commit 935745a08e0e583cb05c1ebdbd9961ae95dcc40c Author: drbob Date: Thu Nov 15 03:18:48 2007 +0000 Created V0.3.x branch and moved the head into the trunk directory. git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@246 b45a01b8-16f6-495d-af2f-9b41ad6348cc diff --git a/libretroshare/src/BUGS b/libretroshare/src/BUGS new file mode 100644 index 000000000..a169439d1 --- /dev/null +++ b/libretroshare/src/BUGS @@ -0,0 +1,11 @@ + +This is the list of known BUGS: +------------------------------- + * None! + + + + + + + diff --git a/libretroshare/src/FAQ b/libretroshare/src/FAQ new file mode 100644 index 000000000..629837280 --- /dev/null +++ b/libretroshare/src/FAQ @@ -0,0 +1,6 @@ + +RetroShare FAQ +--------------- + +Ask a Question. + diff --git a/libretroshare/src/Makefile b/libretroshare/src/Makefile new file mode 100644 index 000000000..0625d0c47 --- /dev/null +++ b/libretroshare/src/Makefile @@ -0,0 +1,39 @@ +# FLTKGUI is not required for the Qt4,0 gui. +# + +all: + make -C tcponudp + make -C pqi + make -C util + make -C dbase + make -C server + make -C dht + make -C upnp + make -C rsserver + make -C rsiface +# make -C fltkgui + +clean: + make -C tcponudp clean + make -C pqi clean + make -C util clean + make -C dbase clean + make -C server clean + make -C dht clean + make -C upnp clean + make -C rsserver clean + make -C rsiface clean +# make -C fltkgui clean + +clobber: + make -C tcponudp clobber + make -C pqi clobber + make -C util clobber + make -C dbase clobber + make -C server clobber + make -C dht clobber + make -C upnp clobber + make -C rsserver clobber + make -C rsiface clobber +# make -C fltkgui clobber + diff --git a/libretroshare/src/Readme.txt b/libretroshare/src/Readme.txt new file mode 100644 index 000000000..e9e856dc1 --- /dev/null +++ b/libretroshare/src/Readme.txt @@ -0,0 +1,150 @@ + +Compiling + Running RetroShare (V0.3.0) +------------------------------------------------------------- + +Quick Requirements: +--------------------------------------------- +Libraries/Tools: + C/C++ Compiler. (standard on Linux/cygwin) + OpenSSL-0.9.7g-xpgp + KadC Dht library + Qt-4.2 development libraries. + +RetroShare Source Code: ( from sf.net/projects/retroshare) + Qt-GUI-XXX.tgz + retroshare-src-v0.3.XXX.tgz + +Windows Requirements: + Cygwin (Windows Only) + Pthreads (Windows Only) + Zlib (Windows Only) +--------------------------------------------- + +OpenSSL-0.9.7g-xpgp is available at: +http://www.lunamutt.com/retroshare/openssl-0.9.7g-xpgp-0.1c.tgz + +KadC (latest) is available from sourceforge.net + +Download/Compile as per instructions... + +--------------------------------------------- + +Compiling Linux +--------------------------------------------- + +(1) compile openSSL-0.9.7g-xpgp. + +(2) compile KadC. (and correct the library) + +(4) Modify ./make.opts + (4a) modify the Makefile so that: OS=Linux or OS=Win + (4c) Define SSL_DIR to point to openSSL-0.9.7g-xpgp. + (4c) Define KADC_DIR to point to KadC + +(5) type: make + This builds ./lib/libretroshare.a, + and the various test programs. + + There is server-only (no GUI) executable + compiled in ./rsiface/retroshare-nogui, + you can run this to check that its working. + +--------------------------------------------- + +Compiling Linux (Alternative Instructions from Bharath) +--------------------------------------------- +here's how to compiled retroshare on ubuntu linux: + + compile openssl: + 1. Get the patched version of openssl (openssl-0.9.7g-xpgp, from http://www.lunamutt.com) + 2. run: + ./config + make + make test + + compile KadC: + 1. Get KadC library from http://kadc.sourceforge.net/ + 2. run: + make + + install packages needed for retroshare compile: + sudo apt-get install libxft-dev + sudo apt-get install libXinerama-dev + + complile retroshare: + 1. set directories in make.opt: + RS_DIR=/home/dev/rs-v0.3.0-pr8/src + SSL_DIR=/home/dev/openssl-0.9.7g-xpgp-0.1c + KADC_DIR=/home/dev/KadC + 2. comment out the directory declarations uncer Cygwin since that will override your directory declarations from 1. + 3. change RSLIBS = -L$(LIBDIR) -lretroshare -L$(SSL_DIR) -lssl -lcrypto -lpthread -lKadC + to + RSLIBS = -L$(LIBDIR) -lretroshare -L$(SSL_DIR) -lssl -lcrypto -lpthread -L$(KADC_DIR) -lKadC + 4. run: + make + +Hope this helps. + +--------------------------------------------- +Compiling the Qt GUI +_____________________________________________ + +(1) untar the Qt-GUI source package. run qmake, + + tar -xvzf Qt-GUI-XXXX.tgz + + cd Qt-Gui-XXX/src/ + + qmake-qt4 Retroshare.pro + +(2) tweak the makefile: The default makefile + doesn't have the links to the retroshare + libraries. It should something like this: + +RSLIBS = -L/home/dev/prog/devel/rs-v0.3.0XXX/src/lib -lretroshare -lKadC +SSLLIBS = -L/home/dev/prog/devel/openssl-0.9.7g-xpgp -lssl -lcrypto +LIBS = $(SUBLIBS) $(RSLIBS) $(SSLLIBS) -L/usr/lib -lQtXml -lQtGui -lQtNetwork -lQtCore -lpthread + + This should build you an executable: + + RetroShare. + +------------------------------------------------ +This has been compiled on the following platforms: + (a) Debian Linux (stable/testing/unstable) + (b) Suse Linux (9.X/10.X) + (c) WinXP + +------------------------------------------------ +WIN XP Compilation. +------------------------------------------------ + +This much harder, and more perilous than the +Linux compilation: It requires both the cygwin +and the mingw compilers... + +Need: + Cygwin development environment + Qt4.2 opensource development kit + MinGw. + source code for all libraries. + +In Brief: +UNDER Cygwin: + (1) Compile openssl-xpgp. + (2) Compile pthreads. + (3) Compile zlib. + (4) Compile KadC. (there are some tweaks, + needed to the code) + + (5) Compile retroshare-v0.3.0 + +UNDER Mingw: + (6) Compile the Qt-Gui. + + +Email me if you're having trouble: + retroshare@lunamutt.com +--------------------------------------------- + + + diff --git a/libretroshare/src/Readme.txt-V0.2.1 b/libretroshare/src/Readme.txt-V0.2.1 new file mode 100644 index 000000000..a03059b14 --- /dev/null +++ b/libretroshare/src/Readme.txt-V0.2.1 @@ -0,0 +1,54 @@ + +Compiling + Running RetroShare +------------------------------------------------------------- + +Quick Requirements: +--------------------------------------------- + Cygwin (Windows Only) + Fltk 1.1.6 (standard on Linux) + OpenSSL-0.9.7g-xpgp + C/C++ Compiler. (standard on Linux/cygwin) +--------------------------------------------- + +OpenSSL-0.9.7g-xpgp is available at: + +http://www.lunamutt.com/retroshare/openssl-0.9.7g-xpgp-0.1c.tgz + +Download/Compile as per instructions... + +--------------------------------------------- + +Compiling. +--------------------------------------------- + +(1) Install openSSL-0.9.7g-xpgp. +(2) (WIN ONLY) Install fltk1.1.6. + +(3) compile the tcponudp library. + (3a) cd ./tcponudp + (3b) modify the Makefile so that: OS=Linux or OS=Win + (3c) type: make + (3d) This should compile the libtou library, and the tests + +(4) Modify ./make.opts + (4a) modify the Makefile so that: OS=Linux or OS=Win + (4b) Define RS_DIR to point to this directory. + (4c) Define SSL_DIR to point to openSSL-0.9.7g-xpgp. + (4d) (WIN ONLY) Define FLTK_DIR to point to FLTK. + +(5) type: make + +(6) run retroShare: ./fltkgui/RetroShare +--------------------------------------------- + +This has been compiled on the following platforms: + (a) Debian Linux (stable/testing/unstable) + (b) Suse Linux (9.X/10.X) + (c) WinXP + +Let me know if something goes wrong: + retroshare@lunamutt.com +--------------------------------------------- + + + diff --git a/libretroshare/src/TODO b/libretroshare/src/TODO new file mode 100644 index 000000000..a33e0e718 --- /dev/null +++ b/libretroshare/src/TODO @@ -0,0 +1,7 @@ + +TODO +--------------- + +Too much to list... + + diff --git a/libretroshare/src/dbase/Makefile b/libretroshare/src/dbase/Makefile new file mode 100644 index 000000000..2514aea28 --- /dev/null +++ b/libretroshare/src/dbase/Makefile @@ -0,0 +1,53 @@ + +RS_TOP_DIR = .. +include ../make.opt + +OBJ = filedex.o filelook.o \ + findex.o fimonitor.o cachestrapper.o fistore.o \ + rsexpr.o + +EXEC = ftest looktest fitest2 fisavetest ficachetest searchtest + +ifeq ($(OS),Linux) + EXEC += fimontest +endif + +all : $(OBJ) librs $(EXEC) + +librs: $(OBJ) + $(AR) r $(LIBRS) $(OBJ) + $(RANLIB) $(LIBRS) + +ftest: $(OBJ) ftest.o + $(CC) $(CFLAGS) -o ftest $(OBJ) ftest.o $(RSLIBS) + +looktest: $(OBJ) looktest.o + $(CC) $(CFLAGS) -o looktest $(OBJ) looktest.o $(RSLIBS) + +fitest2 : fitest2.o $(OBJ) + $(CC) $(CFLAGS) -o fitest2 fitest2.o $(OBJ) $(RSLIBS) + +fisavetest : fisavetest.o $(OBJ) + $(CC) $(CFLAGS) -o fisavetest fisavetest.o $(OBJ) $(RSLIBS) + +fimontest : fimontest.o $(OBJ) + $(CC) $(CFLAGS) -o fimontest fimontest.o $(OBJ) $(RSLIBS) + +ficachetest : ficachetest.o $(OBJ) + $(CC) $(CFLAGS) -o ficachetest ficachetest.o $(OBJ) $(RSLIBS) + +searchtest : searchtest.o $(OBJ) + $(CC) $(CFLAGS) -o searchtest searchtest.o $(OBJ) $(RSLIBS) + + +.cc.o: + $(CC) $(CFLAGS) -c $< + +clean: + -/bin/rm $(OBJ) ftest.o looktest.o + -/bin/rm fitest2.o fisavetest.o fimontest.o + -/bin/rm ficachetest.o searchtest.o + +clobber: clean + -/bin/rm $(EXEC) + diff --git a/libretroshare/src/dbase/cachestrapper.cc b/libretroshare/src/dbase/cachestrapper.cc new file mode 100644 index 000000000..948a6702d --- /dev/null +++ b/libretroshare/src/dbase/cachestrapper.cc @@ -0,0 +1,721 @@ +/* + * RetroShare FileCache Module: cachestrapper.cc + * + * Copyright 2004-2007 by Robert Fernie. + * + * 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 "dbase/cachestrapper.h" + +#include +#include +#include + +/** + * #define CS_DEBUG 1 + */ + +bool operator<(const CacheId &a, const CacheId &b) +{ + if (a.type == b.type) + return (a.subid < b.subid); + return (a.type < b.type); +} + +bool operator<(const CachePair &a, const CachePair &b) +{ + return (a.id < b.id); +} + + +std::ostream &operator<<(std::ostream &out, const CacheData &d) +{ + out << "[ p: " << d.pid << " id: <" << d.cid.type << "," << d.cid.subid; + out << "> #" << d.hash << " size: " << d.size; + out << " \"" << d.name << "\"@\"" << d.path; + out << "\" ]"; + return out; +} + +/********************************* Cache Store / Source ************************** + * This is a generic interface which interacts with the FileTransfer Unit + * to collect Data to be Cached. + * + ********************************* Cache Store / Source *************************/ + +CacheSource::CacheSource(uint16_t t, bool m, std::string cachedir) + :cacheType(t), multiCache(m), cacheDir(cachedir) + { + return; + } + + /* Mutex Stuff -> to be done... */ +void CacheSource::lockData() +{ +#ifdef CS_DEBUG + std::cerr << "CacheSource::lockData()" << std::endl; +#endif + cMutex.lock(); +} + +void CacheSource::unlockData() +{ +#ifdef CS_DEBUG + std::cerr << "CacheSource::unlockData()" << std::endl; +#endif + cMutex.unlock(); +} + + /* to be overloaded for inherited Classes */ +bool CacheSource::loadCache(const CacheData &data) +{ + return refreshCache(data); +} + + /* control Caches available */ +bool CacheSource::refreshCache(const CacheData &data) +{ + lockData(); /* LOCK MUTEX */ + + bool ret = false; + if (data.cid.type == getCacheType()) + { + if (isMultiCache()) + { + caches[data.cid.subid] = data; + } + else + { + caches[0] = data; + } + ret = true; + } + + unlockData(); /* UNLOCK MUTEX */ + return ret; +} + +bool CacheSource::clearCache(CacheId id) +{ + lockData(); /* LOCK MUTEX */ + + bool ret = false; + if (id.type == getCacheType()) + { + CacheSet::iterator it; + if (caches.end() != (it = caches.find(id.subid))) + { + caches.erase(it); + ret = true; + } + } + + unlockData(); /* UNLOCK MUTEX */ + return ret; +} + +bool CacheSource::cachesAvailable(RsPeerId pid, std::map &ids) +{ + lockData(); /* LOCK MUTEX */ + + /* can overwrite for more control! */ + CacheSet::iterator it; + for(it = caches.begin(); it != caches.end(); it++) + { + ids[(it->second).cid] = it->second; + } + bool ret = (caches.size() > 0); + + unlockData(); /* UNLOCK MUTEX */ + return ret; + +} + + +bool CacheSource::findCache(std::string hash, CacheData &data) +{ + lockData(); /* LOCK MUTEX */ + + bool found = false; + CacheSet::iterator it; + for(it = caches.begin(); it != caches.end(); it++) + { + if (hash == (it->second).hash) + { + data = it->second; + found = true; + break; + } + } + + unlockData(); /* UNLOCK MUTEX */ + + return found; +} + + +void CacheSource::listCaches(std::ostream &out) +{ + lockData(); /* LOCK MUTEX */ + + /* can overwrite for more control! */ + CacheSet::iterator it; + out << "CacheSource::listCaches() [" << getCacheType(); + out << "] Total: " << caches.size() << std::endl; + int i; + for(i = 0, it = caches.begin(); it != caches.end(); it++, i++) + { + out << "\tC[" << i << "] : " << it->second << std::endl; + } + + unlockData(); /* UNLOCK MUTEX */ + return; +} + + +CacheStore::CacheStore(uint16_t t, bool m, CacheTransfer *cft, std::string cachedir) + :cacheType(t), multiCache(m), cacheTransfer(cft), cacheDir(cachedir) + { + /* not much */ + return; + } + + /* Mutex Stuff -> to be done... */ +void CacheStore::lockData() +{ +#ifdef CS_DEBUG + std::cerr << "CacheStore::lockData()" << std::endl; +#endif + cMutex.lock(); +} + +void CacheStore::unlockData() +{ +#ifdef CS_DEBUG + std::cerr << "CacheStore::unlockData()" << std::endl; +#endif + cMutex.unlock(); +} + +void CacheStore::listCaches(std::ostream &out) +{ + lockData(); /* LOCK MUTEX */ + + /* can overwrite for more control! */ + std::map::iterator pit; + out << "CacheStore::listCaches() [" << getCacheType(); + out << "] Total People: " << caches.size(); + out << std::endl; + for(pit = caches.begin(); pit != caches.end(); pit++) + { + CacheSet::iterator it; + out << "\tTotal for [" << pit->first << "] : " << (pit->second).size(); + out << std::endl; + for(it = (pit->second).begin(); it != (pit->second).end(); it++) + { + out << "\t\t" << it->second; + out << std::endl; + } + } + + unlockData(); /* UNLOCK MUTEX */ + return; +} + + + /* look for stored data. using pic/cid in CacheData + */ +bool CacheStore::getStoredCache(CacheData &data) +{ + lockData(); /* LOCK MUTEX */ + + bool ok = locked_getStoredCache(data); + + unlockData(); /* UNLOCK MUTEX */ + return ok; +} + + +bool CacheStore::locked_getStoredCache(CacheData &data) +{ + if (data.cid.type != getCacheType()) + { + return false; + } + + std::map::iterator pit; + if (caches.end() == (pit = caches.find(data.pid))) + { + return false; + } + + CacheSet::iterator cit; + if (isMultiCache()) + { + /* look for subid */ + if ((pit->second).end() == + (cit = (pit->second).find(data.cid.subid))) + { + return false; + } + } + else + { + if ((pit->second).end() == + (cit = (pit->second).find(0))) + { + return false; + } + } + + /* we found it! (cit) */ + data = cit->second; + + return true; +} + + + + /* input from CacheStrapper. + * check if we want to download it... + * determine the new name/path + * then request it. + */ +void CacheStore::availableCache(const CacheData &data) +{ + std::cerr << "CacheStore::availableCache() :" << data << std::endl; + /* basic checks */ + lockData(); /* LOCK MUTEX */ + + bool rightCache = (data.cid.type == getCacheType()); + + unlockData(); /* UNLOCK MUTEX */ + + if (!rightCache) + { + return; /* bad id */ + } + + /* These Functions lock the Mutex themselves + */ + + if (!fetchCache(data)) + { + return; /* ignore it */ + } + + CacheData rData = data; + + /* get new name */ + if (!nameCache(rData)) + { + return; /* error naming */ + } + + /* request it */ + cacheTransfer -> RequestCache(rData, this); + + /* will get callback when it is complete */ + return; +} + + + /* called when the download is completed ... updates internal data */ +void CacheStore::downloadedCache(const CacheData &data) +{ + std::cerr << "CacheStore::downloadedCache() :" << data << std::endl; + /* updates data */ + if (!loadCache(data)) + { + return; + } +} + /* called when the download is completed ... updates internal data */ +void CacheStore::failedCache(const CacheData &data) +{ + std::cerr << "CacheStore::failedCache() :" << data << std::endl; + return; +} + + + /* virtual function overloaded by cache implementor */ +bool CacheStore::fetchCache(const CacheData &data) +{ + /* should we fetch it? */ + std::cerr << "CacheStore::fetchCache() tofetch?:" << data << std::endl; + + CacheData incache = data; + + lockData(); /* LOCK MUTEX */ + + bool haveCache = ((locked_getStoredCache(incache)) && (data.hash == incache.hash)); + + unlockData(); /* UNLOCK MUTEX */ + + + if (haveCache) + { + std::cerr << "CacheStore::fetchCache() Already have it: false" << std::endl; + return false; + } + + std::cerr << "CacheStore::fetchCache() Missing this cache: true" << std::endl; + return true; +} + + +int CacheStore::nameCache(CacheData &data) +{ + /* name it... */ + lockData(); /* LOCK MUTEX */ + + + std::cerr << "CacheStore::nameCache() for:" << data << std::endl; + data.name = data.hash; + data.path = getCacheDir(); + std::cerr << "CacheStore::nameCache() done:" << data << std::endl; + + unlockData(); /* UNLOCK MUTEX */ + + return 1; +} + + +int CacheStore::loadCache(const CacheData &data) +{ + /* attempt to load -> dummy function */ + std::cerr << "CacheStore::loadCache() Dummy Load for:" << data << std::endl; + + lockData(); /* LOCK MUTEX */ + + locked_storeCacheEntry(data); + + unlockData(); /* UNLOCK MUTEX */ + + return 1; +} + +/* This function is called to store Cache Entry in the CacheStore Table. + * it must be called from within a Mutex Lock.... + * + * It doesn't lock itself -> to avoid race conditions + */ + +void CacheStore::locked_storeCacheEntry(const CacheData &data) +{ + /* store what we loaded - overwriting if necessary */ + std::map::iterator pit; + if (caches.end() == (pit = caches.find(data.pid))) + { + /* add in a new CacheSet */ + CacheSet emptySet; + caches[data.pid] = emptySet; + + pit = caches.find(data.pid); + } + + if (isMultiCache()) + { + (pit->second)[data.cid.subid] = data; + } + else + { + (pit->second)[0] = data; + } + return; +} + + +/********************************* CacheStrapper ********************************* + * This is the bit which handles queries + * + ********************************* CacheStrapper ********************************/ + +CacheStrapper::CacheStrapper(RsPeerId id, time_t period) + :ownId(id), queryPeriod(period) +{ + return; +} + + +void CacheStrapper::addCachePair(CachePair set) +{ + caches[set.id.type] = set; +} + + + /* from pqimonclient */ +void CacheStrapper::monUpdate(const std::list &plist) +{ + std::list::const_iterator it; + std::map::iterator mit; + for(it = plist.begin(); it != plist.end(); it++) + { + if (status.end() == (mit = status.find(it->id))) + { + addPeerId(it->id); + } + } +} + + +void CacheStrapper::addPeerId(RsPeerId pid) +{ + std::map::iterator it; + + /* just reset it for the moment */ + CacheTS ts; + ts.query = 0; + ts.answer = 0; + + status[pid] = ts; +} + +bool CacheStrapper::removePeerId(RsPeerId pid) +{ + std::map::iterator it; + if (status.end() != (it = status.find(pid))) + { + status.erase(it); + return true; + } + return false; +} + + + /* pass to correct CacheSet */ +void CacheStrapper::recvCacheResponse(CacheData &data, time_t ts) +{ + /* update internal data first */ + std::map::iterator it; + if (status.end() == status.find(data.pid)) + { + /* add it in */ + CacheTS d; + d.query = 0; + d.answer = 0; + + status[data.pid] = d; + } + + it = status.find(data.pid); /* will always succeed */ + + /* update status */ + (it -> second).answer = ts; + + /* find cache store */ + std::map::iterator it2; + if (caches.end() == (it2 = caches.find(data.cid.type))) + { + /* error - don't have this type of cache */ + return; + } + + /* notify the CacheStore */ + (it2 -> second).store -> availableCache(data); +} + + + /* generate periodically or at a change */ +bool CacheStrapper::sendCacheQuery(std::list &id, time_t ts) +{ + /* iterate through peers, and see who we haven't got an answer from recently */ + std::map::iterator it; + for(it = status.begin(); it != status.end(); it++) + { + if ((ts - (it->second).query) > queryPeriod) + { + /* query this one */ + id.push_back(it->first); + (it->second).query = ts; + } + } + return (id.size() > 0); +} + + +void CacheStrapper::handleCacheQuery(RsPeerId id, std::map &hashs) +{ + /* basic version just iterates through .... + * more complex could decide who gets what! + * + * or that can be handled on a cache by cache basis. + */ + + std::map::iterator it; + for(it = caches.begin(); it != caches.end(); it++) + { + (it->second).source -> cachesAvailable(id, hashs); + } + return; +} + +void CacheStrapper::listCaches(std::ostream &out) +{ + /* can overwrite for more control! */ + std::map::iterator it; + out << "CacheStrapper::listCaches() [" << ownId; + out << "] Total Peers: " << status.size() << " Total Caches: " << caches.size(); + out << std::endl; + for(it = caches.begin(); it != caches.end(); it++) + { + out << "CacheType: " << it->first; + out << std::endl; + + (it->second).source->listCaches(out); + (it->second).store->listCaches(out); + out << std::endl; + } + return; +} + +void CacheStrapper::listPeerStatus(std::ostream &out) +{ + std::map::iterator it; + out << "CacheStrapper::listPeerStatus() [" << ownId; + out << "] Total Peers: " << status.size() << " Total Caches: " << caches.size(); + out << std::endl; + for(it = status.begin(); it != status.end(); it++) + { + out << "Peer: " << it->first; + out << " Query: " << (it->second).query; + out << " Answer: " << (it->second).answer; + out << std::endl; + } + return; +} + + +bool CacheStrapper::findCache(std::string hash, CacheData &data) +{ + /* can overwrite for more control! */ + std::map::iterator it; + for(it = caches.begin(); it != caches.end(); it++) + { + if ((it->second).source->findCache(hash, data)) + { + return true; + } + } + return false; +} + + +/********************************* CacheStrapper ********************************* + * This is the bit which handles queries + * + ********************************* CacheStrapper ********************************/ + + +/* request from CacheStore */ +bool CacheTransfer::RequestCache(CacheData &data, CacheStore *cbStore) +{ + /* store request */ + cbData[data.hash] = data; + cbStores[data.hash] = cbStore; + + /* request data */ + RequestCacheFile(data.pid, data.path, data.hash, data.size); + + /* wait for answer */ + return true; +} + + +/* to be overloaded */ +bool CacheTransfer::RequestCacheFile(RsPeerId id, std::string path, std::string hash, uint32_t size) +{ + std::cerr << "CacheTransfer::RequestCacheFile() : from:" << id << " #"; + std::cerr << hash << " size: " << size; + std::cerr << " savepath: " << path << std::endl; + std::cerr << "CacheTransfer::RequestCacheFile() Dummy... saying completed"; + std::cerr << std::endl; + + /* just tell them we've completed! */ + CompletedCache(hash); + return true; +} + + +/* internal completion -> does cb */ +bool CacheTransfer::CompletedCache(std::string hash) +{ + std::map::iterator dit; + std::map::iterator sit; + + /* find in store.... */ + sit = cbStores.find(hash); + dit = cbData.find(hash); + + if ((sit == cbStores.end()) || (dit == cbData.end())) + { + return false; + } + + /* callback */ + (sit -> second) -> downloadedCache(dit->second); + + /* clean up store */ + cbStores.erase(sit); + cbData.erase(dit); + + return true; +} + +/* internal completion -> does cb */ +bool CacheTransfer::FailedCache(std::string hash) +{ + std::map::iterator dit; + std::map::iterator sit; + + /* find in store.... */ + sit = cbStores.find(hash); + dit = cbData.find(hash); + + if ((sit == cbStores.end()) || (dit == cbData.end())) + { + return false; + } + + /* callback */ + (sit -> second) -> failedCache(dit->second); + + /* clean up store */ + cbStores.erase(sit); + cbData.erase(dit); + + return true; +} + + +bool CacheTransfer::FindCacheFile(std::string hash, std::string &path, uint32_t &size) +{ + CacheData data; + if (strapper->findCache(hash, data)) + { + path = data.path + "/" + data.name; + size = data.size; + return true; + } + + return false; +} + + + diff --git a/libretroshare/src/dbase/cachestrapper.h b/libretroshare/src/dbase/cachestrapper.h new file mode 100644 index 000000000..534903d8f --- /dev/null +++ b/libretroshare/src/dbase/cachestrapper.h @@ -0,0 +1,321 @@ +/* + * RetroShare FileCache Module: cachestrapper.h + * + * Copyright 2004-2007 by Robert Fernie. + * + * 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". + * + */ + +#ifndef MRK_CACHE_STRAPPER_H +#define MRK_CACHE_STRAPPER_H + +#include +#include +#include +#include +#include "util/rsthreads.h" + +/******************* CacheStrapper and Related Classes ******************* + * A generic Cache Update system. + * + * CacheStrapper: maintains a set of CacheSources, and CacheStores, + * queries and updates as new information arrives. + * + * CacheTransfer: Interface for FileTransfer Class to support. + * + * CacheSource: Base Class for cache data provider. eg. FileIndexMonitor. + * CacheStore: Base Class for data cache. eg. FileCache/Store. + * + * Still TODO: + * (1) Design and Implement the Upload side of CacheTransfer/CacheStrapper. + * (2) CacheStrapper:: Save / Load Cache lists.... + * (3) Clean up lists, maps on shutdown etc. + * (4) Consider Mutexes for multithreaded operations. + * (5) Test the MultiSource/Store capabilities. + * + ******************* CacheStrapper and Related Classes *******************/ + + +class CacheTransfer; /* Interface for File Transfer */ +class CacheSource; /* Interface for local File Index/Monitor */ +class CacheStore; /* Interface for the actual Cache */ +class CacheStrapper; /* Controlling Class */ + +/**** +typedef uint32_t RsPeerId; +*****/ +typedef std::string RsPeerId; + +/******************************** CacheId ********************************/ +class CacheId +{ + public: + CacheId() :type(0), subid(0) { return; } + CacheId(uint16_t a, uint16_t b) :type(a), subid(b) { return; } + uint16_t type; + uint16_t subid; +}; + + +bool operator<(const CacheId &a, const CacheId &b); + +#define CACHE_TYPE_FILE_INDEX 1 +#define CACHE_TYPE_WEB 2 +#define CACHE_TYPE_OTHER 4 + +/* think of any others? */ + +class CacheData +{ + public: + + RsPeerId pid; + std::string pname; /* peer name (can be used by cachestore) */ + CacheId cid; + std::string path; + std::string name; + std::string hash; + uint32_t size; + time_t recvd; +}; + + +std::ostream &operator<<(std::ostream &out, const CacheData &d); + +/***************************** CacheTransfer *****************************/ + +class CacheTransfer +{ + public: + CacheTransfer(CacheStrapper *cs) :strapper(cs) { return; } +virtual ~CacheTransfer() {} + + /* upload side of things .... searches through CacheStrapper. */ +bool FindCacheFile(std::string hash, std::string &path, uint32_t &size); + + + /* At the download side RequestCache() => overloaded RequestCacheFile() + * the class should then call CompletedCache() or FailedCache() + */ + +bool RequestCache(CacheData &data, CacheStore *cbStore); /* request from CacheStore */ + + protected: + /* to be overloaded */ +virtual bool RequestCacheFile(RsPeerId id, std::string path, std::string hash, uint32_t size); + +bool CompletedCache(std::string hash); /* internal completion -> does cb */ +bool FailedCache(std::string hash); /* internal completion -> does cb */ + + private: + + CacheStrapper *strapper; + + std::map cbData; + std::map cbStores; +}; + + + +/************************ CacheSource/CacheStore *************************/ + +typedef std::map CacheSet; + +class CacheSource +{ + public: + CacheSource(uint16_t t, bool m, std::string cachedir); +virtual ~CacheSource() {} + + /* called to determine available cache for peer - + * default acceptable (returns all) + */ +virtual bool cachesAvailable(RsPeerId pid, std::map &ids); + + /* function called at startup to load from + * configuration file.... + * to be overloaded by inherited class + */ +virtual bool loadCache(const CacheData &data); + + /* control Caches available */ +bool refreshCache(const CacheData &data); +bool clearCache(CacheId id); + + /* get private data */ +std::string getCacheDir() { return cacheDir; } +bool isMultiCache() { return multiCache; } +uint16_t getCacheType() { return cacheType; } + + /* display */ +void listCaches(std::ostream &out); + + /* search */ +bool findCache(std::string hash, CacheData &data); + + protected: + + /*** MUTEX LOCKING - TODO + */ +void lockData(); +void unlockData(); + + CacheSet caches; + + private: + + uint16_t cacheType; /* for checking */ + bool multiCache; /* do we care about subid's */ + + std::string cacheDir; + RsMutex cMutex; +}; + + +class CacheStore +{ + public: + + CacheStore(uint16_t t, bool m, CacheTransfer *cft, std::string cachedir); +virtual ~CacheStore() {} + + /* current stored data */ +bool getStoredCache(CacheData &data); /* use pid/cid in data */ + + /* input from CacheStrapper -> store can then download new data */ +void availableCache(const CacheData &data); + + /* called when the download is completed ... updates internal data */ +void downloadedCache(const CacheData &data); + + /* called if the download fails */ +void failedCache(const CacheData &data); + + /* virtual functions overloaded by cache implementor */ +virtual bool fetchCache(const CacheData &data); /* a question? */ +virtual int nameCache(CacheData &data); /* fill in the name/path */ +virtual int loadCache(const CacheData &data); /* actual load, once data available */ + + /* get private data */ +std::string getCacheDir() { return cacheDir; } +bool isMultiCache() { return multiCache; } +uint16_t getCacheType() { return cacheType; } + + /* display */ +void listCaches(std::ostream &out); + + protected: + /*** MUTEX LOCKING */ +void lockData(); +void unlockData(); + + /* This function is called to store Cache Entry in the CacheStore Table. + * it must be called from within a Mutex Lock.... + * + * It doesn't lock itself -> to avoid race conditions + */ +void locked_storeCacheEntry(const CacheData &data); +bool locked_getStoredCache(CacheData &data); + + private: + + uint16_t cacheType; /* for checking */ + bool multiCache; /* do we care about subid's */ + + CacheTransfer *cacheTransfer; + std::string cacheDir; + + std::map caches; + + RsMutex cMutex; +}; + + + +/***************************** CacheStrapper *****************************/ + + +/* Make Sure you get the Ids right! */ +class CachePair +{ + public: + CachePair() + :source(NULL), store(NULL), id(0, 0) { return; } + + CachePair(CacheSource *a, CacheStore *b, CacheId c) + :source(a), store(b), id(c) { return; } + + CacheSource *source; + CacheStore *store; + CacheId id; +}; + + +bool operator<(const CachePair &a, const CachePair &b); + +class CacheTS +{ + public: + + time_t query; + time_t answer; +}; + +#include "pqi/pqimon.h" + +class CacheStrapper: public pqimonclient +{ + public: + CacheStrapper(RsPeerId id, time_t period); +virtual ~CacheStrapper() { return; } + + /* from pqimonclient */ +virtual void monUpdate(const std::list &plist); + +void addCachePair(CachePair pair); + +void addPeerId(RsPeerId pid); +bool removePeerId(RsPeerId pid); + + /*** I/O (1) ***/ + /* pass to correct CacheSet */ +void recvCacheResponse(CacheData &date, time_t ts); + /* generate periodically or at a change */ +bool sendCacheQuery(std::list &id, time_t ts); + + /*** I/O (2) ***/ + /* handle a DirQuery */ +void handleCacheQuery(RsPeerId id, std::map &data); + + /* search through CacheSources. */ +bool findCache(std::string hash, CacheData &data); + + /* display */ +void listCaches(std::ostream &out); +void listPeerStatus(std::ostream &out); + + private: + + std::map status; + std::map caches; + RsPeerId ownId; + time_t queryPeriod; +}; + + +#endif diff --git a/libretroshare/src/dbase/cachetest.h b/libretroshare/src/dbase/cachetest.h new file mode 100644 index 000000000..3a28ed2ae --- /dev/null +++ b/libretroshare/src/dbase/cachetest.h @@ -0,0 +1,63 @@ +/* + * RetroShare FileCache Module: cachetest.h + * + * Copyright 2004-2007 by Robert Fernie. + * + * 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". + * + */ + +#ifndef MRK_TEST_CACHE_H +#define MRK_TEST_CACHE_H + +#include "cachestrapper.h" + +#define TESTID 0xffff +#define TESTID2 0xffee + +class CacheTestSource: public CacheSource +{ + public: + CacheTestSource(std::string dir) + :CacheSource(TESTID, false, dir) { return; } +}; + +class CacheTestStore: public CacheStore +{ + public: + CacheTestStore(CacheTransfer *cft, std::string dir) + :CacheStore(TESTID, false, cft, dir) { return; } +}; + + +class CacheTestMultiSource: public CacheSource +{ + public: + CacheTestMultiSource(std::string dir) + :CacheSource(TESTID2, true, dir) { return; } +}; + +class CacheTestMultiStore: public CacheStore +{ + public: + CacheTestMultiStore(CacheTransfer *cft, std::string dir) + :CacheStore(TESTID2, true, cft, dir) { return; } +}; + + +#endif + diff --git a/libretroshare/src/dbase/ficachetest.cc b/libretroshare/src/dbase/ficachetest.cc new file mode 100644 index 000000000..c795ff95c --- /dev/null +++ b/libretroshare/src/dbase/ficachetest.cc @@ -0,0 +1,209 @@ +/* + * RetroShare FileCache Module: ficachetest.cc + * + * Copyright 2004-2007 by Robert Fernie. + * + * 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 "cachestrapper.h" +#include "cachetest.h" + +#include +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS +#else + #include +#endif +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ + + +void handleQuery(CacheStrapper *csp, RsPeerId pid, + std::map &strappers); + +/* A simple test of the CacheStrapper Code. + * + * create 3 different CacheStrappers, each with a Source/Store Pair and Transfer Class. + * pass queries and responses between the CacheStrappers, + * and ensure that the hashes in the Caches are updated. + * + */ + +int main(int argc, char **argv) +{ + + time_t period = 11; + RsPeerId pid1("0x0101"); + RsPeerId pid2("0x0102"); + RsPeerId pid3("0x0103"); + + CacheStrapper sc1(pid1, period); + CacheStrapper sc2(pid2, period); + CacheStrapper sc3(pid3, period); + CacheTransfer ctt1(&sc1); + CacheTransfer ctt2(&sc2); + CacheTransfer ctt3(&sc3); + + std::map strappers; + strappers[pid1] = &sc1; + strappers[pid2] = &sc2; + strappers[pid3] = &sc3; + + + std::string nulldir = ""; + + CacheSource *csrc1 = new CacheTestSource(nulldir); + CacheStore *cstore1 = new CacheTestStore(&ctt1, nulldir); + CacheId cid1(TESTID, 0); + + CacheSource *csrc2 = new CacheTestSource(nulldir); + CacheStore *cstore2 = new CacheTestStore(&ctt2, nulldir); + CacheId cid2(TESTID, 0); + + CacheSource *csrc3 = new CacheTestSource(nulldir); + CacheStore *cstore3 = new CacheTestStore(&ctt3, nulldir); + CacheId cid3(TESTID, 0); + + CachePair cp1(csrc1, cstore1, cid1); + CachePair cp2(csrc2, cstore2, cid2); + CachePair cp3(csrc3, cstore3, cid3); + + sc1.addCachePair(cp1); + sc2.addCachePair(cp2); + sc3.addCachePair(cp3); + + + sc1.addPeerId(pid2); + sc2.addPeerId(pid1); + sc2.addPeerId(pid3); + sc3.addPeerId(pid2); + + /* add in a cache to sc2 */ + CacheData cdata; + + cdata.pid = pid1; + cdata.cid = cid1; + cdata.name = "Perm Cache"; + cdata.path = "./"; + cdata.hash = "GHJKI"; + + csrc1->refreshCache(cdata); + + cdata.pid = pid2; + cdata.cid = cid2; + cdata.name = "Funny Cache"; + cdata.path = "./"; + cdata.hash = "ABCDEF"; + + csrc2->refreshCache(cdata); + + /* now exercise it */ + + for(int i = 0; 1 ; i++) + { + RsPeerId src(""); + CacheStrapper *csp = NULL; + + if (i % 5 == 1) + { + src = pid1; + csp = &sc1; + } + else if (i % 5 == 2) + { + src = pid2; + csp = &sc2; + } + else if (i % 5 == 3) + { + src = pid3; + csp = &sc3; + } + std::cerr << std::endl; + std::cerr << "Cache Iteraton: " << time(NULL) << std::endl; + std::cerr << std::endl; + + if (src != "") + { + handleQuery(csp, src, strappers); + } + + + if (i % 21 == 0) + { + /* print out the resources */ + sc1.listCaches(std::cerr); + sc2.listCaches(std::cerr); + sc3.listCaches(std::cerr); + } + + /* every once in a while change the cache on 2 */ + if (i % 31 == 25) + { + cdata.hash += "X"; + csrc2->refreshCache(cdata); + } + +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS + sleep(1); +#else + Sleep(1000); +#endif +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ + + /* tick the systems */ + + } + + /* Cleanup - TODO */ + + return 1; +} + +void handleQuery(CacheStrapper *csp, RsPeerId pid, + std::map &strappers) +{ + /* query */ + std::list ids; + std::list::iterator pit; + + std::cerr << "Cache Query from: " << pid << std::endl; + + csp -> sendCacheQuery(ids, time(NULL)); + for(pit = ids.begin(); pit != ids.end(); pit++) + { + std::cerr << "Cache Query for: " << (*pit) << std::endl; + std::map::iterator sit; + if (strappers.end() != (sit = strappers.find(*pit))) + { + std::map hashs; + std::map::iterator hit; + (sit -> second) -> handleCacheQuery(pid, hashs); + for(hit = hashs.begin(); hit != hashs.end(); hit++) + { + csp -> recvCacheResponse(hit->second, time(NULL)); + } + } + else + { + std::cerr << "Unknown Query Destination!" << std::endl; + } + } +} + diff --git a/libretroshare/src/dbase/filedex.cc b/libretroshare/src/dbase/filedex.cc new file mode 100644 index 000000000..ae4a5a5a4 --- /dev/null +++ b/libretroshare/src/dbase/filedex.cc @@ -0,0 +1,366 @@ +/* + * "$Id: filedex.cc,v 1.8 2007-02-18 21:46:49 rmf24 Exp $" + * + * Other Bits for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "filedex.h" + +#include + +#include +#include +#include +#include + +fdex::fdex() +{ + return; +} + +fdex::fdex(const char *p, const char *d, const char *f, const char *e, int l, int v) + :path(p), subdir(d), file(f), ext(e), len(l), vis(v) +{ + return; +} + + +int filedex::load(std::list dirs) +{ + std::list::iterator it; + + /* these must be done in the correct order to ensure + * that the visibility is correct + */ + for(int i = FD_VIS_EXACT_ONLY; i <= FD_VIS_LISTING; i++) + { + for(it = dirs.begin(); it != dirs.end(); it++) + { + if (i == it -> vis) + { + //std::cerr << "Adding Type(" << it -> vis << ") " << it -> basepath; + //std::cerr << std::endl; + + dirtodo.push_back(*it); + } + } + } + return processdirs(); +} + +int filedex::clear() +{ + std::list::iterator it; + dirtodo.clear(); + dirdone.clear(); + + for(it = files.begin(); it != files.end(); it++) + { + delete(*it); + } + files.clear(); + + for(it = dirlist.begin(); it != dirlist.end(); it++) + { + delete(*it); + } + dirlist.clear(); + return 1; +} + +std::string strtolower2(std::string in) +{ + std::string out = in; + for(int i = 0; i < (signed) out.length(); i++) + { + if (isupper(out[i])) + { + out[i] += 'a' - 'A'; + } + } + return out; +} + +std::string fileextension2(std::string in) +{ + std::string out; + bool found = false; + for(int i = in.length() -1; (i >= 0) && (found == false); i--) + { + if (in[i] == '.') + { + found = true; + for(int j = i+1; j < (signed) in.length(); j++) + { + out += in[j]; + } + } + } + return strtolower2(out); +} + +std::list filedex::search(std::list terms, int limit, bool local) +{ + bool found; + std::list newlist; + int matches = 0; + + std::list::iterator fit; + std::list::iterator tit; + + //std::cerr << "filedex::search() looking for" << std::endl; + //for(tit = terms.begin(); tit != terms.end(); tit++) + // std::cerr << "\t(" << *tit << ")" << std::endl; + + //std::cerr << "Checking:" << std::endl; + + for(fit = files.begin(); fit != files.end(); fit++) + { + // ignore named only files. + if ((!local) && ((*fit)->vis < FD_VIS_SEARCH)) + continue; + found = true; + for(tit = terms.begin(); (tit != terms.end()) && (found); tit++) + { + std::string path = (*fit) -> subdir+"/"+(*fit)->file; + std::string lowerpath = strtolower2(path); + std::string lowerterm = strtolower2(*tit); + + //std::cerr << "\tLooking for (" << lowerterm; + //std::cerr << ") in (" << lowerpath << ") "; + + if (strstr(lowerpath.c_str(), lowerterm.c_str()) == NULL) + { + found = false; + //std::cerr << "\tFalse..." << std::endl; + } + else + { + //std::cerr << "\tTrue..." << std::endl; + } + } + if (found) + { + //std::cerr << "Found Matching!" << std::endl; + newlist.push_back(*fit); + if (++matches == limit) + { + //std::cerr << "Reached Limit(" << limit << ")"; + //std::cerr << "Returning Results" << std::endl; + return newlist; + } + } + } + return newlist; +} + + +std::list filedex::dirlisting(std::string basedir) +{ + std::list newlist; + std::list::iterator fit; + + //std::cerr << "filedex::dirlisting() looking for subdir: " << basedir << std::endl; + + //std::cerr << "Checking:" << std::endl; + + for(fit = dirlist.begin(); fit != dirlist.end(); fit++) + { + //std::cerr << "DCHK(" << basedir << ") vs (" << (*fit) -> subdir << ")" << std::endl; + if (basedir == (*fit) -> subdir) + { + /* in the dir */ + //std::cerr << "Found Matching SubDir:"; + //std::cerr << (*fit) -> subdir << std::endl; + newlist.push_back(*fit); + } + } + + for(fit = files.begin(); fit != files.end(); fit++) + { + //std::cerr << "FCHK(" << basedir << ") vs (" << (*fit) -> subdir << ")" << std::endl; + if (basedir == (*fit) -> subdir) + { + /* in the dir */ + //std::cerr << "Found Matching File:"; + //std::cerr << (*fit) -> subdir << std::endl; + newlist.push_back(*fit); + } + } + return newlist; +} + + +std::list filedex::findfilename(std::string name) +{ + std::list newlist; + std::list::iterator fit; + + std::cerr << "filedex::findfilename() looking for: " << name << std::endl; + + std::cerr << "Checking:" << std::endl; + for(fit = files.begin(); fit != files.end(); fit++) + { + if (name == (*fit) -> file) + { + /* in the dir */ + std::cerr << "Found Matching File!" << std::endl; + newlist.push_back(*fit); + } + } + return newlist; +} + + +int filedex::processdirs() +{ + std::list::iterator it; + std::list::iterator sit; + std::string dirname; + std::string subdir; + std::string fname; + std::string fullname; + struct dirent *ent; + struct stat buf; + bool found = false; + fdex *fx; + int count = 0; + int ficount = 0; + while(dirtodo.size() > 0) + { + count++; + it = dirtodo.begin(); + DirItem currDir(*it); + dirname = currDir.getFullPath(); + dirtodo.erase(it); + + //std::cerr << "\tExamining: " << currDir.basepath; + //std::cerr << " -/- " << currDir.subdir << std::endl; + //std::cerr << "\t\t" << count << " Directories done, "; + //std::cerr << dirtodo.size() << " to go! " << std::endl; + + // open directory. + DIR *dir = opendir(dirname.c_str()); + + if (dir != NULL) { + // read the directory. + while(NULL != (ent = readdir(dir))) + { + fname = ent -> d_name; + fullname = dirname + "/" + fname; + subdir = currDir.subdir; + // std::cerr << "Statting dirent: " << fullname.c_str() < getFullPath() == fullname) + found = true; + } + for(sit = dirdone.begin(); sit != dirdone.end(); sit++) + { + if ((*sit) == fullname) + found = true; + } + if (found == false) + { + // add to list to read. + DirItem ndir(currDir.basepath, subdir+"/"+fname, currDir.vis); + // Push to the front of the list -> so processing done in order. + dirtodo.push_front(ndir); + // std::cerr << "\t Adding Directory: " << fullname; + // std::cerr << " to dirtodo" << std::endl; + + if (currDir.vis == FD_VIS_LISTING) + { + // add to dirlist dbase. + fx = new fdex(fullname.c_str(), subdir.c_str(), + fname.c_str(), "DIR", 0, currDir.vis); + dirlist.push_back(fx); + // std::cerr << "\t Adding Directory: " << fullname; + // std::cerr << " to dirlist" << std::endl; + } + } + } + else if (S_ISREG(buf.st_mode)) + { + // add to dbase. + fx = new fdex(fullname.c_str(), subdir.c_str(), + fname.c_str(), (fileextension2(fname)).c_str(), + buf.st_size, currDir.vis); + + //fx -> path = fullname; + files.push_back(fx); + ficount++; + if (ficount % 100 == 0) + { + //std::cerr << "\tIndex(" << ficount << ") : "; + //std::cerr << "\tIndexing File: " << fname; + //std::cerr << std::endl; + } + + } + else + { + // warning. + std::cerr << "\t Ignoring Unknown FileType"; + std::cerr << std::endl; + } + } + else + { + + } + + } + // should check error message. + dirdone.push_back(dirname); + closedir(dir); + } + else + { + //std::cerr << "Cannot Open Directory:" << dirname << std::endl; + } + + } + return 1; +} + + diff --git a/libretroshare/src/dbase/filedex.h b/libretroshare/src/dbase/filedex.h new file mode 100644 index 000000000..5041a9d1d --- /dev/null +++ b/libretroshare/src/dbase/filedex.h @@ -0,0 +1,111 @@ +/* + * "$Id: filedex.h,v 1.4 2007-02-18 21:46:49 rmf24 Exp $" + * + * Other Bits for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + +#ifndef MRK_PQI_FILEINDEXER +#define MRK_PQI_FILEINDEXER + +/* a file index. + * + * initiated with a list of directories. + * + */ + +#include +#include + +#define FD_VIS_EXACT_ONLY 0 +#define FD_VIS_SEARCH 1 +#define FD_VIS_LISTING 2 + +/* if vis = FD_VIS_EXACT_ONLY + * Then only an exact filename match works + * if vis = FD_VIS_SEARCH + * Then only a search will return it. + * if vis = FD_VIS_LISTING + * Then any method will find it. + */ + +class fdex +{ + public: + fdex(); + fdex(const char *path, const char *srchpath, + const char *file, const char *ext, int len, int vis); + +std::string path; // full path. (not searched) +std::string subdir; // searched if flag set. +std::string file; +std::string ext; +int len; +int vis; + +}; + + +class DirItem +{ + public: + DirItem(std::string bp, std::string sd, int v) + : basepath(bp), subdir(sd), vis(v) {} + std::string getFullPath() + { + return basepath + subdir; + } + std::string basepath; + std::string subdir; + int vis; +}; + +class filedex +{ + public: + +int load(std::list dirs); +int clear(); + +// -1 for no limit. +// If remote ... then restrictions apply. +std::list search(std::list, int limit, bool local); +std::list dirlisting(std::string); +std::list findfilename(std::string); + + private: + +int processdirs(); + + std::list dirtodo; + std::list dirdone; + + /* dbase */ + std::list files; + std::list dirlist; +}; + + + + +#endif diff --git a/libretroshare/src/dbase/filelook.cc b/libretroshare/src/dbase/filelook.cc new file mode 100644 index 000000000..f4b44d788 --- /dev/null +++ b/libretroshare/src/dbase/filelook.cc @@ -0,0 +1,538 @@ +/* + * "$Id: filelook.cc,v 1.3 2007-03-05 21:26:03 rmf24 Exp $" + * + * Other Bits for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "dbase/filelook.h" +#include "util/rsdir.h" + +#include + +#include +#include +#include +#include + + +/* + * The Basic Low-Level Local File/Directory Interface. + * + * Requests are queued, and serviced (slowly) + * + * + * So this is a simple + * Local Lookup service, + * with a locked threaded interface. + * + * Input: + * "lookup directory". + * + * Output: + * "FileItems" + * "DirItems" + * + * + * a file index. + * + * initiated with a list of directories. + * + */ + + +fileLook::fileLook() +{ + return; +} + +fileLook::~fileLook() +{ + + return; +} + + /* interface */ +void fileLook::setSharedDirectories(std::list dirs) +{ + int i; + lockDirs(); { /* LOCKED DIRS */ + + /* clear old directories */ + sharedDirs.clear(); + + /* iterate through the directories */ + std::list::iterator it; + for(it = dirs.begin(); it != dirs.end(); it++) + { + /* get the head directory */ + std::string root_dir = *it; + std::string top_dir = RsDirUtil::getTopDir(root_dir); + + /* if unique -> add, else add modifier */ + bool unique = false; + for(i = 0; !unique; i++) + { + std::string tst_dir = top_dir; + if (i > 0) + { + std::ostringstream out; + out << "-" << i; + tst_dir += out.str(); + } + std::map::const_iterator cit; + if (sharedDirs.end()== (cit=sharedDirs.find(tst_dir))) + { + unique = true; + /* add it! */ + sharedDirs[tst_dir.c_str()] = root_dir; + std::cerr << "Added [" << tst_dir << "] => " << root_dir << std::endl; + } + } + } + + } unlockDirs(); /* UNLOCKED DIRS */ +} + + + +int fileLook::lookUpDirectory(PQItem *i) +{ + std::cerr << "lookUpDirectory() About to Lock" << std::endl; + lockQueues(); + + std::cerr << "lookUpDirectory():" << std::endl; + i -> print(std::cerr); + + mIncoming.push_back(i); + + unlockQueues(); + std::cerr << "lookUpDirectory() Unlocked" << std::endl; + + return 1; +} + +PQItem *fileLook::getResult() +{ + PQItem *i = NULL; + + lockQueues(); + + if (mOutgoing.size() > 0) + { + i = mOutgoing.front(); + mOutgoing.pop_front(); + + std::cerr << "getResult()" << std::endl; + //i -> print(std::cerr); + } + + unlockQueues(); + + return i; +} + + /* locking +void fileLook::lockQueues() +{} + +void fileLook::unlockQueues() +{} + +void fileLook::lockDirs() +{} + +void fileLook::unlockDirs() +{} + +************/ + +void fileLook::run() +{ + std::cerr << "fileLook::run() started." << std::endl; + processQueue(); +} + +void fileLook::processQueue() +{ + while(1) + { + + PQItem *i = NULL; + + //std::cerr << "fileLook::run() -> lockQueues()" << std::endl; + lockQueues(); + + if (mIncoming.size() > 0) + { + i = mIncoming.front(); + mIncoming.pop_front(); + } + + unlockQueues(); + //std::cerr << "fileLook::run() -> unlockQueues()" << std::endl; + + if (i) + { + /* process item */ + + /* look up the directory */ + std::cerr << "fileLook::run() -> loadDirectory()" << std::endl; + loadDirectory(i); + } + else + { + /* sleep */ + //std::cerr << "fileLook::sleep() ;)" << std::endl; +#ifndef WINDOWS_SYS /* UNIX */ + usleep(50000); /* 50 milli secs (1/20)th of sec */ +#else + Sleep(50); /* 50 milli secs (1/20)th of sec */ +#endif + + } + } + +} + + +/* THIS IS THE ONLY BIT WHICH DEPENDS ON PQITEM STRUCTURE */ +void fileLook::loadDirectory(PQItem *dir) +{ + /* extract the path */ + std::cerr << "loadDirectory()" << std::endl; + + /* check its a PQFileItem */ + PQFileItem *fi = dynamic_cast(dir); + if (!fi) + { + return; + } + + /* we need the root directory, and the rest */ + std::string req_dir = fi -> path; + std::string root_dir = RsDirUtil::getRootDir(req_dir); + std::string rest_path = RsDirUtil::removeRootDirs(req_dir, root_dir); + + /* get directory listing */ + std::string full_root = "/dev/null"; + + if (root_dir == "") + { + std::cerr << "loadDirectory() Root Request" << std::endl; + loadRootDirs(fi); + } + + int err = 0; + + lockDirs(); + { + /* check that dir is one of the shared */ + std::map::iterator it; + it = sharedDirs.find(root_dir.c_str()); + if (it == sharedDirs.end()) + { + err = 1; + } + else + { + full_root = it -> second; + } + } + unlockDirs(); + std::cerr << "root_dir = [" << root_dir << "]" << std::endl; + std::cerr << "full_root = " << full_root << std::endl; + + if (err) + { + std::cerr << "Rejected: root_dir = " << root_dir << std::endl; + for(unsigned int i = 0; i < root_dir.length(); i++) + { + std::cerr << "[" << (int) root_dir[i] << "]:[" << (int) root_dir[i] << "]" << std::endl; + } + + std::map::iterator it; + for(it = sharedDirs.begin(); it != sharedDirs.end(); it++) + { + std::cerr << "Possible Root: " << it -> first << std::endl; + } + + return; + } + + /* otherwise load directory */ + std::string full_path = full_root; + + if (rest_path.length() > 0) + { + full_path += "/" + rest_path; + } + + std::cerr << "Looking up path:" << full_path << std::endl; + + /* lookup base dir */ + DIR *rootdir = opendir(full_path.c_str()); + struct dirent *rootent, *subent; + struct stat buf; + + if (rootdir == NULL) { + /* error */ + std::cerr << "Error in Path" << std::endl; + return; + } + + std::list subitems; + int rootcount = 0; + while(NULL != (rootent = readdir(rootdir))) + { + /* iterate through the entries */ + bool issubdir = false; + + /* check entry type */ + std::string fname = rootent -> d_name; + std::string fullname = full_path + "/" + fname; + std::cerr << "Statting dirent: " << fullname < d_name; + if ( +#ifndef WINDOWS_SYS /* UNIX */ + (DT_DIR == subent -> d_type) && /* Only works under Unix */ +#else /* WIndows */ +#endif + ((fname == ".") || (fname == ".."))) + { + /* do not add! */ + std::cerr << "Removed entry:" << fname << " from subdir count" << std::endl; + } + else + { + subdirno++; + } + } + /* clean up dir */ + closedir(subdir); + } + rootcount++; + + std::string subname = rootent -> d_name; + + /* create an item */ + PQFileItem *finew = fi -> clone(); + + // path should be copied auto. + finew -> name = subname; + + if (issubdir) + { + finew -> reqtype = PQIFILE_DIRLIST_DIR; + finew -> size = subdirno; /* number of entries in dir */ + } + else + { + finew -> reqtype = PQIFILE_DIRLIST_FILE; + finew -> size = buf.st_size; + } + subitems.push_back(finew); + } + + /* clean up dir */ + closedir(rootdir); + + + /* if necessary create Root Entry */ + + + /* if constructing Tree - do it here */ + + /* put on queue */ + lockQueues(); + + std::list::iterator it; + for(it = subitems.begin(); it != subitems.end(); it++) + { + /* push onto outgoing queue */ + mOutgoing.push_back(*it); + } + subitems.clear(); + + unlockQueues(); +}; + +void fileLook::loadRootDirs(PQFileItem *dir) +{ + /* extract the path */ + std::cerr << "loadRootDirs()" << std::endl; + + dir -> path = ""; + int rootcount = 0; + + lockDirs(); + + std::list subitems; + std::map::iterator it; + for(it = sharedDirs.begin(); it != sharedDirs.end(); it++) + { + + /* lookup base dir */ + DIR *entdir = opendir(it -> second.c_str()); + struct dirent *subent; + + if (!entdir) + { + std::cerr << "Bad Shared Dir: " << it->second << std::endl; + continue; + } + + int subdirno = 0; + while(NULL != (subent = readdir(entdir))) + { + + std::string fname = subent -> d_name; + if ( +#ifndef WINDOWS_SYS /* UNIX */ + (DT_DIR == subent -> d_type) && /* Only works under Unix */ +#else /* WIndows */ +#endif + ((fname == ".") || (fname == ".."))) + { + /* do not add! */ + std::cerr << "Removed entry:" << fname << " from subdir count" << std::endl; + } + else + { + subdirno++; + } + } + + closedir(entdir); + + rootcount++; + + /* create an item */ + PQFileItem *finew = dir -> clone(); + + // path should be copied auto. + finew -> name = it -> first; + finew -> reqtype = PQIFILE_DIRLIST_DIR; + finew -> size = subdirno; /* number of entries in dir */ + + subitems.push_back(finew); + } + unlockDirs(); + + + /* put on queue */ + lockQueues(); + + std::list::iterator it2; + for(it2 = subitems.begin(); it2 != subitems.end(); it2++) + { + /* push onto outgoing queue */ + mOutgoing.push_back(*it2); + } + subitems.clear(); + + unlockQueues(); +}; + + +PQFileItem *fileLook::findFileEntry(PQFileItem *fi) +{ + /* extract the path */ + std::cerr << "findFileEntry()" << std::endl; + + /* we need the root directory, and the rest */ + std::string req_dir = fi -> path; + std::string root_dir = RsDirUtil::getRootDir(req_dir); + std::string rest_path = RsDirUtil::removeRootDirs(req_dir, root_dir); + + /* get directory listing */ + std::string full_root = "/dev/null"; + + int err = 0; + + lockDirs(); + { + /* check that dir is one of the shared */ + std::map::iterator it; + it = sharedDirs.find(root_dir.c_str()); + if (it == sharedDirs.end()) + { + err = 1; + } + else + { + full_root = it -> second; + } + } + unlockDirs(); + + PQFileItem *rtn = NULL; + if (err) + return rtn; + + rtn = fi -> clone(); + rtn -> path = full_root + "/" + rest_path; + + return rtn; +} + diff --git a/libretroshare/src/dbase/filelook.h b/libretroshare/src/dbase/filelook.h new file mode 100644 index 000000000..d6452a046 --- /dev/null +++ b/libretroshare/src/dbase/filelook.h @@ -0,0 +1,113 @@ +/* + * "$Id: filelook.h,v 1.1 2007-02-19 20:08:30 rmf24 Exp $" + * + * Other Bits for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + +#ifndef MRK_PQI_FILELOOK +#define MRK_PQI_FILELOOK + +/* + * The Basic Low-Level Local File/Directory Interface. + * + * Requests are queued, and serviced (slowly) + * + * + * So this is a simple + * Local Lookup service, + * with a locked threaded interface. + * + * Input: + * "lookup directory". + * + * Output: + * "FileItems" + * "DirItems" + * + * + * a file index. + * + * initiated with a list of directories. + * + */ + +#include +#include + +#include "pqi/pqi.h" +#include "util/rsthreads.h" + + +class fileLook: public RsThread +{ + public: + + fileLook(); +virtual ~fileLook(); + + /* threading */ +virtual void run(); /* overloaded */ + + /* interface */ +void setSharedDirectories(std::list dirs); + + /* I/O */ +int lookUpDirectory(PQItem *i); + /* This one goes directly -> for speed, actually just a basepath lookup (no file check) */ +PQFileItem *findFileEntry(PQFileItem *); + +PQItem *getResult(); + + private: + + + /* locking */ +void lockQueues() { qMtx.lock(); } +void unlockQueues() { qMtx.unlock(); } + +void lockDirs() { dMtx.lock(); } +void unlockDirs() { dMtx.unlock(); } + + RsMutex qMtx; + RsMutex dMtx; + + /* threading queues */ +std::list mIncoming; +std::list mOutgoing; + +std::map sharedDirs; + + /* Processing Fns */ + +void processQueue(); + +/* THIS IS THE ONLY BIT WHICH DEPENDS ON PQITEM STRUCTURE */ +void loadDirectory(PQItem *dir); +void loadRootDirs(PQFileItem *dir); + +}; + + + +#endif + diff --git a/libretroshare/src/dbase/fimonitor.cc b/libretroshare/src/dbase/fimonitor.cc new file mode 100644 index 000000000..77b0cfa0e --- /dev/null +++ b/libretroshare/src/dbase/fimonitor.cc @@ -0,0 +1,672 @@ +/* + * RetroShare FileCache Module: fimonitor.cc + * + * Copyright 2004-2007 by Robert Fernie. + * + * 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 "dbase/fimonitor.h" +#include "util/rsdir.h" +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#define FIM_DEBUG 1 + +FileIndexMonitor::FileIndexMonitor(std::string cachedir, std::string pid) + :CacheSource(CACHE_TYPE_FILE_INDEX, false, cachedir), fi(pid), + pendingDirs(false), pendingForceCacheWrite(false) + +{ + updatePeriod = 60; +} + + +FileIndexMonitor::~FileIndexMonitor() +{ + /* Data cleanup - TODO */ + return; +} + +bool FileIndexMonitor::findLocalFile(std::string hash, + std::string &fullpath, uint32_t &size) +{ + std::list results; + bool ok = false; + + fiMutex.lock(); { /* LOCKED DIRS */ + + std::cerr << "FileIndexMonitor::findLocalFile() Hash: " << hash << std::endl; + /* search through the fileIndex */ + fi.searchHash(hash, results); + if (results.size() > 0) + { + /* find the full path for the first entry */ + FileEntry *fe = results.front(); + DirEntry *de = fe->parent; /* all files must have a valid parent! */ + + std::cerr << "FileIndexMonitor::findLocalFile() Found Name: " << fe->name << std::endl; + std::string shpath = RsDirUtil::removeRootDir(de->path); + std::string basedir = RsDirUtil::getRootDir(de->path); + std::string realroot = findRealRoot(basedir); + + /* construct full name */ + if (realroot.length() > 0) + { + fullpath = realroot + "/"; + if (shpath != "") + { + fullpath += shpath + "/"; + } + fullpath += fe->name; + + size = fe->size; + ok = true; + } + std::cerr << "FileIndexMonitor::findLocalFile() Found Path: " << fullpath << std::endl; + std::cerr << "FileIndexMonitor::findLocalFile() Found Size: " << size << std::endl; + } + + + } fiMutex.unlock(); /* UNLOCKED DIRS */ + + return ok; +} + + +bool FileIndexMonitor::loadCache(const CacheData &data) /* called with stored data */ +{ + bool ok = false; + + fiMutex.lock(); { /* LOCKED DIRS */ + + //fi.root->name = data.pid; + + /* More error checking needed here! */ + if ((ok = fi.loadIndex(data.path + '/' + data.name, + data.hash, data.size))) + { + std::cerr << "FileIndexMonitor::loadCache() Success!"; + std::cerr << std::endl; + } + else + { + std::cerr << "FileIndexMonitor::loadCache() Failed!"; + std::cerr << std::endl; + } + + } fiMutex.unlock(); /* UNLOCKED DIRS */ + + if (ok) + { + return updateCache(data); + } + return false; +} + +bool FileIndexMonitor::updateCache(const CacheData &data) /* we call this one */ +{ + return refreshCache(data); +} + + +void FileIndexMonitor::setPeriod(int period) +{ + updatePeriod = period; +} + +void FileIndexMonitor::run() +{ + + updateCycle(); + + while(1) + { + + for(int i = 0; i < updatePeriod; i++) + { + +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS + sleep(1); +#else + + Sleep(1000); +#endif +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ + + /* check dirs if they've changed */ + if (internal_setSharedDirectories()) + { + break; + } + } + + updateCycle(); + } +} + + +void FileIndexMonitor::updateCycle() +{ + time_t startstamp = time(NULL); + + /* iterate through all out-of-date directories */ + bool moretodo = true; + bool fiMods = false; + + while(moretodo) + { + /* sleep a bit for each loop */ +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS + usleep(100000); /* 1/10 sec */ +#else + + Sleep(100); +#endif +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ + + /* check if directories have been updated */ + if (internal_setSharedDirectories()) + { + /* reset start time */ + startstamp = time(NULL); + } + + /* Handle a Single out-of-date directory */ + + time_t stamp = time(NULL); + + /* lock dirs */ + fiMutex.lock(); + + DirEntry *olddir = fi.findOldDirectory(startstamp); + + if (!olddir) + { + /* finished */ + fiMutex.unlock(); + moretodo = false; + continue; + } + +#ifdef FIM_DEBUG + std::cerr << "FileIndexMonitor::updateCycle()"; + std::cerr << " Checking: " << olddir->path << std::endl; +#endif + + + FileEntry fe; + /* entries that need to be checked properly */ + std::list filesToHash; + std::list::iterator hit; + + /* determine the full root path */ + std::string dirpath = olddir->path; + std::string rootdir = RsDirUtil::getRootDir(olddir->path); + std::string remdir = RsDirUtil::removeRootDir(olddir->path); + + std::string realroot = findRealRoot(rootdir); + + std::string realpath = realroot; + if (remdir != "") + { + realpath += "/" + remdir; + } + + +#ifdef FIM_DEBUG + std::cerr << "FileIndexMonitor::updateCycle()"; + std::cerr << " RealPath: " << realpath << std::endl; +#endif + + /* check for the dir existance */ + DIR *dir = opendir(realpath.c_str()); + if (!dir) + { + std::cerr << "FileIndexMonitor::updateCycle()"; + std::cerr << " Missing Dir: " << realpath << std::endl; + /* bad directory - delete */ + if (!fi.removeOldDirectory(olddir->parent->path, olddir->name, stamp)) + { + /* bad... drop out of updateCycle() - hopefully the initial cleanup + * will deal with it next time! - otherwise we're in a continual loop + */ + std::cerr << "FileIndexMonitor::updateCycle()"; + std::cerr << "ERROR Failed to Remove: " << olddir->path << std::endl; + } + + fiMutex.unlock(); + continue; + } + + /* update this dir - as its valid */ + fe.name = olddir->name; + fi.updateDirEntry(olddir->parent->path, fe, stamp); + + /* update the directories and files here */ + std::map::iterator dit; + std::map::iterator fit; + + /* flag existing subdirs as old */ + for(dit = olddir->subdirs.begin(); dit != olddir->subdirs.end(); dit++) + { + fe.name = (dit->second)->name; + /* set the age as out-of-date so that it gets checked */ + fi.updateDirEntry(olddir->path, fe, 0); + } + + /* now iterate through the directory... + * directories - flags as old, + * files checked to see if they have changed. (rehashed) + */ + + struct dirent *dent; + struct stat buf; + + while(NULL != (dent = readdir(dir))) + { + /* check entry type */ + std::string fname = dent -> d_name; + std::string fullname = realpath + "/" + fname; + + if (-1 != stat(fullname.c_str(), &buf)) + { +#ifdef FIM_DEBUG + std::cerr << "buf.st_mode: " << buf.st_mode <path, fe, 0); + } + else if (S_ISREG(buf.st_mode)) + { + /* is file */ + bool toadd = false; +#ifdef FIM_DEBUG + std::cerr << "Is File: " << fullname << std::endl; +#endif + + fe.name = fname; + fe.size = buf.st_size; + fe.modtime = buf.st_mtime; + + /* check if it exists already */ + fit = olddir->files.find(fname); + if (fit == olddir->files.end()) + { + /* needs to be added */ +#ifdef FIM_DEBUG + std::cerr << "File Missing from List:" << fname << std::endl; +#endif + toadd = true; + } + else + { + /* check size / modtime are the same */ + if ((fe.size != (fit->second)->size) || + (fe.modtime != (fit->second)->modtime)) + { +#ifdef FIM_DEBUG + std::cerr << "File ModTime/Size changed:" << fname << std::endl; +#endif + toadd = true; + } + else + { + /* keep old info */ + fe.hash = (fit->second)->hash; + } + } + if (toadd) + { + /* push onto Hash List */ +#ifdef FIM_DEBUG + std::cerr << "Adding to Update List: "; + std::cerr << olddir->path; + std::cerr << fname << std::endl; +#endif + filesToHash.push_back(fe); + } + else + { + /* update with new time */ +#ifdef FIM_DEBUG + std::cerr << "File Hasn't Changed:" << fname << std::endl; +#endif + fi.updateFileEntry(olddir->path, fe, stamp); + } + } + else + { + /* unknown , ignore */ + continue; + } + } + } + + + /* now we unlock the lock, and iterate through the + * next files - hashing them, before adding into the system. + */ + /* for safety - blank out data we cannot use (TODO) */ + olddir = NULL; + + /* close directory */ + closedir(dir); + + /* unlock dirs */ + fiMutex.unlock(); + + if (filesToHash.size() > 0) + { + std::cerr << "List of Files to rehash in: " << dirpath << std::endl; + fiMods = true; + } + + for(hit = filesToHash.begin(); hit != filesToHash.end(); hit++) + { + std::cerr << "\t" << hit->name << std::endl; + } + + if (filesToHash.size() > 0) + { + std::cerr << std::endl; + } + + /* update files */ + for(hit = filesToHash.begin(); hit != filesToHash.end(); hit++) + { + if (hashFile(realpath, (*hit))) + { + /* lock dirs */ + fiMutex.lock(); + + /* update fileIndex with new time */ + /* update with new time */ + fi.updateFileEntry(dirpath, *hit, stamp); + + /* unlock dirs */ + fiMutex.unlock(); + } + else + { + std::cerr << "Failed to Hash File!" << std::endl; + } + + /* don't hit the disk too hard! */ +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS + usleep(10000); /* 1/100 sec */ +#else + + Sleep(10); +#endif +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ + + } + } + + fiMutex.lock(); { /* LOCKED DIRS */ + + /* finished update cycle - cleanup extra dirs/files that + * have not had their timestamps updated. + */ + + if (fi.cleanOldEntries(startstamp)) + { + //fiMods = true; + } + + /* print out the new directory structure */ + + fi.printFileIndex(std::cerr); + + /* now if we have changed things -> restore file/hash it/and + * tell the CacheSource + */ + + if (pendingForceCacheWrite) + { + pendingForceCacheWrite = false; + fiMods = true; + } + + } fiMutex.unlock(); /* UNLOCKED DIRS */ + + + if (fiMods) + { + /* store to the cacheDirectory */ + fiMutex.lock(); { /* LOCKED DIRS */ + + std::string path = getCacheDir(); + std::ostringstream out; + out << "fc-own-" << time(NULL) << ".rsfc"; + + std::string tmpname = out.str(); + std::string fname = path + "/" + tmpname; + +#ifdef FIM_DEBUG + std::cerr << "FileIndexMonitor::updateCycle() FileIndex modified ... updating"; + std::cerr << std::endl; + std::cerr << "FileIndexMonitor::updateCycle() saving to: " << fname; + std::cerr << std::endl; +#endif + + std::string calchash; + uint32_t size; + + fi.saveIndex(fname, calchash, size); + +#ifdef FIM_DEBUG + std::cerr << "FileIndexMonitor::updateCycle() saved with hash:" << calchash; + std::cerr << std::endl; +#endif + + /* should clean up the previous cache.... */ + + /* flag as new info */ + CacheData data; + data.pid = fi.root->id; + data.cid.type = getCacheType(); + data.cid.subid = 0; + data.path = path; + data.name = tmpname; + data.hash = calchash; + data.size = size; + data.recvd = time(NULL); + + updateCache(data); + +#ifdef FIM_DEBUG + std::cerr << "FileIndexMonitor::updateCycle() called updateCache()"; + std::cerr << std::endl; +#endif + + } fiMutex.unlock(); /* UNLOCKED DIRS */ + } +} + + /* interface */ +void FileIndexMonitor::setSharedDirectories(std::list dirs) +{ + fiMutex.lock(); { /* LOCKED DIRS */ + + pendingDirs = true; + pendingDirList = dirs; + + } fiMutex.unlock(); /* UNLOCKED DIRS */ +} + +bool FileIndexMonitor::internal_setSharedDirectories() +{ + int i; + fiMutex.lock(); /* LOCKED DIRS */ + + if (!pendingDirs) + { + fiMutex.unlock(); /* UNLOCKED DIRS */ + return false; + } + + pendingDirs = false; + pendingForceCacheWrite = true; + + /* clear old directories */ + directoryMap.clear(); + + /* iterate through the directories */ + std::list::iterator it; + std::map::const_iterator cit; + for(it = pendingDirList.begin(); it != pendingDirList.end(); it++) + { + /* get the head directory */ + std::string root_dir = *it; + std::string top_dir = RsDirUtil::getTopDir(root_dir); + + /* if unique -> add, else add modifier */ + bool unique = false; + for(i = 0; !unique; i++) + { + std::string tst_dir = top_dir; + if (i > 0) + { + std::ostringstream out; + out << "-" << i; + tst_dir += out.str(); + } + if (directoryMap.end()== (cit=directoryMap.find(tst_dir))) + { + unique = true; + /* add it! */ + directoryMap[tst_dir.c_str()] = root_dir; + std::cerr << "Added [" << tst_dir << "] => " << root_dir << std::endl; + } + } + } + + /* now we've decided on the 'root' dirs set them to the + * fileIndex + */ + std::list topdirs; + for(cit = directoryMap.begin(); cit != directoryMap.end(); cit++) + { + topdirs.push_back(cit->first); + } + + fi.setRootDirectories(topdirs, 0); + + fiMutex.unlock(); /* UNLOCKED DIRS */ + + return true; +} + + + + +/* lookup directory function */ +std::string FileIndexMonitor::findRealRoot(std::string rootdir) +{ + /**** MUST ALREADY BE LOCKED ****/ + std::string realroot = ""; + + std::map::const_iterator cit; + if (directoryMap.end()== (cit=directoryMap.find(rootdir))) + { + std::cerr << "FileIndexMonitor::findRealRoot() Invalid RootDir: "; + std::cerr << rootdir << std::endl; + } + else + { + realroot = cit->second; + } + + return realroot; +} + + + +bool FileIndexMonitor::hashFile(std::string fullpath, FileEntry &fent) +{ + std::string f_hash = fullpath + "/" + fent.name; + FILE *fd; + int len; + SHA_CTX *sha_ctx = new SHA_CTX; + unsigned char sha_buf[SHA_DIGEST_LENGTH]; + unsigned char gblBuf[512]; + + std::cerr << "File to hash = " << f_hash << std::endl; + if (NULL == (fd = fopen(f_hash.c_str(), "rb"))) return false; + + SHA1_Init(sha_ctx); + while((len = fread(gblBuf,1, 512, fd)) > 0) + { + SHA1_Update(sha_ctx, gblBuf, len); + } + + /* reading failed for some reason */ + if (ferror(fd)) + { + delete sha_ctx; + fclose(fd); + return false; + } + + SHA1_Final(&sha_buf[0], sha_ctx); + + /* TODO: Actually we should store the hash data as binary ... + * but then it shouldn't be put in a string. + */ + + std::ostringstream tmpout; + for(int i = 0; i < SHA_DIGEST_LENGTH; i++) + { + tmpout << std::setw(2) << std::setfill('0') << std::hex << (unsigned int) (sha_buf[i]); + } + fent.hash = tmpout.str(); + + delete sha_ctx; + fclose(fd); + return true; +} + diff --git a/libretroshare/src/dbase/fimonitor.h b/libretroshare/src/dbase/fimonitor.h new file mode 100644 index 000000000..f44d9aa2c --- /dev/null +++ b/libretroshare/src/dbase/fimonitor.h @@ -0,0 +1,120 @@ +/* + * RetroShare FileCache Module: fimonitor.h + * + * Copyright 2004-2007 by Robert Fernie. + * + * 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". + * + */ + +#ifndef FILE_INDEX_MONITOR_H +#define FILE_INDEX_MONITOR_H + +#include "dbase/findex.h" +#include "dbase/cachestrapper.h" +#include "util/rsthreads.h" + +/****************************************************************************************** + * The Local Monitoring Class: FileIndexMonitor. + * + * This periodically scans the directory tree, and updates any modified directories/files. + * + *****************************************************************************************/ + +/****************************************************************************************** + STILL TODO: + + (1) Implement Hash function. + +bool FileIndexMonitor::hashFile(std::string path, FileEntry &fi); + + (2) Add Shared directory controls to Monitor. + +int FileIndexMonitor::addSharedDirectory(std::path); +int FileIndexMonitor::removeSharedDirectory(std::path); +std::string FileIndexMonitor::findRealRoot(std::string base); + + These must be split into / and the mapping saved. + eg: addSharedDirectory("c:/home/stuff/dir1") --> "c:/home/stuff" <-> "dir1" + This code has been written already, and can just be moved over. + + FOR LATER: + (2) Port File/Directory lookup code to windoze. (or compile dirent.c under windoze) + (3) Add Load/Store interface to FileIndexMonitor. (later) + (4) Integrate with real Thread/Mutex code (last thing to do) + +******************************************************************************************/ + + + +/****************************************************************************************** + * FileIndexMonitor + *****************************************************************************************/ + +class FileIndexMonitor: public CacheSource, public RsThread +{ + public: + FileIndexMonitor(std::string cachedir, std::string pid); +virtual ~FileIndexMonitor(); + + /* external interface for filetransfer */ +bool findLocalFile(std::string hash, std::string &fullpath, uint32_t &size); + + + /* Interacting with CacheSource */ + /* overloaded from CacheSource */ +virtual bool loadCache(const CacheData &data); /* called with stored data */ +bool updateCache(const CacheData &data); /* we call when we have a new cache for others */ + + + /* the FileIndexMonitor inner workings */ +virtual void run(); /* overloaded from RsThread */ +void updateCycle(); + +void setSharedDirectories(std::list dirs); +void setPeriod(int insecs); + + /* util fns */ + + private: + + /* the mutex should be locked before calling... these. */ +std::string findRealRoot(std::string base); /* To Implement */ +bool hashFile(std::string path, FileEntry &fi); /* To Implement */ + + /* data */ + + RsMutex fiMutex; + + FileIndex fi; + + int updatePeriod; + std::map directoryMap; /* used by findRealRoot */ + + /* flags to kick - if we were busy or sleeping */ + bool pendingDirs; + bool pendingForceCacheWrite; + + std::list pendingDirList; +bool internal_setSharedDirectories(); + +}; + + +#endif + + diff --git a/libretroshare/src/dbase/fimontest.cc b/libretroshare/src/dbase/fimontest.cc new file mode 100644 index 000000000..19d1b3bc8 --- /dev/null +++ b/libretroshare/src/dbase/fimontest.cc @@ -0,0 +1,87 @@ +/* + * RetroShare FileCache Module: fimontest.cc + * + * Copyright 2004-2007 by Robert Fernie. + * + * 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 "findex.h" +#include "fimonitor.h" + +#include + +void usage(char *name) +{ + std::cerr << "Usage: " << name << " [-p ] shareDir1 [shareDir2 [shareDir3 [...]]]"; + std::cerr << std::endl; + exit(1); +} + + + +int main(int argc, char **argv) +{ + /* handle commandline arguments */ + int c; + int period = 60; /* recheck period in seconds */ + + while((c = getopt(argc, argv,"p:")) != -1) + { + switch(c) + { + case 'p': + period = atoi(optarg); + break; + default: + std::cerr << "Bad Option."; + std::cerr << std::endl; + usage(argv[0]); + break; + } + } + + std::list rootdirs; + + /* add all the rest of the commandline arguments to rootdirs list */ + for(; optind < argc; optind++) + { + rootdirs.push_back(argv[optind]); + std::cerr << "Adding shared directory: " << argv[optind] << std::endl; + } + + if (rootdirs.size() < 1) + { + usage(argv[0]); + } + + sleep(1); + + FileIndexMonitor mon("", "OWN ID"); + + /* setup monitor */ + mon.setPeriod(period); + mon.setSharedDirectories(rootdirs); + + /* simulate running the thread */ + mon.run(); + + return 1; +} + + diff --git a/libretroshare/src/dbase/findex.cc b/libretroshare/src/dbase/findex.cc new file mode 100644 index 000000000..32cb8465a --- /dev/null +++ b/libretroshare/src/dbase/findex.cc @@ -0,0 +1,1062 @@ +/* + * RetroShare FileCache Module: findex.cc + * + * Copyright 2004-2007 by Robert Fernie, Kefei Zhou. + * + * 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 "dbase/findex.h" +#include "rsiface/rsexpr.h" +#include "util/rsdir.h" + +#include +#include +#include +#include + +#include + +#define FI_DEBUG 1 + + +DirEntry::~DirEntry() +{ + /* cleanup */ + std::map::iterator dit; + std::map::iterator fit; + + for(dit = subdirs.begin(); dit != subdirs.end(); dit++) + { + delete (dit->second); + } + subdirs.clear(); + + for(fit = files.begin(); fit != files.end(); fit++) + { + delete (fit->second); + } + files.clear(); +} + + +int DirEntry::checkParentPointers() +{ +#ifdef FI_DEBUG + updateChildRows(); + std::map::iterator dit; + for(dit = subdirs.begin(); dit != subdirs.end(); dit++) + { + /* debug check */ + (dit->second)->checkParentPointers(); + } +#endif + return 1; +} + + + +int DirEntry::updateChildRows() +{ + /* iterate through children and set row (parent should be good) */ + std::map::iterator dit; + std::map::iterator fit; + int i = 0; + for(dit = subdirs.begin(); dit != subdirs.end(); dit++) + { +#ifdef FI_DEBUG + /* debug check */ + if ((dit->second)->parent != this) + { + std::cerr << "DirEntry::updateChildRows()"; + std::cerr << "****WARNING subdir Parent pointer invalid!"; + std::cerr << std::endl; + (dit->second)->parent = this; + } +#endif + (dit->second)->row = i++; + } + + for(fit = files.begin(); fit != files.end(); fit++) + { +#ifdef FI_DEBUG + /* debug check */ + if ((fit->second)->parent != this) + { + std::cerr << "DirEntry::updateChildRows()"; + std::cerr << "****WARNING file Parent pointer invalid!"; + std::cerr << std::endl; + (fit->second)->parent = this; + } +#endif + (fit->second)->row = i++; + } + return 1; +} + + +int DirEntry::removeDir(std::string name) +{ + /* if it doesn't exist - add */ + std::map::iterator it; + DirEntry *ndir = NULL; + if (subdirs.end() != (it = subdirs.find(name))) + { +#ifdef FI_DEBUG_ALL + std::cerr << "DirEntry::removeDir() Cleaning up dir: " << name; + std::cerr << std::endl; +#endif + ndir = (it->second); + + subdirs.erase(it); + delete ndir; + /* update row counters */ + updateChildRows(); + return 1; + } + +#ifdef FI_DEBUG + std::cerr << "DirEntry::removeDir() missing Entry: " << name; + std::cerr << std::endl; +#endif + return 0; +} + + +int DirEntry::removeFile(std::string name) +{ + /* if it doesn't exist - add */ + std::map::iterator it; + FileEntry *nfile = NULL; + + if (files.end() != (it = files.find(name))) + { +#ifdef FI_DEBUG_ALL + std::cerr << "DirEntry::removeFile() removing File: " << name; + std::cerr << std::endl; +#endif + nfile = (it->second); + + files.erase(it); + delete nfile; + /* update row counters */ + updateChildRows(); + return 1; + } + +#ifdef FI_DEBUG + std::cerr << "DirEntry::removeFile() missing Entry: " << name; + std::cerr << std::endl; +#endif + return 0; +} + + + + +int DirEntry::removeOldDir(std::string name, time_t old) +{ + std::map::iterator it; + DirEntry *ndir = NULL; + if (subdirs.end() != (it = subdirs.find(name))) + { + ndir = (it->second); + if (ndir->updtime < old) + { +#ifdef FI_DEBUG_ALL + std::cerr << "DirEntry::removeOldDir() Removing Old dir: " << name; + std::cerr << std::endl; +#endif + subdirs.erase(it); + delete ndir; + + /* update row counters */ + updateChildRows(); + return 1; + } +#ifdef FI_DEBUG_ALL + std::cerr << "DirEntry::removeOldDir() Keeping UptoDate dir: " << name; + std::cerr << std::endl; +#endif + return 0; + } + +#ifdef FI_DEBUG + std::cerr << "DirEntry::removeDir() missing Entry: " << name; + std::cerr << std::endl; +#endif + return 0; +} + + + + +int DirEntry::removeOldEntries(time_t old, bool recursive) +{ + /* remove old dirs from our lists -> then do children and files */ + + /* get all dirs with old time */ + std::list removeList; + std::map::iterator it; + for(it = subdirs.begin(); it != subdirs.end(); it++) + { + if ((it->second)->updtime < old) + { + removeList.push_back(it->second); + } + } + + /* now remove the old entries */ + std::list::iterator rit; + for(rit = removeList.begin(); rit != removeList.end(); rit++) + { + removeDir((*rit)->name); + } + + if (recursive) + { + /* now handle children */ + for(it = subdirs.begin(); it != subdirs.end(); it++) + { + (it->second)->removeOldEntries(old, recursive); + } + } + + /* now handle files similarly */ + std::list removeFileList; + std::map::iterator fit; + for(fit = files.begin(); fit != files.end(); fit++) + { + if ((fit->second)->updtime < old) + { + removeFileList.push_back(fit->second); + } + } + + /* now remove the old entries */ + std::list::iterator rfit; + for(rfit = removeFileList.begin(); rfit != removeFileList.end(); rfit++) + { + removeFile((*rfit)->name); + } + + return 1; +} + + +DirEntry *DirEntry::findOldDirectory(time_t old) +{ + /* check if one of our directories is old ... + */ + + /* get all dirs with old time */ + std::map::iterator it; + for(it = subdirs.begin(); it != subdirs.end(); it++) + { + if ((it->second)->updtime < old) + { + return (it->second); + } + } + + /* + * else check chlidren. + */ + + for(it = subdirs.begin(); it != subdirs.end(); it++) + { + DirEntry *olddir = (it->second)->findOldDirectory(old); + if (olddir) + { + return olddir; + } + } + + return NULL; +} + + +DirEntry *DirEntry::findDirectory(std::string fpath) +{ + std::string nextdir = RsDirUtil::getRootDir(fpath); + std::map::iterator it; + if (subdirs.end() == (it = subdirs.find(nextdir))) + { +#ifdef FI_DEBUG + std::cerr << "DirEntry::findDirectory() Missing subdir:"; + std::cerr << "\"" << nextdir << "\""; + std::cerr << std::endl; +#endif + return NULL; + } + + std::string rempath = RsDirUtil::removeRootDir(fpath); + if (rempath == "") + { + return it->second; + } + + return (it->second)->findDirectory(rempath); +} + + +int DirEntry::updateDirectories(std::string fpath, int new_pop, int new_modtime) +{ + int ret = 1; + if (path != "") /* if not there -> continue down tree */ + { + std::string nextdir = RsDirUtil::getRootDir(fpath); + std::map::iterator it; + if (subdirs.end() == (it = subdirs.find(nextdir))) + { + return 0; + } + + std::string rempath = RsDirUtil::removeRootDir(fpath); + ret = (it->second)->updateDirectories(rempath, new_pop, new_modtime); + } + + if (ret) /* if full path is okay -> update and return ok */ + { + /* this is assumes that pop always increases! */ + if (new_pop > pop) + { + pop = new_pop; + } + if (new_modtime > modtime) + { + modtime = new_modtime; + } + } + return ret; +} + +DirEntry *DirEntry::updateDir(FileEntry fe, time_t utime) +{ + /* if it doesn't exist - add */ + std::map::iterator it; + DirEntry *ndir = NULL; + if (subdirs.end() == (it = subdirs.find(fe.name))) + { +#ifdef FI_DEBUG_ALL + std::cerr << "DirEntry::updateDir() Adding Entry"; + std::cerr << std::endl; +#endif + ndir = new DirEntry(); + ndir -> parent = this; + ndir -> path = path + "/" + fe.name; + ndir -> name = fe.name; + ndir -> pop = 0; + ndir -> modtime = 0; + ndir -> updtime = utime; + + subdirs[fe.name] = ndir; + + /* update row counters */ + updateChildRows(); + return ndir; + } + +#ifdef FI_DEBUG_ALL + std::cerr << "DirEntry::updateDir() Updating Entry"; + std::cerr << std::endl; +#endif + + /* update utime */ + ndir = (it->second); + ndir->updtime = utime; + + return ndir; +} + + +FileEntry *DirEntry::updateFile(FileEntry fe, time_t utime) +{ + /* if it doesn't exist - add */ + std::map::iterator it; + FileEntry *nfile = NULL; + if (files.end() == (it = files.find(fe.name))) + { + +#ifdef FI_DEBUG_ALL + std::cerr << "DirEntry::updateFile() Adding Entry"; + std::cerr << std::endl; +#endif + + nfile = new FileEntry(); + nfile -> parent = this; + nfile -> name = fe.name; + nfile -> hash = fe.hash; + nfile -> size = fe.size; + nfile -> pop = 0; + nfile -> modtime = fe.modtime; + nfile -> updtime = utime; + + files[fe.name] = nfile; + + /* update row counters */ + updateChildRows(); + return nfile; + } + + +#ifdef FI_DEBUG_ALL + std::cerr << "DirEntry::updateFile() Updating Entry"; + std::cerr << std::endl; +#endif + + + /* update utime */ + nfile = (it->second); + nfile -> parent = this; + nfile -> name = fe.name; + nfile -> hash = fe.hash; + nfile -> size = fe.size; + nfile -> modtime = fe.modtime; + nfile -> updtime = utime; + //nfile -> pop = 0; // not handled here. + + return nfile; +} + + +int FileEntry::print(std::ostream &out) +{ + /* print this dir, then subdirs, then files */ + + out << "file "; + out << std::setw(3) << std::setfill('0') << row; + out << " [" << updtime << "/" << modtime << "] : "; + + if (parent) + out << parent->path; + else + out << "[MISSING PARENT]"; + + out << " " << name; + out << " [ s: " << size << " ] ==> "; + out << " [ " << hash << " ]"; + out << std::endl; + return 1; +} + + +int DirEntry::print(std::ostream &out) +{ + /* print this dir, then subdirs, then files */ + out << "dir "; + out << std::setw(3) << std::setfill('0') << row; + out << " [" << updtime << "] : " << path; + out << std::endl; + + std::map::iterator it; + for(it = subdirs.begin(); it != subdirs.end(); it++) + { + (it->second)->print(out); + } + std::map::iterator fit; + for(fit = files.begin(); fit != files.end(); fit++) + { + (fit->second)->print(out); + } + return 1; +} + +FileIndex::FileIndex(std::string pid) +{ + root = new PersonEntry(pid); +} + +FileIndex::~FileIndex() +{ + delete root; +} + +int FileIndex::setRootDirectories(std::list inlist, time_t updtime) +{ + /* set update time to zero */ + std::map::iterator it; + for(it = root->subdirs.begin(); it != root->subdirs.end(); it++) + { + (it->second)->updtime = 0; + } + + std::list::iterator ait; + FileEntry fe; + time_t utime = 1; + for(ait = inlist.begin(); ait != inlist.end(); ait++) + { + fe.name = (*ait); + + /* see if it exists */ + root->updateDir(fe, utime); + } + + /* remove all dirs with zero time (non recursive) */ + root->removeOldEntries(utime, false); + + /* now flag remaining directories with correct update time */ + for(it = root->subdirs.begin(); it != root->subdirs.end(); it++) + { + (it->second)->updtime = updtime; + } + + return 1; +} + + +int FileIndex::getRootDirectories(std::list &outlist) +{ + /* set update time to zero */ + std::map::iterator it; + for(it = root->subdirs.begin(); it != root->subdirs.end(); it++) + { + outlist.push_back(it->first); + } + return 1; +} + + /* update (index building) */ +DirEntry *FileIndex::updateDirEntry(std::string fpath, FileEntry fe, time_t utime) +{ + /* path is to parent */ +#ifdef FI_DEBUG_ALL + std::cerr << "FileIndex::updateDirEntry() Path: \""; + std::cerr << fpath << "\"" << " + \"" << fe.name << "\""; + std::cerr << std::endl; +#endif + DirEntry *parent = NULL; + if (fpath == "") + { + parent = root; + } + else + { + parent = root->findDirectory(fpath); + } + + if (!parent) { +#ifdef FI_DEBUG + std::cerr << "FileIndex::updateDirEntry() NULL parent"; + std::cerr << std::endl; +#endif + return NULL; + } + return parent -> updateDir(fe, utime); +} + + +FileEntry *FileIndex::updateFileEntry(std::string fpath, FileEntry fe, time_t utime) +{ + /* path is to parent */ +#ifdef FI_DEBUG_ALL + std::cerr << "FileIndex::updateFileEntry() Path: \""; + std::cerr << fpath << "\"" << " + \"" << fe.name << "\""; + std::cerr << std::endl; +#endif + DirEntry *parent = root->findDirectory(fpath); + + if (!parent) { +#ifdef FI_DEBUG + std::cerr << "FileIndex::updateFileEntry() NULL parent"; + std::cerr << std::endl; +#endif + return NULL; + } + return parent -> updateFile(fe, utime); +} + + +DirEntry *FileIndex::findOldDirectory(time_t old) /* finds directories older than old */ +{ + DirEntry *olddir = root->findOldDirectory(old); +#ifdef FI_DEBUG + + std::cerr << "FileIndex::findOldDirectory(" << old << ") -> "; + if (olddir) + { + std::cerr << olddir->path; + } + else + { + std::cerr << "NONE"; + } + std::cerr << std::endl; + +#endif + return olddir; +} + +int FileIndex::removeOldDirectory(std::string fpath, std::string name, time_t old) +{ + /* path is to parent */ +#ifdef FI_DEBUG_ALL + std::cerr << "FileIndex::removeOldDir() Path: \""; + std::cerr << fpath << "\"" << " + \"" << name << "\""; + std::cerr << std::endl; +#endif + + /* because of this find - we cannot get a child of + * root (which is what we want!) + */ + DirEntry *parent = root->findDirectory(fpath); + + if (!parent) { +#ifdef FI_DEBUG + std::cerr << "FileIndex::removeOldDir() NULL parent"; + std::cerr << std::endl; +#endif + return 0; + } + return parent -> removeOldDir(name, old); +} + + +int FileIndex::cleanOldEntries(time_t old) /* removes entries older than old */ +{ + std::map::iterator it; + for(it = root->subdirs.begin(); it != root->subdirs.end(); it++) + { + (it->second)->removeOldEntries(old, true); + } + return 1; +} + + + +int FileIndex::printFileIndex(std::ostream &out) +{ + out << "FileIndex::printFileIndex()" << std::endl; + root->print(out); + return 1; +} + + +int FileIndex::loadIndex(std::string filename, std::string expectedHash, uint32_t size) +{ + std::ifstream file (filename.c_str(), std::ifstream::binary); + if (!file) + { +#ifdef FI_DEBUG + std::cerr << "FileIndex::loadIndex error opening file: " << filename; + std::cerr << std::endl; +#endif + return 0; + } + + /* load file into memory, close file */ + char ibuf[512]; + std::stringstream ss; + while(!file.eof()) + { + file.read(ibuf, 512); + ss.write(ibuf, file.gcount()); + } + file.close(); + + /* calculate hash */ + unsigned char sha_buf[SHA_DIGEST_LENGTH]; + SHA_CTX *sha_ctx = new SHA_CTX; + SHA1_Init(sha_ctx); + SHA1_Update(sha_ctx, ss.str().c_str(), ss.str().length()); + SHA1_Final(&sha_buf[0], sha_ctx); + delete sha_ctx; + + std::ostringstream tmpout; + for(int i = 0; i < SHA_DIGEST_LENGTH; i++) + { + tmpout << std::setw(2) << std::setfill('0') << std::hex << (unsigned int) (sha_buf[i]); + } + + if (expectedHash != tmpout.str()) + { +#ifdef FI_DEBUG + std::cerr << "FileIndex::loadIndex expected hash does not match" << std::endl; + std::cerr << "Expected hash: " << expectedHash << std::endl; + std::cerr << "Hash found: " << tmpout.str() << std::endl; +#endif + return 0; + } + + DirEntry *ndir = NULL; + FileEntry *nfile = NULL; + std::list dirlist; + std::string word; + char ch; + + while(ss.get(ch)) + { + if (ch == '-') + { + ss.ignore(256, '\n'); + switch(dirlist.size()) + { + /* parse error: out of directory */ + case 0: + { +#ifdef FI_DEBUG + std::cerr << "loadIndex error parsing saved file: " << filename; + std::cerr << " Ran out of dirs"; + std::cerr << std::endl; +#endif + goto error; + } + /* finished parse, last dir is root */ + case 1: + { + std::string pid = root -> id; + delete root; /* to clean up old entries */ + root = new PersonEntry(pid); + + /* shallow copy of all except id */ + ndir = dirlist.back(); + dirlist.pop_back(); /* empty list */ + (*root) = (*ndir); + + /* now cleanup (can't call standard delete) */ + ndir->subdirs.clear(); + ndir->files.clear(); + delete ndir; + ndir = NULL; + + /* must reset parent pointers now */ + std::map::iterator it; + for(it = root->subdirs.begin(); + it != root->subdirs.end(); it++) + { + (it->second)->parent = root; + } + + break; + } + /* pop stack */ + default: dirlist.pop_back(); ndir = dirlist.back(); + } + continue; + } + + // Ignore comments + else if (ch == '#') + { + ss.ignore(256, '\n'); + } + + else { + std::vector tokens; + /* parse line */ + while(1) + { + getline(ss, word, ','); + if (ss.eof()) + goto error; + tokens.push_back(word); + if (ss.peek() == '\n') + { + ss.ignore(256, '\n'); + break; + } + + } + /* create new file and add it to last directory*/ + if (ch == 'f') + { + if (tokens.size() != 6) + { +#ifdef FI_DEBUG + std::cerr << "loadIndex error parsing saved file: " << filename; + std::cerr << " File token count wrong: " << tokens.size(); + std::cerr << std::endl; + for(unsigned int i = 0; i < tokens.size(); i++) + { + std::cerr << "\tToken[" << i << "]:" << tokens[i]; + std::cerr << std::endl; + } + +#endif + goto error; + } + nfile = new FileEntry(); + nfile->name = tokens[0]; + nfile->hash = tokens[1]; + nfile->size = atoi(tokens[2].c_str()); + nfile->modtime = atoi(tokens[3].c_str()); + nfile->pop = atoi(tokens[4].c_str()); + nfile->updtime = atoi(tokens[5].c_str()); + nfile->parent = ndir; + nfile->row = ndir->subdirs.size() + ndir->files.size(); + ndir->files[nfile->name] = nfile; + + } + /* create new dir and add to stack */ + else if (ch == 'd') + { + if (tokens.size() != 6) + { +#ifdef FI_DEBUG + std::cerr << "loadIndex error parsing saved file: " << filename; + std::cerr << " Dir token count wrong: " << tokens.size(); + std::cerr << std::endl; +#endif + goto error; + } + ndir = new DirEntry(); + ndir->name = tokens[0]; + ndir->path = tokens[1]; + ndir->size = atoi(tokens[2].c_str()); + ndir->modtime = atoi(tokens[3].c_str()); + ndir->pop = atoi(tokens[4].c_str()); + ndir->updtime = atoi(tokens[5].c_str()); + if (!dirlist.empty()) + { + ndir->parent = (dirlist.back()); + ndir->row = dirlist.back()->subdirs.size(); + dirlist.back()->subdirs[ndir->name] = ndir; + } + dirlist.push_back(ndir); + } + } + } + + return 1; + + /* parse error encountered */ +error: +#ifdef FI_DEBUG + std::cerr << "loadIndex error parsing saved file: " << filename; + std::cerr << std::endl; +#endif + return 0; +} + + +int FileIndex::saveIndex(std::string filename, std::string &fileHash, uint32_t &size) +{ + unsigned char sha_buf[SHA_DIGEST_LENGTH]; + std::ofstream file (filename.c_str(), std::ofstream::binary); + std::ostringstream oss; + + if (!file) + { +#ifdef FI_DEBUG + std::cerr << "FileIndex::saveIndex error opening file: " << filename; + std::cerr << std::endl; +#endif + return 0; + } + + /* print version and header */ + oss << "# FileIndex version 0.1" << std::endl; + oss << "# Dir: d name, path, parent, size, modtime, pop, updtime;" << std::endl; + oss << "# File: f name, hash, size, modtime, pop, updtime;" << std::endl; + oss << "#" << std::endl; + + /* begin recusion */ + root->saveEntry(oss); + + /* calculate sha1 hash */ + SHA_CTX *sha_ctx = new SHA_CTX; + SHA1_Init(sha_ctx); + SHA1_Update(sha_ctx, oss.str().c_str(), oss.str().length()); + SHA1_Final(&sha_buf[0], sha_ctx); + delete sha_ctx; + + std::ostringstream tmpout; + for(int i = 0; i < SHA_DIGEST_LENGTH; i++) + { + tmpout << std::setw(2) << std::setfill('0') << std::hex << (unsigned int) (sha_buf[i]); + } + fileHash = tmpout.str(); + + /* finally, save to file */ + file << oss.str(); + + /* get the size out */ + size=file.tellp(); + file.close(); + return 1; +} + + +std::string FixName(std::string in) +{ + /* replace any , with _ */ + for(unsigned int i = 0; i < in.length(); i++) + { + if (in[i] == ',') + { + in[i] = '_'; + } + } + return in; +} + + +/* recusive function for traversing the dir tree in preorder */ +int DirEntry::saveEntry(std::ostringstream &oss) +{ + /* print node info */ + oss << "d"; + oss << FixName(name) << ","; + oss << FixName(path) << ","; + oss << size << ","; + oss << modtime << ","; + oss << pop << ","; + oss << updtime << "," << std::endl; + + std::map::iterator it; + for(it = subdirs.begin(); it != subdirs.end(); it++) + { + (it->second)->saveEntry(oss); + } + + /* print file info */ + std::map::iterator fit; + for(fit = files.begin(); fit != files.end(); fit++) + { + oss << "f"; + oss << FixName((fit->second)->name) << ","; + oss << (fit->second)->hash << ","; + oss << (fit->second)->size << ","; + oss << (fit->second)->modtime << ","; + oss << (fit->second)->pop << ","; + oss << (fit->second)->updtime << "," << std::endl; + } + + /* signal to pop directory from stack in loadIndex() */ + oss << "-" << std::endl; + return 1; +} + + +int FileIndex::searchHash(std::string hash, std::list &results) +{ + DirEntry *ndir = NULL; + std::list dirlist; + dirlist.push_back(root); + + while(!dirlist.empty()) + { + ndir = dirlist.back(); + dirlist.pop_back(); + /* add subdirs to stack */ + std::map::iterator it; + for(it = ndir->subdirs.begin(); it != ndir->subdirs.end(); it++) + { + dirlist.push_back(it->second); + } + + std::map::iterator fit; + /* search in current dir */ + for(fit = ndir->files.begin(); fit != ndir->files.end(); fit++) + { + if (hash == (fit->second)->hash) + { + results.push_back(fit->second); + } + } + } + + return 0; +} + + +int FileIndex::searchTerms(std::list terms, std::list &results) +{ + DirEntry *ndir = NULL; + std::list dirlist; + dirlist.push_back(root); + + /* iterators */ + std::map::iterator it; + std::map::iterator fit; + std::list::const_iterator iter; + + while(!dirlist.empty()) + { + ndir = dirlist.back(); + dirlist.pop_back(); + for(it = ndir->subdirs.begin(); it != ndir->subdirs.end(); it++) + { + dirlist.push_back(it->second); + } + + for(fit = ndir->files.begin(); fit != ndir->files.end(); fit++) + { + /* cycle through terms */ + for(iter = terms.begin(); iter != terms.end(); iter++) + { + /* always ignore case */ + std::string::const_iterator it2 ; + const std::string &str1 = fit->second->name; + const std::string &str2 = (*iter); + + it2 = std::search( str1.begin(), str1.end(), + str2.begin(), str2.end(), CompareCharIC() ); + if (it2 != str1.end()) + { + results.push_back(fit->second); + break; + } + /* original case specific term search ****** + if (fit->second->name.find(*iter) != std::string::npos) + { + results.push_back(fit->second); + break; + } + ************/ + } + } + } //while + + return 0; +} + +int FileIndex::searchBoolExp(Expression * exp, std::list &results) +{ + DirEntry *ndir = NULL; + std::list dirlist; + dirlist.push_back(root); + + /* iterators */ + std::map::iterator it; + std::map::iterator fit; + std::list::const_iterator iter; + + while(!dirlist.empty()) + { + ndir = dirlist.back(); + dirlist.pop_back(); + for(it = ndir->subdirs.begin(); it != ndir->subdirs.end(); it++) + { + dirlist.push_back(it->second); + } + + for(fit = ndir->files.begin(); fit != ndir->files.end(); fit++) + { + /*Evaluate the boolean expression and add it to the results if its true*/ + bool ret = exp->eval(fit->second); + if (ret == true){ + results.push_back(fit->second); + } + } + } //while + + return 0; +} + diff --git a/libretroshare/src/dbase/findex.h b/libretroshare/src/dbase/findex.h new file mode 100644 index 000000000..5e8f1790d --- /dev/null +++ b/libretroshare/src/dbase/findex.h @@ -0,0 +1,229 @@ +/* + * RetroShare FileCache Module: findex.h + * + * Copyright 2004-2007 by Robert Fernie. + * + * 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". + * + */ + +#ifndef FILE_INDEX_H +#define FILE_INDEX_H + +#include +#include +#include +#include + +class ostream; + +/****************************************************************************************** + * The Key Data Types for the File Index: + + FileEntry : Information about a single file. + DirEntry : Information about a directory and its children + PersonEntry : Information the root of a FileIndex. + + FileIndex : A Collection of root directories, with a set of functions to manipulate them. + In terms of retroshare, There will be a single 'Local' FileIndex used to store + the shared files, and a set of 'Remote' FileIndices which are used to store + the available files of all the peers. + +******************************************************************************************/ +/****************************************************************************************** + STILL TODO: + + (1) Load/Store a FileIndex to file... + int FileIndex::loadIndex(FILE *input); + int FileIndex::saveIndex(FILE *input); + + This can be done in a recursive manner, or handled completely within FileIndex. + + (2) Search Functions for Partial File Names and Hashes. + + int FileIndex::searchHash(std::string hash, std::list &results); + int FileIndex::searchTerms(std::list terms, std::list &results); + + This is probably best done in a recursive manner. + + The search could also be extended to handle complex Boolean searches such as : + match (size > 100K) && (name contains 'Blue') .... if anyone is interested. + But this can get quite complicated, and can be left to a later date. + +******************************************************************************************/ + + +/****************************************************************************************** + * FileEntry + *****************************************************************************************/ + +class DirEntry; + +class FileEntry +{ + public: + FileEntry() :parent(NULL), row(-1) { return; } +virtual ~FileEntry() { return; } + +virtual int print(std::ostream &out); + + /* Data */ + std::string name; + std::string hash; + int size; /* file size */ + int modtime; /* modification time - most recent mod time for a sub entry for dirs */ + int pop; /* popularity rating */ + + int updtime; /* last updated */ + + /* References for easy manipulation */ + DirEntry *parent; + int row; +}; + +/****************************************************************************************** + * DirEntry + *****************************************************************************************/ + +class DirEntry: public FileEntry +{ + public: + + /* cleanup */ +virtual ~DirEntry(); + + /* update local entries */ +DirEntry * updateDir(FileEntry fe, time_t updtime); +FileEntry * updateFile(FileEntry fe, time_t updtime); + + +int checkParentPointers(); +int updateChildRows(); + + /* remove local entries */ +int removeFile(std::string name); +int removeDir(std::string name); +int removeOldDir(std::string name, time_t old); /* checks ts first */ + + /* recursive cleanup */ +int removeOldEntries(time_t old, bool recursive); + + /* recursive searches */ +DirEntry * findOldDirectory(time_t old); +DirEntry * findDirectory(std::string path); + + /* recursive update directory mod/pop values */ +int updateDirectories(std::string path, int pop, int modtime); + + /* output */ +int print(std::ostream &out); + +int saveEntry(std::ostringstream &out); + + /* Data */ + std::string path; /* full path (includes name) */ + std::map subdirs; + std::map files; + + /* Inherited members from FileEntry: + int size - count for dirs + std::string name; - directory name + std::string hash; - not used + int size; - not used + int modtime; - most recent modication time of any child file (recursive) + int pop; - most popular child file (recursive) + int updtime; - last updated + */ + +}; + +/****************************************************************************************** + * PersonEntry + *****************************************************************************************/ + +class PersonEntry: public DirEntry +{ + public: + /* cleanup */ + PersonEntry(std::string pid) : id(pid) { return; } +virtual ~PersonEntry() { return; } + +DirEntry &operator=(DirEntry &src) +{ + DirEntry *pdest = this; + (*pdest) = src; + return src; +} + + /* Data */ + std::string id; + + /* Inherited members from FileEntry: + int size - count for dirs + std::string name; - directory name + std::string hash; - not used + int size; - not used + int modtime; - most recent modication time of any child file (recursive) + int pop; - most popular child file (recursive) + int updtime; - last updated + */ + +}; + +/****************************************************************************************** + * FileIndex + *****************************************************************************************/ + +class Expression; + +class FileIndex +{ + public: + FileIndex(std::string pid); + ~FileIndex(); + + /* control root entries */ +int setRootDirectories(std::list inlist, time_t utime); +int getRootDirectories(std::list &outlist); + + /* update (index building) */ +DirEntry * updateDirEntry(std::string path, FileEntry fe, time_t utime); +FileEntry * updateFileEntry(std::string path, FileEntry fe, time_t utime); + +DirEntry * findOldDirectory(time_t old); /* finds directories older than old */ +int removeOldDirectory(std::string fpath, std::string name, time_t old); + +int cleanOldEntries(time_t old); /* removes entries older than old */ + + /* debug */ +int printFileIndex(std::ostream &out); + + /* load/save to file */ +int loadIndex(std::string filename, std::string expectedHash, uint32_t size); +int saveIndex(std::string filename, std::string &fileHash, uint32_t &size); + + /* search through this index */ +int searchTerms(std::list terms, std::list &results); +int searchHash(std::string hash, std::list &results); +int searchBoolExp(Expression * exp, std::list &results); + + PersonEntry *root; +}; + + +#endif + diff --git a/libretroshare/src/dbase/fisavetest.cc b/libretroshare/src/dbase/fisavetest.cc new file mode 100644 index 000000000..1e7452ac8 --- /dev/null +++ b/libretroshare/src/dbase/fisavetest.cc @@ -0,0 +1,118 @@ +/* + * RetroShare FileCache Module: fisavetest.cc + * + * Copyright 2004-2007 by Kefei Zhou. + * + * 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 "dbase/findex.h" +#include + +FileIndex *createBasicFileIndex(time_t age); + +int main() +{ + FileIndex *fi1 = createBasicFileIndex(100); + FileIndex *fi2 = new FileIndex("A SILLY ID"); + + fi1->printFileIndex(std::cout); + std::string fhash; + uint32_t size; + fi1->saveIndex("test.index", fhash, size); + + std::cout << " Saved Index: Size: " << size << " Hash: " << fhash << std::endl; + std::cout << " -- new file index -- " << std::endl; + + fi2->loadIndex("test.index", fhash, size); + fi2->printFileIndex(std::cout); + + delete fi1; + delete fi2; + + return 1; +} + + +FileIndex *createBasicFileIndex(time_t age) +{ + FileIndex *fi = new FileIndex("A SILLY ID"); + + FileEntry fe; + + std::list rootdirs; + rootdirs.push_back("base1"); + rootdirs.push_back("base2"); + rootdirs.push_back("base3"); + + fi -> setRootDirectories(rootdirs, age); + + /* add some entries */ + fe.name = "dir1"; + fi -> updateDirEntry("base1",fe, age); + fe.name = "dir2"; + fi -> updateDirEntry("base1",fe, age); + + fe.name = "dir01"; + fi -> updateDirEntry("/base1/dir1/",fe, age); + + fe.name = "dir001"; + fi -> updateDirEntry("/base1/dir1/dir01/",fe, age); + + fe.name = "file1"; + fi -> updateFileEntry("/base1/dir1/",fe, age); + fe.name = "file2"; + fi -> updateFileEntry("/base1/dir1/",fe, age); + fe.name = "file3"; + fi -> updateFileEntry("/base1/dir1/",fe, age); + fe.name = "file4"; + fi -> updateFileEntry("/base1/dir1/",fe, age); + + + fe.name = "dir2"; + fi -> updateDirEntry("/base1",fe, age); + fe.name = "file5"; + fi -> updateFileEntry("/base1/dir2/",fe, age); + fe.name = "file6"; + fi -> updateFileEntry("/base1/dir2/",fe, age); + fe.name = "file7"; + fi -> updateFileEntry("/base1/dir2/",fe, age); + fe.name = "file8"; + fi -> updateFileEntry("/base1/",fe, age); + + + fe.name = "dir3"; + fi -> updateDirEntry("/base1/dir2/",fe, age); + fe.name = "file10"; + fi -> updateFileEntry("/base1/dir2/dir3",fe, age); + fe.name = "file11"; + fi -> updateFileEntry("/base1/dir2/dir3",fe, age); + fe.name = "file12"; + fi -> updateFileEntry("/base1/dir2/dir3",fe, age); + + + fe.name = "dir4"; + fi -> updateDirEntry("/base3/",fe, age); + fe.name = "file20"; + fi -> updateFileEntry("/base3/dir4/",fe, age); + fe.name = "file21"; + fi -> updateFileEntry("/base3/dir4",fe, age); + + return fi; +} + diff --git a/libretroshare/src/dbase/fistore.cc b/libretroshare/src/dbase/fistore.cc new file mode 100644 index 000000000..6fe9d0bc6 --- /dev/null +++ b/libretroshare/src/dbase/fistore.cc @@ -0,0 +1,521 @@ +/* + * RetroShare FileCache Module: fistore.cc + * + * Copyright 2004-2007 by Robert Fernie. + * + * 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 "dbase/fistore.h" +#include "rsiface/rsexpr.h" + +FileIndexStore::FileIndexStore(CacheTransfer *cft, + NotifyBase *cb_in, RsPeerId ownid, std::string cachedir) + :CacheStore(CACHE_TYPE_FILE_INDEX, false, cft, cachedir), + localId(ownid), localindex(NULL), cb(cb_in) +{ + return; +} + +FileIndexStore::~FileIndexStore() +{ + /* clean up the Index */ + return; +} + +/*** + * #define FIS_DEBUG2 1 + * #define FIS_DEBUG 1 + **/ + + /* actual load, once data available */ +int FileIndexStore::loadCache(const CacheData &data) +{ + +#ifdef FIS_DEBUG2 + std::cerr << "FileIndexStore::loadCache() hash: " << data.hash << std::endl; + std::cerr << "FileIndexStore::loadCache() path: " << data.path << std::endl; + std::cerr << "FileIndexStore::loadCache() name: " << data.name << std::endl; + std::cerr << "FileIndexStore::loadCache() size: " << data.size << std::endl; +#endif + + /* do Callback */ + AboutToModify(); + + /* lock it up */ + lockData(); + + FileIndex *fiold = NULL; + bool local = (data.pid == localId); + + std::map::iterator it; + /* remove old cache */ + if (local) + { + fiold = localindex; + localindex = NULL; + } + else if (indices.end() != (it = indices.find(data.pid))) + { + fiold = it->second; + indices.erase(it); + //delete fi; + } + + /* load Cache */ + FileIndex *finew = new FileIndex(data.pid); + + if (finew->loadIndex(data.path + '/' + data.name, data.hash, data.size)) + { +#ifdef FIS_DEBUG2 + std::cerr << "FileIndexStore::loadCache() Succeeded!" << std::endl; +#endif + /* set the name */ + finew->root->name = data.pname; + if (local) + { + localindex = finew; + } + else + { + indices[data.pid] = finew; + } + delete fiold; + + /* store in tale */ + locked_storeCacheEntry(data); + } + else + { +#ifdef FIS_DEBUG2 + std::cerr << "FileIndexStore::loadCache() Failed!" << std::endl; +#endif + /* reinstall the old one! */ + delete finew; + if (fiold) + { + if (local) + { + localindex = fiold; + } + else + { + indices[data.pid] = fiold; + } + } + } + + /* need to correct indices(row) for the roots of the FileIndex */ + int i = 0; + for(it = indices.begin(); it != indices.end(); it++) + { + (it->second)->root->row = i++; + } + if (localindex) + { + localindex->root->row = 0; + } + + unlockData(); + + ModCompleted(); + bool ret = false; + return ret; +} + + /* Search Interface - For Directory Access */ +int FileIndexStore::RequestDirDetails(std::string uid, std::string path, DirDetails &details) +{ + /* lock it up */ + lockData(); + + std::map::iterator it; + it = indices.find(uid); + bool found = true; + if (it == indices.end()) + { + //DirEntry *fdir = (it->second).lookupDirectory(path); + /* translate it + */ + found = false; + } + else + { + found = false; + } + + unlockData(); + return found; +} + +int FileIndexStore::RequestDirDetails(void *ref, DirDetails &details, uint32_t flags) +{ + lockData(); + bool found = true; + std::map::iterator pit; + + /* so cast *ref to a DirEntry */ + FileEntry *file = (FileEntry *) ref; + DirEntry *dir = dynamic_cast(file); + PersonEntry *person; + /* root case */ + +#ifdef FIS_DEBUG + std::cerr << "FileIndexStore::RequestDirDetails() CHKS" << std::endl; + for(pit = indices.begin(); pit != indices.end(); pit++) + { + (pit->second)->root->checkParentPointers(); + } +#endif + + if (!ref) + { +#ifdef FIS_DEBUG + std::cerr << "FileIndexStore::RequestDirDetails() ref=NULL (root)" << std::endl; +#endif + if (flags & DIR_FLAGS_LOCAL) + { + /* local only */ + if (localindex) + { + DirStub stub; + stub.type = DIR_TYPE_PERSON; + stub.name = localindex->root->name; + stub.ref = localindex->root; + details.children.push_back(stub); + details.count = 1; + } + else + { + details.count = 0; + } + + details.parent = NULL; + details.prow = 0; + details.ref = NULL; + details.type = DIR_TYPE_ROOT; + details.name = ""; + details.hash = ""; + details.path = ""; + details.age = 0; + details.rank = 0; + } + else + { + /* get remote root entries */ + for(pit = indices.begin(); pit != indices.end(); pit++) + { + /* + */ + DirStub stub; + stub.type = DIR_TYPE_PERSON; + stub.name = (pit->second)->root->name; + stub.ref = (pit->second)->root; + + details.children.push_back(stub); + } + details.parent = NULL; + details.prow = 0; + details.ref = NULL; + details.type = DIR_TYPE_ROOT; + details.name = ""; + details.hash = ""; + details.path = ""; + details.count = indices.size(); + details.age = 0; + details.rank = 0; + } + } + else + { + if (dir) /* has children --- fill */ + { +#ifdef FIS_DEBUG + std::cerr << "FileIndexStore::RequestDirDetails() ref=dir" << std::endl; +#endif + std::map::iterator fit; + std::map::iterator dit; + /* extract all the entries */ + for(dit = dir->subdirs.begin(); + dit != dir->subdirs.end(); dit++) + { + DirStub stub; + stub.type = DIR_TYPE_DIR; + stub.name = (dit->second) -> name; + stub.ref = (dit->second); + + details.children.push_back(stub); + } + + for(fit = dir->files.begin(); + fit != dir->files.end(); fit++) + { + DirStub stub; + stub.type = DIR_TYPE_FILE; + stub.name = (fit->second) -> name; + stub.ref = (fit->second); + + details.children.push_back(stub); + } + + details.type = DIR_TYPE_DIR; + details.hash = ""; + details.count = dir->subdirs.size() + + dir->files.size(); + } + else + { +#ifdef FIS_DEBUG + std::cerr << "FileIndexStore::RequestDirDetails() ref=file" << std::endl; +#endif + details.type = DIR_TYPE_FILE; + details.count = file->size; + } + +#ifdef FIS_DEBUG + std::cerr << "FileIndexStore::RequestDirDetails() name: " << file->name << std::endl; +#endif + details.ref = file; + details.name = file->name; + details.hash = file->hash; + details.age = time(NULL) - file->modtime; + details.rank = file->pop; + + /* TODO Path */ + details.path = ""; + + /* find parent pointer, and row */ + DirEntry *parent = file->parent; + if (!parent) /* then must be root */ + { + details.parent = NULL; + details.prow = 0; + } + else + { + details.parent = parent; + details.prow = parent->row; + } + + /* find peer id */ + parent = dir; + if (!dir) + { + /* cannot be null -> no files at root level */ + parent=file->parent; + } + + while(parent->parent) + parent = parent->parent; + + /* we should end up on the PersonEntry */ + if (NULL == (person = dynamic_cast(parent))) + { + std::cerr << "Major Error- Not PersonEntry!"; + exit(1); + } + + details.id = person->id; + } + + unlockData(); + return found; +} + + +int FileIndexStore::SearchHash(std::string hash, std::list &results) +{ + lockData(); + std::map::iterator pit; + std::list::iterator rit; + std::list firesults; + + time_t now = time(NULL); + +#ifdef FIS_DEBUG + std::cerr << "FileIndexStore::SearchHash()" << std::endl; +#endif + for(pit = indices.begin(); pit != indices.end(); pit++) + { + firesults.clear(); + + (pit->second)->searchHash(hash, firesults); + /* translate results */ + for(rit = firesults.begin(); rit != firesults.end(); rit++) + { + FileDetail fd; + fd.id = pit->first; + fd.name = (*rit)->name; + fd.hash = (*rit)->hash; + fd.path = ""; /* TODO */ + fd.size = (*rit)->size; + fd.age = now - (*rit)->modtime; + fd.rank = (*rit)->pop; + + results.push_back(fd); + } + + } + + unlockData(); + return results.size(); +} + + +int FileIndexStore::SearchKeywords(std::list keywords, std::list &results) +{ + lockData(); + std::map::iterator pit; + std::list::iterator rit; + std::list firesults; + + time_t now = time(NULL); + +#ifdef FIS_DEBUG + std::cerr << "FileIndexStore::SearchKeywords()" << std::endl; +#endif + for(pit = indices.begin(); pit != indices.end(); pit++) + { + firesults.clear(); + + (pit->second)->searchTerms(keywords, firesults); + /* translate results */ + for(rit = firesults.begin(); rit != firesults.end(); rit++) + { + FileDetail fd; + fd.id = pit->first; + fd.name = (*rit)->name; + fd.hash = (*rit)->hash; + fd.path = ""; /* TODO */ + fd.size = (*rit)->size; + fd.age = now - (*rit)->modtime; + fd.rank = (*rit)->pop; + + results.push_back(fd); + } + + } + if (localindex) + { + firesults.clear(); + + localindex->searchTerms(keywords, firesults); + /* translate results */ + for(rit = firesults.begin(); rit != firesults.end(); rit++) + { + FileDetail fd; + fd.id = "Local"; //localId; + fd.name = (*rit)->name; + fd.hash = (*rit)->hash; + fd.path = ""; /* TODO */ + fd.size = (*rit)->size; + fd.age = now - (*rit)->modtime; + fd.rank = (*rit)->pop; + + results.push_back(fd); + } + + } + + unlockData(); + return results.size(); +} + + +int FileIndexStore::searchBoolExp(Expression * exp, std::list &results) +{ + lockData(); + std::map::iterator pit; + std::list::iterator rit; + std::list firesults; + + time_t now = time(NULL); + +#ifdef FIS_DEBUG + std::cerr << "FileIndexStore::searchBoolExp()" << std::endl; +#endif + for(pit = indices.begin(); pit != indices.end(); pit++) + { + firesults.clear(); + + (pit->second)->searchBoolExp(exp, firesults); + + /* translate results */ + for(rit = firesults.begin(); rit != firesults.end(); rit++) + { + FileDetail fd; + fd.id = pit->first; + fd.name = (*rit)->name; + fd.hash = (*rit)->hash; + fd.path = ""; /* TODO */ + fd.size = (*rit)->size; + fd.age = now - (*rit)->modtime; + fd.rank = (*rit)->pop; + + results.push_back(fd); + } + + } + + /* finally search local files */ + if (localindex) + { + firesults.clear(); + + localindex->searchBoolExp(exp, firesults); + + /* translate results */ + for(rit = firesults.begin(); rit != firesults.end(); rit++) + { + FileDetail fd; + fd.id = "Local"; //localId; + fd.name = (*rit)->name; + fd.hash = (*rit)->hash; + fd.path = ""; /* TODO */ + fd.size = (*rit)->size; + fd.age = now - (*rit)->modtime; + fd.rank = (*rit)->pop; + + results.push_back(fd); + } + + } + + + unlockData(); + return results.size(); +} + +int FileIndexStore::AboutToModify() +{ + if (cb) + cb->notifyListPreChange(NOTIFY_LIST_DIRLIST, 0); + + return 1; +} + + +int FileIndexStore::ModCompleted() +{ + if (cb) + cb->notifyListChange(NOTIFY_LIST_DIRLIST, 0); + + return 1; +} + + diff --git a/libretroshare/src/dbase/fistore.h b/libretroshare/src/dbase/fistore.h new file mode 100644 index 000000000..8374e7640 --- /dev/null +++ b/libretroshare/src/dbase/fistore.h @@ -0,0 +1,100 @@ +/* + * RetroShare FileCache Module: fistore.h + * + * Copyright 2004-2007 by Robert Fernie. + * + * 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". + * + */ + +#ifndef MRK_FILE_INDEX_STORE_H +#define MRK_FILE_INDEX_STORE_H + + +/********** + * Stores the FileCaches of the Peers + * must implement 'loadCache' to + * + * This class is also accessed by the GUI.... + * and the FileTransfer class. + * + */ + +#include "dbase/findex.h" +#include "dbase/cachestrapper.h" +#include "rsiface/rsiface.h" + +class FileStoreResult +{ + public: + std::string id; + std::string path; + std::string hash; + std::string name; +}; + +class NotifyCallback +{ + public: + NotifyCallback() { return; } +virtual ~NotifyCallback() { return; } +virtual void AboutToModify() { return; } +virtual void ModCompleted() { return; } +}; + + +class Expression; + +class FileIndexStore: public CacheStore +{ + public: + + FileIndexStore(CacheTransfer *cft, NotifyBase *cb_in, + RsPeerId ownid, std::string cachedir); +virtual ~FileIndexStore(); + + /* virtual functions overloaded by cache implementor */ +virtual int loadCache(const CacheData &data); /* actual load, once data available */ + + /* Search Interface - For FileTransfer Lookup */ + int SearchHash(std::string hash, std::list &results); + + /* Search Interface - For Search Interface */ + int SearchKeywords(std::list terms, std::list &results); + + /* Search Interface - for Adv Search Interface */ + int searchBoolExp(Expression * exp, std::list &results); + + + /* Search Interface - For Directory Access */ + int RequestDirDetails(std::string uid, std::string path, DirDetails &details); + int RequestDirDetails(void *ref, DirDetails &details, uint32_t flags); + + private: + int AboutToModify(); + int ModCompleted(); + + std::map indices; + + RsPeerId localId; + FileIndex *localindex; + + NotifyBase *cb; +}; + + +#endif diff --git a/libretroshare/src/dbase/fitest2.cc b/libretroshare/src/dbase/fitest2.cc new file mode 100644 index 000000000..7d1fc4c9a --- /dev/null +++ b/libretroshare/src/dbase/fitest2.cc @@ -0,0 +1,213 @@ +/* + * RetroShare FileCache Module: fitest2.cc + * + * Copyright 2004-2007 by Robert Fernie. + * + * 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 "dbase/findex.h" + +#include + +FileIndex *createBasicFileIndex(time_t age); + +int test1(FileIndex *fi); +int test2(FileIndex *fi); + +int main() +{ + FileIndex *fi = createBasicFileIndex(100); + + test1(fi); + + delete fi; + + return 1; +} + +int test1(FileIndex *fi) +{ + /* in this test we are going to get the old directories - and update them */ + time_t stamp = 200; + + DirEntry *olddir = NULL; + FileEntry fe; + while((olddir = fi -> findOldDirectory(stamp))) + { + /* update the directories and files here */ + std::map::iterator dit; + std::map::iterator fit; + + /* update this dir */ + fe.name = olddir->name; + fi -> updateDirEntry(olddir->parent->path, fe, stamp); + + /* update subdirs */ + for(dit = olddir->subdirs.begin(); dit != olddir->subdirs.end(); dit++) + { + fe.name = (dit->second)->name; + /* set the age as out-of-date so that it gets checked */ + fi -> updateDirEntry(olddir->path, fe, 0); + } + + /* update files */ + for(fit = olddir->files.begin(); fit != olddir->files.end(); fit++) + { + fe.name = (fit->second)->name; + fi -> updateFileEntry(olddir->path, fe, stamp); + } + + /* clean up the dir (should have no effect) */ + fi -> removeOldDirectory(olddir->parent->path, olddir->name, stamp); + fi -> printFileIndex(std::cout); + } + + fi -> printFileIndex(std::cout); + + return 1; +} + + +int test2(FileIndex *fi) +{ + /* in this test we are going to simulate that 2 directories have disappeared */ + time_t stamp = 200; + + DirEntry *olddir = NULL; + FileEntry fe; + bool missingdir = false; + int i = 0; + + while((olddir = fi -> findOldDirectory(stamp))) + { + missingdir = false; + if (i % 2 == 0) + { + std::cerr << " Simulating that dir doesnt exist :" << olddir->path; + std::cerr << std::endl; + missingdir = true; + } + i++; + + if (!missingdir) + { + /* update the directories and files here */ + std::map::iterator dit; + std::map::iterator fit; + + /* update this dir */ + fe.name = olddir->name; + fi -> updateDirEntry(olddir->parent->path, fe, stamp); + + /* update subdirs */ + for(dit = olddir->subdirs.begin(); dit != olddir->subdirs.end(); dit++) + { + fe.name = (dit->second)->name; + /* set the age as out-of-date so that it gets checked */ + fi -> updateDirEntry(olddir->path, fe, 0); + } + + /* update files */ + for(fit = olddir->files.begin(); fit != olddir->files.end(); fit++) + { + fe.name = (fit->second)->name; + fi -> updateFileEntry(olddir->path, fe, stamp); + } + } + /* clean up the dir */ + fi -> removeOldDirectory(olddir->parent->path, olddir->name, stamp); + + fi -> printFileIndex(std::cout); + } + + fi -> printFileIndex(std::cout); + + return 1; +} + + + + + +FileIndex *createBasicFileIndex(time_t age) +{ + FileIndex *fi = new FileIndex("A SILLY ID"); + + FileEntry fe; + + /* print empty FileIndex */ + fi -> printFileIndex(std::cout); + + std::list rootdirs; + rootdirs.push_back("base1"); + rootdirs.push_back("base2"); + rootdirs.push_back("base3"); + + fi -> setRootDirectories(rootdirs, age); + + /* add some entries */ + fe.name = "dir1"; + fi -> updateDirEntry("base1",fe, age); + fe.name = "file1"; + fi -> updateFileEntry("/base1/dir1/",fe, age); + fe.name = "file2"; + fi -> updateFileEntry("/base1/dir1/",fe, age); + fe.name = "file3"; + fi -> updateFileEntry("/base1/dir1/",fe, age); + fe.name = "file4"; + fi -> updateFileEntry("/base1/dir1/",fe, age); + + fe.name = "dir2"; + fi -> updateDirEntry("/base1",fe, age); + fe.name = "file5"; + fi -> updateFileEntry("/base1/dir2/",fe, age); + fe.name = "file6"; + fi -> updateFileEntry("/base1/dir2/",fe, age); + fe.name = "file7"; + fi -> updateFileEntry("/base1/dir2/",fe, age); + fe.name = "file8"; + fi -> updateFileEntry("/base1/",fe, age); + + + fe.name = "dir3"; + fi -> updateDirEntry("/base1/dir2/",fe, age); + fe.name = "file10"; + fi -> updateFileEntry("/base1/dir2/dir3",fe, age); + fe.name = "file11"; + fi -> updateFileEntry("/base1/dir2/dir3",fe, age); + fe.name = "file12"; + fi -> updateFileEntry("/base1/dir2/dir3",fe, age); + + + fe.name = "dir4"; + fi -> updateDirEntry("/base3/",fe, age); + fe.name = "file20"; + fi -> updateFileEntry("/base3/dir4/",fe, age); + fe.name = "file21"; + fi -> updateFileEntry("/base3/dir4",fe, age); + + // one that will fail. + fe.name = "file20"; + fi -> updateFileEntry("/base3/",fe, age); + + fi -> printFileIndex(std::cout); + + return fi; +} + diff --git a/libretroshare/src/dbase/ftest.cc b/libretroshare/src/dbase/ftest.cc new file mode 100644 index 000000000..443a94ce9 --- /dev/null +++ b/libretroshare/src/dbase/ftest.cc @@ -0,0 +1,111 @@ +/* + * "$Id: ftest.cc,v 1.5 2007-02-18 21:46:49 rmf24 Exp $" + * + * Other Bits for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + +/* Example Test of filedex index */ + +#include "filedex.h" +#include + +int main() +{ + filedex fd; + std::string term; + std::list dirs; + std::list terms; + std::list results; + std::list::iterator it; + + dirs.push_back(DirItem("/usr/local", "", 1)); + dirs.push_back(DirItem("/var/log", "", 2)); + + fd.load(dirs); + + // now show the root directories... + results.clear(); + results = fd.dirlisting(""); + + std::cerr << "Root Directory Results:" << std::endl; + for(it = results.begin(); it != results.end(); it++) + { + std::cerr << "Full Path: " << (*it) -> path << std::endl; + std::cerr << "\tFile:" << (*it) -> file << std::endl; + std::cerr << "\tExt:" << (*it) -> ext; + std::cerr << " Size: " << (*it) -> len << std::endl; + std::cerr << "\tDir:" << (*it) -> subdir << std::endl; + } + + while(1) + { + std::cerr << "Enter Search Term :"; + std::cin >> term; + std::cerr << "Searching For:" << term << std::endl; + terms.clear(); + terms.push_back(term); + + results.clear(); + results = fd.search(terms, 10, false); + + std::cerr << "Search Results:" << std::endl; + for(it = results.begin(); it != results.end(); it++) + { + std::cerr << "Full Path: " << (*it) -> path << std::endl; + std::cerr << "\tFile:" << (*it) -> file << std::endl; + std::cerr << "\tExt:" << (*it) -> ext; + std::cerr << " Size: " << (*it) -> len << std::endl; + std::cerr << "\tDir:" << (*it) -> subdir << std::endl; + } + + results.clear(); + results = fd.dirlisting(term); + + std::cerr << "FileName Results:" << std::endl; + for(it = results.begin(); it != results.end(); it++) + { + std::cerr << "Full Path: " << (*it) -> path << std::endl; + std::cerr << "\tFile:" << (*it) -> file << std::endl; + std::cerr << "\tExt:" << (*it) -> ext; + std::cerr << " Size: " << (*it) -> len << std::endl; + std::cerr << "\tDir:" << (*it) -> subdir << std::endl; + } + + results.clear(); + results = fd.findfilename(term); + + std::cerr << "FileName Results:" << std::endl; + for(it = results.begin(); it != results.end(); it++) + { + std::cerr << "Full Path: " << (*it) -> path << std::endl; + std::cerr << "\tFile:" << (*it) -> file << std::endl; + std::cerr << "\tExt:" << (*it) -> ext; + std::cerr << " Size: " << (*it) -> len << std::endl; + std::cerr << "\tDir:" << (*it) -> subdir << std::endl; + } + } + + //sleep(5); + return 1; +} + + diff --git a/libretroshare/src/dbase/looktest.cc b/libretroshare/src/dbase/looktest.cc new file mode 100644 index 000000000..c36db4447 --- /dev/null +++ b/libretroshare/src/dbase/looktest.cc @@ -0,0 +1,89 @@ +/* + * "$Id: looktest.cc,v 1.1 2007-02-19 20:08:30 rmf24 Exp $" + * + * Other Bits for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "filedex.h" +#include "dbase/filelook.h" +#include + +#include "pqi/pqi.h" + +int main() +{ + fileLook *fl = new fileLook(); + std::string term; + std::list dirs; + std::list terms; + std::list results; + std::list::iterator it; + + dirs.push_back("/mnt/disc2/extra/rmf24/mp3s/good"); + dirs.push_back("/mnt/disc2/extra/rmf24/mp3s/marks"); + dirs.push_back("/mnt/disc2/extra/rmf24/mp3s/incoming"); + + fl -> start(); /* background look thread */ + + std::cerr << "FileLook Thread started" << std::endl; + + fl -> setSharedDirectories(dirs); + + PQFileItem *i = new PQFileItem(); + + + std::cerr << "test Lookup ..." << std::endl; + fl -> lookUpDirectory(i); + std::cerr << "Entering Main Loop" << std::endl; + + while(1) + { + std::cerr << "Enter Search Term :"; + std::cin >> term; + std::cerr << "Searching For:" << term << std::endl; + terms.clear(); + terms.push_back(term); + + PQFileItem *i = new PQFileItem(); + i -> path = term; + + std::cerr << "Root Lookup ..." << std::endl; + fl -> lookUpDirectory(i); + std::cerr << "LookUp done" << std::endl; + + while(NULL != (i = (PQFileItem *) fl -> getResult())) + { + std::cerr << "Results:" << std::endl; + i -> print(std::cerr); + std::cerr << std::endl; + } + + } + + //sleep(5); + return 1; +} + + diff --git a/libretroshare/src/dbase/rsexpr.cc b/libretroshare/src/dbase/rsexpr.cc new file mode 100644 index 000000000..db22692f6 --- /dev/null +++ b/libretroshare/src/dbase/rsexpr.cc @@ -0,0 +1,149 @@ +/* + * rs-core/src/dbase: rsexpr.cc + * + * RetroShare C++ Interface. + * + * Copyright 2007-2008 by Kashif Kaleem. + * + * 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 "dbase/findex.h" +#include "rsiface/rsexpr.h" +#include + + +/****************************************************************************************** +eval functions of relational expressions. + +******************************************************************************************/ + +bool DateExpression::eval(FileEntry *file) +{ + return evalRel(file->modtime); +} + +bool SizeExpression::eval(FileEntry *file) +{ + return evalRel(file->size); +} + +bool PopExpression::eval(FileEntry *file) +{ + return evalRel(file->pop); +} + +/****************************************************************************************** +Code for evaluating string expressions + +******************************************************************************************/ + +bool NameExpression::eval(FileEntry *file) +{ + return evalStr(file->name); +} + +bool PathExpression::eval(FileEntry *file){ + std::string path; + /*Construct the path of this file*/ + DirEntry * curr = file->parent; + while ( curr != NULL ){ + path = curr->name+"/"+ path; + curr = curr->parent; + } + return evalStr(path); +} + +bool ExtExpression::eval(FileEntry *file){ + std::string ext; + /*Get the part of the string after the last instance of . in the filename */ + unsigned int index = file->name.find_last_of('.'); + if (index != std::string::npos) { + ext = file->name.substr(index+1); + if (ext != "" ){ + return evalStr(ext); + } + } + return false; +} + +bool HashExpression::eval(FileEntry *file){ + return evalStr(file->hash); +} + +/*Check whether two strings are 'equal' to each other*/ +static bool StrEquals(const std::string & str1, const std::string & str2, + bool IgnoreCase ){ + if ( str1.size() != str2.size() ){ + return false; + } else if (IgnoreCase) { + std::equal( str1.begin(), str1.end(), + str2.begin(), CompareCharIC() ); + } + return std::equal( str1.begin(), str1.end(), + str2.begin()); +} + +/*Check whether one string contains the other*/ +static bool StrContains( std::string & str1, std::string & str2, + bool IgnoreCase){ + + std::string::const_iterator iter ; + if (IgnoreCase) { + iter = std::search( str1.begin(), str1.end(), + str2.begin(), str2.end(), CompareCharIC() ); + } else { + iter = std::search( str1.begin(), str1.end(), + str2.begin(), str2.end()); + } + + return ( iter != str1.end() ); +} + + +bool StringExpression :: evalStr ( std::string &str ){ + std::list::iterator iter; + switch (Op) { + case ContainsAllStrings: + for ( iter = terms.begin(); iter != terms.end(); iter++ ) { + if ( StrContains (str, *iter, IgnoreCase) == false ){ + return false; + } + } + return true; + break; + case ContainsAnyStrings: + for ( iter = terms.begin(); iter != terms.end(); iter++ ) { + if ( StrContains (str,*iter, IgnoreCase) == true ) { + return true; + } + } + break; + case EqualsString: + for ( iter = terms.begin(); iter != terms.end(); iter++ ) { + if ( StrEquals (str,*iter, IgnoreCase) == true ) { + return true; + } + } + break; + default: + return false; + } + return false; +} diff --git a/libretroshare/src/dbase/searchtest.cc b/libretroshare/src/dbase/searchtest.cc new file mode 100644 index 000000000..2bd4bffa0 --- /dev/null +++ b/libretroshare/src/dbase/searchtest.cc @@ -0,0 +1,74 @@ +/* + * RetroShare FileCache Module: searchtest.cc + * + * Copyright 2004-2007 by Kefei Zhou. + * + * 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 "dbase/findex.h" +#include +#include + +int main() +{ + + std::cout << std::string::npos << std::endl; + std::string testfile = "searchtest.index"; + std::string fhash = "6851c28d99a6616a86942c3914476bf11997242a"; + FileIndex *fi = new FileIndex("DUMB ID"); + + // loading fileindex + std::cout << std::endl << "Test load" << std::endl; + fi->loadIndex(testfile, fhash, 1532); + fi->printFileIndex(std::cout); + std::cout << "FileIndex Loaded" << std::endl << std::endl; + + std::list hashresult; + std::list termresult; + + // searchhash + std::string findhash = "82bffa6e1cdf8419397311789391238174817481"; + + + std::cout << "Search hash : " << findhash << std::endl; + fi->searchHash(findhash, hashresult); + + while(!hashresult.empty()) + { + hashresult.back()->print(std::cout); + hashresult.pop_back(); + } + + // searchterm + std::list terms; + terms.push_back("paper"); + terms.push_back("doc"); + + std::cout << "Search terms" << std::endl; + fi->searchTerms(terms, termresult); + + while(!termresult.empty()) + { + termresult.back()->print(std::cout); + termresult.pop_back(); + } + + delete fi; + return 1; +} diff --git a/libretroshare/src/dht/Makefile b/libretroshare/src/dht/Makefile new file mode 100644 index 000000000..36cc71947 --- /dev/null +++ b/libretroshare/src/dht/Makefile @@ -0,0 +1,28 @@ + +RS_TOP_DIR = .. +include ../make.opt + +OBJ = dhthandler.o +#CADKINC = /home/rmf24/prog/src/KadC +#CFLAGS += -I $(CADKINC) +#RSLIBS += -L $(CADKINC) -lKadC + + +all : $(OBJ) librs dhttest + +dhttest: $(OBJ) dhttest.o + $(CC) $(CFLAGS) -o dhttest $(OBJ) dhttest.o $(RSLIBS) + +librs: $(OBJ) + $(AR) r $(LIBRS) $(OBJ) + $(RANLIB) $(LIBRS) + +.cc.o: + $(CC) $(CFLAGS) -c $< + +clean: + -/bin/rm $(OBJ) dhttest.o + +clobber: clean + -/bin/rm dhttest + diff --git a/libretroshare/src/dht/dhthandler.cc b/libretroshare/src/dht/dhthandler.cc new file mode 100644 index 000000000..2b8eccefd --- /dev/null +++ b/libretroshare/src/dht/dhthandler.cc @@ -0,0 +1,710 @@ + +#include "dht/dhthandler.h" + + +/* This stuff is actually C */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include + +#ifdef __cplusplus +} /* extern C */ +#endif +/* This stuff is actually C */ + + +/* HACK TO SWITCH THIS OFF during testing */ +/*define NO_DHT_RUNNING 1*/ + + +#include +#include + +std::ostream &operator<<(std::ostream &out, dhtentry &ent) +{ + out << "DHTENTRY(" << ent.id << "): Status: " << ent.status; + out << std::endl; + out << "\taddr: " << inet_ntoa(ent.addr.sin_addr) << ":" << ntohs(ent.addr.sin_port); + out << std::endl; + out << "\tlastTS: " << time(NULL) - ent.lastTs << " secs ago"; + out << "\tFlags: " << ent.flags; + out << std::endl; + return out; +} + +#define DHT_UNKNOWN 0 +#define DHT_SEARCHING 1 /* for peers */ +#define DHT_PUBLISHING 1 /* for self */ +#define DHT_FOUND 2 + +/* time periods */ +#define DHT_MIN_PERIOD 10 +#define DHT_SEARCH_PERIOD 300 +#define DHT_REPUBLISH_PERIOD 1200 + +void cleardhtentry(dhtentry *ent, std::string id) +{ + ent -> name = ""; + ent -> id = id; + ent -> addr.sin_addr.s_addr = 0; + ent -> addr.sin_port = 0; + ent -> flags = 0; + ent -> status = DHT_UNKNOWN; + ent -> lastTs = 0; + return; +} + + +void initdhtentry(dhtentry *ent) +{ + ent -> name = ""; + // leave these ... + //ent -> addr.sin_addr.in_addr = 0; + //ent -> addr.sin_port = 0; + //ent -> flags = 0; + ent -> status = DHT_SEARCHING; + ent -> lastTs = time(NULL); + return; +} + +void founddhtentry(dhtentry *ent, struct sockaddr_in inaddr, unsigned int flags) +{ + ent -> addr = inaddr; + ent -> flags = flags; + ent -> status = DHT_FOUND; + ent -> lastTs = time(NULL); + return; +} + + +dhthandler::dhthandler(std::string inifile) + :mShutdown(false), dhtOk(false) +{ + /* init own to null */ + dataMtx.lock(); /* LOCK MUTEX */ + cleardhtentry(&ownId, ""); + kadcFile = inifile; + dataMtx.unlock(); /* UNLOCK MUTEX */ + + /* start up the threads... */ + init(); +} + +dhthandler::~dhthandler() +{ + +} + + + /* This is internal - only called when active */ +bool dhthandler::networkUp() +{ + /* no need for mutex? */ + return (20 < KadC_getnknodes(pkcc)); +} + + /* this is external */ +int dhthandler::dhtPeers() +{ + int count = 0; + dataMtx.lock(); /* LOCK MUTEX */ + if (dhtOk) + { + count = KadC_getnknodes(pkcc); + } + dataMtx.unlock(); /* UNLOCK MUTEX */ + return count; + +} + + + /* set own tag */ +void dhthandler::setOwnHash(std::string id) +{ + dataMtx.lock(); /* LOCK MUTEX */ + ownId.id = id; + dataMtx.unlock(); /* UNLOCK MUTEX */ +} + +void dhthandler::setOwnPort(short port) +{ + dataMtx.lock(); /* LOCK MUTEX */ + ownId.addr.sin_port = htons(port); + /* reset own status -> so we republish */ + ownId.status = DHT_UNKNOWN; + + dataMtx.unlock(); /* UNLOCK MUTEX */ +} + +bool dhthandler::getExtAddr(struct sockaddr_in &addr, unsigned int &flags) +{ + dataMtx.lock(); /* LOCK MUTEX */ + + if (ownId.status == DHT_UNKNOWN) + { + dataMtx.unlock(); /* UNLOCK MUTEX */ + return false; + } + + addr = ownId.addr; + flags = ownId.flags; + + dataMtx.unlock(); /* UNLOCK MUTEX */ + return true; +} + + /* at startup */ +void dhthandler::addFriend(std::string id) +{ + dataMtx.lock(); /* LOCK MUTEX */ + std::map::iterator it; + it = addrs.find(id); + if (it == addrs.end()) + { + /* not found - add */ + dhtentry ent; + cleardhtentry(&ent, id); + addrs[id] = ent; + } + else + { + /* already there */ + std::cerr << "dhthandler::addFriend() Already there!" << std::endl; + } + dataMtx.unlock(); /* UNLOCK MUTEX */ +} + +void dhthandler::removeFriend(std::string id) +{ + dataMtx.lock(); /* LOCK MUTEX */ + std::map::iterator it; + it = addrs.find(id); + if (it == addrs.end()) + { + /* not found - complain*/ + std::cerr << "dhthandler::addFriend() Already there!" << std::endl; + } + else + { + /* found */ + addrs.erase(it); + } + dataMtx.unlock(); /* UNLOCK MUTEX */ +} + + /* called prior to connect */ +bool dhthandler::addrFriend(std::string id, struct sockaddr_in &addr, unsigned int &flags) +{ + + dataMtx.lock(); /* LOCK MUTEX */ + + /* look it up */ + bool ret = false; + std::map::iterator it; + it = addrs.find(id); + if (it == addrs.end()) + { + /* not found - complain*/ + std::cerr << "dhthandler::addrFriend() Non-existant!" << std::endl; + ret = false; + } + else + { + if (it->second.status == DHT_FOUND) + { + addr = it->second.addr; + ret = true; + } + } + dataMtx.unlock(); /* UNLOCK MUTEX */ + return ret; +} + +int dhthandler::init() +{ + dataMtx.lock(); /* LOCK MUTEX */ + + /* HACK TO SWITCH THIS OFF during testing */ +#ifdef NO_DHT_RUNNING + dataMtx.unlock(); /* UNLOCK MUTEX */ + dhtOk = false; + return 1; +#endif + + char *filename = (char *) malloc(1024); + sprintf(filename, "%.1023s", kadcFile.c_str()); + + /* start up the dht server. */ + KadC_log("KadC - library version: %d.%d.%d\n", + KadC_version.major, KadC_version.minor, KadC_version.patchlevel); + + /* file, Leaf, StartNetworking (->false in full version) */ + kcc = KadC_start(filename, true, 1); + if(kcc.s != KADC_OK) { + KadC_log("KadC_start(%s, %d) returned error %d:\n", + kadcFile.c_str(), 1, kcc.s); + KadC_log("%s %s", kcc.errmsg1, kcc.errmsg2); + + dhtOk = false; + } + else + { + dhtOk = true; + } + + pkcc = &kcc; + + dataMtx.unlock(); /* UNLOCK MUTEX */ + return 1; +} + +int dhthandler::shutdown() +{ + dataMtx.lock(); /* LOCK MUTEX */ + /* end the dht server. */ + kcs = KadC_stop(&kcc); + if(kcs != KADC_OK) { + KadC_log("KadC_stop(&kcc) returned error %d:\n", kcc.s); + KadC_log("%s %s", kcc.errmsg1, kcc.errmsg2); + } + + KadC_list_outstanding_mallocs(10); + + dataMtx.unlock(); /* UNLOCK MUTEX */ + return 0; +} + + +int dhthandler::write_inifile() +{ + /* if we're up and we have enough valid ones */ + +#define MIN_KONTACTS 50 + + if (KadC_getncontacts(pkcc) > MIN_KONTACTS) + { + std::cerr << "DhtHandler::Write_IniFile() Writing File" << std::endl; + if (KADC_OK != KadC_write_inifile(pkcc, NULL)) + { + KadC_log("KadC_write_inifile(%s, %d) returned error %d:\n", + kadcFile.c_str(), 1, kcc.s); + KadC_log("%s %s", kcc.errmsg1, kcc.errmsg2); + } + } + else + { + std::cerr << "DhtHandler::Write_IniFile() Not enough contacts" << std::endl; + } + return 1; +} + + +void dhthandler::run() +{ + + /* infinite loop */ + int totalsleep = 0; + while(1) + { + // std::cerr << "DhtHandler::Run()" << std::endl; + + if (!dhtOk) + { + std::cerr << "DhtHandler::Run() Failed to Start" << std::endl; + +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS + sleep(1); +#else + + Sleep(1000); +#endif +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ + + continue; + } + + /* lock it up */ + dataMtx.lock(); /* LOCK MUTEX */ + + bool toShutdown = mShutdown; + + /* shutdown */ + dataMtx.unlock(); /* UNLOCK MUTEX */ + + + print(); + + if (toShutdown) + { + shutdown(); + dhtOk = false; + } + + + /* check ids */ + + int allowedSleep = checkOwnStatus(); + int nextPeerCheck = checkPeerIds(); + if (nextPeerCheck < allowedSleep) + { + allowedSleep = nextPeerCheck; + } + if (allowedSleep > 10) + { + allowedSleep = 10; + } + else if (allowedSleep < 10) + { + allowedSleep = 10; + } + // std::cerr << "DhtHandler::Run() sleeping for:" << allowedSleep << std::endl; +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS + sleep(allowedSleep); +#else + Sleep(1000 * allowedSleep); +#endif +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ + +#define DHT_INIT_STORE_PERIOD 300 + + totalsleep += allowedSleep; + if (totalsleep > DHT_INIT_STORE_PERIOD) + { + write_inifile(); + totalsleep = 0; + } + + + } + return; +} + +int dhthandler::print() +{ + dataMtx.lock(); /* LOCK MUTEX */ + + std::cerr << "DHT Status:" << std::endl; + std::cerr << "KNodes: " << KadC_getnknodes(pkcc); + std::cerr << std::endl; + std::cerr << "Kontacts: " << KadC_getncontacts(pkcc); + std::cerr << std::endl; + std::cerr << "KBuckets: "; + std::cerr << std::endl; + KadC_listkbuckets(pkcc); + std::cerr << std::endl; + std::cerr << "Own DHT:" << std::endl; + std::cerr << ownId << std::endl; + + std::cerr << addrs.size() << " Peers:" << std::endl; + + std::map::iterator it; + for(it = addrs.begin(); it != addrs.end(); it++) + { + std::cerr << "Peer DHT" << std::endl; + std::cerr << it -> second << std::endl; + } + + dataMtx.unlock(); /* UNLOCK MUTEX */ + return 1; +} + + +int dhthandler::checkOwnStatus() +{ + dataMtx.lock(); /* LOCK MUTEX */ + + int nextcall = DHT_REPUBLISH_PERIOD; + bool toPublish = false; + + /* if we are publishing, and time up ... republish */ + if (ownId.status == DHT_UNKNOWN) + { + /* if valid Hash and Port */ + if ((ownId.id != "") && (ownId.addr.sin_port != 0) && + (networkUp())) /* network is up */ + { + unsigned long int extip = KadC_getextIP(pkcc); + ownId.flags = KadC_getfwstatus(pkcc); + if (extip != 0) + { + ownId.addr.sin_addr.s_addr = htonl(extip); + toPublish = true; + } + } + nextcall = DHT_MIN_PERIOD; + } + else /* ownId.status == DHT_PUBLISHING */ + { + /* check time. + */ + if (ownId.lastTs + DHT_REPUBLISH_PERIOD < time(NULL)) + { + toPublish = true; + } + } + + dataMtx.unlock(); /* UNLOCK MUTEX */ + + if (toPublish) + { + publishOwnId(); + } + + return nextcall; +} + +int dhthandler::checkPeerIds() +{ + dataMtx.lock(); /* LOCK MUTEX */ + /* if we are unknown .... wait */ + int nextcall = DHT_REPUBLISH_PERIOD; + std::map::iterator it; + + /* local list */ + std::list idsToUpdate; + std::list::iterator it2; + + for(it = addrs.begin(); it != addrs.end(); it++) + { + /* if we are publishing, and time up ... republish */ + if (it -> second.status == DHT_UNKNOWN) + { + /* startup */ + idsToUpdate.push_back(it->first); + } + else if (it -> second.status == DHT_SEARCHING) + { + /* check if time */ + if (it -> second.lastTs + DHT_SEARCH_PERIOD < time(NULL)) + { + idsToUpdate.push_back(it->first); + } + nextcall = DHT_SEARCH_PERIOD; + } + else if (it -> second.status == DHT_FOUND) + { + /* check if time */ + if (it -> second.lastTs + DHT_REPUBLISH_PERIOD < time(NULL)) + { + idsToUpdate.push_back(it->first); + } + } + } + + dataMtx.unlock(); /* UNLOCK MUTEX */ + + for(it2 = idsToUpdate.begin(); it2 != idsToUpdate.end(); it2++) + { + searchId(*it2); + } + + return nextcall; +} + +/* already locked */ +int dhthandler::publishOwnId() +{ + dataMtx.lock(); /* LOCK MUTEX */ + /* publish command */ + /* publish {#[khash]|key} {#[vhash]|value} [meta-list [nthreads [nsecs]]] */ + char index[1024]; + sprintf(index, "#%.1023s", ownId.id.c_str()); + char value[1024]; + sprintf(value, "#%.1023s", ownId.id.c_str()); + + /* to store the ip address and flags */ + char metalist[1024]; + sprintf(metalist, "rsid=%s:%d;flags=%04X;", + inet_ntoa(ownId.addr.sin_addr), + ntohs(ownId.addr.sin_port), + ownId.flags); + + dataMtx.unlock(); /* UNLOCK MUTEX */ + + + int nthreads = 10; + int duration = 15; + int status; + + /* might as well hash back to us? */ + status = KadC_republish(pkcc, index, value, metalist, nthreads, duration); + if(status == 1) + { + KadC_log("Syntax error preparing search. Try: p key #hash [tagname=tagvalue[;...]]\n"); + } + + dataMtx.lock(); /* LOCK MUTEX */ + + /* update entry */ + initdhtentry(&ownId); + + dataMtx.unlock(); /* UNLOCK MUTEX */ + + return 1; +} + + +/* must be protected by mutex externally */ +dhtentry *dhthandler::finddht(std::string id) +{ + std::map::iterator it; + it = addrs.find(id); + if (it == addrs.end()) + { + return NULL; + } + return &(it->second); +} + +int dhthandler::searchId(std::string id) +{ + if (!networkUp()) + return 0; + + /* ack search */ + bool updated = false; + + /* search */ + void *iter; + KadCdictionary *pkd; + char *filter = ""; + int nthreads = 10; + int duration = 15; + int maxhits = 100; + time_t starttime = time(NULL); + void *resdictrbt; + int nhits; + + char index[1024]; + sprintf(index, "#%.1023s", id.c_str()); + + /* cannot be holding mutex here... (up to 15 secs) */ + resdictrbt = KadC_find(pkcc, index, filter, nthreads, maxhits, duration); + + nhits = rbt_size(resdictrbt); + + /* list each KadCdictionary returned in the rbt */ + for(iter = rbt_begin(resdictrbt); iter != NULL; iter = rbt_next(resdictrbt, iter)) { + pkd = rbt_value(iter); + + KadC_log("Found: "); + KadC_int128flog(stdout, KadCdictionary_gethash(pkd)); + KadC_log("\n"); + KadCdictionary_dump(pkd); + KadC_log("\n"); + + KadCtag_iter iter; + unsigned int i; + + bool found = false; + std::string addrline; + std::string flagsline; + for(i = 0, KadCtag_begin(pkd, &iter); (i < iter.tagsleft); i++, KadCtag_next(&iter)) { + if(i > 0) + KadC_log(";"); + if ((strncmp("rsid", iter.tagname, 4) == 0) + && (iter.tagtype == KADCTAG_STRING)) + { + KadC_log("DECODING:%s", (char *)iter.tagvalue); + addrline = (char *) iter.tagvalue; + found = true; + } + if ((strncmp("flags", iter.tagname, 5) == 0) + && (iter.tagtype == KADCTAG_STRING)) + { + KadC_log("DECODING:%s", (char *)iter.tagvalue); + flagsline = (char *) iter.tagvalue; + } + } + + /* must parse:rsid=ddd.ddd.ddd.ddd:dddd;flags=xxxx */ + struct sockaddr_in addr; + unsigned int flags = 0; + unsigned int a, b, c, d, e; + if ((found) && + (5 == sscanf(addrline.c_str(), "%d.%d.%d.%d:%d", &a, &b, &c, &d, &e))) + { + std::ostringstream out; + out << a << "." << b << "." << c << "." << d; + inet_aton(out.str().c_str(), &(addr.sin_addr)); + addr.sin_port = htons(e); + + if (flagsline != "") + sscanf(flagsline.c_str(), "%x", &flags); + + std::cerr << "Decoded entry: " << out.str() << " : " << e << std::endl; + + + dataMtx.lock(); /* LOCK MUTEX */ + + dhtentry *ent = finddht(id); + if (ent) + { + founddhtentry(ent, addr, flags); + updated = true; + } + + dataMtx.unlock(); /* UNLOCK MUTEX */ + + } + else + { + std::cerr << "Failed to Scan:" << addrline << " <-----" << std::endl; + } + + } + KadC_log("Search completed in %d seconds - %d hit%s returned\n", + time(NULL)-starttime, nhits, (nhits == 1 ? "" : "s")); + + for(iter = rbt_begin(resdictrbt); iter != NULL; iter = rbt_begin(resdictrbt)) { + pkd = rbt_value(iter); + rbt_erase(resdictrbt, iter); + KadCdictionary_destroy(pkd); + } + rbt_destroy(resdictrbt); + + dataMtx.lock(); /* LOCK MUTEX */ + if (!updated) + { + dhtentry *ent = finddht(id); + if (ent) + { + initdhtentry(ent); + } + } + dataMtx.unlock(); /* UNLOCK MUTEX */ + + return 1; +} + +#if (0) + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include /* required by net.h, sigh... */ +#include /* only for domain2hip() */ + +#include + +#endif + diff --git a/libretroshare/src/dht/dhthandler.h b/libretroshare/src/dht/dhthandler.h new file mode 100644 index 000000000..fe615444a --- /dev/null +++ b/libretroshare/src/dht/dhthandler.h @@ -0,0 +1,97 @@ +#ifndef _RS_DHT_IFACE_H +#define _RS_DHT_IFACE_H + +#include + +/* This stuff is actually C */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +#ifdef __cplusplus +} /* extern C */ +#endif +/* This stuff is actually C */ + + +#include "util/rsthreads.h" +#include +#include + +/* platform independent networking... */ +#include "pqi/pqinetwork.h" +#include "pqi/pqiaddrstore.h" + +class dhtentry +{ + public: + std::string name; + std::string id; + struct sockaddr_in addr; + unsigned int flags; + int status; + int lastTs; +}; + +class dhthandler: public RsThread, public pqiAddrStore +{ + public: + + dhthandler(std::string inifile); + ~dhthandler(); + + /* RsIface */ + /* set own tag */ +void setOwnHash(std::string id); +void setOwnPort(short port); +bool getExtAddr(sockaddr_in &addr, unsigned int &flags); + + /* at startup */ +void addFriend(std::string id); +void removeFriend(std::string id); +int dhtPeers(); + + /* pqiAddrStore ... called prior to connect */ +virtual bool addrFriend(std::string id, struct sockaddr_in &addr, unsigned int &flags); + +int init(); +int shutdown(); +int print(); + + /* must run thread */ +virtual void run(); + + private: + + int write_inifile(); + + bool networkUp(); /* get status */ + + int checkOwnStatus(); + int checkPeerIds(); + int publishOwnId(); + int searchId(std::string id); + + dhtentry *finddht(std::string id); + + /* Mutex for data below */ + RsMutex dataMtx; + + dhtentry ownId; + std::map addrs; + + KadCcontext kcc, *pkcc; + KadC_status kcs; + std::string kadcFile; + bool mShutdown; + + bool dhtOk; +}; + + + +#endif /* _RS_DHT_IFACE_H */ diff --git a/libretroshare/src/dht/dhttest.cc b/libretroshare/src/dht/dhttest.cc new file mode 100644 index 000000000..e06e53b22 --- /dev/null +++ b/libretroshare/src/dht/dhttest.cc @@ -0,0 +1,90 @@ + +#include "dht/dhthandler.h" + + +int main(int argc, char **argv) +{ + + int id = argc % 3; + + char *hash1 = "3509426505463458576487"; + char *hash2 = "1549879882341985914515"; + char *hash3 = "8743598543269526505434"; + + int port1 = 8754; + int port2 = 2355; + int port3 = 6621; + + std::cerr << "Starting dhttest Id: " << id << std::endl; +/******************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#else + // Windows Networking Init. + WORD wVerReq = MAKEWORD(2,2); + WSADATA wsaData; + + if (0 != WSAStartup(wVerReq, &wsaData)) + { + std::cerr << "Failed to Startup Windows Networking"; + std::cerr << std::endl; + } + else + { + std::cerr << "Started Windows Networking"; + std::cerr << std::endl; + } + +#endif +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ + + #ifdef PTW32_STATIC_LIB + pthread_win32_process_attach_np(); + #endif + + dhthandler dht("tst.ini"); + + dht.start(); + + if (id == 0) + { + dht.setOwnPort(port1); + dht.setOwnHash(hash1); + + dht.addFriend(hash2); + dht.addFriend(hash3); + } + else if (id == 1) + { + dht.setOwnPort(port2); + dht.setOwnHash(hash2); + + dht.addFriend(hash1); + dht.addFriend(hash3); + } + else + { + dht.setOwnPort(port3); + dht.setOwnHash(hash3); + + dht.addFriend(hash1); + dht.addFriend(hash2); + } + + + while(1) + { + +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS + sleep(1); +#else + + Sleep(1000); +#endif +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ + } + + +} + diff --git a/libretroshare/src/dht/tst.ini b/libretroshare/src/dht/tst.ini new file mode 100644 index 000000000..5e0904576 --- /dev/null +++ b/libretroshare/src/dht/tst.ini @@ -0,0 +1,272 @@ +[local] +# if the hash (first arg) is 0, a random value will be used. +0 0.0.0.0 1234 4662 0 +[some_ignored_stuff] +these lines... +...under unrecognized sections... +...are ignored and left alone... +[overnet_peers] +# 259 contacts follow +01e32c7d216d1479ff1738b88f81bf3b 82.224.47.90 11297 0 +01ee86531f5070a344e9d0484744d14d 85.157.111.164 6267 0 +028b0545ae661b53d1538d90a7728fac 87.238.10.193 8150 0 +032a16ddd72ad9873e036db246930163 83.78.25.111 10089 0 +035a2148d7da45022bc36088cbeaa2d5 84.188.185.143 6780 0 +035d1f176411bd53b4578e383a66bcdd 82.82.140.226 4298 0 +03b47000764e0b3be3efaff6f81e1a0b 24.0.148.14 4665 0 +057b9a66771826db0bbd51483a10ff93 85.97.196.22 5678 0 +084fe60f368e1117c52e88e8f209113e 85.16.152.185 9363 0 +0857c84b6c77bf9e0d0cdeea6e56f11a 172.159.137.252 11316 1 +08ca7126b6ead7e6ea3870d13f32d004 83.11.233.250 3911 0 +090b57278c13cc673230893305538d1f 82.252.210.95 15030 1 +09166e1c64456cc7b3a989d1acb6bd65 84.98.135.162 11933 0 +092a05ae3c651f430c806bc49aeb2cb9 210.213.140.62 10521 0 +0941d60b7b2d83ef565047610570998c 83.181.168.72 3450 0 +09729bc4c1639fe3f4d914cbb8ddc213 82.247.37.205 7663 0 +098b7599f442273d1ec2f04710ff436f 80.142.123.8 6133 0 +09ebe97100d307d2e5419fa2f7cdfec3 87.10.147.210 10301 0 +0a157ca24a7445da325322144ee01993 24.74.148.251 9464 0 +0a23207ed240aa7f35202bd4e63b8bdd 84.170.225.102 22222 0 +0a2e67bee755ff15c5518b3072867034 87.14.169.88 4445 0 +0a39d5f89b4910945087ef9886f58c77 82.235.178.185 9818 0 +0becaf5dbbe2eb30694c86408cffb25b 82.234.43.27 19632 0 +1284fc9d5064cf0c89630fcc06f86f96 122.254.164.2 11839 0 +12b0ebaa0b3e17e16e38f7149f899e96 82.52.190.151 5405 0 +12cefeb85edc41e33686ec23f707621c 90.27.87.164 5637 0 +12dd8d3931c05d9dc7f9fe0fafc54e46 213.103.153.186 11880 0 +12e075a67748bd9888a537b1ddfc68bb 75.162.143.84 12100 0 +12f298eb89c926b23eef71724794f386 80.97.199.30 7007 0 +12f9fb4045af33cb47f5b87ac618b39d 85.140.95.208 6484 0 +12fced7a66d90c3c029e2fbb0d27d44e 70.48.189.93 6093 1 +13005d05429d43624683fd2c3ce83c65 83.214.38.125 7448 0 +13c90dbc29a45b6d8297ce758772c056 58.77.54.12 12291 0 +140470e218c7f8184af176e54cecc294 62.94.193.218 5600 0 +148a88de9e03129f7e3e15bdeae59fe1 70.48.175.156 10301 0 +14d04c790464ad46121934041d6254ec 62.57.36.125 4041 0 +14d589f5f766e40c0838fd9a74218f7a 71.56.125.35 7543 0 +158889e94d84e71c135935061743d456 200.16.221.180 3432 0 +1667353bcc5e4953c9dcb2b025a8e87b 212.76.242.34 9574 1 +168d639d6f6b4f87e1bd9b1df8344729 218.162.61.52 12901 0 +16c3bcc5ffc4ce92cdfc7db9f8d52184 80.188.8.104 4662 0 +182015e86828a195e22ccb2455378e91 220.134.22.185 3315 0 +18f43620c84d373a5935eb1cffa4bb96 89.169.146.14 8323 0 +1998abaf1be11abe19a2ea5961befa38 75.36.191.184 5002 0 +19f0b20dce022dca4ca915b7ce859b17 59.124.237.86 11590 0 +19ffaeafef17d524126ed45ff7326c2b 83.2.140.63 3128 0 +1a0b0df71afbac06620431e1ddb5f939 212.106.171.142 6711 0 +1b6b5245e54d2f68972bfb178b887724 203.49.242.90 6324 0 +1c20dc407cfa9b57778e929a7867af8a 87.175.196.166 5713 1 +21b3df22b8c563ac18ee4dfe35a155bc 58.232.60.235 4197 0 +21d59ad8e70e8e60659638e29eef5c25 80.203.138.183 6350 0 +220c4cc811b0511f13ccd0672fe2954a 83.28.247.107 3884 0 +287f16f02efd285381d7657ca5cd99d9 87.221.0.217 6672 0 +2981223354677a4ddf777902e9225bef 81.179.202.34 4222 0 +29a7a5751d92da3ade58ad92a1ed942d 124.8.65.42 4422 0 +29be351bbe4318605d535c76b9a76a6d 83.23.38.244 11386 0 +29cf29ab2b870b288a292cefed0d94bf 151.44.119.139 7688 0 +29d063f9aba16668462ab3edf2f43ab7 61.224.52.103 5687 0 +2a0c14e8d6383d9e5bf2730f0d0ec857 82.130.210.82 50020 0 +2a11275793d740d102a1348fd3f45909 80.53.196.58 9936 0 +2a519604b6a0119c126194063edf4b8c 68.148.121.42 6472 0 +2a83ac042d1278798b00d3352aefe98d 24.243.188.178 10301 0 +2acf26c3b18173eb4eb6f73622540c6a 86.56.213.115 3558 0 +2bf18d609eb338c9697c9e99379fd16a 85.137.81.79 11717 0 +3279ca195c2f4ddf598b8a7dbfd670b6 84.125.74.120 23232 0 +32ac6a1eeabdcf65f1505d2a95cee6c9 83.24.146.73 11964 1 +3304d216ec77e0fa5c18712d53c008f6 85.57.160.211 7721 0 +33a550bed46568b18eb91fae70ca0dbe 24.225.232.219 12164 0 +33e97bddd82e4d09131b7342acfeb79c 24.132.162.32 3016 0 +33e9ca51aa7f521589a2e6a3438b2821 80.180.76.149 12777 0 +34085309549df35140c8e27068083a63 212.59.192.220 4029 0 +36196c2ea442dd5ae56cd35a7d1f8619 90.10.169.218 12214 0 +361cea6dd0d377f200474a2d72ca7ba6 149.135.104.131 8190 0 +3625c3d644b80f221568d688f0f135c5 90.7.181.106 12615 0 +36317d125a1aff13035bcd3c0dec4978 80.36.124.22 46675 0 +3640f164a682b2c5d249bdcd8bf38274 80.35.196.42 4665 0 +36a55737e170cc90ef3ebee1c3b0dc72 217.228.164.18 5325 0 +36d7979c3328056ab80a53e94588ae9c 87.122.0.101 9902 0 +37075f69ca1fe6aabe53567c2ab48a1a 87.227.73.35 7776 0 +375615ba9163d8ecc6a5aed410fe4182 81.1.118.25 5667 1 +3796255e359f42a5c4fe41976307b5cc 85.141.108.236 4505 0 +38b0e0fb572b282ed6a610adf7a90de8 82.232.90.43 12223 0 +38b39efee6bf73cdcc5aff57e816d6ea 71.17.52.65 11438 0 +38f6091d65b3483cb6f90d670cb3e8fa 151.97.69.209 9997 0 +39037677e44d021350494e6f7c055a8b 82.225.33.80 11541 0 +39145af608906d68f059d04b64e8a291 84.129.0.36 8940 0 +397460b987ff9e9e360f52136618b2c3 83.38.86.240 3378 0 +3ab05f4b0cebd8a2ff689ce8bfb55232 82.238.254.166 3868 0 +3acac309140ec0f5e906b6c4ad64d4f4 212.241.66.225 10986 0 +3b27d9526ef86fbbf0723ae413723c1d 85.16.150.41 9948 0 +3ebecd58d1f7263b087d9159664997c3 80.192.21.44 3751 0 +3f614043083f37e5c8487d36b237ea78 124.57.75.101 9934 0 +3f755464997b43d4d0826fcbbc8b266f 219.84.26.38 7583 0 +3fac223d6c8f833c42d2ae248e206f21 220.72.28.213 4105 0 +40bbdfb51868764a24fb96ddf1035f33 70.113.90.243 11327 0 +40ce92ad1ac65e7290541e2fa1915bdc 148.160.184.5 4669 0 +416297dd4a79f9fe526182de7dbb1e4d 88.73.212.252 11139 1 +418b6b00550617e913a3f85cb6043aa4 80.33.124.231 7000 0 +41d492e47d76f13e4cb76579123a99e7 84.151.121.46 5687 0 +48ae47cc410aa2ae05c1b707744301f4 82.55.119.14 5875 0 +48d9789199fc1008b36acb095f9fc787 62.43.160.213 12573 0 +48e228897865a53b264f4c57db5312d1 71.107.201.77 4864 0 +49ad250210a9842cfce8fb6d8b848cc9 70.244.241.16 8155 0 +49c0c086162a51a485c8fc579176ba03 84.148.228.169 12762 0 +4a6a309f7d179856cffb9e6e47921c6a 88.22.50.75 6955 0 +4abd70a4ceeee66563edf074f152d4ce 89.180.5.149 12492 0 +4e2006734147d86a4f7f47199014be4c 70.53.44.52 80 0 +4e2540fad59bfabd00ff5b28519b1e61 82.7.244.135 4614 0 +4f8e9b83504d589c5591d58e81406e18 123.99.82.220 9992 0 +4fd92008c42283607a0ce22e90897696 86.139.46.140 8308 0 +4fedf465f25cdf48a66e5dec9d1bdd17 83.6.241.127 6882 0 +50bb895dd390303527424e828e5b54be 24.202.246.85 8230 0 +51ac71921161bcb6d8b7f8880f46eefc 24.232.81.207 7851 0 +51b83c36ac4adb9707fbc719f422cbe8 70.80.1.95 10677 0 +51f280b2fb3151daee581811edb3460d 172.183.248.32 10456 0 +523fcbe15ed90076457197d9e6750f1e 84.60.0.22 12831 0 +531d8c87b014bcf993094c420ed08cfe 74.103.42.209 4111 0 +53a75112814d14ecca2d80bf4a05304c 195.4.200.62 8750 0 +541e2bb43da70411b0ec9e4a2e3aa0bc 84.125.22.187 3867 0 +5abf0e1bb97d86db40d4002d4709bf1a 220.70.254.220 5244 0 +5dc4f61ca975687da17ad01d7a06285d 211.201.124.116 6059 0 +5efb862926700079413f76ab2c3e79e2 84.126.46.156 5444 0 +5f27354bfa0ba9ca2bae6106899cc1a3 83.10.113.23 5410 0 +5f5774d921ce06f3f12dfcb40dd73a49 213.185.6.53 4665 0 +5f5e5d1d9726f0e0149ffaa75751b05d 82.5.42.25 10301 0 +6060d6810bc1d07ba691bbe90b95585c 82.56.93.76 4792 0 +654bf80221c0dec4c74b0342c045abc6 83.53.130.173 4267 0 +68f38041f26ff4625247ccfa6c9645a2 83.27.138.127 3241 0 +6928f1993de7d20516fd1dd489213dbc 216.28.31.253 3620 0 +6b14fa18fc8b5ed357133b1a2502a094 82.159.13.169 12286 0 +6e21525341966500c9900aa17df49bf3 85.53.89.43 4582 0 +6e2614fe5389f95f36093d8723536929 58.234.36.88 5225 1 +6e4fc1983cc5fe4a310712bd063b9de4 83.192.115.177 6265 0 +6e93bca819d46c7c31164938482e276c 82.49.27.239 8463 0 +6eb7eb16713cf56f3d8e1ce368bebdab 87.10.218.82 10301 0 +6f0083083a91360160326195a59ea476 85.49.253.102 11583 1 +6f414f0a142b802b05932ee4fb810b12 62.80.230.79 6000 0 +6f548dd7068651c0ee22bfef37080862 172.141.131.116 3003 0 +6f66be33cebe99344cfcf328aa702cfc 82.234.247.90 5596 0 +70875fedb3fd7b5e49bcf7fb8323caad 211.213.130.221 4152 0 +70bbf8199ffef9edd68041ec954dfca0 218.101.206.9 3322 0 +70d009412251fd40d46d5475c33b5b4d 213.213.249.47 4662 0 +70dff47cbddf76aa58e13b4124076526 83.42.124.195 9256 0 +70ecffa5c424f8169d50922cf0de9267 81.60.195.33 47047 0 +7102b6d37c71f4bb249b4b6e20ac4c0d 146.115.56.136 3682 1 +712d6dc23289c4c269823f5cb6899e25 84.55.206.118 9228 0 +7156fd747d07a6865f5b02a8971bc78a 62.235.24.23 17008 0 +7186f68b51e03cfb745b65f8612f5619 83.198.187.23 5864 1 +71cc7aa04be67418f10bfbe4adb1bacf 87.5.76.116 5569 0 +71dbfe600812a1dd9a841951f68edca0 74.78.2.177 4548 0 +723b96cefcde27f6394bb312ddb3bc73 62.42.1.125 5783 0 +72f43b744b3170537794cde315148361 84.121.109.184 4175 0 +7341869dd42cdd9054e2578b68d53029 81.220.168.54 4985 1 +7a1956c5b41f66669c4b74c71742a058 88.23.168.112 9433 0 +7a1a6c659c387c936fef2666a1912a32 80.132.101.112 3633 0 +7a316a90de24721a9733d86d5321e8f0 84.189.143.14 4394 0 +7a50edadd981b09ba88b6f06acef3718 62.15.235.127 7095 0 +7a552fce17bb88689f601e531a7e572b 61.64.69.133 6719 0 +7a753356842ad958e7057a1fcfd2c083 211.201.93.71 10674 0 +7aa5334de0f210a741c5f1354104b3b1 70.252.73.94 10504 0 +7b0fc9ae76a8a2727ae54e843bfc3977 80.48.142.10 6162 0 +7b31f2b3500d8aa49537625afaac52db 24.67.81.50 9469 0 +7b441d23d521023f5a42cc9b594dd92a 83.92.40.199 6164 0 +7b4ecae988a881b978f7748088d8e051 67.168.85.39 9273 0 +7b65226b440f58717ec06ef5d935bc45 86.208.174.157 7253 0 +7b870dabafbd3419fe46740a5cd7fdfc 82.121.160.160 5040 0 +7b8879cd08a41d3bf18cb6b00b12e61c 88.24.51.189 11127 0 +7b8feeeecb097e817fe35416be73fc56 83.6.232.250 5181 0 +7bd571d08d784662e96f7bae7f7f17b3 84.57.158.33 7222 0 +7bf2513793a5994b5cad8546f6231e89 84.75.199.138 6082 0 +7c4e2c83d7417f42afb85c25d903629f 83.26.117.189 4736 0 +7db9b910b7a85739740f86b81321c5e1 83.21.71.92 6174 0 +7f51b9d5b5e986f212f34274aff7e4c3 90.154.213.232 59800 0 +7f9b3a74b692c7bb5b75e450122d6608 84.77.5.138 55000 0 +7fd158be4a5f243789e123ef83d3edf0 82.54.224.155 23830 0 +84396c8cf1a26258cba101ea007a49d9 89.228.227.215 8654 0 +84c97bd4a9fa479440ee7ef35947ce38 70.82.82.220 5290 0 +8ae1f2710e59c77f8266a12d028a8aaf 212.241.64.215 4854 0 +900ffda15c6702a93b220738f6f6bccb 84.25.7.56 7746 0 +90a87e1fe896621f14416995bd3166af 134.109.132.156 16563 0 +90a8d8cb9c9af9c2e76dac650c189d00 83.23.155.182 8914 0 +90b399ec0fbe1dab3471e208598d2e7e 84.44.231.141 28583 0 +90bcf4c6d0620aa9faa928b6da3b1d17 213.47.112.74 3404 0 +9200db48b63d6331b747621d73cfd3ef 125.135.73.172 5510 0 +923a3ca51d2c173795ea7980fec03fa4 82.61.70.247 8014 0 +92de6303460273a43508296b6237c078 124.61.19.247 3348 0 +92f2c65e8d8c984ecae982c8f9cad81e 85.16.150.41 9948 0 +945f69d2b0fed4d40c501d18ac1ee335 84.255.205.251 6818 0 +95f23a606a61d0eedccfc88c671c9504 210.159.160.154 4188 0 +960ed75cdf0e8e55d8bdf2122779006b 80.102.115.141 3915 0 +96e1ba371333a60439608576f729617e 84.121.87.1 47047 0 +98d02d1b5b7ad14dd13535ed11b51c48 85.53.69.99 10003 0 +9d9a51252908efca21b7f5940d5c16ae 82.225.38.240 7821 0 +9e31d3105d1be1be100c2dbca9c1cedb 84.183.164.47 7204 0 +9e53862ce85a043876da4a5784ad1661 85.140.63.22 7516 0 +9edc2fc255ebae8396d622cb15957176 83.112.107.20 8180 1 +9ee556648ad3baf1f792aad85e470a7c 219.74.80.197 6601 0 +9fa9acb2252a2b65b5bfe032cb434281 81.240.140.43 9703 0 +a167a1c1a719856704541c0a1c3e03a9 69.241.238.138 11593 0 +a82320cb11db5a34d2e692c5b7ad19d8 88.24.214.34 9534 0 +a8967880514d80246b2d940d89907976 220.244.126.14 4668 1 +a914e917b7c972d0ddb0f5d654e9aadc 84.122.49.158 12769 0 +a91b9efdde30841d46de0b12040b948c 85.155.209.92 5707 0 +a9b06362d0342d42b24902cb3d71683d 75.46.112.130 9576 0 +acaca1572ac1f9cb9953e55b2729249d 83.35.237.97 4665 0 +b2ae365b21df68b48988045b63d4d6fc 189.172.29.169 9874 0 +b4bddaca531a4f012d4fa46900f69813 71.9.169.115 5775 0 +b5c9a247777ddae8fcfa83cee4ac676e 219.68.29.74 6230 1 +b74595669f238061c5b30a518ae33fa5 83.25.82.238 5326 0 +c12d62c54b9b343874dc7c8366c2cfb6 189.157.29.196 8705 0 +c14322f92dc74c67dc0f864d272fcbf7 69.31.93.178 3471 0 +c1604c1d202792be1dca16283d8e9d5a 220.124.224.75 9581 0 +c1bef91ee0fac09f1a54d827546e6a0a 87.11.206.239 3959 0 +c21d96781cc4c3d2b16407d76f02e944 218.163.184.113 8597 0 +c23d212ae659766e8e46438fcfd7dc22 172.180.110.81 3086 0 +c285e7b2ab22453496522299b15b3801 59.12.208.195 11267 0 +c2bd693941ef041db66d2fe5c1692e59 88.9.121.245 9384 1 +c30bdae50cb39cba80ba9ac1a5e1a65a 82.58.189.230 10301 0 +c3b0f868f4a9abae3eb7007ab9e2e7c8 87.123.217.188 9030 0 +c54a4feeb6618bfe854146f560ad4c47 81.214.39.120 10000 0 +c57a5e547d138d1f581221f17e0e272e 86.215.168.93 11447 0 +c5be09328b367f7702397cae1711f586 83.53.177.127 11315 0 +c5bf7360aa07f31c07830a7370431c8a 61.224.78.247 12595 0 +c8618647749d12e3e0995e3f0c556a5b 70.111.26.144 6133 0 +c8ac99b1bfc68b615e165129f9b182d5 211.233.2.100 12542 0 +db19cb61c98529a91384cf06493be556 210.180.124.29 3246 0 +db45d9513bbaf7c3c5bf3e2fffd3012c 83.31.233.170 4471 0 +db4b83b43f36bc58ac2685743533a389 65.189.237.244 8044 0 +db5dc765e684ba9a610a865800de3416 81.198.131.36 12718 0 +db8be48ab25ea2ebff67f3f4312dd204 84.48.235.130 5999 1 +db9ffaa55e3712f9cee25b805732ee7b 84.9.76.208 10209 0 +dbb5697be82496bb0c46c3c0a2df3110 61.247.84.226 12426 0 +dbd681193c024ffce547fdb999ae8339 84.177.92.139 7017 0 +dbdd57d92f889e6c84a344d862e23826 84.61.146.49 5751 0 +dbe7aec6a2535f0ff4172ca2917c853c 89.78.201.185 6787 0 +e119f64361e2022eb2f8e16ab704ac79 70.177.168.143 3893 0 +e26c5ade9519477fbfb754e142758641 87.123.168.236 5002 0 +e32ad67eef113f2788c5e438932968d8 85.216.39.254 8579 0 +e36b23d3b0e5c4e653008aa0fe683941 213.216.232.88 11108 0 +e38016ff75ecb0de179162256b5afdb1 83.61.12.146 8020 0 +e380e102024f2e299e7ed2ed847c0edc 87.103.45.238 10901 0 +e39b3800ff70830b5e158f334197cb7b 222.106.229.231 4474 0 +e7025c81e4f11bd9595eb5b12635ad88 68.185.86.95 6842 0 +e702aab5bf92f3356d3a26590e736def 74.56.202.29 8029 0 +e71f3f7252bc12414cd3fa425f9ae8f3 88.17.127.248 10863 0 +e75578be101ba7e8a36ae1072682f5f7 122.34.133.174 9592 0 +e75f71fd8126965e32e23f1056056141 81.203.63.82 1756 0 +edd8190b83b7ed219536320d4ecb7691 67.83.25.1 4662 0 +efaff405e405967bae5ea9264229f386 211.187.188.231 3915 0 +efbdc05dc73789a0656b091186ee1089 71.100.59.158 7519 0 +f0831665903a6b37e4205ace3621a925 74.114.66.20 3420 0 +f0a877163f230e7fc690022d564ad4f5 213.46.9.204 9676 0 +f0c1976867bfa84bbd0929ebb1ec8028 74.103.127.57 8805 0 +f296f17abd4ccb3ad63a99468eb96060 82.232.173.22 8754 0 +f5932b7cee522a08ecb627d47f5b60f5 121.124.152.54 4104 0 +f66f25c51aa05ea462694b9055b70193 84.143.27.99 7665 0 +f7508519f31549d0018f363e58e4646c 125.224.193.111 10729 0 +f8aa2bd3d4b288fbc520ad0f121416d7 213.239.205.232 10755 0 +f8ca9f346d4ac702695dbddbf5b7f0bb 90.13.150.216 11403 0 +[other_stuff] +blah blah +blah +[blacklisted_nodes] diff --git a/libretroshare/src/fltkgui/Fl_File_Item.cc b/libretroshare/src/fltkgui/Fl_File_Item.cc new file mode 100644 index 000000000..7c97ae5bf --- /dev/null +++ b/libretroshare/src/fltkgui/Fl_File_Item.cc @@ -0,0 +1,328 @@ +// +// "$Id: Fl_File_Item.cc,v 1.3 2007-02-18 21:46:49 rmf24 Exp $" +// +// This is hacked up FLTK code, and so is released under +// their licence. (below) +// Copyright 2004-2006 by Robert Fernie. +// +// Please report all bugs and problems to "retroshare@lunamutt.com". +// +///////////////////////////////////////////////////////////////////// +// +// C function type code for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2004 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 of the License, or (at your option) any later version. +// +// 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 "fltk-bugs@fltk.org". +// + +#include +#include "Fl_Tree_Browser.h" +#include +#include + +#include + +// +//extern int i18n_type; +//extern const char* i18n_include; +//extern const char* i18n_function; +//extern const char* i18n_file; +//extern const char* i18n_set; +//extern char i18n_program[]; + +//////////////////////////////////////////////////////////////// +// quick check of any C code for legality, returns an error message + +static char buffer[128]; // for error messages + +// check a quoted string ending in either " or ' or >: +const char *_q_check(const char * & c, int type) { + for (;;) switch (*c++) { + case '\0': + sprintf(buffer,"missing %c",type); + return buffer; + case '\\': + if (*c) c++; + break; + default: + if (*(c-1) == type) return 0; + } +} + +// check normal code, match braces and parenthesis: +const char *_c_check(const char * & c, int type) { + const char *d; + for (;;) switch (*c++) { + case 0: + if (!type) return 0; + sprintf(buffer, "missing %c", type); + return buffer; + case '/': + // Skip comments as needed... + if (*c == '/') { + while (*c != '\n' && *c) c++; + } else if (*c == '*') { + c++; + while ((*c != '*' || c[1] != '/') && *c) c++; + if (*c == '*') c+=2; + else { + return "missing '*/'"; + } + } + break; + case '#': + // treat cpp directives as a comment: + while (*c != '\n' && *c) c++; + break; + case '{': + if (type==')') goto UNEXPECTED; + d = _c_check(c,'}'); + if (d) return d; + break; + case '(': + d = _c_check(c,')'); + if (d) return d; + break; + case '\"': + d = _q_check(c,'\"'); + if (d) return d; + break; + case '\'': + d = _q_check(c,'\''); + if (d) return d; + break; + case '}': + case ')': + UNEXPECTED: + if (type == *(c-1)) return 0; + sprintf(buffer, "unexpected %c", *(c-1)); + return buffer; + } +} + +const char *c_check(const char *c, int type) { + return _c_check(c,type); +} + +//////////////////////////////////////////////////////////////// +// UNSURE +//#include "function_panel.h" +//#include +//////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////// + +Fl_Item *Fl_Dir_Item::make(Fl_Item *p) { + //std::cerr << "Fl_Dir_Item::make()" << std::endl; + //Fl_Item *p = Fl_Item::current; + while (p && p->is_file()) p = p->parent; + + Fl_Dir_Item *o = new Fl_Dir_Item(); + o->name("Dir: printf(\"Hello, World!\\n\");"); + o->add(p); + o->factory = this; + return o; +} + +void file_requestdir(std::string person, std::string dir); + +void Fl_Dir_Item::open() +{ + //std::cerr << "open Dir..." << std::endl; + Fl_Item *p = NULL; + + int ccount = 0; + for(p = next; (p && (p->parent == this));p = p->next) + { + ccount++; + } + + //std::cerr << "count:" << ccount << std::endl; + + if (ccount == 0) // && (lload > time(NULL) + MIN_RELOAD)) + { + // get our path.... + std::string fulldir(name()); + int lvl = level; + //std::cerr << "level:" << level << std::endl; + //std::cerr << "prev:" << (int) prev << std::endl; + //std::cerr << "prev->parent:" << (int) prev->parent << std::endl; + + for(p = prev; (p && p->parent);p = p->prev) + { + //std::cerr << "fulldir srch: " << p -> name() << std::endl; + if (p->level < lvl) + { + std::string subdir(p->name()); + fulldir = subdir + "/" + fulldir; + lvl = p->level; + } + } + fulldir = "/" + fulldir; + + if (p) + { + Fl_Person_Item *pi; + if ((pi = dynamic_cast(p))) + { + std::string person(pi->person_hash); + file_requestdir(person, fulldir); + //std::cerr << "Requesting: " << person << ":" << fulldir << std::endl; + } + else + { + //std::cerr << "Not PersonItem" << std::endl; + } + + } + else + { + //std::cerr << "No Requesting: NULL" << ":" << fulldir << std::endl; + } + + + } + else + { + for(p = next; (p && (p->parent == this));p = p->next) + { + //std::cerr << "Setting Item Visible" << std::endl; + p -> visible = 1; + //p -> open_ = 1; + } + redraw_browser(); + } +} + +Fl_Dir_Item Fl_Dir_Item_type; + +//////////////////////////////////////////////////////////////// + +Fl_Item *Fl_File_Item::make(Fl_Item *p) { + //std::cerr << "Fl_File_Item::make()" << std::endl; + while (p && p->is_file()) p = p->parent; + if (!p) { + //std::cerr << "File in no directory!" << std::endl; + return 0; + } + + Fl_File_Item *o = new Fl_File_Item(); + o->name("file: hello world"); + o->add(p); + o->factory = this; + //redraw_browser(); + return o; +} + +void Fl_File_Item::open() +{ + //std::cerr << "open File? How..." << std::endl; + redraw_browser(); +} + +Fl_File_Item Fl_File_Item_type; + +//////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////// + +Fl_Item *Fl_Person_Item::make(Fl_Item *p) { + //std::cerr << "Fl_Person_Item::make()" << std::endl; + //while (p) && p->is_file()) p = p->parent; + //while (p) && p->is_file()) p = p->parent; + p = NULL; // always at top. + + Fl_Person_Item *o = new Fl_Person_Item(); + o->name("person"); + o->add(p); + o->factory = this; + return o; +} + + +void Fl_Person_Item::open() +{ + //std::cerr << "open Person? How..." << std::endl; + Fl_Item *p; + { + for(p = next; (p && (p->parent == this));p = p->next) + { + //std::cerr << "Setting Item Visible" << std::endl; + p -> visible = 1; + } + redraw_browser(); + } +} + +Fl_Person_Item Fl_Person_Item_type; + +//////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////// + +Fl_Item *Fl_Msg_Item::make(Fl_Item *p) { + //std::cerr << "Fl_Msg_Item::make()" << std::endl; + while (p && p->is_file()) p = p->parent; + if (!p) { + //std::cerr << "File in no directory!" << std::endl; + return 0; + } + + Fl_Msg_Item *o = new Fl_Msg_Item(); + o->name("msg"); + o->add(p); + o->factory = this; + //redraw_browser(); + return o; +} + +void Fl_Msg_Item::open() +{ + //std::cerr << "open Msg? How..." << std::endl; + redraw_browser(); +} + +Fl_Msg_Item Fl_Msg_Item_type; + +//////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////// + +const char* Fl_Item::class_name(const int need_nest) const { + Fl_Item* p = parent; + while (p) { + if (p->is_class()) { + // see if we are nested in another class, we must fully-qualify name: + // this is lame but works... + const char* q = 0; + if(need_nest) q=p->class_name(need_nest); + if (q) { + static char s[256]; + if (q != s) fltk_strlcpy(s, q, sizeof(s)); + fltk_strlcat(s, "::", sizeof(s)); + fltk_strlcat(s, p->name(), sizeof(s)); + return s; + } + return p->name(); + } + p = p->parent; + } + return 0; +} + +// +// End of "$Id: Fl_File_Item.cc,v 1.3 2007-02-18 21:46:49 rmf24 Exp $". +// diff --git a/libretroshare/src/fltkgui/Fl_Funky_Browser.cc b/libretroshare/src/fltkgui/Fl_Funky_Browser.cc new file mode 100644 index 000000000..454e725e1 --- /dev/null +++ b/libretroshare/src/fltkgui/Fl_Funky_Browser.cc @@ -0,0 +1,1704 @@ +/* + * "$Id: Fl_Funky_Browser.cc,v 1.11 2007-02-18 21:46:49 rmf24 Exp $" + * + * FltkGUI for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * NB: Parts of this code are derived from FLTK Fl_Browser code. + * + * 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". + * + */ + +/* My new funky browser..... + * + * - Designed to sort/display a tree brower + * for search results.... + * + * First we need the basic interface class that + * must wrap the Data.... + */ + +const static int FUNKY_EXPANDED = 0x001; +const static int FUNKY_VISIBLE = 0x002; +const static int FUNKY_SELECTED = 0x004; + +#include +#include "pqi/pqidebug.h" +const int pqiflfbzone = 91393; + +#include "fltkgui/Fl_Funky_Browser.h" +#include +#include +#include + +#include + + Fl_Funky_Browser::Fl_Funky_Browser(int a, int b, int c, + int d, const char *n, int ncol) + :Fl_Browser(a,b,c,d,n), + ncols(ncol), sort_order(ncol), sort_direction(ncol), tree(ncol), + display_order(ncol), widths(ncol), titles(ncol), check_box(ncol), + drag_mode(0), one_select(true) +{ + // set the widths for the Columns onto Fl_Browser. + fl_widths = (int *) malloc((ncol + 1) * sizeof(int)); + + for(int i = 0; i < ncol; i++) + { + sort_order[i] = i; + sort_direction[i] = 1; + tree[i] = 0; + display_order[i] = i; + widths[i] = 150; + fl_widths[i] = widths[i]; + titles[i] = "Unknown"; + check_box[i] = false; + } + // temp hack to make the first two columns expandable. + if (ncol > 0) + tree[0] = 1; + if (ncol > 1) + tree[1] = 1; + ntrees = 2; + + // NOTE: It only makes sense to have the tree at the + // left hand side..... so all tree ticked ones + // should automatically be moved to left columns. + + fl_widths[ncol] = 0; + column_widths(fl_widths); + + return; +} + +int Fl_Funky_Browser::addItemSeries(DisplayData *d) +{ + int idx = 1; + int i; + + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, + "Fl_Funky_Browser::addItem Properly()...."); + + idx++; + + std::list::iterator it; + + DisplayItem *last[ntrees]; + + DisplayItem *ni = new DisplayItem(); + ni -> expander = -1; + ni -> flags = FUNKY_EXPANDED | FUNKY_VISIBLE; + ni -> ref = d; + + it = dlist.begin(); + if (it == dlist.end()) + { + dlist.push_back(ni); + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, + "Fl_Funky_Browser::addItem Empty List"); + + RePopulate(); + return 1; + } + + // add in all the initial levels. + for(i = 0; (i < ntrees) && (it != dlist.end()); i++, it++) + { + last[i] = (*it); + } + + if (it == dlist.end()) + { + pqioutput(PQL_ALERT, pqiflfbzone, + "FL_Funky_Browser::Serious Accounting Condition!"); + + SortList(); + RePopulate(); + return 1; + } + + + idx += ntrees; + { + std::ostringstream out; + + out << "Fl_Funky_Browser::addItem Inserting:"; + out << std::endl; + + for(i = 0; i < d -> ndix();i++) + { + out << "\t:" << d -> txt(i) << std::endl; + } + + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, out.str()); + } + + for(; it != dlist.end(); it++, idx++) + { + std::ostringstream out; + out << "Fl_Funky_Browser::addItem Checking Against:"; + out << std::endl; + for(i = 0; i < (*it)->ref->ndix();i++) + { + out << "\t:" << (*it)->ref->txt(i); + out << std::endl; + } + + // cmp with item. + int res = cmp(ni, *it); // if ni < *it + out << "Cmp *ni vs *it: " << res << std::endl; + + if (0 > res) // if ni < *it + { + // if before it, stop and add item in. + // check the level difference between + // item and location... + // best way to do this is checking against + // the last[ntree], and *it. + + int level = 0; + level = cmp_upto(ntrees, ni, *it); + out << "(Cmp < 0):Level Match:" << level; + out << std::endl; + + // if expanders following - redirect. + for(i = 0;(it != dlist.end()) && + ((*it) -> expander < level) && + ((*it) -> expander != -1); it++, idx++) + { + (*it) -> ref = ni -> ref; + last[(*it) -> expander] = (*it); + } + + // add in extra unique ones. + for(i = level; i < ntrees; i++) + { + last[i] = new DisplayItem(); + last[i] -> expander = i; + last[i] -> index = idx++; + last[i] -> ref = ni -> ref; + // random initial flags - visibility checked later. + if (i == 0) + last[i] -> flags = FUNKY_EXPANDED | FUNKY_VISIBLE; + else + last[i] -> flags = FUNKY_VISIBLE; + //last[i-1] -> flags; + + dlist.insert(it, last[i]); + } + + + // add in item. + dlist.insert(it, ni); + // update details. + ni -> index = idx++; + if ((last[ntrees-1]->flags & FUNKY_EXPANDED) + &(last[ntrees-1]->flags & FUNKY_VISIBLE)) + { + ni -> flags = FUNKY_VISIBLE; + } + + // update indices. + for(; it != dlist.end(); it++) + { + (*it) -> index = idx++; + } + + // finished and added item. + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, out.str()); + return 1; + // drawList(); //not every time! + } + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, out.str()); + } + + // emergency procedures. (stick in at the end) + // if before it, stop and add item in. + // check the level difference between + // item and location... + // best way to do this is checking against + // the last[ntree] + + int level = 0; + level = cmp_upto(ntrees, last[ntrees-1], ni); + + { + std::ostringstream out; + out << "Sticking at the End." << std::endl; + out << "(Cmp < 0): Level Match:" << level; + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, out.str()); + } + + // add in extra unique ones. + for(i = level; i < ntrees; i++) + { + std::ostringstream out; + out << "--> Adding in extra Unique Ones." << std::endl; + out << "i: " << i << " index: " << idx << " ref: " << ni->ref; + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, out.str()); + + last[i] = new DisplayItem(); + last[i] -> expander = i; + last[i] -> index = idx++; + last[i] -> ref = ni -> ref; + // random initial flags - visibility checked later. + if (i == 0) + last[i] -> flags = FUNKY_EXPANDED | FUNKY_VISIBLE; + else + last[i] -> flags = FUNKY_VISIBLE; + //last[i-1] -> flags; + + dlist.push_back(last[i]); + } + + + // add in item. + { + std::ostringstream out; + out << "--> Adding in Last Item" << std::endl; + out << " index: "; + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, out.str()); + } + + dlist.push_back(ni); + // update details. + ni -> index = idx++; + if ((last[ntrees-1]->flags & FUNKY_EXPANDED) + &(last[ntrees-1]->flags & FUNKY_VISIBLE)) + { + ni -> flags = FUNKY_VISIBLE; + } + + // finished and added item. + return 1; +} + +int Fl_Funky_Browser::selectDD(DisplayData *dd) +{ + std::list::iterator it; + + if (dd == NULL) + return 0; + for(it = dlist.begin(); it != dlist.end();it++) + { + if (dd == (*it) -> ref) + { + return selectItems((*it) -> index); + } + + } + return 0; +} + + +int Fl_Funky_Browser::addItem(DisplayData *d) +{ + addItemSeries(d); + return ItemSeriesDone(); +} + +int Fl_Funky_Browser::ItemSeriesDone() +{ + updateList(); + return 1; +} + +int Fl_Funky_Browser::updateList() +{ + if (0 > checkSort()) + { + checkIndices(); + SortList(); + RePopulate(); + } + return drawList(); +} + + +// if sorted 1 +int Fl_Funky_Browser::checkSort() +{ + std::list::iterator it, prev; + + it = dlist.begin(); + if (it == dlist.end()) + { + return 1; + } + + // add in all the initial levels. + int res; + for(prev = it++; it != dlist.end(); prev = it++) + { + if (0 < (res = cmp(*prev, *it))) // expect prev <= it, so if (prev > it) + { + pqioutput(PQL_WARNING, pqiflfbzone, + "Fl_Funky_Browser::checkSort() Not Sorted()"); + return -1; + } + else + { + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, + "Fl_Funky_Browser::checkSort() Sorted()"); + } + } + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, + "Fl_Funky_Browser::checkSort() ListSorted()"); + // sorted! + return 1; +} + + + + + +void Fl_Funky_Browser::clear() +{ + std::list::iterator it; + for(it = dlist.begin(); it != dlist.end();) + { + delete *it; + it = dlist.erase(it); + } + Fl_Browser::clear(); +} + +DisplayData *Fl_Funky_Browser::removeItem(int idx) +{ + return NULL; +} + +DisplayData *Fl_Funky_Browser::removeItem(int (*fn)(DisplayData *)) +{ + return NULL; +} + +DisplayData *Fl_Funky_Browser::getSelected() +{ + return NULL; +} + +DisplayData *Fl_Funky_Browser::getCurrentItem() +{ + int itemnum = value(); + if (value() <= 1) + return NULL; + + std::list::iterator it; + for(it = dlist.begin(); it != dlist.end(); it++) + { + if (itemnum == (*it) -> index) + { + if ((*it) -> expander != -1) + return NULL; + return (*it) -> ref; + } + } + return NULL; +} + + // Worker Functions. +int Fl_Funky_Browser::SortList() +{ + std::list tmplist = dlist; + std::list::iterator it; + std::list::iterator it2; + + dlist.clear(); + + // terrible sorting algorithm --- fix with template class. + // But Okay for now. + + // clean out the expanders first. + it = tmplist.begin(); + while(it != tmplist.end()) + { + if ((*it) -> expander > -1) + { + // XXX Memory leak??? + it = tmplist.erase(it); + } + else + { + it++; + } + } + + while(tmplist.size() > 0) + { + for(it2 = it = tmplist.begin(); it != tmplist.end(); it++) + { + if (0 > cmp(*it, *it2)) // if *it < *it2 + { + it2 = it; + } + } + dlist.push_back(*it2); + tmplist.erase(it2); + } + // sorted! + return 1; +} + +int Fl_Funky_Browser::RePopulate() +{ + // This adds in the expanders where necessary + // a major change that should be done as + // little as possible. + + int idx = 1; + int i; + std::string titleline; + + Fl_Browser::clear(); + + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, + "Fl_Funky_Browser::RePopulate()...."); + + idx++; + + std::list::iterator it; + + DisplayItem *last[ntrees]; + + it = dlist.begin(); + if (it == dlist.end()) + { + return drawList(); + } + + // add in all the initial levels. + for(i = ntrees - 1; i >= 0; i--) + { + last[i] = new DisplayItem(); + last[i] -> expander = i; + last[i] -> index = idx + i; + last[i] -> ref = (*it) -> ref; + // random initial flags - visibility checked later. + if (i == 0) + last[i] -> flags = FUNKY_EXPANDED | FUNKY_VISIBLE; + else + last[i] -> flags = FUNKY_VISIBLE; + + dlist.push_front(last[i]); + } + + idx += ntrees; + (*it) -> index = idx++; + + DisplayItem *prev = (*it); + + for(it++; it != dlist.end(); it++) + { + // if matching at current of expansion. then ignore. + int level = 0; + level = cmp_upto(ntrees, prev, *it); + for(i = level; i < ntrees; i++) + { + last[i] = new DisplayItem(); + last[i] -> expander = i; + last[i] -> index = idx++; + last[i] -> ref = (*it) -> ref; + // random initial flags - visibility checked later. + if (i == 0) + last[i] -> flags = FUNKY_EXPANDED | FUNKY_VISIBLE; + else + last[i] -> flags = FUNKY_VISIBLE; + + dlist.insert(it, last[i]); + } + (*it) -> index = idx++; + (*it) -> flags |= FUNKY_VISIBLE; + prev = (*it); + } + + return drawList(); +} + + + +int Fl_Funky_Browser::drawList() +{ + // No need to remake list... + // just iterate through and change the text. + + int i; + int idx = 1; + std::string titleline; + //std::cerr << "Fl_Funky_Browser::drawList() 1...." << std::endl; + + int nlen = dlist.size() + 1; + if (nlen != size()) + { + // fix size. + // two loops should do the trick. + for(;size() > nlen;) + remove(size()); + add("dummy"); + for(;nlen > size();) + add("dummy"); + } + + //std::cerr << "Fl_Funky_Browser::drawList() 1b...." << std::endl; + + // draw the title. + for(i = 0; i < ncols; i++) + { + // ticked header or not..... + if (tree[display_order[i]] == 1) + { + titleline += "@T"; + } + else + { + titleline += "@E"; + } + if (sort_direction[display_order[i]] == 1) + { + titleline += "@A"; + } + else + { + titleline += "@a"; + } + + titleline += "@D@b@i@."; + + titleline += titles[display_order[i]]; + titleline += "\t"; + } + // change the text. + text(idx++, titleline.c_str()); + + std::list::iterator it; + DisplayItem *last[ntrees]; + // Now create it.... + for(it = dlist.begin(); it != dlist.end(); it++, idx++) + { + std::string line; + bool vis = true; + int depth = ntrees; + + //std::cerr << "Fl_Funky_Browser::drawList() " << idx << std::endl; + + if ((*it) -> expander > -1) + { + // save. + depth = (*it) -> expander; + last[(*it) -> expander] = (*it); + + // the line is visible if all of the lasts.. + // are expanded. + + // have an expander.... get the text. + // only creating the unique bit. - do spaces before. + for(i = 0; i < (*it) -> expander; i++) + { + line += "\t"; + } + + // put the subsign.. + line += "@I"; + + // if the last one add an expander. + if ((*it) -> flags & FUNKY_EXPANDED) + { + line += "@p@."; + } + else + { + line += "@P@."; + } + + line += (*it) -> ref -> txt(display_order[(*it) -> expander]); + line += "\t"; + } + else // A Normal element. + { + for(i = 0; i < ntrees; i++) + { + line += "\t"; + } + for(i = ntrees; i < ncols; i++) + { + if (check_box[display_order[i]]) + { + if (1 == (*it) -> ref -> check(i)) + { + line += "@T@."; + } + else + { + line += "@E@."; + } + } + + line += (*it) -> ref -> txt(display_order[i]); + line += "\t"; + } + std::ostringstream out; + out << "Normal Line:" << line << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, out.str()); + } + + // check the visibility. + for(i = 0; i < depth; i++) + { + if (!(last[i] -> flags & FUNKY_EXPANDED)) + vis = false; + line += "\t"; + } + + text(idx, line.c_str()); + // Set Visibility and Selected. + if (!vis) + { + (*it) -> flags &= ~FUNKY_VISIBLE; + hide(idx); + } + else + { + (*it) -> flags |= FUNKY_VISIBLE; + show(idx); + } + + if ((*it) -> flags & FUNKY_SELECTED) + { + select(idx, 1); + } + } + redraw(); + return 1; +} + +int Fl_Funky_Browser::checkIndices() +{ + // The just checks that the indices are valid.... + // interestingly - you could justifiably want to + // display the same column twice so we only have to check + // that they are valid. + + // Now sort columns so all the trees are + // first (both in display + sort) + int nontree = -1; + int i; + + // simple sort which is order n if correct. + for(i = 0; i < ncols; i++) + { + // check item. + if (tree[display_order[i]] == 0) + { + // catch first non tree. + if (nontree < 0) + { + nontree = i; + } + } + else // a tree one + { + if (nontree != -1) // with nontrees ahead! + { + std::ostringstream out; + out << "Swapping Items (" << i; + out << ") and (" << nontree << ")"; + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, out.str()); + + // swap the items along. + for(;i > nontree; i--) + { + int sdo = display_order[i - 1]; + display_order[i - 1] = display_order[i]; + sort_order[i - 1] = display_order[i]; + display_order[i] = sdo; + sort_order[i] = sdo; + } + // increment and continue. + nontree++; + i++; + } + } + } + // finally fix the fl_width array. + for(i = 0; i < ncols; i++) + { + fl_widths[i] = widths[display_order[i]]; + } + fl_widths[ncols] = 0; + return 1; +} + + + +int Fl_Funky_Browser::toggleCollapseLevel(int row) +{ + int itemnum = row; + int i; + std::list::iterator it, it2; + + DisplayItem *last[ntrees]; + + for(it = dlist.begin(); it != dlist.end(); it++) + { + if ((*it) -> expander > -1) + { + last[(*it) -> expander] = (*it); + } + + if (itemnum == (*it) -> index) + { + if ((*it) -> expander < 0) + { + // not a expansion point. + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, + "toggleCollapseLevel() Bad PT"); + return 0; + } + + { + std::ostringstream out; + out << "toggleCollapseLevel() Found(" << itemnum; + out << ")" << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, out.str()); + } + + if ((*it) -> flags & FUNKY_EXPANDED) + { + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, + "Setting EXP -> OFF"); + (*it) -> flags &= ~FUNKY_EXPANDED; // FLIP BIT. + } + else + { + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, + "Setting EXP -> ON"); + (*it) -> flags |= FUNKY_EXPANDED; // FLIP BIT. + } + + // Must change the text to match!. + std::string line; + + // only creating the unique bit. - do spaces before. + for(i = 0; i < (*it) -> expander; i++) + { + line += "\t"; + } + + // put the subsign.. + line += "@I"; + + // if the last one add an expander. + if ((*it) -> flags & FUNKY_EXPANDED) + { + line += "@p@."; + } + else + { + line += "@P@."; + } + + line += (*it) -> ref -> txt(display_order[(*it) -> expander]); + line += "\t"; + // replace the text. + text(itemnum, line.c_str()); + + + // continue down the list + // until we reach the next collapse + // of the same level. + it2 = it; + int idx = itemnum; + for(it2++, idx++; it2 != dlist.end(); it2++, idx++) + { + // if expander + higher level. + if (((*it2) -> expander > -1) && + ((*it2) -> expander <= (*it) -> expander)) + { + // finished. + return 1; + } + int depth = ntrees; + // update still. + if ((*it2) -> expander > -1) + { + depth = (*it2) -> expander; + last[(*it2) -> expander] = (*it2); + } + + // check visibility. + bool vis = true; + + { + std::ostringstream out; + out << "LINE: " << text(idx) << std::endl; + out << "EXP_TREE: "; + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, out.str()); + } + + for(i = 0; i < depth; i++) + { + if (!(last[i] -> flags & FUNKY_EXPANDED)) + { + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, "\tOFF"); + vis = false; + } + else + { + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, "\tON"); + } + } + + // Set Visibility and Selected. + if (!vis) + { + (*it2) -> flags &= ~FUNKY_VISIBLE; + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, "\tSUB EXP -> OFF"); + hide(idx); + } + else + { + (*it2) -> flags |= FUNKY_VISIBLE; + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, "\tSUB EXP -> ON"); + show(idx); + } + } + } + } + return 0; +} + + +int Fl_Funky_Browser::selectItems(int row) +{ + int itemnum = row; + int idx; + std::list::iterator it, it2; + + for(it = dlist.begin(), idx = 2; it != dlist.end(); it++, idx++) + { + // Not Selected. + (*it) -> flags &= ~FUNKY_SELECTED; + select(idx, 0); + + { + std::ostringstream out; + out << "Un - Selecting(" << idx << "):"; + out << text(idx) << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, out.str()); + } + + if (itemnum == (*it) -> index) { + if (one_select) + { + if ((*it) -> expander == -1) + { + (*it) -> flags |= FUNKY_SELECTED; + select(idx, 1); + } + else // iterate down until. + { + for(; (it != dlist.end()) && + ((*it) -> expander != -1); it++, idx++) + { + (*it) -> flags &= ~FUNKY_SELECTED; + select(idx, 0); + if (!((*it) -> flags & FUNKY_EXPANDED)) + toggleCollapseLevel(idx); + } + // end condition + if (it == dlist.end()) + { + do_callback(); + return 1; + } + (*it) -> flags |= FUNKY_SELECTED; + select(idx, 1); + + } + } + else + { + (*it) -> flags |= FUNKY_SELECTED; + select(idx, 1); + int depth = (*it) -> expander; + + for(it++, idx++; (it != dlist.end()) && + (((*it) -> expander == -1) || + ((*it) -> expander > depth)); it++, idx++) + { + (*it) -> flags |= FUNKY_SELECTED; + select(idx, 1); + + std::ostringstream out; + out << "Selecting(" << idx << "):"; + out << text(idx) << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, out.str()); + } + if (it == dlist.end()) + { + do_callback(); + return 1; + } + }} + } + do_callback(); + return 0; +} + + +int Fl_Funky_Browser::getCheckState(int row, int col) +{ + if (row != -1) + { + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, + "Fl_Funky_Browser::getCheckState() Cannot Handle Random Row yet!"); + } + row = value(); + col = 0; + + int idx; + std::list::iterator it, it2; + + for(it = dlist.begin(), idx = 2; it != dlist.end() + && (idx <= row); it++, idx++) + { + if (row == (*it) -> index) + { + if ((*it) -> expander != -1) + { + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, "No CheckBox"); + return 0; + } + + // toggle. + return (*it) -> ref -> check(display_order[col]); + } + } + return 0; +} + + +int Fl_Funky_Browser::toggleCheckBox(int row, int col) +{ + int itemnum = row; + col = 0; + int i, idx; + std::list::iterator it, it2; + + { + std::ostringstream out; + out << "Fl_Funky_Browser::toggleCheckBox(" << row << "."; + out << col << ")" << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, out.str()); + } + + for(it = dlist.begin(), idx = 2; it != dlist.end(); it++, idx++) + { + if (itemnum == (*it) -> index) + { + if ((*it) -> expander != -1) + { + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, "No CheckBox"); + return 0; + } + + // toggle. + int chk = (*it) -> ref -> check(display_order[col]); + if (chk == 1) + { + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, "Checked Off"); + (*it) -> ref -> check(display_order[col], 0); + } + else + { + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, "Checked On"); + (*it) -> ref -> check(display_order[col], 1); + } + + // do line again.... + std::string line; + for(i = 0; i < ntrees; i++) + { + line += "\t"; + } + for(i = ntrees; i < ncols; i++) + { + if (check_box[display_order[i]]) + { + if (1 == (*it) -> ref -> check(i)) + { + line += "@T@."; + } + else + { + line += "@E@."; + } + } + + line += (*it) -> ref -> txt(display_order[i]); + line += "\t"; + } + text(itemnum, line.c_str()); + + + // select line, and then return. + return selectItems(itemnum); + } + } + return 0; +} + +int Fl_Funky_Browser::toggle_TreeSetting(int col) +{ + if (tree[display_order[col]] == 1) + { + // already a tree -> make non tree. + tree[display_order[col]] = 0; + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, + "Fl_Funky_Browser::toggle_TreeSetting() - Off!"); + ntrees--; + } + else + { + tree[display_order[col]] = 1; + ntrees++; + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, + "Fl_Funky_Browser::toggle_TreeSetting() - On!"); + } + + checkIndices(); + SortList(); + RePopulate(); + return 1; +} + + + +int Fl_Funky_Browser::toggle_ArrowSetting(int col) +{ + if (sort_direction[display_order[col]] == 1) + { + sort_direction[display_order[col]] = 0; + } + else + { + sort_direction[display_order[col]] = 1; + } + SortList(); + RePopulate(); + + return 1; +} + + + + + + + +// can handle NULLs. +int Fl_Funky_Browser::cmp_upto(int lvl, DisplayItem *i1, DisplayItem *i2) +{ + if ((i1 == NULL) || (i2 == NULL)) + { + return 0; + } + + //std::cerr << "Fl_Funky_Browser::cmp_upto(): "; + int i; + for(i = 0; i < lvl; i++) + { + if (0 != i1 -> ref -> cmp(sort_order[i], i2 -> ref)) + { + // std::cerr << "D(" << i << ")" << std::endl; + return i; + } + // std::cerr << "M(" << i << ") "; + } + //std::cerr << "S(" << lvl << ")" << std::endl; + return lvl; +} + + +int Fl_Funky_Browser::cmp(DisplayItem *i1, DisplayItem *i2) +{ + int i; + int ret; + for(i = 0; i < ncols; i++) + { + if (0 != (ret = i1 -> ref -> cmp(sort_order[i], i2 -> ref))) + { + if (sort_direction[sort_order[i]] < 1) + { + // reverse direction. + return -ret; + } + return ret; + } + } + return 0; +} + +int Fl_Funky_Browser::setTitle(int col, std::string name) +{ + titles[col % ncols] = name; + drawList(); + return 1; +} + + +int Fl_Funky_Browser::setCheck(int col) +{ + check_box[col % ncols] = true; + return 1; +} + + +static const int FL_SIGN_NONE = 0; +static const int FL_SIGN_EXPANDED = 0x01; +static const int FL_SIGN_CONTRACT = 0x02; +static const int FL_SIGN_SUBITEM = 0x04; +static const int FL_SIGN_TICKED = 0x08; +static const int FL_SIGN_BOX = 0x10; +static const int FL_SIGN_UP_ARROW = 0x20; +static const int FL_SIGN_DOWN_ARROW = 0x40; + +void Fl_Funky_Browser::item_draw(void* v, int X, int Y, int W, int H) const +{ + // Round About way of getting the text. + int inum = lineno(v); + // bad cast, but it doesn't change the text.... + // actually it does!!!! XXX BAD. should copy. + char* str = (char *) text(inum); + const int* i = column_widths(); + + + while (W > 6) { // do each tab-seperated field + int w1 = W; // width for this field + char* e = 0; // pointer to end of field or null if none + if (*i) { // find end of field and temporarily replace with 0 + e = strchr(str, column_char()); + if (e) {*e = 0; w1 = *i++;} + } + int tsize = textsize(); + Fl_Font font = textfont(); + Fl_Color lcol = textcolor(); + Fl_Align talign = FL_ALIGN_LEFT; + + //rmf24 new variable. + int expand = FL_SIGN_NONE; + + // check for all the @-lines recognized by XForms: + while (*str == format_char() && *++str && *str != format_char()) { + switch (*str++) { + case 'l': case 'L': tsize = 24; break; + case 'm': case 'M': tsize = 18; break; + case 's': tsize = 11; break; + case 'b': font = (Fl_Font)(font|FL_BOLD); break; + case 'i': font = (Fl_Font)(font|FL_ITALIC); break; + case 'f': case 't': font = FL_COURIER; break; + case 'c': talign = FL_ALIGN_CENTER; break; + case 'r': talign = FL_ALIGN_RIGHT; break; + case 'B': + // rmf24 changing to we can reach the info, + //if (!(((FL_BLINE*)v)->flags & SELECTED)) { + if (1 == selected(inum)) + { + fl_color((Fl_Color)strtol(str, &str, 10)); + fl_rectf(X, Y, w1, H); + } else strtol(str, &str, 10); + break; + case 'C': + lcol = (Fl_Color)strtol(str, &str, 10); + break; + case 'F': + font = (Fl_Font)strtol(str, &str, 10); + break; + case 'N': + lcol = FL_INACTIVE_COLOR; + break; + case 'S': + tsize = strtol(str, &str, 10); + break; + case '-': + fl_color(FL_DARK3); + fl_line(X+3, Y+H/2, X+w1-3, Y+H/2); + fl_color(FL_LIGHT3); + fl_line(X+3, Y+H/2+1, X+w1-3, Y+H/2+1); + break; + case 'u': + case '_': + fl_color(lcol); + fl_line(X+3, Y+H-1, X+w1-3, Y+H-1); + break; +// rmf24 - mods to include the (P)lus/(p) available Buttons. + case 'T': + expand |= FL_SIGN_TICKED; + break; + case 'E': + expand |= FL_SIGN_BOX; + break; + case 'P': + expand |= FL_SIGN_EXPANDED; + break; + case 'p': + expand |= FL_SIGN_CONTRACT; + break; + case 'I': + expand |= FL_SIGN_SUBITEM; + break; + case 'A': + expand |= FL_SIGN_UP_ARROW; + break; + case 'a': + expand |= FL_SIGN_DOWN_ARROW; + break; + case 'D': + fl_color(FL_DARK3); + fl_rectf(X + 2, Y + 1, w1 - 4, H - 2); + // change the drawing color. + lcol = fl_contrast(lcol, selection_color()); + break; + case '.': + goto BREAK; + case '@': + str--; goto BREAK; + } + } + BREAK: + fl_font(font, tsize); + // changed to reach the data. + //if (((FL_BLINE*)v)->flags & SELECTED) + if (1 == selected(inum)) + lcol = fl_contrast(lcol, selection_color()); + if (!active_r()) lcol = fl_inactive(lcol); + fl_color(lcol); + +// rmf24 extensions to the class. + if (expand != FL_SIGN_NONE) + { + int req_end_len = 0; + int req_init_len = 0; + int CS = H - 4; + + if (expand & FL_SIGN_TICKED) + { + CS = H - 6; + // draw a box with tick at the start. + fl_loop(X+H/2-CS/2, Y+H/2-CS/2, + X+H/2-CS/2, Y+H/2+CS/2, + X+H/2+CS/2, Y+H/2+CS/2, + X+H/2+CS/2, Y+H/2-CS/2); + + fl_line(X+H/2-CS/2, Y+H/2, X+H/2, Y+H/2+CS/2); + fl_line(X+H/2, Y+H/2+CS/2, X+H/2+CS/2, Y+H/2-CS/2); + // second set of lines.... to make it visible. + fl_line(X+H/2-CS/2-1, Y+H/2, X+H/2-1, Y+H/2+CS/2); + fl_line(X+H/2-1, Y+H/2+CS/2, X+H/2+CS/2-1, Y+H/2-CS/2); + + // indicate space required. + req_init_len = (int) H; + } + else if (expand & FL_SIGN_BOX) + { + CS = H - 6; + // draw a box at the start. + fl_loop(X+H/2-CS/2, Y+H/2-CS/2, + X+H/2-CS/2, Y+H/2+CS/2, + X+H/2+CS/2, Y+H/2+CS/2, + X+H/2+CS/2, Y+H/2-CS/2); + + // indicate space required. + req_init_len = (int) H; + } + else if (expand & FL_SIGN_CONTRACT) + { + // draw a sign with a plus.... at the start. + fl_loop(X+H/2-CS/2, Y+H/2-CS/2, + X+H/2-CS/2, Y+H/2+CS/2, + X+H/2+CS/2, Y+H/2+CS/2, + X+H/2+CS/2, Y+H/2-CS/2); + + fl_line(X+H/2, Y+H/2-CS/2, X+H/2, Y+H/2+CS/2); + fl_line(X+H/2-CS/2, Y+H/2, X+H/2+CS/2, Y+H/2); + + // indicate space required. + req_init_len = (int) H; + } + else if (expand & FL_SIGN_EXPANDED) + { + // draw a sign with a minus.... at the start. + fl_loop(X+H/2-CS/2, Y+H/2, + X+H/2, Y+H/2+CS/2, + X+H/2+CS/2, Y+H/2, + X+H/2, Y+H/2-CS/2); + + // No Vertical Line. + //fl_line(X+H/2, Y+H/2-CS/2, X+H/2, Y+H/2+CS/2); + fl_line(X+H/2-CS/2, Y+H/2, X+H/2+CS/2, Y+H/2); + + // indicate space required. + req_init_len = (int) H; + } + + if (expand & FL_SIGN_UP_ARROW) + { + // draw an uparrow. + fl_polygon(X+req_init_len+H/2-CS/2, Y+H/2+CS/2, + X+req_init_len+H/2, Y+H/2-CS/2, + X+req_init_len+H/2+CS/2, Y+H/2+CS/2); + + // indicate space required. + req_init_len += (int) H; + } + else if (expand & FL_SIGN_DOWN_ARROW) + { + fl_polygon(X+req_init_len+H/2-CS/2, Y+H/2-CS/2, + X+req_init_len+H/2, Y+H/2+CS/2, + X+req_init_len+H/2+CS/2, Y+H/2-CS/2); + + // indicate space required. + req_init_len += (int) H; + } + + // actually draw the text + fl_draw(str, X+3+req_init_len, Y, w1-6-req_end_len-req_init_len, H, e ? Fl_Align(talign|FL_ALIGN_CLIP) : talign, 0, 0); + } + else + { + // the original case. + fl_draw(str, X+3, Y, w1-6, H, e ? Fl_Align(talign|FL_ALIGN_CLIP) : talign, 0, 0); + } + + if (!e) break; // no more fields... + *e = column_char(); // put the seperator back + X += w1; + W -= w1; + str = e+1; + } +} + + +// taken from the FLTK template + +int Fl_Funky_Browser::handle(int event) +{ + int x = Fl::event_x(); + int y = Fl::event_y(); + + int bbx, bby, bbw, bbh; + bbox(bbx, bby, bbw, bbh); + if (!Fl::event_inside(bbx, bby, bbw, bbh)) + { + return Fl_Browser::handle(event); + } + + + switch(event) + { + case FL_PUSH: + // save location, and tell the world. + { + std::ostringstream out; + out << "FL_PUSH Event at (" << x << "," << y << ")"; + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, out.str()); + } + // if in row 1, then dragndrop. else + // might before an expansion. + if (0 == handle_push(x,y)) + { + std::ostringstream out; + out << "Sending FL_PUSH to Fl_Browser..."; + out << " for selection and callback."; + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, out.str()); + + return Fl_Browser::handle(event); + } + redraw(); + return 1; + case FL_DRAG: + { + std::ostringstream out; + out << "FL_DRAG Event at (" << x << "," << y << ")"; + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, out.str()); + } + return 1; + case FL_RELEASE: + { + std::ostringstream out; + out << "FL_RELEASE Event at (" << x << "," << y << ")"; + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, out.str()); + } + if (dragging()) + { + handle_release(x,y); + redraw(); + } + return 1; + default: + return Fl_Browser::handle(event); + } +} + +static const int DRAG_MODE_NONE = 0; +static const int DRAG_MODE_EDGE = 1; +static const int DRAG_MODE_COLUMN = 2; + +static const int EDGE_TOLERANCE = 5; +static const int BOX_TOLERANCE_RIGHT = 15; +static const int ARROW_TOLERANCE_RIGHT = 30; + +static const int BOX_TOLERANCE_LEFT = -10; +static const int MIN_WIDTH = 40; + +int Fl_Funky_Browser::handle_push(int x, int y) +{ + void *v = find_item(y); + if (v == NULL) + { + // deselect. + //deselect(); + return 0; + } + int inum = lineno(v); + int i; + + // which row??? + // if standard row - was it at a box (ie H from start).... + if (inum != 1) + { + drag_mode = DRAG_MODE_NONE; + int xloc = x - leftedge(); + for(i = 0; (xloc > BOX_TOLERANCE_RIGHT) && (i < ncols); i++) + { + xloc -= widths[display_order[i]]; + } + if (xloc > BOX_TOLERANCE_LEFT) + { + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, "Clicked on The Edge!"); + // we hit an edge. + if (tree[display_order[i]] == 1) + { + toggleCollapseLevel(inum); + return 1; + } + else if (check_box[display_order[i]] == true) + { + toggleCheckBox(inum, i); + return 1; + } + } + // our select policy... + selectItems(inum); + // else select it. + // select(inum); + return 1; + } + else + { + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, "Clicked on The Header!"); + drag_mode = DRAG_MODE_NONE; + int xloc = x - leftedge(); + for(i = 0; (xloc > widths[display_order[i]]) && (i < ncols); i++) + { + xloc -= widths[display_order[i]]; + } + { + std::ostringstream out; + out << "Click Parameters: X: " << x << " Y: " << y; + out << " NCols: " << ncols; + out << " Drag Column: " << i << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, out.str()); + } + + if (abs(xloc) < EDGE_TOLERANCE) + { + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, + "Clicked on The Edge!"); + drag_mode = DRAG_MODE_EDGE; + // set mouse icon. + // save point. + drag_column = i; + drag_x = x; + drag_y = y; + fl_cursor(FL_CURSOR_INSERT, FL_FOREGROUND_COLOR, FL_BACKGROUND_COLOR); + return 1; + } + else if ((xloc > EDGE_TOLERANCE) && + (xloc < BOX_TOLERANCE_RIGHT)) + { + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, + "Clicked on The Box!"); + toggle_TreeSetting(i); + } + else if ((xloc > BOX_TOLERANCE_RIGHT) && + (xloc < ARROW_TOLERANCE_RIGHT)) + { + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, + "Clicked on The Arrow!"); + toggle_ArrowSetting(i); + } + else if ((xloc > ARROW_TOLERANCE_RIGHT) && + (xloc < widths[display_order[i]] - EDGE_TOLERANCE)) + { + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, + "Clicked on The Title!"); + + drag_mode = DRAG_MODE_COLUMN; + // set mouse icon. + // save point. + drag_column = i; + drag_x = x; + drag_y = y; + fl_cursor(FL_CURSOR_HAND, FL_FOREGROUND_COLOR, FL_BACKGROUND_COLOR); + return 1; + } + } + + drag_mode = DRAG_MODE_NONE; + + return 1; +} + +bool Fl_Funky_Browser::dragging() +{ + if (drag_mode != DRAG_MODE_NONE) + return true; + return false; +} + +int Fl_Funky_Browser::handle_release(int x, int y) +{ + { + std::ostringstream out; + out << "Drag Handling from (" << drag_x << ","; + out << drag_y << ") -> (" << x << "," << y << ")" << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, out.str()); + } + + fl_cursor(FL_CURSOR_DEFAULT, FL_FOREGROUND_COLOR, FL_BACKGROUND_COLOR); + if (drag_mode == DRAG_MODE_EDGE) + { + if ((drag_column < 1) || (drag_column > ncols)) + { + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, "Can't Drag that Column!"); + drag_mode = DRAG_MODE_NONE; + return 1; + } + + int x_change = x - drag_x; + int new_width = widths[display_order[drag_column - 1]]; + new_width += x_change; + if (new_width < MIN_WIDTH) + { + new_width = MIN_WIDTH; + } + + widths[display_order[drag_column - 1]] = new_width; + fl_widths[drag_column - 1] = new_width; + } + else + { + + } + + drag_mode = DRAG_MODE_NONE; + return 1; +} + + +int Fl_Funky_Browser::setup(std::string opts) +{ + { + std::ostringstream out; + out << "Fl_Funky_Browser::setup(" << opts << ")" << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, out.str()); + } + int loc = 0; + char name[1024]; + int so, w, n, t; + + int tc = 0; + for(int i = 0; i < ncols; i++) + { + int r = sscanf(&(opts.c_str()[loc]), + " %1000s (%d:%d:%d)%n", name, &so, &w, &t, &n); + if (r < 4) + { + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, + "Failed to Finish Reading"); + break; + } + // save + { + std::ostringstream out; + out << "Data for Column(" << i << ") Name: " << name; + out << " sOrder: " << so << " Width: " << w; + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, out.str()); + } + titles[i] = name; + sort_order[i] = display_order[i] = so; + widths[i] = w; + if (t == 1) + { + tree[i] = 1; + tc++; + } + else + tree[i] = 0; + + + loc += n; + } + ntrees = tc; + checkIndices(); + SortList(); + RePopulate(); + return 1; +} + +std::string Fl_Funky_Browser::setup() +{ + std::string opts; + char str[1024]; + for(int i = 0; i < ncols; i++) + { + sprintf(str, "%s (%d:%d:%d)", titles[i].c_str(), sort_order[i], widths[i], tree[i]); + opts += str; + if (i + 1 != ncols) + opts += "\t"; + } + + { + std::ostringstream out; + out << "Fl_Funky_Browser::setup() = " << opts << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqiflfbzone, out.str()); + } + + return opts; +} + + diff --git a/libretroshare/src/fltkgui/Fl_Funky_Browser.h b/libretroshare/src/fltkgui/Fl_Funky_Browser.h new file mode 100644 index 000000000..6cbbd81c1 --- /dev/null +++ b/libretroshare/src/fltkgui/Fl_Funky_Browser.h @@ -0,0 +1,179 @@ +/* + * "$Id: Fl_Funky_Browser.h,v 1.4 2007-02-18 21:46:49 rmf24 Exp $" + * + * FltkGUI for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + +#ifndef RS_FL_FUNKY_BROWSER +#define RS_FL_FUNKY_BROWSER + +/* My new funky browser..... + * + * - Designed to sort/display a tree brower + * for search results.... + * + * First we need the basic interface class that + * must wrap the Data.... + */ + +#include +#include +#include + +class DisplayData; + +class DisplayItem +{ + public: + int expander; + int index; + int flags; + std::string txt; + DisplayData *ref; +}; + +class DisplayData +{ + public: + DisplayData() { return;} +virtual ~DisplayData() { return;} + + // a couple of functions that do the work. +virtual int ndix() = 0; // Number of Indices. + +std::string txt(int col, int width) + { + std::string out1 = txt(col); + int i; + for(i = (signed) out1.length() + 1; i < width; i++) + { + out1 += " "; + } + if ((signed) out1.length() > width) + { + std::string out2; + for(i = 0; i < width; i++) + { + out2 += out1[i]; + } + return out2; + } + return out1; + } + +virtual std::string txt(int col) = 0; + +virtual int cmp(int col, DisplayData *) = 0; +virtual int check(int n, int v = -1) { return -1;} + // return -1 unless have a check box. then return 0/1 + // if v != -1 attempt to set value. +}; + +#include + +class Fl_Funky_Browser : public Fl_Browser +{ + public: + Fl_Funky_Browser(int, int, int, int, const char *, int ncol); + //Fl_Funky_Browser(int ncol); + + // add items. +int selectDD(DisplayData *); +int addItem(DisplayData *); + // add in a batch (faster) +int addItemSeries(DisplayData *); +int ItemSeriesDone(); + +int setTitle(int col, std::string name); +int setCheck(int col); // enables check for the column; + +DisplayData *removeItem(int idx = -1); +DisplayData *removeItem(int (*fn)(DisplayData *)); // remove first matching fn. +DisplayData *getSelected(); +DisplayData *getCurrentItem(); + +int checkSort(); // check if update affected order. +int updateList(); // if affected call this. + +int toggleCheckBox(int row, int col = -1); +int getCheckState(int row = -1, int col = -1); + + // old - don't use +int current_SetCollapsed(bool col) { return 1;} + +void clear(); + + // change browser config. +int setup(std::string opts); +std::string setup(); + + // Worker Functions. +int drawList(); + + // Overload the Browser Functions....... + protected: +virtual void item_draw(void* v, int X, int Y, int W, int H) const; +virtual int handle(int event); + private: + +int toggleCollapseLevel(int row); +int toggle_TreeSetting(int); +int toggle_ArrowSetting(int); +int selectItems(int row); + +int cmp_upto(int lvl, DisplayItem *i1, DisplayItem *i2); +int cmp(DisplayItem *i1, DisplayItem *i2); + + // Worker Functions. +int checkIndices(); + +int SortList(); +int RePopulate(); + + // drag and ticks mouse stuff + int handle_push(int x, int y); + bool dragging(); + int handle_release(int x, int y); + + int ncols; + std::list dlist; + std::vector sort_order; + std::vector sort_direction; + std::vector tree; + std::vector display_order; + std::vector widths; + std::vector titles; + std::vector check_box; + + int *fl_widths; + int ntrees; + + int drag_mode; + int drag_column; // which column + int drag_x, drag_y; + bool one_select; +}; + + +#endif + diff --git a/libretroshare/src/fltkgui/Fl_Tree_Browser.cc b/libretroshare/src/fltkgui/Fl_Tree_Browser.cc new file mode 100644 index 000000000..8d7e09764 --- /dev/null +++ b/libretroshare/src/fltkgui/Fl_Tree_Browser.cc @@ -0,0 +1,752 @@ +// +// "$Id: Fl_Tree_Browser.cc,v 1.3 2007-02-18 21:46:49 rmf24 Exp $" +// +// This is hacked up FLTK code, and so is released under +// their licence. (below) +// Copyright 2004-2006 by Robert Fernie. +// +// Please report all bugs and problems to "retroshare@lunamutt.com". +// +///////////////////////////////////////////////////////////////////// +// +// Widget type code for the Fast Light Tool Kit (FLTK). +// +// Each object described by Fluid is one of these objects. They +// are all stored in a double-linked list. +// +// They "type" of the object is covered by the virtual functions. +// There will probably be a lot of these virtual functions. +// +// The type browser is also a list of these objects, but they +// are "factory" instances, not "real" ones. These objects exist +// only so the "make" method can be called on them. They are +// not in the linked list and are not written to files or +// copied or otherwise examined. +// +// Copyright 1998-2004 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 of the License, or (at your option) any later version. +// +// 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 "fltk-bugs@fltk.org". +// + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "Fl_Tree_Browser.h" + +#include + +//static Fl_Pixmap lock_pixmap(lock_xpm); +//static Fl_Pixmap unlock_pixmap(unlock_xpm); + +void selection_changed(Fl_Item *p); +size_t fltk_strlcpy(char *dst, const char *src, size_t size); +const char* subclassname(Fl_Item *i) { return i -> type_name(); } + + +//////////////////////////////////////////////////////////////// + +class Fl_Tree_Browser : public Fl_Browser_ { + friend class Fl_Item; + + // required routines for Fl_Browser_ subclass: + void *item_first() const ; + void *item_next(void *) const ; + void *item_prev(void *) const ; + int item_selected(void *) const ; + void item_select(void *,int); + int item_width(void *) const ; + int item_height(void *) const ; + void item_draw(void *,int,int,int,int) const ; + int incr_height() const ; + +public: + + int handle(int); + void callback(); + Fl_Tree_Browser(int,int,int,int,const char * =0); +}; + +static Fl_Tree_Browser *tree_browser; + +Fl_Widget *make_tree_browser(int x,int y,int w,int h, const char *) { + return (tree_browser = new Fl_Tree_Browser(x,y,w,h)); +} + +void select(Fl_Item *o, int v) { + tree_browser->select(o,v,1); + // Fl_Item::current = o; +} + +void select_only(Fl_Item *o) { + tree_browser->select_only(o,1); +} + +void deselect() { + tree_browser->deselect(); + //Fl_Item::current = 0; // this breaks the paste & merge functions +} + +Fl_Item *Fl_Item::first; +Fl_Item *Fl_Item::last; +Fl_Item *Fl_Item::current; + +static void Fl_Tree_Browser_callback(Fl_Widget *o,void *) { + ((Fl_Tree_Browser *)o)->callback(); +} + +Fl_Tree_Browser::Fl_Tree_Browser(int X,int Y,int W,int H,const char*l) +: Fl_Browser_(X,Y,W,H,l) { + type(FL_MULTI_BROWSER); + Fl_Widget::callback(Fl_Tree_Browser_callback); + when(FL_WHEN_RELEASE); +} + +void *Fl_Tree_Browser::item_first() const {return Fl_Item::first;} + +void *Fl_Tree_Browser::item_next(void *l) const {return ((Fl_Item*)l)->next;} + +void *Fl_Tree_Browser::item_prev(void *l) const {return ((Fl_Item*)l)->prev;} + +int Fl_Tree_Browser::item_selected(void *l) const {return ((Fl_Item*)l)->new_selected;} + +void Fl_Tree_Browser::item_select(void *l,int v) {((Fl_Item*)l)->new_selected = v;} + +int Fl_Tree_Browser::item_height(void *l) const { + return ((Fl_Item *)l)->visible ? textsize()+2 : 0; +} + +int Fl_Tree_Browser::incr_height() const {return textsize()+2;} + +static Fl_Item* pushedtitle; + +// Generate a descriptive text for this item, to put in browser & window titles +const char* Fl_Item::title() { + const char* c = name(); if (c) return c; + return type_name(); +} + +extern const char* subclassname(Fl_Item*); + +void Fl_Tree_Browser::item_draw(void *v, int X, int Y, int, int) const { + Fl_Item *l = (Fl_Item *)v; + X += 3 + 18 + l->level * 12; + if (l->new_selected) fl_color(fl_contrast(FL_BLACK,FL_SELECTION_COLOR)); + else fl_color(FL_BLACK); + Fl_Pixmap *pm = NULL; //pixmap[l->pixmapID()]; + if (pm) pm->draw(X-18, Y); + //if (l->is_public() == 0) lock_pixmap.draw(X - 17, Y); + //else if (l->is_public() > 0) ; //unlock_pixmap.draw(X - 17, Y); + if (l->is_parent()) { + if (!l->next || l->next->level <= l->level) { + if (l->open_!=(l==pushedtitle)) { + fl_loop(X,Y+7,X+5,Y+12,X+10,Y+7); + } else { + fl_loop(X+2,Y+2,X+7,Y+7,X+2,Y+12); + } + } else { + if (l->open_!=(l==pushedtitle)) { + fl_polygon(X,Y+7,X+5,Y+12,X+10,Y+7); + } else { + fl_polygon(X+2,Y+2,X+7,Y+7,X+2,Y+12); + } + } + X += 10; + } + if (l->is_widget() || l->is_class()) { + //if (l->is_widget()) { + const char* c = subclassname(l); + if (!strncmp(c,"Fl_",3)) c += 3; + fl_font(textfont(), textsize()); + fl_draw(c, X, Y+13); + X += int(fl_width(c)+fl_width('n')); + c = l->name(); + if (c) { + fl_font(textfont()|FL_BOLD, textsize()); + fl_draw(c, X, Y+13); + } else if ((c=l->label())) { + char buf[50]; char* p = buf; + *p++ = '"'; + for (int i = 20; i--;) { + if (! (*c & -32)) break; + *p++ = *c++; + } + if (*c) {strcpy(p,"..."); p+=3;} + *p++ = '"'; + *p = 0; + fl_draw(buf, X, Y+13); + } + } else { + const char* c = l->title(); + char buf[60]; char* p = buf; + for (int i = 55; i--;) { + if (! (*c & -32)) break; + *p++ = *c++; + } + if (*c) {strcpy(p,"..."); p+=3;} + *p = 0; + fl_font(textfont() | (l->is_code_block() && (l->level==0 || l->parent->is_class())?0:FL_BOLD), textsize()); + fl_draw(buf, X, Y+13); + } +} + +int Fl_Tree_Browser::item_width(void *v) const { + Fl_Item *l = (Fl_Item *)v; + + if (!l->visible) return 0; + + int W = 3 + 16 + 18 + l->level*10; + if (l->is_parent()) W += 10; + + if (l->is_widget() || l->is_class()) { + const char* c = l->type_name(); + if (!strncmp(c,"Fl_",3)) c += 3; + fl_font(textfont(), textsize()); + W += int(fl_width(c) + fl_width('n')); + c = l->name(); + if (c) { + fl_font(textfont()|FL_BOLD, textsize()); + W += int(fl_width(c)); + } else if ((c=l->label())) { + char buf[50]; char* p = buf; + *p++ = '"'; + for (int i = 20; i--;) { + if (! (*c & -32)) break; + *p++ = *c++; + } + if (*c) {strcpy(p,"..."); p+=3;} + *p++ = '"'; + *p = 0; + W += int(fl_width(buf)); + } + } else { + const char* c = l->title(); + char buf[60]; char* p = buf; + for (int i = 55; i--;) { + if (! (*c & -32)) break; + *p++ = *c++; + } + if (*c) {strcpy(p,"..."); p+=3;} + *p = 0; + fl_font(textfont() | (l->is_code_block() && (l->level==0 || l->parent->is_class())?0:FL_BOLD), textsize()); + W += int(fl_width(buf)); + } + + return W; +} + +void redraw_browser() { + tree_browser->redraw(); +} + +void Fl_Tree_Browser::callback() { + selection_changed((Fl_Item*)selection()); +} + +int Fl_Tree_Browser::handle(int e) { + static Fl_Item *title; + Fl_Item *l; + int X,Y,W,H; bbox(X,Y,W,H); + switch (e) { + case FL_PUSH: + if (!Fl::event_inside(X,Y,W,H)) break; + l = (Fl_Item*)find_item(Fl::event_y()); + if (l) { + X += 12*l->level + 18 - hposition(); + if (l->is_parent() && Fl::event_x()>X && Fl::event_x()level + 18 - hposition(); + if (l->is_parent() && Fl::event_x()>X && Fl::event_x()new_selected && (Fl::event_clicks() || Fl::event_state(FL_CTRL))) + l->open(); + break; + } + l = pushedtitle; + title = pushedtitle = 0; + if (l) { + if (l->open_) { + l->open_ = 0; + for (Fl_Item*k = l->next; k&&k->level>l->level; k = k->next) + k->visible = 0; + } else { + l->open_ = 1; + for (Fl_Item*k=l->next; k&&k->level>l->level;) { + k->visible = 1; + if (k->is_parent() && !k->open_) { + Fl_Item *j; + for (j = k->next; j && j->level>k->level; j = j->next); + k = j; + } else + k = k->next; + } + } + redraw(); + } + return 1; + } + return Fl_Browser_::handle(e); +} + +Fl_Item::Fl_Item() { + factory = 0; + parent = 0; + next = prev = 0; + selected = new_selected = 0; + visible = 0; + name_ = 0; + label_ = 0; + user_data_ = 0; + user_data_type_ = 0; + callback_ = 0; + rtti = 0; + level = 0; +} + +static void fixvisible(Fl_Item *p) { + Fl_Item *t = p; + for (;;) { + if (t->parent) t->visible = t->parent->visible && t->parent->open_; + else t->visible = 1; + t = t->next; + if (!t || t->level <= p->level) break; + } +} + +// turn a click at x,y on this into the actual picked object: +Fl_Item* Fl_Item::click_test(int,int) {return 0;} +void Fl_Item::add_child(Fl_Item*, Fl_Item*) {} +void Fl_Item::move_child(Fl_Item*, Fl_Item*) {} +void Fl_Item::remove_child(Fl_Item*) {} + +// add a list of widgets as a new child of p: +void Fl_Item::add(Fl_Item *p) { + if (p && parent == p) return; + parent = p; + Fl_Item *end = this; + while (end->next) end = end->next; + Fl_Item *q; + int newlevel; + if (p) { + for (q = p->next; q && q->level > p->level; q = q->next); + newlevel = p->level+1; + } else { + q = 0; + newlevel = 0; + } + for (Fl_Item *t = this->next; t; t = t->next) t->level += (newlevel-level); + //std::cerr << "add -> level = " << newlevel << std::endl; + + level = newlevel; + if (q) { + prev = q->prev; + prev->next = this; + q->prev = end; + end->next = q; + } else if (first) { + prev = last; + prev->next = this; + end->next = 0; + last = end; + } else { + first = this; + last = end; + prev = end->next = 0; + } + if (p) p->add_child(this,0); + open_ = 1; + fixvisible(this); + //modflag = 1; + tree_browser->redraw(); +} + +// add to a parent before another widget: +void Fl_Item::insert(Fl_Item *g) { + Fl_Item *end = this; + while (end->next) end = end->next; + parent = g->parent; + int newlevel = g->level; + visible = g->visible; + for (Fl_Item *t = this->next; t; t = t->next) t->level += newlevel-level; + level = newlevel; + prev = g->prev; + if (prev) prev->next = this; else first = this; + end->next = g; + g->prev = end; + fixvisible(this); + if (parent) parent->add_child(this, g); + tree_browser->redraw(); +} + +// Return message number for I18N... +int +Fl_Item::msgnum() { + int count; + Fl_Item *p; + + for (count = 0, p = this; p;) { + if (p->label()) count ++; + //if (p != this && p->is_widget() && ((Fl_Widget_Type *)p)->tooltip()) count ++; + if (p != this && p->is_widget()) count ++; + + if (p->prev) p = p->prev; + else p = p->parent; + } + + return count; +} + + +// delete from parent: +Fl_Item *Fl_Item::remove() { + Fl_Item *end = this; + for (;;) { + if (!end->next || end->next->level <= level) break; + end = end->next; + } + if (prev) prev->next = end->next; + else first = end->next; + if (end->next) end->next->prev = prev; + else last = prev; + Fl_Item *r = end->next; + prev = end->next = 0; + if (parent) parent->remove_child(this); + parent = 0; + tree_browser->redraw(); + selection_changed(0); + return r; +} + +// update a string member: +int storestring(const char *n, const char * & p, int nostrip) { + if (n == p) return 0; + int length = 0; + if (n) { // see if blank, strip leading & trailing blanks + if (!nostrip) while (isspace(*n)) n++; + const char *e = n + strlen(n); + if (!nostrip) while (e > n && isspace(*(e-1))) e--; + length = e-n; + if (!length) n = 0; + } + if (n == p) return 0; + if (n && p && !strncmp(n,p,length) && !p[length]) return 0; + if (p) free((void *)p); + if (!n || !*n) { + p = 0; + } else { + char *q = (char *)malloc(length+1); + fltk_strlcpy(q,n,length+1); + p = q; + } + //modflag = 1; + return 1; +} + +void Fl_Item::name(const char *n) { + if (storestring(n,name_)) { + if (visible) tree_browser->redraw(); + } +} + +void Fl_Item::label(const char *n) { + if (storestring(n,label_,1)) { + setlabel(label_); + if (visible && !name_) tree_browser->redraw(); + } +} + +void Fl_Item::callback(const char *n) { + storestring(n,callback_); +} + +void Fl_Item::user_data(const char *n) { + storestring(n,user_data_); +} + +void Fl_Item::user_data_type(const char *n) { + storestring(n,user_data_type_); +} + +void Fl_Item::open() { + printf("Open of '%s' is not yet implemented\n",type_name()); +} + +void Fl_Item::setlabel(const char *) {} + +Fl_Item::~Fl_Item() { + // warning: destructor only works for widgets that have been add()ed. + if (tree_browser) tree_browser->deleting(this); + if (prev) prev->next = next; else first = next; + if (next) next->prev = prev; else last = prev; + if (current == this) current = 0; + //modflag = 1; + if (parent) parent->remove_child(this); +} + +int Fl_Item::is_parent() const {return 0;} +int Fl_Item::is_widget() const {return 0;} +int Fl_Item::is_valuator() const {return 0;} +int Fl_Item::is_button() const {return 0;} +int Fl_Item::is_menu_item() const {return 0;} +int Fl_Item::is_menu_button() const {return 0;} +int Fl_Item::is_group() const {return 0;} +int Fl_Item::is_window() const {return 0;} +int Fl_Item::is_code_block() const {return 0;} +int Fl_Item::is_decl_block() const {return 0;} +int Fl_Item::is_class() const {return 1;} +int Fl_Item::is_public() const {return 1;} +int Fl_Item::is_file() const {return 0;} + +int Fl_File_Item::is_public()const { return 1; } +int Fl_Dir_Item::is_public()const { return 1; } +int Fl_File_Item::is_parent() const {return 0;} +int Fl_Dir_Item::is_parent() const {return 1;} + +int Fl_Person_Item::is_public()const { return 1; } +int Fl_Person_Item::is_parent() const {return 1;} +int Fl_Msg_Item::is_public()const { return 1; } +int Fl_Msg_Item::is_parent() const {return 0;} + + +//////////////////////////////////////////////////////////////// + +Fl_Item *in_this_only; // set if menu popped-up in window + +void select_all_cb(Fl_Widget *,void *) { + Fl_Item *p = Fl_Item::current ? Fl_Item::current->parent : 0; + if (in_this_only) { + Fl_Item *t = p; + for (; t && t != in_this_only; t = t->parent); + if (t != in_this_only) p = in_this_only; + } + for (;;) { + if (p) { + int foundany = 0; + for (Fl_Item *t = p->next; t && t->level>p->level; t = t->next) { + if (!t->new_selected) {tree_browser->select(t,1,0); foundany = 1;} + } + if (foundany) break; + p = p->parent; + } else { + for (Fl_Item *t = Fl_Item::first; t; t = t->next) + tree_browser->select(t,1,0); + break; + } + } + selection_changed(p); +} + +// rmfern - removed static.... +void delete_children(Fl_Item *p) { + Fl_Item *f; + for (f = p; f && f->next && f->next->level > p->level; f = f->next); + for (; f != p; ) { + Fl_Item *g = f->prev; + delete f; + f = g; + } +} + +void delete_all(int selected_only) { + for (Fl_Item *f = Fl_Item::first; f;) { + if (f->selected || !selected_only) { + delete_children(f); + Fl_Item *g = f->next; + delete f; + f = g; + } else f = f->next; + } + //if(!selected_only) include_H_from_C=1; + + selection_changed(0); +} + +// move f (and it's children) into list before g: +// returns pointer to whatever is after f & children +void Fl_Item::move_before(Fl_Item* g) { + if (level != g->level) printf("move_before levels don't match! %d %d\n", + level, g->level); + Fl_Item* n; + for (n = next; n && n->level > level; n = n->next); + if (n == g) return; + Fl_Item *l = n ? n->prev : Fl_Item::last; + prev->next = n; + if (n) n->prev = prev; else Fl_Item::last = prev; + prev = g->prev; + l->next = g; + if (prev) prev->next = this; else Fl_Item::first = this; + g->prev = l; + if (parent) parent->move_child(this,g); + tree_browser->redraw(); +} + +// move selected widgets in their parent's list: +void earlier_cb(Fl_Widget*,void*) { + Fl_Item *f; + for (f = Fl_Item::first; f; ) { + Fl_Item* nxt = f->next; + if (f->selected) { + Fl_Item* g; + for (g = f->prev; g && g->level > f->level; g = g->prev); + if (g && g->level == f->level && !g->selected) f->move_before(g); + } + f = nxt; + } +} + +void later_cb(Fl_Widget*,void*) { + Fl_Item *f; + for (f = Fl_Item::last; f; ) { + Fl_Item* prv = f->prev; + if (f->selected) { + Fl_Item* g; + for (g = f->next; g && g->level > f->level; g = g->next); + if (g && g->level == f->level && !g->selected) g->move_before(f); + } + f = prv; + } +} + +// FROM Fl_Widget_Type.cxx + +// Called when ui changes what objects are selected: +// p is selected object, null for all deletions (we must throw away +// old panel in that case, as the object may no longer exist) +void selection_changed(Fl_Item *p) { + // store all changes to the current selected objects: + //if (p && the_panel && the_panel->visible()) { + if (p) { + //set_cb(0,0); + // if there was an error, we try to leave the selected set unchanged: +// if (haderror) { +// Fl_Item *q = 0; +// for (Fl_Item *o = Fl_Item::first; o; o = o->next) { +// o->new_selected = o->selected; +// if (!q && o->selected) q = o; +// } +// if (!p || !p->selected) p = q; +// Fl_Item::current = p; +// redraw_browser(); +// return; +// } + } + // update the selected flags to new set: + Fl_Item *q = 0; + for (Fl_Item *o = Fl_Item::first; o; o = o->next) { + o->selected = o->new_selected; + if (!q && o->selected) q = o; + } + if (!p || !p->selected) p = q; + Fl_Item::current = p; +} + + +/* + * 'fltk_strlcpy()' - Safely copy two strings. (BSD style) + * Taken from fltk/src/flstring.c + */ + +size_t /* O - Length of string */ +fltk_strlcpy(char *dst, /* O - Destination string */ + const char *src, /* I - Source string */ + size_t size) { /* I - Size of destination string buffer */ + size_t srclen; /* Length of source string */ + + + /* + * Figure out how much room is needed... + */ + + size --; + + srclen = strlen(src); + + /* + * Copy the appropriate amount... + */ + + if (srclen > size) srclen = size; + + memcpy(dst, src, srclen); + dst[srclen] = '\0'; + + return (srclen); +} + +size_t /* O - Length of string */ +fltk_strlcat(char *dst, /* O - Destination string */ + const char *src, /* I - Source string */ + size_t size) { /* I - Size of destination string buffer */ + size_t srclen; /* Length of source string */ + size_t dstlen; /* Length of destination string */ + + + /* + * * Figure out how much room is left... + * */ + + dstlen = strlen(dst); + size -= dstlen + 1; + + if (!size) return (dstlen); /* No room, return immediately... */ + + /* + * * Figure out how much room is needed... + * */ + + srclen = strlen(src); + + /* + * * Copy the appropriate amount... + * */ + + if (srclen > size) srclen = size; + + memcpy(dst + dstlen, src, srclen); + dst[dstlen + srclen] = '\0'; + + return (dstlen + srclen); +} + +// +// End of "$Id: Fl_Tree_Browser.cc,v 1.3 2007-02-18 21:46:49 rmf24 Exp $". +// diff --git a/libretroshare/src/fltkgui/Fl_Tree_Browser.h b/libretroshare/src/fltkgui/Fl_Tree_Browser.h new file mode 100644 index 000000000..097976d4b --- /dev/null +++ b/libretroshare/src/fltkgui/Fl_Tree_Browser.h @@ -0,0 +1,210 @@ +// +// "$Id: Fl_Tree_Browser.h,v 1.2 2007-02-18 21:46:49 rmf24 Exp $" +// +// This is hacked up FLTK code, and so is released under +// their licence. (below) +// Copyright 2004-2006 by Robert Fernie. +// +// Please report all bugs and problems to "retroshare@lunamutt.com". +// +/////////////////////////////////////////////////////////////////// +// +// Widget type header file for the Fast Light Tool Kit (FLTK). +// +// Each object described by Fluid is one of these objects. They +// are all stored in a double-linked list. +// +// There is also a single "factory" instance of each type of this. +// The method "make()" is called on this factory to create a new +// instance of this object. It could also have a "copy()" function, +// but it was easier to implement this by using the file read/write +// that is needed to save the setup anyways. +// Copyright 1998-2004 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 of the License, or (at your option) any later version. +// +// 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 "fltk-bugs@fltk.org". +// + +#include +#include +#include +#include + +size_t fltk_strlcpy(char *dst, const char *src, size_t size); +size_t fltk_strlcat(char *dst, const char *src, size_t size); + +Fl_Widget *make_tree_browser(int,int,int,int,const char *l=0); +void redraw_browser(); +void delete_all(int selected_only); + +class Fl_Item { + + friend class Tree_Browser; + friend Fl_Widget *make_tree_browser(int,int,int,int,const char *l); + friend class Fl_Window_Type; + virtual void setlabel(const char *); // virtual part of label(char*) + +protected: + + Fl_Item(); + + const char *name_; + const char *label_; + const char *callback_; + const char *user_data_; + const char *user_data_type_; + +public: // things that should not be public: + + Fl_Item *parent; // parent, which is previous in list + char new_selected; // browser highlight + char selected; // copied here by selection_changed() + char open_; // state of triangle in browser + char visible; // true if all parents are open + char rtti; // hack because I have no rtti, this is 0 for base class + int level; // number of parents over this + static Fl_Item *first, *last; // linked list of all objects + Fl_Item *next, *prev; // linked list of all objects + + Fl_Item *factory; + const char *callback_name(); + +public: + + virtual ~Fl_Item(); + virtual Fl_Item *make(Fl_Item *p) = 0; + + void add(Fl_Item *parent); // add as new child + void insert(Fl_Item *n); // insert into list before n + Fl_Item* remove(); // remove from list + void move_before(Fl_Item*); // move before a sibling + + virtual const char *title(); // string for browser + virtual const char *type_name() = 0; // type for code output + + const char *name() const {return name_;} + void name(const char *); + const char *label() const {return label_;} + void label(const char *); + const char *callback() const {return callback_;} + void callback(const char *); + const char *user_data() const {return user_data_;} + void user_data(const char *); + const char *user_data_type() const {return user_data_type_;} + void user_data_type(const char *); + + virtual Fl_Item* click_test(int,int); + virtual void add_child(Fl_Item*, Fl_Item* beforethis); + virtual void move_child(Fl_Item*, Fl_Item* beforethis); + virtual void remove_child(Fl_Item*); + + static Fl_Item *current; // most recently picked object + virtual void open(); // what happens when you double-click + + // get message number for I18N + int msgnum(); + + // fake rtti: + virtual int is_parent() const; + virtual int is_widget() const; + virtual int is_button() const; + virtual int is_valuator() const; + virtual int is_menu_item() const; + virtual int is_menu_button() const; + virtual int is_public() const; + virtual int is_group() const; + virtual int is_window() const; + virtual int is_code_block() const; + virtual int is_decl_block() const; + virtual int is_class() const; + virtual int is_file() const; + + + virtual int pixmapID() { return 0; } + + const char* class_name(const int need_nest) const; +}; + +class Fl_Dir_Item : public Fl_Item { +public: + Fl_Item *make(Fl_Item *p); + void open(); + virtual const char *type_name() {return "dir";} + int is_file() const {return 0;} + int is_parent() const; /* {return 1;} */ + int pixmapID() { return 8; } + virtual int is_public() const; +}; + +extern Fl_Dir_Item Fl_Dir_Item_type; + +class Fl_File_Item : public Fl_Item { +public: + int size; + std::string filename; + + Fl_Item *make(Fl_Item *p); + void open(); + virtual const char *type_name() {return "file";} + int is_file() const {return 1;} + int is_parent() const; /* {return 0;} */ + virtual int is_public() const; + int pixmapID() { return 9; } +}; + +extern Fl_File_Item Fl_File_Item_type; + + +class Fl_Person_Item : public Fl_Item { +public: + Fl_Item *make(Fl_Item *p); + void open(); + virtual const char *type_name() {return "Person:";} + int is_file() const {return 0;} + int is_parent() const; /* {return 1;} */ + virtual int is_public() const; + int pixmapID() { return 1; } + std::string person_hash; +}; + +extern Fl_Person_Item Fl_Person_Item_type; + +class Fl_Msg_Item : public Fl_Item { +public: + Fl_Item *make(Fl_Item *p); + void open(); + virtual const char *type_name() {return "msg";} + int is_file() const {return 0;} + int is_parent() const; /* {return 1;} */ + virtual int is_public() const; + int pixmapID() { return 2; } +}; + +extern Fl_Msg_Item Fl_Msg_Item_type; + + +// bonus helper function. +void delete_children(Fl_Item *p); + + + +// replace a string pointer with new value, strips leading/trailing blanks: +int storestring(const char *n, const char * & p, int nostrip=0); + +// +// End of "$Id: Fl_Tree_Browser.h,v 1.2 2007-02-18 21:46:49 rmf24 Exp $". +// diff --git a/libretroshare/src/fltkgui/Makefile b/libretroshare/src/fltkgui/Makefile new file mode 100644 index 000000000..f93c22ffc --- /dev/null +++ b/libretroshare/src/fltkgui/Makefile @@ -0,0 +1,39 @@ + +RS_TOP_DIR = .. +include ../make.opt + +STRIP=strip + +OBJ = fltkserver.o guitab.o Fl_Funky_Browser.o pqibrowseitem.o pqistrings.o \ + Fl_Tree_Browser.o Fl_File_Item.o fltkpqi.o alertbox.o + +WIN_OBJ = retrotray.o + +# add in windows objs +ifeq ($(OS),Linux) +else + OBJ += $(WIN_OBJ) +endif + +all : $(OBJ) RetroShare + +RetroShare : $(OBJ) + $(CC) $(CFLAGS) -static -o RetroShare $(OBJ) -lfltk $(RSLIBS) +# $(STRIP) -s RetroShare.exe +# $(STRIP) -s RetroShare + +.cc.o: + $(CC) $(CFLAGS) -c $< + +clean: + -$(RM) $(OBJ) + +clobber: clean + -$(RM) RetroShare + + + + + + + diff --git a/libretroshare/src/fltkgui/alertbox.cc b/libretroshare/src/fltkgui/alertbox.cc new file mode 100644 index 000000000..7996033d8 --- /dev/null +++ b/libretroshare/src/fltkgui/alertbox.cc @@ -0,0 +1,197 @@ +/* + * "$Id: alertbox.cc,v 1.3 2007-02-18 21:46:49 rmf24 Exp $" + * + * FltkGUI for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "fltkgui/pqistrings.h" +#include "fltkgui/alertbox.h" + +#include + +alertBox::alertBox(Fl_Window *w, Fl_Text_Display *box) + :showThreshold(2), alert_win(w), alert_box(box), + maxMessages(40) + { + /* can't call virtual fn here! */ + alertBox::loadInitMsg(); + return; + } + +alertBox::~alertBox() +{ + /* clean up msgs */ + return; +} + +int alertBox::loadInitMsg() +{ + sendMsg(0, 10,"Welcome to RetroShare ----", ""); + return 1; +} + +int chatterBox::loadInitMsg() +{ + sendMsg(0, 10,"", ""); + sendMsg(0, 10,"\tThis is your Universal ChatterBox Window", ""); + sendMsg(0, 10,"", ""); + sendMsg(0, 10,"\tYou can use it to chat with everyone", ""); + sendMsg(0, 10,"\tthat is online at this moment", ""); + + sendMsg(0, 10,"", ""); + sendMsg(0, 10,"\tSometimes the conversations can seem", ""); + sendMsg(0, 10,"\tweird and wonderful, if you're not", ""); + sendMsg(0, 10,"\tconnected all the same people.", ""); + sendMsg(0, 10,"", ""); + sendMsg(0, 10,"\tIt is a bit of an experiment, so", ""); + sendMsg(0, 10,"\tlet me know if you enjoy it or hate it!", ""); + sendMsg(0, 10,"", ""); + sendMsg(0, 10,"Note. Your ChatterBox only pop up once, when the", ""); + sendMsg(0, 10,"first message is received. After that it'll leave", ""); + sendMsg(0, 10,"you in peace. Use the \"Chat\" Button on the main", ""); + sendMsg(0, 10,"window to open and close your ChatterBox", ""); + sendMsg(0, 10,"", ""); + sendMsg(0, 10,"", ""); + return 1; +} + + +int alertBox::sendMsg(int type, int severity, + std::string msg, std::string source) +{ + alertMsg newal; + + newal.epoch = time(NULL); + newal.type = type; + newal.severity = severity; + newal.msg = msg; + newal.source = source; + + msgs.push_front(newal); + if (msgs.size() > (unsigned) maxMessages) + { + msgs.pop_back(); + } + displayMsgs(); + showMsgs(severity); + return 1; +} + + +int alertBox::showMsgs(int severity) +{ + if (severity <= showThreshold) + { + alert_win -> show(); + return 1; + } + return 0; +} + +/* chatterbox will only pop up for the first chat */ +int chatterBox::showMsgs(int severity) +{ + if ((firstMsg) && (alertBox::showMsgs(severity))) + { + firstMsg = false; + return 1; + } + return 0; +} + +void alertBox::displayMsgs() +{ + std::ostringstream msg; + + std::deque::reverse_iterator it; + for(it = msgs.rbegin(); it != msgs.rend(); it++) + { + if (it -> severity <= showThreshold) + { + msg << "----------------->>>> ALERT: "; + msg << timeFormat(it -> epoch, TIME_FORMAT_NORMAL); + msg << std::endl; + msg << std::endl; + + msg << it -> msg << std::endl; + msg << std::endl; + msg << "<<<<----------------"; + msg << std::endl; + msg << std::endl; + } + else + { + msg << timeFormat(it -> epoch, TIME_FORMAT_NORMAL); + msg << ":" << it -> msg << std::endl; + msg << std::endl; + } + } + Fl_Text_Buffer *buf = alert_box -> buffer(); + buf -> text(msg.str().c_str()); + int c = buf -> length(); + int lines = buf -> count_lines(0, c-1); + // want to scroll to the bottom. + alert_box -> scroll(lines, 0); +} + + +void chatterBox::displayMsgs() +{ + std::ostringstream msg; + + std::deque::reverse_iterator it; + std::string lsrc = ""; + int lts = 0; + for(it = msgs.rbegin(); it != msgs.rend(); it++) + { + if ((it->epoch-lts > 30) || // more than 30 seconds. + (it->source != lsrc)) // not same source + { + msg << "\t\t\t\t\t\t["; + msg << it->source; + msg << " @ "; + msg << timeFormat(it -> epoch, TIME_FORMAT_NORMAL); + msg << "]"; + msg << std::endl; + } + + msg << it -> msg; + msg << std::endl; + + /* store last one */ + lts = it->epoch; + lsrc = it->source; + } + + Fl_Text_Buffer *buf = alert_box -> buffer(); + buf -> text(msg.str().c_str()); + int c = buf -> length(); + int lines = buf -> count_lines(0, c-1); + // want to scroll to the bottom. + alert_box -> scroll(lines, 0); +} + + + diff --git a/libretroshare/src/fltkgui/alertbox.h b/libretroshare/src/fltkgui/alertbox.h new file mode 100644 index 000000000..93ff55a00 --- /dev/null +++ b/libretroshare/src/fltkgui/alertbox.h @@ -0,0 +1,91 @@ +/* + * "$Id: alertbox.h,v 1.4 2007-02-18 21:46:49 rmf24 Exp $" + * + * FltkGUI for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + +#ifndef RETROSHARE_ALERT_H +#define RETROSHARE_ALERT_H + +#include +#include + +#include +#include + +class alertMsg +{ + public: + + int epoch; + int type; + int severity; + std::string msg; + std::string source; +}; + +class alertBox +{ + public: + alertBox(Fl_Window *w, Fl_Text_Display *box); +virtual ~alertBox(); + +int sendMsg(int type, int severity, + std::string msg, std::string source); + + protected: + int loadInitMsg(); +virtual void displayMsgs(); +virtual int showMsgs(int severity); + + int showThreshold; // At what severity we show ourselves. + Fl_Window *alert_win; + Fl_Text_Display *alert_box; + int maxMessages; + + std::deque msgs; +}; + +class chatterBox: public alertBox +{ + public: + chatterBox(Fl_Window *w, Fl_Text_Display *box) + :alertBox(w, box), firstMsg(true) + { + chatterBox::loadInitMsg(); + return; + } + + protected: + int loadInitMsg(); +virtual void displayMsgs(); +virtual int showMsgs(int severity); + + private: + bool firstMsg; + +}; + + +#endif diff --git a/libretroshare/src/fltkgui/fltkpqi.cc b/libretroshare/src/fltkgui/fltkpqi.cc new file mode 100644 index 000000000..ddde097e4 --- /dev/null +++ b/libretroshare/src/fltkgui/fltkpqi.cc @@ -0,0 +1,1852 @@ +/* + * "$Id: fltkpqi.cc,v 1.34 2007-02-19 20:30:05 rmf24 Exp $" + * + * FltkGUI for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "dbase/filedex.h" +#include "server/filedexserver.h" +#include "pqi/pqipersongrp.h" +#include "pqi/pqiloopback.h" + +#include "fltkgui/guitab.h" +#include "fltkgui/fltkserver.h" + +#include +#include +#include + +// Includes for directory creation. +#include +#include +#include +// Conflicts with FLTK def - hope they are the same. +//#include + +// for blocking signals +#include + +#include "fltkgui/alertbox.h" + +#include "pqi/pqidebug.h" + +// key callback functions. + +void gui_update(); +void update_connections(); +void update_search(); +void update_messages(); +void update_about(); +void update_files(); + + +// Global Pointers for the callback functions. +fltkserver *fserv; +UserInterface *ui; + +alertBox *chatbox; +alertBox *alertbox; + +// initial configuration bootstrapping... +static const std::string config_init_file = "default_cert.txt"; +static const std::string config_file = "config.rs"; +static const std::string cert_dir = "friends"; +static const std::string key_dir = "keys"; +static const std::string ca_file = "cacerts.pem"; + +static std::string config_basedir; +static std::string load_cert; +static std::string load_key; + +static std::string load_trustedpeer_file; +static bool load_trustedpeer = false; + +static bool firsttime_run = false; + +int create_configinit(); +int check_create_directory(std::string dir); +void load_check_basedir(); +void clear_passwds(); + + + +/******************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS +static const char dirSeperator = '/'; // For unix. + +// standard start for unix. +int main(int argc, char **argv) +{ + + // setup debugging for desired zones. + setOutputLevel(PQL_WARNING); // default to Warnings. + + // For Testing purposes. + // We can adjust everything under Linux. + //setZoneLevel(PQL_DEBUG_BASIC, 38422); // pqipacket. + //setZoneLevel(PQL_DEBUG_BASIC, 96184); // pqinetwork; + //setZoneLevel(PQL_DEBUG_BASIC, 82371); // pqiperson. + //setZoneLevel(PQL_DEBUG_BASIC, 60478); // pqitunnel. + //setZoneLevel(PQL_DEBUG_BASIC, 34283); // pqihandler. + //setZoneLevel(PQL_DEBUG_BASIC, 44863); // discItems. + //setZoneLevel(PQL_DEBUG_BASIC, 2482); // p3disc + //setZoneLevel(PQL_DEBUG_BASIC, 1728); // pqi/p3proxy + //setZoneLevel(PQL_DEBUG_BASIC, 1211); // sslroot. + //setZoneLevel(PQL_DEBUG_BASIC, 37714); // pqissl. + //setZoneLevel(PQL_DEBUG_BASIC, 8221); // pqistreamer. + //setZoneLevel(PQL_DEBUG_BASIC, 9326); // pqiarchive + //setZoneLevel(PQL_DEBUG_BASIC, 3334); // p3channel. + //setZoneLevel(PQL_DEBUG_BASIC, 354); // pqipersongrp. + //setZoneLevel(PQL_DEBUG_BASIC, 6846); // pqiudpproxy + //setZoneLevel(PQL_DEBUG_BASIC, 3144); // pqissludp; + //setZoneLevel(PQL_DEBUG_BASIC, 86539); // pqifiler. + //setZoneLevel(PQL_DEBUG_BASIC, 91393); // Funky_Browser. + //setZoneLevel(PQL_DEBUG_BASIC, 25915); // fltkserver + //setZoneLevel(PQL_DEBUG_BASIC, 47659); // fldxsrvr + //setZoneLevel(PQL_DEBUG_BASIC, 49787); // pqissllistener + + + +/******************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#else + +static const char dirSeperator = '\\'; // For windows. + +// Include for the windows system tray... +// the reason for the alternative +// program start. + +#include "retroTray.h" + +/* believe this fn exists! */ +LPSTR * WINAPI CommandLineToArgvA(LPCSTR,int*); + +const int MAX_ARGS = 32; + +int WinMain(HINSTANCE hinst, HINSTANCE prevhinst, char *argv_crap, int argc_crap) +{ + int i,j; + + int argc; + char *argv[MAX_ARGS]; + char *wholeline = GetCommandLine(); + int cmdlen = strlen(wholeline); + // duplicate line, so we can put in spaces.. + char dupline[cmdlen+1]; + strcpy(dupline, wholeline); + + /* break wholeline down .... + * NB. This is very simplistic, and will not + * handle multiple spaces, or quotations etc, only for debugging purposes + */ + argv[0] = dupline; + for(i = 1, j = 0; (j + 1 < cmdlen) && (i < MAX_ARGS);) + { + /* find next space. */ + for(;(j + 1 < cmdlen) && (dupline[j] != ' ');j++); + if (j + 1 < cmdlen) + { + dupline[j] = '\0'; + argv[i++] = &(dupline[j+1]); + } + } + argc = i; + for( i=0; i dirs; + + short port = 7812; // default port. + bool forceLocalAddr = false; + bool haveLogFile = false; + bool outStderr = false; + + char inet[256] = "127.0.0.1"; + char passwd[256] = ""; + char logfname[1024] = ""; + + int c; + bool havePasswd = false; + bool haveDebugLevel = false; + int debugLevel = PQL_WARNING; + bool udpListenerOnly = false; + + while((c = getopt(argc, argv,"i:p:c:sw:l:d:u")) != -1) + { + switch (c) + { + case 'l': + strncpy(logfname, optarg, 1024); + std::cerr << "LogFile (" << logfname; + std::cerr << ") Selected" << std::endl; + haveLogFile = true; + break; + case 'w': + strncpy(passwd, optarg, 256); + std::cerr << "Password Specified(" << passwd; + std::cerr << ") Selected" << std::endl; + havePasswd = true; + break; + case 'i': + strncpy(inet, optarg, 256); + std::cerr << "New Inet Addr(" << inet; + std::cerr << ") Selected" << std::endl; + forceLocalAddr = true; + break; + case 'p': + port = atoi(optarg); + std::cerr << "New Listening Port(" << port; + std::cerr << ") Selected" << std::endl; + break; + case 'c': + config_basedir = optarg; + std::cerr << "New Base Config Dir("; + std::cerr << config_basedir; + std::cerr << ") Selected" << std::endl; + break; + case 's': + outStderr = true; + haveLogFile = false; + std::cerr << "Output to Stderr"; + std::cerr << std::endl; + break; + case 'd': + haveDebugLevel = true; + debugLevel = atoi(optarg); + std::cerr << "Opt for new Debug Level"; + std::cerr << std::endl; + break; + case 'u': + udpListenerOnly = true; + std::cerr << "Opt for only udpListener"; + std::cerr << std::endl; + break; + default: + std::cerr << "Unknown Option!"; + exit(1); + } + } + + + // set the default Debug Level... + if (haveDebugLevel) + { + if ((debugLevel > 0) && (debugLevel <= PQL_DEBUG_ALL)) + { + std::cerr << "Setting Debug Level to: " << debugLevel; + std::cerr << std::endl; + setOutputLevel(debugLevel); + } + else + { + std::cerr << "Ignoring Invalid Debug Level: "; + std::cerr << debugLevel; + std::cerr << std::endl; + } + } + + // set the debug file. + if (haveLogFile) + { + setDebugFile(logfname); + } + +/******************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#else + // As windows doesn't have commandline options - we have to set them... + // or make them part of prog config. + + /* + char certloc[256] = "./keys/bobby_cert.pem"; + char pkeyloc[256] = "./keys/bobby_pk.pem"; + */ + //char inet[256] = "10.0.0.2"; + + // only the currnet directory for the moment. + //dirs.push_back("."); + + // Windows Networking Init. + WORD wVerReq = MAKEWORD(2,2); + WSADATA wsaData; + + if (0 != WSAStartup(wVerReq, &wsaData)) + { + std::cerr << "Failed to Startup Windows Networking"; + std::cerr << std::endl; + } + else + { + std::cerr << "Started Windows Networking"; + std::cerr << std::endl; + } + +#endif +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ + + // first check config directories, and set bootstrap values. + load_check_basedir(); + + // blank the trustedpeer loading variables. + load_trustedpeer = false; + load_trustedpeer_file = ""; + + firsttime_run = false; + + // Next - Setup the GUI defaults...... + ui = new UserInterface(); + ui -> make_windows(); + + // SWITCH off the SIGPIPE - kills process on Linux. +/******************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS + struct sigaction sigact; + sigact.sa_handler = SIG_IGN; + sigact.sa_flags = 0; + + if (0 == sigaction(SIGPIPE, &sigact, NULL)) + { + std::cerr << "RetroShare:: Successfully Installed"; + std::cerr << "the SIGPIPE Block" << std::endl; + } + else + { + std::cerr << "RetroShare:: Failed to Install"; + std::cerr << "the SIGPIPE Block" << std::endl; + } +#else + // in windows case, install the system tray. + std::string iconpath = config_basedir + dirSeperator; + iconpath += "tst.ico"; + SetIconPath(iconpath.c_str()); + InitialiseRetroTray(hinst, NULL, ui); + +#endif +/******************************** WINDOWS/UNIX SPECIFIC PART ******************/ + + // add the text_buffers to the correct displays... + ui -> cert_details -> buffer(new Fl_Text_Buffer(10000)); + ui -> msg_details -> buffer(new Fl_Text_Buffer(10000)); + ui -> msg_text -> buffer(new Fl_Text_Buffer(10000)); + ui -> transfer_overview -> buffer(new Fl_Text_Buffer(10000)); + ui -> chan_createmsg_msg -> buffer(new Fl_Text_Buffer(10000)); + ui -> chan_msgdetails_msg -> buffer(new Fl_Text_Buffer(10000)); + + ui -> alert_box -> buffer(new Fl_Text_Buffer(10000)); + ui -> chatter_box -> buffer(new Fl_Text_Buffer(10000)); + + //ui -> cert_list -> Fl_Browser::handle(FL_PUSH); + ui -> cert_list -> when(FL_WHEN_CHANGED); + ui -> srch_results -> when(FL_WHEN_CHANGED); + ui -> msg_list -> when(FL_WHEN_CHANGED); + ui -> cert_list -> setCheck(2); + +// ui -> cert_list -> setTitle(0,"Status"); +// ui -> cert_list -> setTitle(1,"Person"); +// ui -> cert_list -> setTitle(2,"Auto Connect"); +// ui -> cert_list -> setTitle(3,"Server"); +// +// +// ui -> srch_results -> setTitle(0,"Source"); +// ui -> srch_results -> setTitle(1,"KeyWord"); +// ui -> srch_results -> setTitle(2,"FileName"); +// ui -> srch_results -> setTitle(3,"Size"); +// +// +// ui -> msg_list -> setTitle(0,"Source"); +// ui -> msg_list -> setTitle(1,"Message"); +// ui -> msg_list -> setTitle(2,"Date"); +// +// ui -> transfer_downloads -> setTitle(0,"Source"); +// ui -> transfer_downloads -> setTitle(1,"Direction"); +// ui -> transfer_downloads -> setTitle(2,"Filename"); +// ui -> transfer_downloads -> setTitle(3,"Completed"); +// ui -> transfer_downloads -> setTitle(4,"Rate"); + + + // disable the channel stuff (and recommend stuff) for now! + ui ->file_channel_button->deactivate(); + ui ->search_channel_button->deactivate(); + //ui ->channels->deactivate(); + + + + chatbox = new chatterBox(ui->chatter_window, ui->chatter_box); + alertbox = new alertBox(ui->alert_window,ui->alert_box); + + //static int neighbour_widths[3] = { 150, 250, 0 }; + //ui -> cert_neighbour_list -> column_widths(neighbour_widths); +static int neighbour_widths[3] = { 150, 250, 0 }; + ui -> neigh_signers -> column_widths(neighbour_widths); + + ui -> file_chooser -> preview(0); + + // Next bring up the welcome window..... + // load up the default welcome settings. + //ui -> load_cert -> value(load_cert.c_str()); + //ui -> load_key -> value(load_key.c_str()); + + std::string userName; + bool existingUser = false; + if (LoadCheckXPGPandGetName(load_cert.c_str(), userName)) + { + ui -> load_name -> value(userName.c_str()); + existingUser = true; + } + else + { + ui -> load_name -> value("No Existing User -> Create New"); + } + + //ui -> gen_basename -> value("user"); + + ui -> welcome_window -> show(); + if (existingUser) + { + ui -> load_passwd -> take_focus(); + } + else + { + ui -> gen_name -> take_focus(); + } + + + alertbox ->sendMsg(0, 10, "RetroShare GUI Loading.", ""); + alertbox ->sendMsg(0, 10, "RetroShare: Alert Msgs activated", ""); + + /* do a null init to allow the SSL libray to startup! */ +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + /* do a null init to allow the SSL libray to startup! */ + getSSLRoot() -> initssl(NULL, NULL, NULL); +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + getSSLRoot() -> initssl(NULL, NULL, NULL, NULL); +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + +/******************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS + if (havePasswd) + { + ui -> load_passwd -> value(passwd); + load_existing(NULL, NULL); + // do we need to shut down the window? + } +/******************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#else // WINDOWS + // can't load passwd from command line. +#endif + + // wait for this window to be finished.... + while(!(getSSLRoot() -> active())) + { + Fl::wait(); + } + + // ssl root is setup already.... by welcome_window. + // this means that the cert/key + cacerts have been loaded. + sslroot *sr = getSSLRoot(); + +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + if (1 != sr -> initssl(NULL, NULL, NULL)) +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + if (1 != sr -> initssl(NULL, NULL, NULL, NULL)) +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + { + std::cerr << "main() - Fatal Error....." << std::endl; + std::cerr << "Invalid Certificate configuration!" << std::endl; + std::cerr << std::endl; + exit(1); + } + + /* set the debugging to crashMode */ + if ((!haveLogFile) && (!outStderr)) + { + std::string crashfile = config_basedir + dirSeperator; + crashfile += "retro.log"; + setDebugCrashMode(crashfile.c_str()); + } + + alertbox ->sendMsg(0, 10, "RetroShare: Loading", ""); + + // set the directories for full configuration load. + sr -> setConfigDirs(config_basedir.c_str(), cert_dir.c_str()); + sr -> loadCertificates(config_file.c_str()); + sr -> checkNetAddress(); + + // filedex server. + filedexserver server; + + +#ifdef USE_FILELOOK + fileLook *fl = new fileLook(); + fl -> start(); /* background look thread */ + server.setFileLook(fl); +#else /*********************************************************************/ + filedex *fd = new filedex(); + server.setFileDex(fd); +#endif + + server.setConfigDir(config_basedir.c_str()); + + SecurityPolicy *none = secpolicy_create(); + + if (forceLocalAddr) + { + struct sockaddr_in laddr; + + laddr.sin_family = AF_INET; + laddr.sin_port = htons(port); + + // universal + laddr.sin_addr.s_addr = inet_addr(inet); + // unix specific + //inet_aton(inet, &(laddr.sin_addr)); + + cert *own = sr -> getOwnCert(); + if (own != NULL) + { + own -> localaddr = laddr; + } + } + + /* must load the trusted_peer before setting up the pqipersongrp */ + if (firsttime_run) + { + /* at this point we want to load and start the trusted peer -> if selected */ + if (load_trustedpeer) + { + /* sslroot does further checks */ + sr -> loadInitialTrustedPeer(load_trustedpeer_file); + } + } + + unsigned long flags = 0; + if (udpListenerOnly) + { + flags |= PQIPERSON_NO_SSLLISTENER; + } + + pqipersongrp psg(none, sr, flags); + psg.load_config(); + server.setSearchInterface(&psg, sr); + +#ifdef PQI_USE_CHANNELS + server.setP3Channel(psg.getP3Channel()); +#endif + + // create loopback device, and add to pqisslgrp. + + SearchModule *mod = new SearchModule(); + pqiloopback *ploop = new pqiloopback(); + + mod -> smi = 1; + mod -> pqi = ploop; + mod -> sp = secpolicy_create(); + + psg.AddSearchModule(mod); + + //autoDiscovery ad(&psg, sr); + //ad.load_configuration(); + //ad.localSetup(); + + fltkserver ncs; + fserv = &ncs; + + ncs.setuppqissl(&server, &psg, sr, ui); + ncs.addAlerts(alertbox, chatbox); + + // Set Default Save Dir. pre-load + // Load from config will overwrite... + std::string hdefpath = fserv -> getHomePath(); + server.setSaveDir(hdefpath.c_str()); + + // load the GUI browser settings from sslroot. + ncs.cert_load_gui_config(); + + server.load_config(); + + ncs.addAutoDiscovery(psg.getP3Disc()); + + // load up the help page + std::string helppage = config_basedir + dirSeperator; + //helppage += "html"; + //helppage += dirSeperator; + //helppage += "retro_help.html"; + helppage += "retro.htm"; + //helppage += "index.html"; + //helppage = "/home/rmf24/prog/src/FLTK/fltk-1.1.6/documentation/index.html"; + + // Temp remove about page. + ui -> help_view -> load(helppage.c_str()); + ui -> help_view -> textsize(14); + + alertbox ->sendMsg(0, 10, "RetroShare: Loaded", ""); + + + /* finally show the main window */ + ui -> main_win -> show(); + + if (firsttime_run) + { + /* change any gui options that should be setup for the initial run */ + + /* set the help to be the default visible tab */ + ui -> gui_tabs->value(ui->about_help_tab); + } + else + { + /* make connect gui the initial tab */ + ui -> gui_tabs->value(ui->connect_tab); + } + + ncs.init(); + ncs.run(); + + return 1; +} + + +/* Neighbour Fns. + */ +void cert_neighbour_list_select(Fl_Funky_Browser*, void*) +{ + fserv -> cert_neighbour_item_ok = false; + std::cerr << "cert_neighbour_list_select() callback!" << std::endl; + return; +} + +void cert_neigh_signers_select(Fl_Browser*, void*) +{ + std::cerr << "cert_neigh_signers_select() callback!" << std::endl; +} + +void neigh_auth_callback(Fl_Input*, void*) +{ + fserv -> neigh_update_auth(); + return; +} + +/* Cert fns */ + +void cert_list_select(Fl_Funky_Browser*, void*) +{ + fserv -> cert_item_ok = false; + // check if this was called by ticking the box. + fserv -> cert_check_auto(); + std::cerr << "cert_list_select() callback!" << std::endl; + return; +} + +void cert_move_to_friends(Fl_Button*, void*) +{ + fserv -> cert_add_neighbour(); + std::cerr << "cert_move_to_friend() callback!" << std::endl; + return; +} + + +void cert_show_config(Fl_Button*, void*) +{ + ui -> cert_config -> show(); + return; +} + +void cert_hide_config(Fl_Button*, void*) +{ + ui -> cert_config -> hide(); + return; +} + +void cert_show_neighbour_config(Fl_Button*, void*) +{ + //ui -> cert_neighbour_config -> show(); + return; +} + +void cert_hide_neighbour_config(Fl_Button*, void*) +{ + //ui -> cert_neighbour_config -> hide(); + return; +} + +void cert_allow_change(Fl_Check_Button*, void*) +{ + if (ui -> cert_allow -> value() == 0) + { + fserv -> cert_deny_current(); + } + else + { + fserv -> cert_allow_current(); + } + fserv -> cert_list_ok = false; + fserv -> cert_item_ok = false; + return; +} + +void cert_listen_change(Fl_Check_Button*, void*) +{ + fserv -> cert_listen_current(); + fserv -> cert_list_ok = false; + fserv -> cert_item_ok = false; + return; +} + +void cert_connect_change(Fl_Check_Button*, void*) +{ + fserv -> cert_connect_current(); + fserv -> cert_list_ok = false; + fserv -> cert_item_ok = false; + return; +} + +void cert_auth_callback(Fl_Input*, void*) +{ + fserv -> cert_update_auth(); + return; +} + + +void cert_save_servaddr(Fl_Button*, void*) +{ + // if success - update gui. + // else leave for error message. + if (0 != fserv -> cert_save_servaddr()) + { + fserv -> cert_item_ok = false; + } + return; +} + + +void cert_save_n_connect(Fl_Button*, void*) +{ + if (0 != fserv -> cert_saveaddr_connect()) + { + fserv -> cert_item_ok = false; + } + return; +} + + +void cert_save_config(Fl_Button*, void*) +{ + /* + fserv -> cert_save_config(config_file.c_str()); + */ + // To allow autosave. + fserv -> cert_save_config(); + std::cerr << "fserv -> cert_save_config() Done!" << std::endl; + return; +} + + +void cert_remove_cert(Fl_Button*, void*) +{ + fserv -> cert_remove_current(); + fserv -> cert_list_ok = false; + fserv -> cert_item_ok = false; + return; +} + + +void cert_trust_person_change(Fl_Check_Button*, void*) +{ + std::cerr << "cert_trust_person_change()" << std::endl; + /* at this point we ask the sslroot->tosign(current *) */ + fserv -> cert_trust_current_toggle(); + return; +} + +void cert_auto_change(Fl_Check_Button*, void*) +{ + std::cerr << "cert_auto_change()" << std::endl; + fserv -> cert_toggle_auto(); + return; +} + + +void cert_local_change(Fl_Check_Button*, void*) +{ + std::cerr << "cert_local_change()" << std::endl; + //fserv -> cert_toggle_auto(); + return; +} + + +void cert_sign(Fl_Button*, void*) +{ + std::cerr << "cert_sign()" << std::endl; + + /* at this point we ask the sslroot->tosign(current *) */ + fserv -> cert_sign_current(); + return; +} + + +void msg_send(Fl_Button*, void*) +{ + fserv -> msg_send(); + ui -> msg_dialog -> hide(); + return; +} + + +void msg_select(Fl_Funky_Browser*, void*) +{ + fserv -> msg_list_ok = false; + fserv -> msg_item_ok = false; + return; +} + + +void msg_toggle_select(Fl_Button*, void*) +{ + return; +} + + +void msg_dialog_hide(Fl_Button*, void*) +{ + ui -> msg_dialog -> hide(); + return; +} + +void msg_dialog_show(Fl_Button*, void*) +{ + ui -> msg_dialog -> show(); + return; +} + +void msg_remove(Fl_Button*, void*) +{ + fserv -> msg_remove(); + fserv -> msg_list_ok = false; + fserv -> msg_item_ok = false; + return; +} + + +void msg_dialog_reply(Fl_Button*, void*) +{ + fserv -> msg_reply(); + fserv -> msg_item_ok = false; + ui -> msg_dialog -> show(); + return; +} + + +void msg_get_recommendation(Fl_Button*, void*) +{ + fserv -> download_recommend(); + return; +} + + +void channel_select(Fl_Browser*, void*) +{ + std::cerr << "Channel callback" << std::endl; + fserv -> msg_channel_select(); +} + + +void transfer_select(Fl_Funky_Browser*, void*) +{ + std::cerr << "Transfer callback" << std::endl; + //fserv -> transfer_select(); +} + +void file_transfer_cancel(Fl_Button*, void*) +{ + std::cerr << "File Transfer Cancel callback" << std::endl; + fserv -> transfer_cancel(); +} + +void file_transfer_clear(Fl_Button*, void*) +{ + std::cerr << "File Transfer Clear callback" << std::endl; + fserv -> transfer_clear(); +} + +void file_transfer_total_rate(Fl_Counter*, void*) +{ + std::cerr << "File Transfer Total Rate callback" << std::endl; + fserv -> transfer_rates(); +} + + +void file_transfer_indiv_rate(Fl_Counter*, void*) +{ + std::cerr << "File Transfer Individual Rate callback" << std::endl; + fserv -> transfer_rates(); +} + + +void file_transfers_max(Fl_Counter*, void*) +{ + std::cerr << "File Transfer Max callback" << std::endl; + fserv -> transfer_rates(); +} + + +void do_new_search(Fl_Input *, void*) +{ + fserv -> search_new(); + return; +} + +void do_search_button(Fl_Button *, void*) +{ + fserv -> search_new(); + return; +} + +void search_remove(Fl_Button*, void*) +{ + fserv -> search_remove(); + return; +} + +void search_result_select(Fl_Funky_Browser*, void*) +{ + fserv -> result_item_ok = false; + std::cerr << "search_result_select() callback!" << std::endl; + return; +} + +void search_download(Fl_Button*, void*) +{ + fserv -> search_download(); + return; +} + +void search_recommend(Fl_Button*, void*) +{ + fserv -> search_recommend(); + return; +} + +void gui_hide(Fl_Button*, void*); + +void gui_quit(Fl_Button*a, void*b) +{ + gui_hide(a,b); + //exit(1); + return; +} + +void gui_hide(Fl_Button*, void*) +{ + // Temp use to shown chatter window. + // ui -> chatter_window -> show(); +/******************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS + // iconize. + ui -> main_win -> iconize(); +#else + // windows we can hide (cos the system tray is still there) + ui -> main_win -> hide(); +#endif +/******************************** WINDOWS/UNIX SPECIFIC PART ******************/ + return; +} + +void file_import(Fl_Button*, void*) +{ + fserv -> file_select(FILE_CHOOSER_IMPORT); + ui -> file_chooser -> show(); + return; +} + + +void file_export(Fl_Button*, void*) +{ + fserv -> file_select(FILE_CHOOSER_EXPORT); + ui -> file_chooser -> show(); + return; +} + +/* Have to fix buggy Fl_File_Chooser Code..... + * Forcing the use of Enter Button. + * + * + * if valid selection..... + Enter.... + * do I/O + * + * else add timeout. + * and unhide..... + */ + +void fc_timeout(void *); + +void file_chooser_select(Fl_File_Chooser *, void*v) +{ + std::cerr << "file_chooser_select()" << std::endl; + if ((Fl::event_key() == FL_Enter) && + (NULL != ui -> file_chooser -> value())) + { + std::cerr << "file_chooser_select() Hit Enter (With Val)!" << std::endl; + fserv -> file_completeIO(); + ui -> file_chooser -> hide(); + return; + } + + // Else add timeout callback .... + Fl::add_timeout(0.5, fc_timeout); + + //fserv -> file_completeIO(); + //ui -> file_chooser -> hide(); + + +} + + +void fc_timeout(void *) +{ + std::cerr << "fc_timeout()" << std::endl; + + // ignore timeout if still shown... + if (ui -> file_chooser -> shown()) + { + std::cerr << "Visible - Ignoring fc_timeout()" << std::endl; + return; + } + + // if valid selection.... do it. + if (NULL != ui -> file_chooser -> value()) + { + std::cerr << "Hidden + Value - Do I/O" << std::endl; + fserv -> file_completeIO(); + return; + } + // else reshow the window, + std::cerr << "Hidden + No Value - re-Show" << std::endl; + ui -> file_chooser -> show(); + return; +} + + +void config_server_update(Fl_Check_Button*, void*) +{ + // save the settings. + fserv -> config_server_update(); + return; +} + + +void config_server_change(Fl_Button*, void*) +{ + // save the settings. + fserv -> config_server_change(); + return; +} + + +void config_save_dir_change(Fl_Button*, void*) +{ + fserv -> file_select(FILE_CHOOSER_SAVEDIR); + ui -> file_chooser -> show(); + // save the settings. + return; +} + + +void config_add_dir(Fl_Button*, void*) +{ + fserv -> file_select(FILE_CHOOSER_DIR); + ui -> file_chooser -> show(); + // save the settings. + return; +} + +void config_remove_dir(Fl_Button*, void*) +{ + fserv -> config_remove_dir(); + return; +} + + + + +void load_passwd_callback(Fl_Input*, void*) +{ + load_existing(NULL, NULL); + return; +} + + +void load_existing(Fl_Button*, void*) +{ + std::string cert_loc = load_cert; //ui -> load_cert -> value(); + std::string key_loc = load_key; //ui -> load_key -> value(); + std::string passwd = ui -> load_passwd -> value(); + + // hack to use the generate passwd. + if (passwd == "") + { + passwd = ui -> gen_passwd -> value(); + } + + if (cert_loc == "") + { + alertbox ->sendMsg(0, 0, "RetroShare needs a certificate", ""); + return; + } + if (key_loc == "") + { + alertbox ->sendMsg(0, 0, "RetroShare needs a Key", ""); + return; + } + if (passwd == "") + { + alertbox ->sendMsg(0, 0, "RetroShare needs a passwd", ""); + return; + } + + std::string std_key_dir = config_basedir + dirSeperator; + std_key_dir += key_dir; + + // check that the key file exists....., + // and if it is not in the configuration directory - copy it there. + + + std::string ca_loc = std_key_dir + dirSeperator; + ca_loc += ca_file; + + sslroot *sr = getSSLRoot(); + +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + if (0 < sr -> initssl(cert_loc.c_str(), key_loc.c_str(), + passwd.c_str())) +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + if (0 < sr -> initssl(cert_loc.c_str(), key_loc.c_str(), + ca_loc.c_str(), passwd.c_str())) +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + + { + ui -> welcome_window -> hide(); + clear_passwds(); + + // success..... save the cert + key locations. + // as the keys are good we can create a initfile + load_cert = cert_loc; + load_key = key_loc; + + create_configinit(); + + return; + } + + // else clean up .... + alertbox ->sendMsg(0, 0, "RetroShare Failed To Start!",""); + alertbox ->sendMsg(0, 0, "Please Check File Names/Password",""); + + return; +} + +void generate_certificate(Fl_Button *button, void *nuffing) +{ + // In the XPGP world this is easy... + // generate the private_key / certificate. + // save to file. + // + // then load as if they had entered a passwd. + + // check basename exists. + // check that passwords match. + if ((strlen(ui -> gen_passwd -> value()) < 4) || + (0 != strcmp(ui -> gen_passwd -> value(), + ui -> gen_passwd2 -> value()))) + { + std::ostringstream out; + out << "RetroShare cannot generate your"; + out << "Certficate because:" << std::endl; + out << "\tPassword is Unsatisfactory..." << std::endl; + out << "\tMust be 4+ chars and entered twice" << std::endl; + alertbox ->sendMsg(0, 0, out.str(), ""); + return; + } + + if (strlen(ui -> gen_name -> value()) < 3) + { + std::ostringstream out; + out << "RetroShare cannot generate your"; + out << "Certficate because:" << std::endl; + out << "\tThe Name is bad..." << std::endl; + out << "\tMust be 3+ chars" << std::endl; + alertbox ->sendMsg(0, 0, out.str(), ""); + return; + } + + int nbits = 2048; + + // Create the filename. + std::string basename = config_basedir; + basename += dirSeperator; + basename += key_dir + dirSeperator; + basename += "user"; //ui -> gen_basename -> value(); + + std::string key_name = basename + "_pk.pem"; + std::string cert_name = basename + "_cert.pem"; + + +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + if (!generate_xpgp(cert_name.c_str(), key_name.c_str(), + ui -> gen_passwd2 -> value(), + ui -> gen_name -> value(), + "", //ui -> gen_email -> value(), + ui -> gen_org -> value(), + ui -> gen_loc -> value(), + "", //ui -> gen_state -> value(), + ui -> gen_country -> value(), + nbits)) +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + /* UNTIL THIS IS FILLED IN CANNOT GENERATE X509 REQ */ +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + { + std::ostringstream out; + out << "RetroShare cannot generate your"; + out << "Certficate: UNKNOWN REASON!" << std::endl; + alertbox ->sendMsg(0, 0, out.str(), ""); + return; + } + + + /* set the load passwd to the gen version + * and try to load it! + */ + + //ui -> load_cert -> value(cert_name.c_str()); + //ui -> load_key -> value(key_name.c_str()); + load_cert = cert_name.c_str(); + load_key = key_name.c_str(); + //ui -> load_passwd -> value(ui -> load_passwd -> value()); + + { + std::ostringstream out; + out << "RetroShare has Successfully generated"; + out << "a Certficate/Key" << std::endl; + out << "\tCert Located: " << cert_name << std::endl; + out << "\tLocated: " << key_name << std::endl; + alertbox ->sendMsg(0, 10, out.str(), ""); + } + + /* now if the user has selected to load a trusted certificate + * we must save the details to we can load it in a second. + * + * load_trustedpeer is taken from the gen_trusted_tick_box, + * while load_trusted_cert(Fl_Button*, void*) sets the load_trustedpeer_file string. + */ + + if (1 == ui -> gen_trusted_tick_box -> value()) + { + load_trustedpeer = true; + } + else + { + load_trustedpeer = false; + } + + // Also set the first time flag. + firsttime_run = true; + + /* call standard load ! */ + load_existing(button, nuffing); + + return; +} + + +void load_trusted_cert(Fl_Button*, void*) +{ + Fl_File_Chooser *fc = new Fl_File_Chooser("", + "Certificate File (*.{pqi})", 0, "Trusted Friend Selection"); + fc -> show(); + while(fc -> shown()) + Fl::wait(); + + /* if we are successful, + * 1) load certificate.... if that is successful... + * 2) display name, + * 3) and tick box.. + */ + + bool valid = false; + bool trustedFriend = false; + + std::string userName; + if (fc->value()) + { + valid = true; + load_trustedpeer_file = fc -> value(); + } + + if ((valid) && (LoadCheckXPGPandGetName(load_trustedpeer_file.c_str(), userName))) + { + ui -> gen_trusted_peer -> value(userName.c_str()); + ui -> gen_trusted_tick_box -> value(1); + trustedFriend = true; + } + else + { + load_trustedpeer_file = ""; + if (valid) + { + ui -> gen_trusted_peer -> value("-Bad-File-"); + } + else + { + ui -> gen_trusted_peer -> value(""); + } + ui -> gen_trusted_tick_box -> value(0); + } + + delete fc; + return; +} + + +void gen_trusted_tick_callback(Fl_Check_Button*, void*) +{ + std::cerr << "gen_trusted_tick_callback()"; + std::cerr << std::endl; + if (ui -> gen_trusted_tick_box -> value()) + { + load_trusted_cert(NULL, NULL); + } + else + { + ui -> gen_trusted_peer -> value(""); + } + + return; +} + +void gen_load_trusted(Fl_Button*, void*) +{ + std::cerr << "gen_load_trusted()"; + std::cerr << std::endl; + + load_trusted_cert(NULL, NULL); + return; +} + + +void load_cert_change(Fl_Button*, void*) +{ + std::string std_key_dir = config_basedir + dirSeperator; + std_key_dir += key_dir; +/******************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifdef WINDOWS_SYS /* ONLY FOR WINDOWS */ + std_key_dir = make_path_unix(std_key_dir); +#endif +/******************************** WINDOWS/UNIX SPECIFIC PART ******************/ + + + Fl_File_Chooser *fc = new Fl_File_Chooser(std_key_dir.c_str(), + "Certificate File (*.{pem})", 0, "Certificate Selection"); + fc -> show(); + while(fc -> shown()) + Fl::wait(); + + //ui -> load_cert -> value(fc -> value()); + delete fc; + return; +} + +void load_key_change(Fl_Button*, void*) +{ + std::string std_key_dir = config_basedir + dirSeperator; + std_key_dir += key_dir; +/******************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifdef WINDOWS_SYS /* ONLY FOR WINDOWS */ + std_key_dir = make_path_unix(std_key_dir); +#endif +/******************************** WINDOWS/UNIX SPECIFIC PART ******************/ + + Fl_File_Chooser *fc = new Fl_File_Chooser(std_key_dir.c_str(), + "Private Key File (*.{pem})", 0, "Key Selection"); + fc -> show(); + while(fc -> shown()) + Fl::wait(); + + + //ui -> load_key -> value(fc -> value()); + delete fc; + return; +} + + + +void clear_passwds() +{ + ui -> load_passwd -> value("UNKNOWN.....0"); + ui -> gen_passwd -> value("UNKNOWN.....1"); + ui -> gen_passwd2 -> value("UNKNOWN.....2"); +} + + +void load_check_basedir() +{ + // get the default configuration location. + + if (config_basedir == "") + { + // if unix. homedir + /.pqiPGPrc +/******************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS + char *h = getenv("HOME"); + std::cerr << "fltkpqi::basedir() -> $HOME = "; + std::cerr << h << std::endl; + if (h == NULL) + { + std::cerr << "load_check_basedir() Fatal Error --"; + std::cerr << std::endl; + std::cerr << "\tcannot determine $HOME dir" < $APPDATA = "; + std::cerr << h << std::endl; + char *h2 = getenv("HOMEDRIVE"); + std::cerr << "fltkpqi::basedir() -> $HOMEDRIVE = "; + std::cerr << h2 << std::endl; + char *h3 = getenv("HOMEPATH"); + std::cerr << "fltkpqi::basedir() -> $HOMEPATH = "; + std::cerr << h3 << std::endl; + if (h == NULL) + { + // generating default + std::cerr << "load_check_basedir() getEnv Error --Win95/98?"; + std::cerr << std::endl; + + config_basedir="C:\\Retro"; + + } + else + { + config_basedir = h; + } + + check_create_directory(config_basedir); + config_basedir += "\\RetroShare"; +#endif +/******************************** WINDOWS/UNIX SPECIFIC PART ******************/ + } + + + std::string subdir1 = config_basedir + dirSeperator; + std::string subdir2 = subdir1; + subdir1 += key_dir; + subdir2 += cert_dir; + + // fatal if cannot find/create. + std::cerr << "Checking For Directories" << std::endl; + check_create_directory(config_basedir); + check_create_directory(subdir1); + check_create_directory(subdir2); + + // have a config directories. + + // Check for config file. + std::string initfile = config_basedir + dirSeperator; + initfile += config_init_file; + + // open and read in the lines. + FILE *ifd = fopen(initfile.c_str(), "r"); + char path[1024]; + int i; + + if (ifd != NULL) + { + if (NULL != fgets(path, 1024, ifd)) + { + for(i = 0; (path[i] != '\0') && (path[i] != '\n'); i++); + path[i] = '\0'; + load_cert = path; + } + if (NULL != fgets(path, 1024, ifd)) + { + for(i = 0; (path[i] != '\0') && (path[i] != '\n'); i++); + path[i] = '\0'; + load_key = path; + } + fclose(ifd); + } + + // we have now + // 1) checked or created the config dirs. + // 2) loaded the config_init file - if possible. + return; +} + +int create_configinit() +{ + // Check for config file. + std::string initfile = config_basedir + dirSeperator; + initfile += config_init_file; + + // open and read in the lines. + FILE *ifd = fopen(initfile.c_str(), "w"); +/* + char path[1024]; + int i; +*/ + + if (ifd != NULL) + { + fprintf(ifd, "%s\n", load_cert.c_str()); + fprintf(ifd, "%s\n", load_key.c_str()); + fclose(ifd); + + std::cerr << "Creating Init File: " << initfile << std::endl; + std::cerr << "\tLoad Cert: " << load_cert << std::endl; + std::cerr << "\tLoad Key: " << load_key << std::endl; + + return 1; + } + std::cerr << "Failed To Create Init File: " << initfile << std::endl; + return -1; +} + + +int check_create_directory(std::string dir) +{ + struct stat buf; + int val = stat(dir.c_str(), &buf); + if (val == -1) + { + // directory don't exist. create. +/******************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS // UNIX + if (-1 == mkdir(dir.c_str(), 0777)) +#else // WIN + if (-1 == mkdir(dir.c_str())) +#endif +/******************************** WINDOWS/UNIX SPECIFIC PART ******************/ + + { + std::cerr << "check_create_directory() Fatal Error --"; + std::cerr <value()); + std::string s("LOCL USR"); + inp -> value(""); + + //fserv -> chatmsg(m,s); + fserv -> ownchatmsg(m); + std::cerr << "Wish we could talk!" << std::endl; + return; +} + +void alert_okay_msg(Fl_Return_Button*, void*) +{ + ui -> alert_window -> hide(); + std::cerr << "Alert Okay" << std::endl; + return; +} + + +void alert_cancel_msg(Fl_Button*, void*) +{ + ui -> alert_window -> hide(); + std::cerr << "Abort Cancel" << std::endl; + return; +} + +void file_result_select(Fl_File_Browser*, void*) +{ + std::cerr << "FL_FILE_BROWSER::file_select!!!!" << std::endl; +} + + +void file_download(Fl_Button*, void*) +{ + std::cerr << "FL_BUTTON::file_download!!!!" << std::endl; + fserv->dirlist_download(); +} + +void file_recommend(Fl_Button*, void*) +{ + std::cerr << "FL_BUTTON::file_recommend!!!!" << std::endl; + fserv->dirlist_recommend(); +} + + +void file_requestdir(std::string person, std::string dir) +{ + std::cerr << "Request Dir Listing:" << person << ":" << dir << std::endl; + fserv->load_dir(person, dir); +} + + + +/* New Callback Fns for Channels *****************************/ + +/* add to channel broadcast (from dir_listing) */ +void file_channel_broadcast(Fl_Button*, void*) +{ + std::cerr << "file_channel_broadcast()"; + std::cerr << std::endl; + + return; +} + +/* add to channel broadcast (from search) */ +void search_channel_broadcast(Fl_Button*, void*) +{ + std::cerr << "search_channel_broadcast()"; + std::cerr << std::endl; + + return; +} + +/* callback for own channel select */ +void channel_own_list_select(Fl_Browser*, void*) +{ + std::cerr << "channel_own_list_select()"; + std::cerr << std::endl; + + return; +} + +/* callback for others channel select */ +void channel_list_select(Fl_Funky_Browser*, void*) +{ + std::cerr << "channel_list_select()"; + std::cerr << std::endl; + + return; +} + +/* callback for channel file listing select */ +void channel_file_list_select(Fl_Funky_Browser*, void*) +{ + std::cerr << "channel_file_list_select()"; + std::cerr << std::endl; + + return; +} + + +/* button press to create channel */ +void channel_create(Fl_Button*, void*) +{ + std::cerr << "channel_create()"; + std::cerr << std::endl; + ui->channel_create_window->show(); + return; +} + +/* button press to delete selected own channel */ +void channel_delete(Fl_Button*, void*) +{ + std::cerr << "channel_delete()"; + std::cerr << std::endl; + + return; +} + +/* open/close chat window */ +void chat_open_callback(Fl_Button*, void*) +{ + std::cerr << "chat_open()"; + std::cerr << std::endl; + if (ui->chatter_window->shown()) + { + ui->chatter_window->hide(); + } + else + { + ui->chatter_window->show(); + } + return; +} + +void channel_show_callback(Fl_Button*, void*) +{ + std::cerr << "channel_show_callback()"; + std::cerr << std::endl; + ui->channel_details_window->show(); + + return; +} + +void channel_delete_callback(Fl_Button*, void*) +{ + std::cerr << "channel_delete_callback()"; + std::cerr << std::endl; + + return; +} + + +void chan_createmsg_list_select(Fl_Funky_Browser*, void*) +{ + std::cerr << "chan_createmsg_list_select()"; + std::cerr << std::endl; + + return; +} + +void chan_createmsg_sendmsg_callback(Fl_Button*, void*) +{ + std::cerr << "chan_createmsg_sendmsg_callback()"; + std::cerr << std::endl; + + return; +} + +void chan_createmsg_postpone_callback(Fl_Button*, void*) +{ + std::cerr << "chan_createmsg_postpone_callback()"; + std::cerr << std::endl; + + ui->channel_create_window->hide(); + return; +} + +void chan_createmsg_cancel_callback(Fl_Button*, void*) +{ + std::cerr << "chan_createmsg_cancel_callback()"; + std::cerr << std::endl; + + ui->channel_create_window->hide(); + return; +} + +void chan_createmsg_remove_callback(Fl_Button*, void*) +{ + std::cerr << "chan_createmsg_remove_callback()"; + std::cerr << std::endl; + + return; +} + +void chan_createmsg_newname_callback(Fl_Input*, void*) +{ + std::cerr << "chan_createmsg_newname_callback()"; + std::cerr << std::endl; + + return; +} + +void chan_createmsg_newname_button_callback(Fl_Round_Button*, void*) +{ + std::cerr << "chan_createmsg_newname_button_callback()"; + std::cerr << std::endl; + + return; +} + +void chan_createmsg_title_button_callback(Fl_Round_Button*, void*) +{ + std::cerr << "chan_createmsg_button_callback()"; + std::cerr << std::endl; + + return; +} + + +void chan_msgdetails_list_select(Fl_Funky_Browser*, void*) +{ + std::cerr << "chan_msgdetails_list_select()"; + std::cerr << std::endl; + + return; +} + +void chan_msgdetails_download_callback(Fl_Button*, void*) +{ + std::cerr << "chan_msgdetails_download_callback()"; + std::cerr << std::endl; + + return; +} + +void chan_msgdetails_subscribe_callback(Fl_Button*, void*) +{ + std::cerr << "chan_msgdetails_subscribe_callback()"; + std::cerr << std::endl; + + return; +} + +void chan_msgdetails_close_callback(Fl_Button*, void*) +{ + std::cerr << "chan_msgdetails_close_callback()"; + std::cerr << std::endl; + ui->channel_details_window->hide(); + + return; +} + diff --git a/libretroshare/src/fltkgui/fltkserver.cc b/libretroshare/src/fltkgui/fltkserver.cc new file mode 100644 index 000000000..069ade6c7 --- /dev/null +++ b/libretroshare/src/fltkgui/fltkserver.cc @@ -0,0 +1,3448 @@ +/* + * "$Id: fltkserver.cc,v 1.29 2007-02-18 21:46:49 rmf24 Exp $" + * + * FltkGUI for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "fltkgui/fltkserver.h" +#include "fltkgui/pqibrowseitem.h" + +#include +#include + +#include "pqi/pqidebug.h" +const int fltksrvrzone = 25915; + +#include +#include + +/* add in an extension if necessary */ +int ensureExtension(std::string &name, std::string def_ext); + +fltkserver::fltkserver() + :server(NULL), pqih(NULL), sslr(NULL), ui(NULL), ad(NULL), + msg(NULL), chat(NULL),loop(0), + search_browser(NULL) +{ + recommend = NULL; + + + init(); + return; +} + +fltkserver::~fltkserver() +{ + return; +} + +int fltkserver::init() +{ + cert_list_ok = false; + cert_neighbour_list_ok = false; + cert_item_ok = false; + cert_neighbour_item_ok = false; + + search_list_ok = false; + result_list_ok = false; + result_item_ok = false; + msg_list_ok = false; + msg_item_ok = false; + msg_dialog_ok = false; + transfer_ok = false; + transfer_item_ok = false; + + dir_list_ok = false; + save_dir_ok = false; + + server_set_ok = false; + transfer_rates_ok = false; + + +#ifdef PQI_USE_CHANNELS + channel_list_ok = false; + channel_msg_list_ok = false; + channel_msg_item_ok = false; +#endif + + + + return 1; +} + +int fltkserver::run() +{ + + double timeDelta = 0.25; + double minTimeDelta = 0.1; // 25; + double maxTimeDelta = 2.0; + double kickLimit = 0.5; + + double avgTickRate = timeDelta; + + struct timeval lastts, ts; + gettimeofday(&lastts, NULL); + long lastSec = 0; /* for the slower ticked stuff */ + + int min = 0; + + while(1) + { + Fl::wait(timeDelta); + + gettimeofday(&ts, NULL); + double delta = (ts.tv_sec - lastts.tv_sec) + + ((double) ts.tv_usec - lastts.tv_usec) / 1000000.0; + + /* for the fast ticked stuff */ + if (delta > timeDelta) + { + //std::cerr << "Delta: " << delta << std::endl; + //std::cerr << "Time Delta: " << timeDelta << std::endl; + //std::cerr << "Avg Tick Rate: " << avgTickRate << std::endl; + + lastts = ts; + int moreToTick = server -> tick(); + + /* adjust tick rate depending on whether there is more. + */ + + avgTickRate = 0.2 * timeDelta + 0.8 * avgTickRate; + + if (1 == moreToTick) + { + timeDelta = 0.9 * avgTickRate; + if (timeDelta > kickLimit) + { + /* force next tick in one sec + * if we are reading data. + */ + timeDelta = kickLimit; + avgTickRate = kickLimit; + } + } + else + { + timeDelta = 1.1 * avgTickRate; + } + + /* limiter */ + if (timeDelta < minTimeDelta) + { + timeDelta = minTimeDelta; + } + else if (timeDelta > maxTimeDelta) + { + timeDelta = maxTimeDelta; + } + + /* now we have the slow ticking stuff */ + /* stuff ticked once a second (but can be slowed down) */ + if (ts.tv_sec > lastSec) + { + lastSec = ts.tv_sec; + + // every ten loops (> 10 secs) + if (loop % 10 == 0) + { + update_quick_stats(); + } + + // every 60 loops (> 1 min) + if (++loop >= 60) + { + loop = 0; + + update_other_stats(); + server -> status(); + + // save the config every 5 minutes. + if (min % 5 == 0) + { + cert_save_config(); +#ifdef PQI_USE_CHANNELS + /* hack to update for now + * Only occassionally - cos disabled + */ + channel_list_ok = false; + update_channels(); +#endif + } + + /* hour loop */ + if (++min >= 60) + { + min = 0; + } + update_dirlist(); + } + + // slow update tick as well. + update(); + } // end of slow tick. + + } // end of only once a second. + + // update graphics.. ( but only if gui is visible ) + // This is also triggered in slow tick... + if ((ui->main_win->shown()) || (ui->chatter_window->shown())) + { + update(); + } + } + return 1; +} + + + +/*********************** DISPLAY DETAILS ************************************/ + +int fltkserver::update() +{ + update_certs(); + update_neighbour_certs(); + + update_search(); + update_msgs(); + update_transfer(); + update_config(); + update_dirs(); + + return 1; +} + + +int fltkserver::update_quick_stats() +{ + cert_list_ok = false; + cert_neighbour_list_ok = false; + transfer_ok = false; + transfer_item_ok = false; + + return 1; +} + +int fltkserver::update_other_stats() +{ + search_list_ok = false; + result_list_ok = false; + result_item_ok = false; + msg_list_ok = false; + msg_item_ok = false; + msg_dialog_ok = false; + + //transfer_ok = false; + //server_set_ok = false; + //transfer_rates_ok = false; + + return 1; +} + +// Now including Funky_Browser. +int fltkserver::update_certs() +{ + // to draw certs, we need to retrieve the list from sslroot. + if (sslr == NULL) + return -1; + + // once this is true, we do all following redraw steps. + bool certs_mod = false; + int i; + + Fl_Funky_Browser *cb = ui -> cert_list; + // Get the Current Cert, by getting current item + // and extracting ref. + DisplayData *selected = cb -> getSelected(); + Person *selperson = NULL; + if (selected != NULL) + { + selperson = ((PersonDisItem *) selected) -> getItem(); + } + + //int inum = cb -> value(); + + // attempt to reset item. + + // only do if + if ((sslr -> CertsChanged()) || (!cert_list_ok)) + { + certs_mod = true; + + if (sslr -> CertsMajorChanged()) // add or remove. + { + // full repopulate. + // or add/remove. (do later) + + // clear the data. + cb -> clear(); + ui -> msg_online -> clear(); + + std::list::iterator it; + std::list &certs = sslr -> getCertList(); + + std::string emptystr(""); + int online = 0; + + selected = NULL; + for(it = certs.begin(), i = 0; + it != certs.end(); it++, i++) + { + cert *c = (*it); + + PersonDisItem *cdi = new PersonDisItem(c); + + if (selperson == c) + selected = cdi; + + // set the check flag. + if (c -> Manual()) + cdi -> check(0, 0); + else + cdi -> check(0, 1); + + if (c -> Connected()) + online++; + + cb -> addItemSeries(cdi); + + //ui -> msg_online -> add((*it).c_str(), + // c -> Group("msg")); + } + cb -> ItemSeriesDone(); + ui -> onlinecounter -> value(online); + } + else + { + // else just update list. + cb -> updateList(); + } + + cb -> selectDD(selected); + cert_list_ok = true; + } + + + if ((certs_mod) || (!cert_item_ok)) + { + PersonDisItem *pdi = (PersonDisItem *) cb -> getCurrentItem(); + Person *p = NULL; + if (pdi != NULL) + { + p = pdi -> getItem(); + } + // do always - neighbours does it afterwards. + cert_display((cert *) p, true); + } + return 1; +} + +int fltkserver::cert_display(cert *c, bool isfriend) +{ + Fl_Text_Buffer *buf = NULL; + std::string certtext; + + if ((c == NULL) || (c->certificate == NULL)) + { + ui -> cert_status -> value("N/A"); + + ui -> cert_server -> value("None"); + ui -> cert_port -> value(0); + + ui -> cert_authcode -> value(""); + ui ->cert_authcode->deactivate(); + ui ->cert_sign_button->deactivate(); + + buf = ui -> cert_details -> buffer(); + buf -> text(certtext.c_str()); + + ui -> cert_allow -> value(0); + ui -> cert_listen -> value(0); + ui -> cert_connect -> value(0); + + cert_item_ok = false; + return 0; + } + + int status = c -> Status(); + if (!isfriend) + { + status = 0; + } + + ui -> cert_status -> value((get_status_string(status)).c_str()); + + if (isfriend) + { + ui -> cert_status -> value((get_status_string(status)).c_str()); + } + else + { + ui -> cert_status -> value("Neighbour"); + } + + // SET SERVER. + if (!cert_item_ok) + { + ui->cert_server->value(inet_ntoa(c->serveraddr.sin_addr)); + ui ->cert_port->value(ntohs(c->serveraddr.sin_port)); + + /* check if we have signed the certificate */ + if (0 < validateCertificateIsSignedByKey(c->certificate, + sslr -> getOwnCert() -> certificate)) + + { + ui->cert_authcode->value( + getXPGPAuthCode(c->certificate).c_str()); + ui ->cert_authcode->deactivate(); + ui ->cert_sign_button->deactivate(); + } + else + { + ui ->cert_authcode->value(""); + ui ->cert_authcode->activate(); + ui ->cert_sign_button->deactivate(); + } + } + + if (c -> Manual() || (!isfriend)) + ui -> cert_auto -> value(0); + else + ui -> cert_auto -> value(1); + + // Finally Fill in the Text Editor. + certtext = get_cert_info(c); + + // Last Connection + // Server Address + // Status + // Hashes + + buf = ui -> cert_details -> buffer(); + buf -> text(certtext.c_str()); + + + if (status & PERSON_STATUS_ACCEPTED) + ui -> cert_allow -> value(1); + else + ui -> cert_allow -> value(0); + + if (status & PERSON_STATUS_WILL_LISTEN) + ui -> cert_listen -> value(1); + else + ui -> cert_listen -> value(0); + + if (status & PERSON_STATUS_WILL_CONNECT) + ui -> cert_connect -> value(1); + else + ui -> cert_connect -> value(0); + + if (status & PERSON_STATUS_TRUSTED) + { + ui -> cert_trust_person -> value(1); + } + else + { + ui -> cert_trust_person -> value(0); + } + + + cert_item_ok = true; + return 1; +} + + +int fltkserver::cert_update_auth() +{ + + cert *c = cert_get_current(); + if ((c == NULL) || (c->certificate == NULL)) + { + ui -> cert_authcode -> value(""); + ui ->cert_authcode->deactivate(); + ui ->cert_sign_button->deactivate(); + return 0; + } + + std::string inp_code = ui->cert_authcode->value(); + std::string real_code = getXPGPAuthCode(c->certificate); + if (inp_code == real_code) + { + ui ->cert_sign_button->activate(); + } + else + { + ui ->cert_sign_button->deactivate(); + } + return 1; +} + + + + +int fltkserver::update_neighbour_certs() +{ + + // to draw certs, we need to retrieve the list from AutoDiscovery. + if (ad == NULL) + return -1; + + + // once this is true, we do all following redraw steps. + bool certs_mod = false; + int i; + + Fl_Funky_Browser *cb = ui -> cert_neighbour_list; + + + // only do if + //if ((sslr -> CertsChanged()) || (!cert_list_ok)) + if (!cert_neighbour_list_ok) + { + certs_mod = true; + + DisplayData *selected = cb -> getCurrentItem(); + Person *selperson = NULL; + if (selected != NULL) + { + selperson = ((NeighDisItem *) selected) -> getItem(); + std::cerr << "Currently Selected is: "; + std::cerr << selperson -> Name(); + std::cerr << std::endl; + } + else + { + std::cerr << "Nothing Selected"; + std::cerr << std::endl; + } + + std::cerr << "Updating Neighbour List"; + std::cerr << std::endl; + + // if (sslr -> CertsMajorChanged()) // add or remove. + { + // full repopulate. + cb -> clear(); + std::list::iterator it; + std::list &certs = ad -> getDiscovered(); + + std::string emptystr(""); + + selected = NULL; + for(it = certs.begin(), i = 0; + it != certs.end(); it++, i++) + { + cert *c = (*it); + NeighDisItem *cdi = new NeighDisItem(c); + + if (selperson == c) + { + std::cerr << "Matched Selected: "; + std::cerr << c -> Name(); + std::cerr << std::endl; + + selected = cdi; + } + + cb -> addItemSeries(cdi); + } + cb -> ItemSeriesDone(); + } + //else + //{ + // // else just update list. + // cb -> updateList(); + //} + + cb -> selectDD(selected); + cert_neighbour_list_ok = true; + } + + + if ((certs_mod) || (!cert_neighbour_item_ok)) + { + NeighDisItem *pdi = (NeighDisItem *) cb -> getCurrentItem(); + Person *p = NULL; + if (pdi != NULL) + { + p = pdi -> getItem(); + } + // do always - neighbours does it afterwards. + neigh_display((cert *) p); + } + return 1; +} + +int fltkserver::neigh_display(cert *c) +{ + ui -> neigh_signers -> clear(); + if ((c == NULL) || (c->certificate == NULL)) + { + ui -> neigh_name -> value("N/A"); + ui -> neigh_org -> value("N/A"); + ui -> neigh_loc -> value("N/A"); + ui -> neigh_country -> value("N/A"); + ui -> neigh_trust -> value("N/A"); + ui -> neigh_auth_notice -> hide(); + ui -> neigh_authcode -> value(""); + ui -> neigh_authcode ->deactivate(); + ui -> neigh_add_button ->deactivate(); + + cert_neighbour_item_ok = true; + return 0; + } + + /* else we need to populate it properly + * + */ + ui -> neigh_name -> value((get_cert_name(c)).c_str()); + ui -> neigh_org -> value((get_cert_org(c)).c_str()); + ui -> neigh_loc -> value((get_cert_loc(c)).c_str()); + ui -> neigh_country -> value((get_cert_country(c)).c_str()); + + std::list::iterator it; + std::list signers = getXPGPsigners(c->certificate); + for(it = signers.begin(); it != signers.end(); it++) + { + ui -> neigh_signers -> add(it->c_str()); + std::cerr << *it << std::endl; + } + + if (c->trustLvl < TRUST_SIGN_AUTHEN) + { + sslr -> checkAuthCertificate(c); + } + + /* calculate trust level! */ + ui -> neigh_trust -> value((get_trust_string(c)).c_str()); + if (!cert_neighbour_item_ok) + { + /* check if we have signed the certificate */ + if (0 < validateCertificateIsSignedByKey(c->certificate, + sslr -> getOwnCert() -> certificate)) + + { + ui -> neigh_authcode->value( + getXPGPAuthCode(c->certificate).c_str()); + ui -> neigh_authcode->deactivate(); + ui -> neigh_auth_notice -> hide(); + if ((c->Accepted()) || (c == sslr->getOwnCert())) + { + ui -> neigh_add_button->deactivate(); + } + else + { + ui -> neigh_add_button->activate(); /* can add! */ + } + } + else + { + /* only reset auth code if it was inactive */ + if (!ui -> neigh_authcode -> active()) + { + ui -> neigh_authcode -> value(""); + } + if (c->trustLvl < TRUST_SIGN_AUTHEN) + { + /* need auth code to add */ + ui -> neigh_authcode ->activate(); + //ui -> neigh_auth_notice -> show(); + //ui -> neigh_add_button ->deactivate(); + //handled in update_auth. + neigh_update_auth(); + } + else + { + /* can add without auth code */ + ui -> neigh_auth_notice -> hide(); + ui -> neigh_authcode ->activate(); + ui -> neigh_add_button ->activate(); + } + } + } + + + /* TODO: + * 1) signer list + * 2) trust level + */ + + cert_neighbour_item_ok = true; + return 1; +} + + +int fltkserver::neigh_update_auth() +{ + + std::cerr << "fltkserver::neigh_update_auth() called"; + std::cerr << std::endl; + + cert *c = cert_get_current_neighbour(); + if ((c == NULL) || (c->certificate == NULL)) + { + std::cerr << "fltkserver::neigh_update_auth() found NULL"; + std::cerr << std::endl; + + ui -> neigh_authcode -> value(""); + ui -> neigh_authcode->deactivate(); + ui -> neigh_add_button->deactivate(); + ui -> neigh_auth_notice -> hide(); + return 0; + } + + std::string inp_code = ui->neigh_authcode->value(); + std::string real_code = getXPGPAuthCode(c->certificate); + if (inp_code == real_code) + { + std::cerr << "fltkserver::neigh_update_auth() ANS!"; + std::cerr << std::endl; + ui -> neigh_auth_notice -> hide(); + ui ->neigh_add_button->activate(); + } + else + { + std::cerr << "fltkserver::neigh_update_auth() NC"; + std::cerr << std::endl; + ui -> neigh_auth_notice -> show(); + ui -> neigh_add_button->deactivate(); + } + return 1; +} + +int fltkserver::update_msgs() +{ + if (server == NULL) + return -1; + + // draw the Messages. + + Fl_Funky_Browser *mb = ui -> msg_list; + bool msg_changed = false; + std::list::iterator mit; + + DisplayData *selected = mb -> getSelected(); + MsgItem *selitem; + if (selected != NULL) + { + selitem = ((MsgDisItem *) selected) -> getItem(); + } + + if ((server -> msgChanged.Changed(0)) || (!msg_list_ok)) + { + if (server->msgMajorChanged.Changed(0)) + { + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, + "fltkserver::update_msgs() (server->searchMajorChanged.Changed(0))"); + + std::list &msgs = server -> getMsgList(); + mb -> clear(); + for(mit = msgs.begin(); mit != msgs.end(); mit++) + { + MsgDisItem *mdi = new MsgDisItem(*mit); + mb -> addItemSeries(mdi); + } + } + else + { + std::list msgs = server -> getNewMsgs(); + for(mit = msgs.begin(); mit != msgs.end(); mit++) + { + MsgDisItem *mdi = new MsgDisItem(*mit); + mb -> addItemSeries(mdi); + } + } + + mb -> ItemSeriesDone(); + mb -> selectDD(selected); + msg_list_ok = true; + msg_changed = true; + } + + if ((msg_changed) || (!msg_item_ok)) + { + Fl_Text_Buffer *buf = ui -> msg_details -> buffer(); + + MsgDisItem *mdi = (MsgDisItem *) mb -> getCurrentItem(); + MsgItem *mi = NULL; + + if (mdi != NULL) + { + mi = mdi -> getItem(); + } + if (mi != NULL) + { + // beautify the message. + std::string msgtext; + msgtext += "From:"; + int width = 60; + int i; + + if (mi -> p != NULL) + { + msgtext += (mi -> p) -> Name(); + } + else + { + msgtext += "Unknown"; + } + msgtext += " Date: N/A\n"; + + msgtext += "Recommendation:"; + msgtext += mi -> recommendname; + msgtext += "\n"; + + msgtext += "__Message"; + + for(i = 9; i < width - 1; i++) + { + msgtext += "_"; + } + msgtext += "\n\n"; + + // draw Message Details. + msgtext += mi -> msg; + + // set the buffer + buf -> text(msgtext.c_str()); + } + else + { + buf -> text("Select Message for Details!"); + } + msg_item_ok = true; + } + + if (!msg_dialog_ok) + { + // display the recommendation. + PQFileItem *fi = get_recommend(); + if (fi == NULL) + { + ui -> msg_recommend -> value(""); + } + else + { + ui -> msg_recommend -> value((fi -> name).c_str()); + } + msg_dialog_ok = true; + } + + // at the end here, we handle chats. + if (server -> chatChanged.Changed(0)) + { + // get the items from the list. + std::list clist = server -> getChatQueue(); + std::list::iterator it; + for(it = clist.begin(); it != clist.end(); it++) + { + if ((*it) -> p) + { + chatmsg((*it) -> msg, (*it) -> p -> Name()); + } + else + { + /* ignore (from loopback device!) */ + } + + delete (*it); + } + } + return 1; +} + +bool isFileTransferItem(PQItem *item) +{ + if ((item -> type == PQI_ITEM_TYPE_FILEITEM) && + (item -> subtype == PQI_FI_SUBTYPE_TRANSFER)) + return true; + return false; +} + + +int fltkserver::update_transfer() +{ + /* only update this irregularly */ + if (transfer_ok) + return 0; + + FileTransferItem *fti; + std::list::iterator it, it_in; + std::list trans_in = server -> getTransfers(); + + Fl_Funky_Browser *tb = ui -> transfer_downloads; + bool transfer_changed = false; + + for(it_in = trans_in.begin(); it_in != trans_in.end(); it_in = trans_in.erase(it_in)) + { + fti = (*it_in); + + std::ostringstream out; + + out << "fltkserver::update_transfer() Received Info: " << fti -> name; + out << std::endl; + + // update local list. + for(it = transfers.begin(); (fti != NULL) && + (it != transfers.end()); it++) + { + out << "fltkserver::update_transfer() Checking Against: " << (*it) -> name; + + if ((fti -> sid == (*it) -> sid) && + (fti -> name == (*it) -> name)) + { + // then the same update... + out << " Match!: incoming crate: " << fti->crate; + (*it) -> copy(fti); + delete fti; + fti = NULL; + } + + out << std::endl; + } + if (fti != NULL) + { + out << "fltkserver::update_transfer() Adding: " << fti -> name; + transfers.push_back(fti); + transfer_ok = false; + } + + // but still trigger details redraw. + transfer_changed = true; + + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, out.str()); + } + + if (!transfer_ok) + { + int inum = tb -> value(); + tb -> clear(); + + for(it = transfers.begin(); (it != transfers.end()); it++) + { + FTDisItem *fdi = new FTDisItem(*it); + tb -> addItemSeries(fdi); + } + + tb -> ItemSeriesDone(); + tb -> value(inum); + transfer_ok = true; + transfer_changed = true; + } + else if (transfer_changed) + { + // speedup hack.... + tb -> drawList(); + } + + if ((transfer_changed) || (!transfer_item_ok)) + { + Fl_Text_Buffer *buf = ui -> transfer_overview -> buffer(); + + FTDisItem *fdi = (FTDisItem *) tb -> getCurrentItem(); + FileTransferItem *fti = NULL; + + if (fdi != NULL) + { + fti = fdi -> getItem(); + } + if (fti != NULL) + { + std::string msgtext; + + if (fti -> in) + { + msgtext += "Downloading From: "; + } + else + { + msgtext += "Uploading To: "; + } + + if (fti -> p != NULL) + { + msgtext += (fti -> p) -> Name(); + } + else + { + msgtext += "Unknown"; + } + + + msgtext += "\n"; + msgtext += "File: "; + msgtext += fti -> name; + msgtext += "\n"; + msgtext += "\n"; + msgtext += "Rate: "; + msgtext += fdi -> txt(4); + msgtext += "\n"; + msgtext += "Transferred: "; + msgtext += fdi -> txt(3); + msgtext += "\n"; + + // set the buffer + buf -> text(msgtext.c_str()); + + } + else + { + buf -> text("Select Transfer for Details!"); + } + transfer_item_ok = true; + } + if (!transfer_rates_ok) + { + ui -> rate_total -> value(pqih -> getMaxRate(true)); + ui -> rate_indiv -> value(pqih -> getMaxIndivRate(true)); + transfer_rates_ok = true; + } + + return 1; +} + + +int fltkserver::update_search() +{ + if (server == NULL) + return -1; + + bool search_changed = false; + + Fl_Funky_Browser *sb = ui -> srch_results; + FileDisItem *fdi = NULL; + PQFileItem *result_item = NULL; + + if ((server -> searchChanged.Changed(0)) || (!search_list_ok)) + { + search_changed = true; + update_search_browser(); + search_list_ok = true; + } + if ((search_changed) || (!result_item_ok)) + { + fdi = (FileDisItem *) sb -> getCurrentItem(); + if (fdi != NULL) + { + result_item = fdi -> getItem(); + } + + if (result_item != NULL) + { + // instead of changing the label -> allow the + // activate the buttons. + if (result_item -> flags & PQI_ITEM_FLAG_LOCAL) + { + //ui -> download_button -> label("Recommend"); + ui -> download_button -> deactivate(); + ui -> recommend_button -> activate(); + } + else + { + //ui -> download_button -> label("Download"); + ui -> download_button -> activate(); + ui -> recommend_button -> deactivate(); + } + } + result_item_ok = true; + } + return 1; +} + + +int fltkserver::update_config() +{ + // draw the Messages. + std::list &dirs = server -> getSearchDirectories(); + + std::list::iterator mit; + + Fl_Browser *br = ui -> config_search_dir; + int itemnum = br -> value(); + bool dir_changed = false; + + if (!dir_list_ok) + { + dir_changed = true; + br -> clear(); + + for(mit = dirs.begin(); mit != dirs.end(); mit++) + { + br -> add((*mit).c_str()); + } + + br -> value(itemnum); + dir_list_ok = true; + } + if (!save_dir_ok) + { + ui -> config_save_dir -> value((server->getSaveDir()).c_str()); + save_dir_ok = true; + } + + if (!server_set_ok) + { + cert *own = sslr -> getOwnCert(); + ui -> config_local_addr -> value( + inet_ntoa(own -> localaddr.sin_addr)); + ui -> config_local_port -> value( + ntohs(own -> localaddr.sin_port)); + + ui -> config_firewall -> value(own -> Firewalled()); + ui -> config_forward -> value(own -> Forwarded()); + + if (own -> Firewalled()) + { + if (own -> Forwarded()) + { + ui -> config_server_addr -> value( + inet_ntoa(own -> serveraddr.sin_addr)); + ui -> config_server_port -> value( + ntohs(own -> serveraddr.sin_port)); + ui -> config_server_addr -> readonly(0); + //ui -> config_server_port -> readonly(0); + } + else + { + ui -> config_server_addr -> value("0.0.0.0"); + ui -> config_server_port -> value(0); + ui -> config_server_addr -> readonly(1); + //ui -> config_server_port -> readonly(1); + } + } + else + { + ui -> config_server_addr -> value( + inet_ntoa(own -> localaddr.sin_addr)); + ui -> config_server_port -> value( + ntohs(own -> localaddr.sin_port)); + ui -> config_server_addr -> readonly(1); + //ui -> config_server_port -> readonly(1); + } + + server_set_ok = true; + } + + return 1; +} + +/********************** PQI SSL INTERFACE ************************/ +int fltkserver::setuppqissl(filedexserver *fd, pqipersongrp *ph, sslroot *r, UserInterface *u) +{ + server = fd; + pqih = ph; + sslr = r; + ui = u; + + return 1; +} + +int fltkserver::search_new() +{ + // read text from new_search. + // send to server. + // clear search terms. + // + int i; + std::list terms; + std::list::iterator it; + + const char *termlist = ui -> new_search -> value(); + int num_str_len = strlen(termlist) + 2; + + char numstr[num_str_len]; + for(i = 0; i < (signed) strlen(termlist); i++) + { + numstr[i] = termlist[i]; + } + for(;i < num_str_len; i++) + { + numstr[i] = '\0'; + } + + std::ostringstream out; + out << "Read in:" << numstr << std::endl; + + // now break it into terms. + int sword = 0; + for(i = 0; (i < num_str_len - 1) && (numstr[i] != '\0'); i++) + { + if (isspace(numstr[i])) + { + numstr[i] = '\0'; + if (i - sword > 0) + { + terms.push_back(std::string(&(numstr[sword]))); + out << "Found Search Term:" << &(numstr[sword]); + out << std::endl; + } + sword = i+1; + } + } + // do the final term. + if (i - sword > 0) + { + terms.push_back(std::string(&(numstr[sword]))); + out << "Found Search Term:" << &(numstr[sword]); + out << std::endl; + } + + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, out.str()); + + server -> doSearch(terms); + return 1; +} + +int fltkserver::search_remove() +{ + Fl_Funky_Browser *sb = ui -> srch_results; + FileDisItem *fdi = NULL; + SearchItem *sitem = NULL; + fdi = (FileDisItem *) sb -> getCurrentItem(); + if (fdi != NULL) + { + sitem = fdi -> getSearchItem(); + } + + if (sitem != NULL) + { + server -> removeSearchResults(sitem); + search_list_ok = false; + // update straight away - so no possibility of bad data. + update_search(); + return 1; + } + return 0; +} + + +/***** CERT COMMANDS *****/ + +/* Transfer from Neighbour to Cert list */ +int fltkserver::cert_add_neighbour() +{ + /* get the current neighbour */ + cert *c = cert_get_current_neighbour(); + + /* check auth code */ + if ((c == NULL) || (c->certificate == NULL)) + { + std::cerr << "fltkserver::cert_add_neighbour() no cert"; + std::cerr << std::endl; + return 1; + } + + if (c == sslr -> getOwnCert()) + { + std::cerr << "fltkserver::cert_add_neighbour() Own Cert"; + std::cerr << std::endl; + return 1; + } + + std::string inp_code = ui->neigh_authcode->value(); + std::string real_code = getXPGPAuthCode(c->certificate); + bool validAuthCode = (inp_code == real_code); + + if (validAuthCode) + { + std::cerr << "fltkserver::cert_add_neighbour() Valid Auth Code"; + std::cerr << std::endl; + } + else + { + std::cerr << "fltkserver::cert_add_neighbour() No Auth Code"; + std::cerr << std::endl; + } + + /* if correct -> sign */ + if (validAuthCode) + { + if (0 < validateCertificateIsSignedByKey(c->certificate, + sslr -> getOwnCert() -> certificate)) + { + std::cerr << "fltkserver::cert_add_neighbour() Signed Already"; + std::cerr << std::endl; + } + else + { + /* if not signed already */ + std::cerr << "fltkserver::cert_add_neighbour() Signing Cert"; + std::cerr << std::endl; + + /* sign certificate */ + sslr -> signCertificate(c); + } + } + + /* check authentication */ + sslr -> checkAuthCertificate(c); + if (c->trustLvl < TRUST_SIGN_AUTHEN) + { + /* do nothing */ + std::cerr << "fltkserver::cert_add_neighbour() Not Authed"; + std::cerr << std::endl; + std::cerr << "fltkserver::cert_add_neighbour() Do Nothing"; + std::cerr << std::endl; + } + else + { + + + std::cerr << "fltkserver::cert_add_neighbour() Adding Cert"; + std::cerr << std::endl; + + /* add */ + sslr -> addUntrustedCertificate(c); + + + std::cerr << "fltkserver::cert_add_neighbour() Auto Connecting"; + std::cerr << std::endl; + /* auto connect */ + pqih -> cert_auto(c, true); + + // tell to redraw. + cert_neighbour_list_ok = false; + cert_neighbour_item_ok = false; + + cert_list_ok = false; + cert_item_ok = false; + } + return 1; +} + + +int fltkserver::cert_allow_current() +{ + cert *c = cert_get_current(); + + if ((c == NULL) || (c == sslr -> getOwnCert())) + { + return -1; + } + pqih -> cert_accept(c); + return 1; +} + +int fltkserver::cert_deny_current() +{ + cert *c = cert_get_current(); + + if ((c == NULL) || (c == sslr -> getOwnCert())) + { + return -1; + } + pqih -> cert_deny(c); + return 1; +} + +int fltkserver::cert_listen_current() +{ + cert *c = cert_get_current(); + + if ((c == NULL) || (c == sslr -> getOwnCert())) + { + return -1; + } + + if (c -> WillListen()) + { + c -> WillListen(false); + } + else + { + c -> WillListen(true); + } + return 1; +} + +int fltkserver::cert_connect_current() +{ + cert *c = cert_get_current(); + + if ((c == NULL) || (c == sslr -> getOwnCert())) + { + return -1; + } + if (c -> WillConnect()) + { + c -> WillConnect(false); + } + else + { + c -> WillConnect(true); + } + return 1; +} + + +int fltkserver::cert_tag_current() +{ + cert *c = cert_get_current(); + // can change our tag. + if (c == NULL) + { + return -1; + } + //c -> Name(std::string(ui -> cert_newtag -> value())); + return 1; +} + +int fltkserver::cert_check_auto() +{ + std::ostringstream out; + out << "fltkserver::cert_check_auto()"; + cert *c = cert_get_current(); + // don't check own here, as we want to change it back + // if checked. + if (c == NULL) + { + out << "NULL cert!" << std::endl; + return -1; + } + + Fl_Funky_Browser *cb = ui -> cert_list; + bool ac = ((bool) cb -> getCheckState()); + if (c -> Manual() == ac) // ie mean different things. + { + out << " fltkserver::cert_check_auto() Changing State! ("; + out << cb -> value(); + out << ") cert -> Manual():" << c -> Manual(); + out << " Check Box: " << ac << std::endl; + out << " Toggling Auto to: " << ac << std::endl; + //cb -> toggleCheckBox(cb -> value()); + + if ((c != sslr -> getOwnCert()) && + (c->trustLvl >= TRUST_SIGN_AUTHEN)) + { + pqih -> cert_auto(c, ac); + } + else + { + // toggle to off. + cb -> toggleCheckBox(cb->value()); + } + } + out << " fltkserver::cert_check_auto() Final State("; + out << cb -> value(); + out << ") cert -> Manual():" << c -> Manual(); + out << " Check Box: " << cb -> getCheckState() << std::endl; + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, out.str()); + return 1; +} + +int fltkserver::cert_toggle_auto() +{ + std::ostringstream out; + out << "fltkserver::cert_toggle_auto()"; + cert *c = cert_get_current(); + if ((c == NULL) || (c == sslr -> getOwnCert())) + { + out << "NULL cert!" << std::endl; + return -1; + } + + Fl_Funky_Browser *cb = ui -> cert_list; + bool ac = ((bool) cb -> getCheckState()); + out << " Toggling Auto:" << ac << " to " << !ac << std::endl; + + cb -> toggleCheckBox(cb -> value()); + pqih -> cert_auto(c, !ac); + + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, out.str()); + return 1; +} + + + +static const std::string gui_nb = "GUI_NB"; +static const std::string gui_cb = "GUI_CB"; +static const std::string gui_srb = "GUI_SRB"; +static const std::string gui_mb = "GUI_MB"; +static const std::string gui_ftb = "GUI_FTB"; +static const std::string gui_chab = "GUI_CHAB"; +static const std::string gui_chfb = "GUI_CHFB"; + +static const std::string gui_nb_default = "Acpt (0:60:0)\tTrust (1:70:0)\tLast_Seen (2:80:0)\tName (3:150:0)"; + +static const std::string gui_cb_default = "Person (1:110:0)\tStatus (0:120:0)\tAuto_Connect (2:150:0)\tTrust_Lvl (3:120:0)\tPeer_Address (4:150:0)"; + +static const std::string gui_srb_default = "Source (1:100:0)\tKeyword (0:110:1)\tFilename (2:340:0)\tSize (3:100:0)\tN/A (4:100:0)"; + +static const std::string gui_mb_default = "Source (0:100:1)\tMessage (2:150:0)\tDate (1:100:0)\tRecommendation (3:250:0)\tSize (4:100:0)"; + +static const std::string gui_ftb_default = "Source (0:110:0)\tStatus (1:120:0)\tFilename (2:250:0)\tCompleted (3:150:0)\tRate (4:100:0)"; + +// Channel Available and File browsers. +static const std::string gui_chab_default = "Mode (0:85:0)\tRank (1:80:0)\tName (2:250:0)\t#Msgs (3:90:0)\tHash (4:200:0)"; +static const std::string gui_chfb_default = "Date (0:80:0)\tMsg (1:360:0)\t#Files (2:80:0)\tSize (3:85:0)\tHash (4:200:0)"; + + +int fltkserver::cert_save_config() +{ + if (sslr == NULL) + return -1; + + // First update the gui config. + Fl_Funky_Browser *fb = ui -> cert_list; + sslr -> setSetting(gui_cb, fb -> setup()); + + fb = ui -> cert_neighbour_list; + sslr -> setSetting(gui_nb, fb -> setup()); + + fb = ui -> srch_results; + sslr -> setSetting(gui_srb, fb -> setup()); + + fb = ui -> msg_list; + sslr -> setSetting(gui_mb, fb -> setup()); + + fb = ui -> transfer_downloads; + sslr -> setSetting(gui_ftb, fb -> setup()); + + // save channel setting. + fb = ui -> channel_list; + sslr -> setSetting(gui_chab, fb -> setup()); + fb = ui -> channel_file_list; + sslr -> setSetting(gui_chfb, fb -> setup()); + + // also call save all the other parts. + server -> save_config(); + ad -> save_configuration(); + pqih -> save_config(); + + sslr -> saveCertificates(); + return 1; +} + +int fltkserver::cert_load_gui_config() +{ + if (sslr == NULL) + return -1; + + std::string empty(""); + std::string tmp(""); + + // First update the gui config. + Fl_Funky_Browser *fb = ui -> cert_list; + if (empty != (tmp = sslr -> getSetting(gui_cb))) + { + fb -> setup(tmp); + } + else + { + fb -> setup(gui_cb_default); + } + + fb = ui -> cert_neighbour_list; + if (empty != (tmp = sslr -> getSetting(gui_nb))) + { + //fb -> setup(tmp); + fb -> setup(gui_nb_default); + } + else + { + fb -> setup(gui_nb_default); + } + + fb = ui -> srch_results; + if (empty != (tmp = sslr -> getSetting(gui_srb))) + { + fb -> setup(tmp); + } + else + { + fb -> setup(gui_srb_default); + } + + fb = ui -> msg_list; + if (empty != (tmp = sslr -> getSetting(gui_mb))) + { + fb -> setup(tmp); + } + else + { + fb -> setup(gui_mb_default); + } + + fb = ui -> transfer_downloads; + if (empty != (tmp = sslr -> getSetting(gui_ftb))) + { + fb -> setup(tmp); + } + else + { + fb -> setup(gui_ftb_default); + } + + fb = ui -> channel_list; + if (empty != (tmp = sslr -> getSetting(gui_chab))) + { + fb -> setup(tmp); + } + else + { + fb -> setup(gui_chab_default); + } + + fb = ui -> channel_file_list; + if (empty != (tmp = sslr -> getSetting(gui_chfb))) + { + fb -> setup(tmp); + } + else + { + fb -> setup(gui_chfb_default); + } + + // these are done externally... + //pqih -> load_config(); + //server -> load_config(); + //ad -> load_configuration(); + return 1; +} + + +cert *fltkserver::cert_get_current() +{ + if (sslr == NULL) + return NULL; + + Fl_Funky_Browser *cb = ui -> cert_list; + PersonDisItem *pdi = (PersonDisItem *) cb -> getCurrentItem(); + Person *p = NULL; + cert *c = NULL; + if (pdi != NULL) + { + + p = pdi -> getItem(); + } + // dynamic to be save - shouldn't be needed. + c = dynamic_cast(p); + return c; +} + +cert *fltkserver::cert_get_current_neighbour() +{ + Fl_Funky_Browser *cb = ui -> cert_neighbour_list; + PersonDisItem *pdi = (PersonDisItem *) cb -> getCurrentItem(); + Person *p = NULL; + cert *c = NULL; + if (pdi != NULL) + { + + p = pdi -> getItem(); + } + // dynamic to be save - shouldn't be needed. + c = dynamic_cast(p); + return c; +} + +int fltkserver::cert_remove_current() +{ + cert * c = cert_get_current(); + if (c != NULL) + { + if (c->Accepted()) + { + std::ostringstream out; + out << "Please Deactivate Person"; + out << " (by unticking the box) "; + out << std::endl; + out << "\tBefore attempting to remove them"; + alertmsg(0, 1, out.str(), ""); + } + return sslr -> removeCertificate(c); + } + return -1; +} + +int fltkserver::cert_save_servaddr() +{ + // read inet + port address from gui. + + struct sockaddr_in addr; + + // check if valid. + cert *c = cert_get_current(); + if ((c == NULL) || (c == sslr -> getOwnCert())) + { + pqioutput(PQL_ALERT, fltksrvrzone, "NULL/Own cert!"); + return -1; + } + + +/********************************** WINDOWS/UNIX SPECIFIC PART *******************/ +#ifndef WINDOWS_SYS + if (0 != inet_aton(ui -> cert_server -> value(), &(addr.sin_addr))) +#else + addr.sin_addr.s_addr = inet_addr(ui -> cert_server -> value()); + if (1) +#endif +/********************************** WINDOWS/UNIX SPECIFIC PART *******************/ + { + // get the server address. + c -> serveraddr.sin_addr = addr.sin_addr; + c -> serveraddr.sin_port = htons((short) ui -> cert_port -> value()); + return 1; + } + else + { + // invalid ... reset the text to indicate. + ui -> cert_server -> value("Invalid Address"); + return 0; + } +} + +int fltkserver::cert_saveaddr_connect() +{ + if (0 < cert_save_servaddr()) + { + cert *c = cert_get_current(); + c -> nc_timestamp = 0; + // set Firewall to off -> so we + // will definitely have connect attempt. + c -> Firewalled(false); + + c -> WillConnect(true); + return 1; + } + return 0; +} + + +int fltkserver::msg_channel_select() +{ + return 1; +} + + + +int fltkserver::msg_reply() +{ + return 1; +} + + +int fltkserver::msg_remove() +{ + Fl_Funky_Browser *mb = ui -> msg_list; + MsgDisItem *mdi = NULL; + MsgItem *mitem = NULL; + mdi = (MsgDisItem *) mb -> getCurrentItem(); + if (mdi != NULL) + { + mitem = mdi -> getItem(); + } + + if (mitem != NULL) + { + server -> removeMsgItem(mitem); + msg_list_ok = false; + msg_item_ok = false; + msg_dialog_ok = false; + + update_msgs(); + return 1; + } + return 0; +} + + +int fltkserver::transfer_select() +{ + return 1; +} + + +int fltkserver::transfer_cancel() +{ + PQFileItem *cancelled; + + /* get the current item */ + Fl_Funky_Browser *tfb = ui -> transfer_downloads; + FTDisItem *tfdi = NULL; + + tfdi = (FTDisItem *) tfb -> getCurrentItem(); + if (tfdi != NULL) + { + cancelled = tfdi -> getItem(); + } + + if (cancelled == NULL) + { + return 0; + } + + server -> cancelTransfer(cancelled -> clone()); + return 1; +} + +// just clear the list - it'll be repopulated. +int fltkserver::transfer_clear() +{ + std::list::iterator it; + for(it = transfers.begin(); (it != transfers.end());) + { + delete (*it); + it = transfers.erase(it); + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, + "fltkserver::transfer_clear() Deleting FT Info!"); + } + /* now tell server to do the same */ + server -> clear_old_transfers(); + transfer_ok = false; + return 1; +} + + +int fltkserver::transfer_rates() +{ + pqih -> setMaxRate(true, ui -> rate_total -> value()); + pqih -> setMaxRate(false, ui -> rate_total -> value()); + pqih -> setMaxIndivRate(true, ui -> rate_indiv -> value()); + pqih -> setMaxIndivRate(false, ui -> rate_indiv -> value()); + return 1; +} + +int fltkserver::set_recommend(PQFileItem *rec) +{ + msg_dialog_ok = false; + if (rec == NULL) + { + recommend = NULL; + return 1; + } + if (recommend != NULL) + { + delete recommend; + } + recommend = (PQFileItem *) rec -> clone(); + return 1; +} + +PQFileItem *fltkserver::get_recommend() +{ + return recommend; +} + +int fltkserver::search_download() +{ + if (server == NULL) + return -1; + + Fl_Funky_Browser *sb = ui -> srch_results; + FileDisItem *fdi = NULL; + PQFileItem *result_item = NULL; + + fdi = (FileDisItem *) sb -> getCurrentItem(); + if (fdi != NULL) + { + result_item = fdi -> getItem(); + } + + if (result_item == NULL) + { + return 0; + } + + // check if remote -> then download. + if (result_item -> flags & PQI_ITEM_FLAG_LOCAL) + { + return -1; + } + + // otherwise ... can get search item. + server -> getSearchFile(result_item); + return 1; +} + + +int fltkserver::search_recommend() +{ + if (server == NULL) + return -1; + + Fl_Funky_Browser *sb = ui -> srch_results; + FileDisItem *fdi = NULL; + PQFileItem *result_item = NULL; + + fdi = (FileDisItem *) sb -> getCurrentItem(); + if (fdi != NULL) + { + result_item = fdi -> getItem(); + } + + if (result_item == NULL) + { + return 0; + } + + // check if remote -> then download. + if (result_item -> flags & PQI_ITEM_FLAG_LOCAL) + { + // Setup the recommend message.... + std::ostringstream out; + out << "fltkserver::search_download() Recommending: "; + out << result_item -> name << std::endl; + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, out.str()); + + // setup recommend gui. + set_recommend(result_item); + ui -> msg_dialog -> show(); + return 2; + } + return -1; +} + +int fltkserver::msg_send() +{ + if (server == NULL) + { + return -1; + } + + // get msg_text from dialog. + Fl_Text_Buffer *buf = ui -> msg_text -> buffer(); + std::string msg = buf -> text(); + + server -> sendRecommend(get_recommend(), msg); + + // clear the buffer, and the recommend. + buf -> text(""); + set_recommend(NULL); + + return 1; +} + + +int fltkserver::download_recommend() +{ + if (server == NULL) + return -1; + + Fl_Funky_Browser *mb = ui -> msg_list; + MsgDisItem *mdi = NULL; + MsgItem *msg_item = NULL; + + mdi = (MsgDisItem *) mb -> getCurrentItem(); + if (mdi != NULL) + { + msg_item = mdi -> getItem(); + } + if (msg_item == NULL) + { + return 0; + } + + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, + "fltkserver::download_recommend() passed ET -> getting file"); + return server -> getSearchFile(msg_item); +} + + +/* The new search regime.... for data handling.... */ + +int fltkserver::update_search_browser() +{ + if (server == NULL) + return -1; + + Fl_Funky_Browser *sb = ui -> srch_results; + + std::map >::iterator it; + std::list::iterator fit; + + DisplayData *selected = sb -> getSelected(); + PQFileItem *selitem; + if (selected != NULL) + { + selitem = ((FileDisItem *) selected) -> getItem(); + } + + if ((server->searchMajorChanged.Changed(0)) || (1 != sb->checkSort())) + { + std::map > + &results = server -> getResults(); + sb -> clear(); + for(it = results.begin(); it != results.end(); it++) + { + for(fit = (it -> second).begin(); + fit != (it -> second).end(); fit++) + { + FileDisItem *fdi = new FileDisItem(*fit, it -> first); + sb -> addItemSeries(fdi); + } + } + } + else + { + // else take it easy. + // get new item - not reference + std::map > + new_results = server -> getNewResults(); + for(it = new_results.begin(); it != new_results.end(); it++) + { + for(fit = (it -> second).begin(); + fit != (it -> second).end(); fit++) + { + FileDisItem *fdi = new FileDisItem(*fit, it -> first); + sb -> addItemSeries(fdi); + } + } + } + + sb -> ItemSeriesDone(); + sb -> selectDD(selected); + return 1; +} + + + +std::string fltkserver::getHomePath() +{ + std::string home; +/******************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS /* UNIX */ + + home = getenv("HOME"); + +#else /* Windows */ + + std::ostringstream out; + char *h2 = getenv("HOMEDRIVE"); + out << "fltkpqi::basedir() -> $HOMEDRIVE = "; + out << h2 << std::endl; + char *h3 = getenv("HOMEPATH"); + out << "fltkpqi::basedir() -> $HOMEPATH = "; + out << h3 << std::endl; + + if (h2 == NULL) + { + // Might be Win95/98 + // generate default. + home = "C:\\Retro"; + } + else + { + home = h2; + home += h3; + home += "\\Desktop"; + } + + out << "fltkserver::getHomePath() -> " << home << std::endl; + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, out.str()); + + // convert to FLTK desired format. + home = make_path_unix(home); +#endif +/******************************** WINDOWS/UNIX SPECIFIC PART ******************/ + return home; +} + + +int fltkserver::file_select(int type) +{ + std::string home = getHomePath(); + // save the type then setup the selector. + fselect_type = type; + ui -> file_chooser -> directory(home.c_str()); + + switch(type) + { + case FILE_CHOOSER_IMPORT: + ui -> file_chooser -> type(Fl_File_Chooser::SINGLE); + ui -> file_chooser -> filter("Certificate Files (*.{pem,pqi})"); + //ui -> file_chooser -> title("Import Certificate"); + break; + case FILE_CHOOSER_EXPORT: + ui -> file_chooser -> type(Fl_File_Chooser::CREATE); + ui -> file_chooser -> filter("Certificate Files (*.{pem,pqi})"); + //ui -> file_chooser -> title("Export Certificate"); + break; + case FILE_CHOOSER_DIR: + ui -> file_chooser -> type(Fl_File_Chooser::DIRECTORY); + ui -> file_chooser -> filter("Directories (*.*)"); + //ui -> file_chooser -> title("Add Share Directory"); + break; + case FILE_CHOOSER_SAVEDIR: + ui -> file_chooser -> type(Fl_File_Chooser::DIRECTORY); + ui -> file_chooser -> filter("Directories (*.*)"); + //ui -> file_chooser -> title("Select Save Directory"); + break; + default: + break; + } + return 1; +} + +int fltkserver::file_updateName() +{ + return 1; +} + +int fltkserver::file_completeIO() +{ + // take filename from line. + std::string nullhash(""); // empty hash - as signature not correct. + + if (NULL == ui -> file_chooser -> value()) + { + pqioutput(PQL_ALERT, fltksrvrzone, + "filtserver::file_completeIO() NULL file selected!"); + return 1; + } + + std::string fileio_name = std::string(ui -> file_chooser -> value()); + + std::ostringstream out; + out << "fltkserver::file_completeIO() supposed to "; + + cert *nc, *c; + + switch(fselect_type) + { + case FILE_CHOOSER_IMPORT: + + out << " IMPORT " << fileio_name << std::endl; + // The load makes sure it is unique. + nc = sslr -> loadcertificate(fileio_name.c_str(), nullhash); + if (nc == NULL) + { + out << "File Import (" << fileio_name; + out << ") Failed!" << std::endl; + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, out.str()); + return -1; + } + else if (0 > sslr -> addCollectedCertificate(nc)) + { + out << "Imported Certificate....but no"; + out << " need for addition - As it exists!"; + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, out.str()); + return 0; + } + + /* ensure it gets to p3disc */ + if (ad) + { + /* tick the p3disc to ensure the new one gets into + * the list before the next update. + */ + ad -> distillData(); + //ad->collectCerts(); + cert_neighbour_list_ok = false; + } + + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, out.str()); + return 1; + break; + + case FILE_CHOOSER_EXPORT: + + /* before we save the file we need to ensure that + * it has the correct extension + */ + + ensureExtension(fileio_name, "pqi"); + + out << " EXPORT to " << fileio_name << std::endl; + c = cert_get_current(); + if (c == NULL) + { + c = cert_get_current_neighbour(); + } + + if (c == NULL) + { + out << "File Export (" << fileio_name; + out << ") Failed - Select A Cert!" << std::endl; + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, out.str()); + return -1; + } + if (c -> certificate == NULL) + { + out << "File Export (" << fileio_name; + out << ") Failed - X509 == NULL!" << std::endl; + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, out.str()); + return -1; + } + + + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, out.str()); + return sslr -> savecertificate(c, fileio_name.c_str()); + break; + + case FILE_CHOOSER_DIR: + // add the directory to the servers list. + ui -> file_chooser -> type(Fl_File_Chooser::DIRECTORY); + server -> addSearchDirectory(fileio_name.c_str()); + dir_list_ok = false; + + break; + case FILE_CHOOSER_SAVEDIR: + // change the save directory. + save_dir_ok = false; + ui -> file_chooser -> type(Fl_File_Chooser::DIRECTORY); + server -> setSaveDir(fileio_name.c_str()); + break; + default: + break; + } + + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, out.str()); + + return 1; + if (fileio_import) + { + } + else // export + { + } + return 0; +} + +int fltkserver::config_remove_dir() +{ + int i = ui -> config_search_dir -> value(); + if (i > 0) + { + server -> removeSearchDirectory( + ui -> config_search_dir -> text(i)); + dir_list_ok = false; + } + return 1; +} + + +// this is call if the ticks are changed. +int fltkserver::config_server_update() +{ + cert *own = sslr -> getOwnCert(); + + // can forward on if firewalled. + if (ui -> config_forward -> value()) + ui -> config_firewall -> value(1); + + if (ui -> config_firewall -> value()) + { + if (ui -> config_forward -> value()) + { + ui -> config_server_addr -> value( + inet_ntoa(own -> serveraddr.sin_addr)); + ui -> config_server_port -> value( + ntohs(own -> serveraddr.sin_port)); + ui -> config_server_addr -> readonly(0); + //ui -> config_server_port -> readonly(0); + } + else + { + ui -> config_server_addr -> value("0.0.0.0"); + ui -> config_server_port -> value(0); + ui -> config_server_addr -> readonly(1); + //ui -> config_server_port -> readonly(1); + } + } + else + { + ui -> config_server_addr -> value( + inet_ntoa(own -> localaddr.sin_addr)); + ui -> config_server_port -> value( + ntohs(own -> localaddr.sin_port)); + ui -> config_server_addr -> readonly(1); + //ui -> config_server_port -> readonly(1); + } + return 1; +} + +int fltkserver::config_server_change() +{ + // check which settings have changed. + // if localaddress is different. then restart server. + // + // all the other settings just get stored and sent to + // others for their info. + + struct in_addr inaddr_local, inaddr_server; + if (0 == inet_aton(ui -> config_local_addr -> value(), &inaddr_local)) + { + // bad address - reset. + server_set_ok = false; + return -1; + } + + cert *c = sslr -> getOwnCert(); + bool local_changed = false; + + + /* always change the address (checked by sslr->checkNetAddress()) */ + c -> localaddr.sin_addr = inaddr_local; + c -> localaddr.sin_port = htons((short) ui -> config_local_port -> value()); + local_changed = true; + + if ((ui -> config_firewall -> value()) && + (ui -> config_forward -> value())) + { + if (0 != inet_aton(ui -> config_server_addr -> value(), + &inaddr_server)) + { + c -> serveraddr.sin_addr = inaddr_server; + c -> serveraddr.sin_port = htons((short) ui -> config_server_port -> value()); + } + } + + c -> Firewalled(ui -> config_firewall -> value()); + c -> Forwarded(ui -> config_forward -> value()); + + if (local_changed) + { + sslr -> checkNetAddress(); + pqih -> restart_listener(); + sslr -> CertsChanged(); + } + server_set_ok = false; + return 1; +} + +std::string make_path_unix(std::string path) +{ + for(unsigned int i = 0; i < path.length(); i++) + { + if (path[i] == '\\') + path[i] = '/'; + } + return path; +} + + + +int fltkserver::addAlerts(alertBox *m, alertBox *c) +{ + msg = m; + chat = c; + return 1; +} + + +int fltkserver::ownchatmsg(std::string m) +{ + server -> sendChat(m); + return 1; +} + + +int fltkserver::chatmsg(std::string m, std::string source) +{ + chat -> sendMsg(0,2,m, source); + return 1; +} + + +int fltkserver::alertmsg(int type, int sev, std::string m, std::string src) +{ + msg -> sendMsg(type, sev,m, src); + return 1; +} + +int fltkserver::update_dirlist() +{ + // get the list of certificates. + // get the dirlist. + std::list &dirs = server -> getDirList(); + std::list::iterator dit; + + std::list::iterator it; + std::list &certs = sslr -> getCertList(); + + for(it = certs.begin(); it != certs.end(); it++) + { + cert *c = (*it); + if ((c != NULL) && (c -> Connected())) + { + bool found = false; + for(dit = dirs.begin(); dit != dirs.end(); dit++) + { + if ((*dit) -> p == c) + { + found = true; + } + } + if (!found) + { + // send off searchitem.... + std::ostringstream out; + out << "Generating FileDir Search Item for: " << *it << std::endl; + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, out.str()); + + SearchItem *si = new SearchItem(PQI_SI_SUBTYPE_SEARCH); + si -> datatype = PQI_SI_DATATYPE_DIR; + si -> data = ""; + // set the target, so it don't go to all!. + si -> cid = c -> cid; + si -> p = c; + server -> handleDirectoryRequest(si); + } + } + } + + server -> printDirectoryListings(); + check_dirlist2(); + //check_dirlist(); + return 1; +} + +//int fltkserver::check_dirlist() +//int fltkserver::load_dir(std::string person, std::string dir) +// +int fltkserver::load_dir(std::string person, std::string dir) +{ + // get the list of certificates. + // get the dirlist. + + cert *c = sslr -> findpeercert(person.c_str()); + std::ostringstream out; + out << "fltkserver::load_dir() chk:" << person << std::endl; + if ((c != NULL) && (c -> Connected())) + { + // send off searchitem.... + out << "Generating FileDir Search Item for: " << c -> certificate -> name << std::endl; + SearchItem *si = new SearchItem(PQI_SI_SUBTYPE_SEARCH); + si -> datatype = PQI_SI_DATATYPE_DIR; + si -> data = dir; + si -> cid = c -> cid; + si -> p = c; + server -> handleDirectoryRequest(si); + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, out.str()); + return 1; + } + out << "fltkserver::load_dir() Failed to match request to person: " << person << std::endl; + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, out.str()); + return 1; +} + + +int process_subdir(DirNode * dir, Fl_Item *p); + +int fltkserver::check_dirlist() +{ + // get the list of certificates. + // get the dirlist. + std::list &dirs = server -> getDirList(); + std::list::iterator dit; + + //std::list certs = sslr -> listCertificates(); + //std::list::iterator it; + + // clear browser. + delete_all(0); + + Fl_Item *p = NULL; + + for(dit = dirs.begin(); dit != dirs.end(); dit++) + { + Fl_Item *di = Fl_Person_Item_type.make(p); + if ((*dit)->p) + { + di->name((*dit)->p->Name().c_str()); + // put proper link in. + ((Fl_Person_Item *) di) -> person_hash = + ((cert *) ((*dit)->p)) -> certificate -> name; + } + else + { + di->name("LOCAL"); + ((Fl_Person_Item *) di) -> person_hash = + sslr -> getOwnCert() -> certificate -> name; + } + process_subdir(*dit, di); + } + return 1; +} + +int process_subdir(DirNode * dir, Fl_Item *p) +{ + std::list &files = dir->files; + std::list &dirs = dir->subdirs; + std::list::iterator fit; + std::list::iterator dit; + + { + std::ostringstream out; + out << "process_subdir(" << dir -> name << ")"; + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, out.str()); + } + + for(dit = dirs.begin(); dit != dirs.end(); dit++) + { + Fl_Item *di = Fl_Dir_Item_type.make(p); + process_subdir(*dit, di); + di -> name((*dit)->name.c_str()); + } + + for(fit = files.begin(); fit != files.end(); fit++) + { + std::ostringstream out; + out << (*fit)->name; + out << " ---> " << (*fit)->size << " bytes"; + + Fl_Item *fi = Fl_File_Item_type.make(p); + fi -> name(out.str().c_str()); + ((Fl_File_Item *) fi) -> filename = (*fit) -> name; + ((Fl_File_Item *) fi) -> size = (*fit) -> size; + } + return 1; +} + + + +int fltkserver::update_dirs() +{ + if (server == NULL) + return -1; + + // draw the Messages. + + if ((server -> dirListChanged.Changed(0)) || + (server->dirListMajorChanged.Changed(0))) + { + // load lists. + check_dirlist2(); + //check_dirlist(); + } + return 1; +} + +Person *getperson(Fl_Item *p) +{ + while(p && p->parent) + p=p->parent; + Fl_Person_Item *pi; + if ((p) && (NULL != (pi = dynamic_cast(p)))) + { + return getSSLRoot() -> findpeercert(pi -> person_hash.c_str()); + } + return NULL; +} + +int fltkserver::dirlist_download() +{ + std::list itemlist; + + // get the list of certificates. + // get the dirlist. + Fl_Item *it = Fl_Item::first; + for(;it; it = it -> next) + { + if (it -> selected && it -> is_file()) + { + Person *p = getperson(it); + std::ostringstream out; + out << "downloading:" << ((Fl_File_Item *) it) -> filename << std::endl; + + if (p) + { + out << "from :" << p -> Name() << std::endl; + } + else + { + out << "from NULL" << std::endl; + } + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, out.str()); + + PQFileItem *fi = new PQFileItem(); + + fi -> sid = getPQIsearchId(); + fi -> subtype = PQI_FI_SUBTYPE_REQUEST; + fi -> name = ((Fl_File_Item *) it) -> filename; + fi -> size = ((Fl_File_Item *) it) -> size; + fi -> cid = p -> cid; + fi -> p = p; + server -> getSearchFile(fi); + } + } + return 1; +} + +int fltkserver::dirlist_recommend() +{ + std::list itemlist; + + // get the list of certificates. + // get the dirlist. + Fl_Item *it = Fl_Item::first; + for(;it; it = it -> next) + { + if (it -> selected && it -> is_file()) + { + Person *p = getperson(it); + + std::ostringstream out; + out << "recommending(NOT YET!): " << it -> name() << std::endl; + if (p) + { + out << "from :" << p -> Name() << std::endl; + } + else + { + out << "from NULL" << std::endl; + } + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, out.str()); + + //SearchItem *si = new SearchItem(PQI_SI_SUBTYPE_SEARCH); + //si -> datatype = PQI_SI_DATATYPE_DIR; + //si -> data = dir; + //si -> cid = c -> cid; + //server -> handleDirectoryRequest(si); + //return 1; + } + } + return 1; + +} + + +Fl_Item *process_subdir2(DirNode * dir, Fl_Item *p); +int add_person(DirBase *db, Fl_Item *next); +int add_subdir(DirNode *dir, Fl_Item *p, Fl_Item *next); +int add_file(PQFileItem *file, Fl_Item *p, Fl_Item *next); + +/* must iterate through in parallel */ + +int fltkserver::check_dirlist2() +{ + // get the list of certificates. + // get the dirlist. + std::list &dirs = server -> getDirList(); + std::list::iterator dit; + + //Fl_Item *p = NULL; + Fl_Item *c = Fl_Item::first; + bool init = true; // needed to check first item (as items loop) + + /* cannot copy Fl_Item::last, as it can change with item addition! */ + for(dit = dirs.begin(); dit != dirs.end() && (c); dit++) + { + if (init) + init = false; + + Person *prsn = (*dit)->p; + std::string name1; + if (prsn) + name1 = prsn -> Name(); + else + name1 = "LOCAL"; + + std::string name2(c->name()); + + { + std::stringstream out; + out << "Person: " << name1; + out << " vs Item: " << name2 << std::endl; + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, out.str()); + } + + if (name1 != name2) + { + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, "MISMATCH!"); + // more complete check ... see if its there. + // search through all the next ones.... see if its there. + Fl_Item *c2 = c; + bool found = false; + for(; (c2) && (!found); c2=c2->next) + { + std::ostringstream out; + out << "Iterating through All People... " << c2->name(); + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, out.str()); + + if ((c2->parent == NULL) && + (name1 == std::string(c2->name()))) + { + found = true; + } + } + if (found) + { + // remove current Fl_Item *.... + std::ostringstream out; + out << "Found PERSON LATER - Should Delete Stuff!"; + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, out.str()); + + // delete stuff inbetween. c -> before c2. + Fl_Item *c3 = NULL; + for(; c != c2; c = c3) + { + delete_children(c); + c3 = c -> next; + c->remove(); + delete c; + } + + // delete subdir. + // continue. + c = process_subdir2(*dit, c2); + } + else + { + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, "Should Add PERSON"); + // add person before current item. + // no increment of c. + add_person(*dit, c); /* add before c */ + } + } + else + { + c = process_subdir2(*dit, c); + } + } + if (dit != dirs.end()) + { + /* add in extras */ + std::ostringstream out; + out << "At end of Fl_Items" << std::endl; + out << "Should Add Extra PERSONS" << std::endl; + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, out.str()); + + for(; dit != dirs.end(); dit++) + { + add_person(*dit, NULL); /* add at end! */ + } + } + else if (c) + { + /* should remove any extra files */ + std::ostringstream out; + out << "At end of Persons, but still Fl_Items" << std::endl; + out << "Should Remove an Extra People" << std::endl; + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, out.str()); + + Fl_Item *c2 = NULL; + for(; c; c = c2) + { + delete_children(c); + c2 = c -> next; + c->remove(); + delete c; + } + } + return 1; +} + +Fl_Item *process_subdir2(DirNode * dir, Fl_Item *p) +{ + std::list &files = dir->files; + std::list &dirs = dir->subdirs; + std::list::iterator fit; + std::list::iterator dit; + + { + std::ostringstream out; + out << "process_subdir2(" << dir -> name << ")" << std::endl; + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, out.str()); + } + + Fl_Item *c = p -> next; + + /* cannot copy Fl_Item::last, as it can change with item addition! */ + for(dit = dirs.begin(); dit != dirs.end() && (c); dit++) + { + { + std::ostringstream out; + out << "Directory: " << (*dit)->name; + out << " vs Item: " << c->name(); + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, out.str()); + } + + if ((*dit)->name != std::string(c->name())) + { + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, "MISMATCH!"); + // more complete check ... see if its there. + // search through all the next ones.... see if its there. + // if we find dir further on.... + // delete Fl_Items.... (obviously deleted from Dirlist) + // else + // add Directory (missing) + bool found = false; + bool child = true; + Fl_Item *c2 = c; + for(; (c2) && (!found) && (child); c2=c2->next) + { + { + std::ostringstream out; + out << "Iterating through Directories... " << c2->name(); + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, out.str()); + } + + // check if it's a child. + Fl_Item *p2 = c2->parent; + while((p2 != NULL) && (p2 != p)) + { + p2 = p2 -> parent; + } + + // if no longer children. + if (p2 != p) + { + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, "End of Children "); + child = false; + } + + if ((c2->parent == p) && + ((*dit)->name == std::string(c2->name()))) + { + found = true; + } + } + if (found) + { + // remove current Fl_Item *.... + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, + "Found DIR LATER - Should Delete Stuff!"); + // delete stuff inbetween. c -> before c2. + Fl_Item *c3 = NULL; + for(; c != c2; c = c3) + { + delete_children(c); + c3 = c -> next; + c->remove(); + delete c; + } + // continue. + c = process_subdir2(*dit, c2); + } + else + { + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, + "Should Add DIR"); + // add subdir.... before c, and processdir. + // no increment of c. + + if (c->parent==p) + { + add_subdir(*dit, p, c); + } + else + { + add_subdir(*dit, p, NULL); + } + } + } + else + { + c = process_subdir2(*dit, c); + } + } + if (dit != dirs.end()) + { + /* add in extras */ + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, + "At end of Fl_Items, Should Add Extra DIRS"); + for(; dit != dirs.end(); dit++) + { + add_subdir(*dit, p, NULL); + } + } + // if same parent, and not a file.... + else if ((c) && (c->parent == p) && (!dynamic_cast(c))) + { + + /* should remove any extra files */ + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, + "At end of Dirs, but still some, Should Remove Extra DIRS"); + + Fl_Item *c2 = NULL; + for(; (c) && (c->parent==p) && (!dynamic_cast(c)); c = c2) + { + delete_children(c); + c2 = c -> next; + c->remove(); + delete c; + } + } + + + for(fit = files.begin(); fit != files.end() && (c); fit++) + { + std::ostringstream out; + out << (*fit)->name; + out << " ---> " << (*fit)->size << " bytes"; + + { + std::ostringstream out; + out << "File: " << out.str(); + out << " vs Item: " << c->name() << std::endl; + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, out.str()); + } + + Fl_File_Item *fi = dynamic_cast(c); + if ((fi == NULL) || ((*fit)->name != fi->filename)) + { + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, "MISMATCH!"); + // more complete check ... see if its there. + + // search through all the next ones.... see if its there. + // if we find dir further on.... + // delete Fl_Items.... (obviously deleted from Dirlist) + // else + // add Directory (missing) + bool found = false; + bool child = true; + Fl_Item *c2 = c; + for(; (c2) && (!found) && (child); c2=c2->next) + { + { + std::ostringstream out; + out << "Iterating through Files... " << c2->name(); + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, out.str()); + } + + // check if it's a child. + Fl_Item *p2 = c2->parent; + while((p2 != NULL) && (p2 != p)) + { + p2 = p2 -> parent; + } + + // if no longer children. + if (p2 != p) + { + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, "End of Children "); + child = false; + } + + if ((c2->parent == p) && + ((*fit)->name == std::string(c2->name()))) + { + found = true; + } + } + if (found) + { + // remove current Fl_Item *.... + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, + "Found File LATER - Should Delete Stuff!"); + + // delete stuff inbetween. c -> before c2. + Fl_Item *c3 = NULL; + for(; c != c2; c = c3) + { + delete_children(c); + c3 = c -> next; + c->remove(); + delete c; + } + // continue. + c = c2 -> next; + } + else + { + // add file before current. + // no increment of c. + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, + "Should Add FILE"); + if (c->parent==p) + { + add_file(*fit, p, c); + } + else + { + add_file(*fit, p, NULL); + } + } + + } + else + { + // iterate. + c=c->next; + } + } + if (fit != files.end()) + { + /* add in extras */ + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, + "At end of Fl_Items, Should Add Extra FILES"); + for(; fit != files.end(); fit++) + { + add_file(*fit, p, NULL); + } + } + else if ((c) && (c->parent == p)) + { + /* should remove any extra files */ + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, + "At end of Files, but still some, Should Remove Extra File"); + + Fl_Item *c2 = NULL; + for(; (c) && (c->parent==p) ; c = c2) + { + delete_children(c); + c2 = c -> next; + c->remove(); + delete c; + } + } + + return c; +} + + + +int add_person(DirBase *db, Fl_Item *next) +{ + Fl_Item *p = NULL; + + Fl_Item *di = NULL; + if (db->p) + { + di = Fl_Person_Item_type.make(p); + { + std::ostringstream out; + out << "add_person() :" << db->p->Name().c_str(); + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, out.str()); + } + + di->name(db->p->Name().c_str()); + // put proper link in. + ((Fl_Person_Item *) di) -> person_hash = + ((cert *) (db->p)) -> certificate -> name; + } + else + { + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, + "add_person() : SHOULD ADD LOCAL"); + } + + if ((next) && (di)) + { + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, + "add_person() : SHIFTING"); + + di -> remove(); + di -> insert(next); + } + + if (di) + { + process_subdir2(db, di); + } + return 1; +} + +int add_subdir(DirNode *dir, Fl_Item *p, Fl_Item *next) +{ + std::cerr << std::endl; + { + std::ostringstream out; + out << "add_subdir() :" << dir->name; + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, out.str()); + } + + /* add subdir with parent p, before next */ + Fl_Item *di = Fl_Dir_Item_type.make(p); + di -> name(dir->name.c_str()); + + if (next) + { + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, + "add_subdir() : SHIFTING"); + + /* must move */ + di->remove(); + di->insert(next); + } + + /* then subprocess. */ + process_subdir2(dir, di); + return 1; +} + + +std::string sizeToString(int size); + +int add_file(PQFileItem *file, Fl_Item *p, Fl_Item *next) +{ + { + std::ostringstream out; + out << "add_file() :" << file->name; + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, out.str()); + } + + /* add file with parent p, before next */ + std::ostringstream out; + out << "[ " << sizeToString(file->size) << " ] " << file->name; + //out << " ---> " << file->size << " bytes"; + + Fl_Item *fi = Fl_File_Item_type.make(p); + fi -> name(out.str().c_str()); + ((Fl_File_Item *) fi) -> filename = file -> name; + ((Fl_File_Item *) fi) -> size = file -> size; + + if (next) + { + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, + "add_file() SHIFTING:"); + + /* must move */ + fi->remove(); + fi->insert(next); + } + + return 1; +} + + + + + +int fltkserver::cert_sign_current() +{ + /* get the current cert, check that its + * in the allowed group. + */ + + /* ask sslroot to sign certificate + */ + cert *c = cert_get_current(); + + if ((c == NULL) || (c == sslr -> getOwnCert())) + { + return -1; + } + return sslr -> signCertificate(c); +} + +int fltkserver::cert_trust_current_toggle() +{ + /* ensure that they are in the allowed group + */ + + cert *c = cert_get_current(); + if ((c == NULL) || (c == sslr -> getOwnCert())) + { + return -1; + } + return sslr -> trustCertificate(c, !(c -> Trusted())); +} + + +#ifdef PQI_USE_CHANNELS + +int fltkserver::update_channels() +{ + if (server == NULL) + return -1; + + // draw the channels + + Fl_Funky_Browser *chb = ui -> channel_list; + Fl_Funky_Browser *chmb = ui -> channel_file_list; + Fl_Funky_Browser *chfb = ui -> chan_msgdetails_filelist; + + bool channels_changed = false; + bool channel_msgs_changed = false; + + // save data on currently selected. + DisplayData *selChannel = chb -> getCurrentItem(); // getSelected() returns NULL??? why; + channelSign selChanSign; + ChanDisItem *selCDI = NULL; + + if (selChannel) + { + selChanSign = ((ChanDisItem *) selChannel) -> cs; + std::ostringstream out; + out << "fltkserver::update_channels() Currently Selected is:"; + selChanSign.print(out); + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, out.str()); + } + + if ((server -> channelsChanged.Changed(0)) || (!channel_list_ok)) + { + std::list chanlist; + std::list::iterator cit; + + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, + "fltkserver::update_channels() (server->channelsChanged.Changed(0))"); + +#ifdef PQI_USE_CHANNELS + server->getAvailableChannels(chanlist); +#endif + chb -> clear(); + for(cit = chanlist.begin(); cit != chanlist.end(); ++cit) + { + ChanDisItem *cdi = new ChanDisItem(*cit); + chb -> addItemSeries(cdi); + + std::ostringstream out; + out << "fltkserver::update_channels() Added: "; + cdi->cs.print(out); + + /* check if previously selected channel */ + if ((selChannel) && (selChanSign == cdi -> cs)) + { + selCDI = cdi; + out << " Matches Previous Selection!"; + } + + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, out.str()); + } + + chb -> ItemSeriesDone(); + if (selCDI) /* if channel still exists */ + { + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, "Selecting Previous Channel"); + chb -> selectDD(selCDI); + } + channel_list_ok = true; + channels_changed = true; + } + + + // save data on currently selected. + DisplayData *selChanMsg = chmb -> getCurrentItem(); + MsgHash selMsgHash; + ChanMsgDisItem *selCMDI = NULL; + + if (selChanMsg) + { + selMsgHash = ((ChanMsgDisItem *) selChanMsg) -> mh; + } + + if ((channels_changed) || (!channel_msg_list_ok)) + { + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, + "fltkserver::update_channels() (channel_changed) || (!channel_msg_list_ok)"); + + if (!selCDI) + { + chmb->clear(); + // selCMDI == NULL as well (so empty Msg Display) + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, + "fltkserver::update_channels() No Channel Selected"); + ui->chan_createmsg_title->value("No Channel Selected!"); + ui->chan_msgdetails_title->value("No Channel Selected!"); + } + else + { + // a channel is selected! + // signature is in selChanSign. + std::list summarylist; + std::list::iterator it; + + /* set the channel names */ + if (selCDI -> mode & 0x040) + { + ui->chan_createmsg_title->value(selCDI->name.c_str()); + } + else + { + ui->chan_createmsg_title->value("Publisher Channel Not Selected!"); + } + ui->chan_msgdetails_title->value(selCDI->name.c_str()); + +#ifdef PQI_USE_CHANNELS + server->getChannelMsgList(selChanSign, summarylist); +#endif + chmb -> clear(); + for(it = summarylist.begin(); it != summarylist.end(); ++it) + { + ChanMsgDisItem *cmdi = new ChanMsgDisItem(*it); + chmb -> addItemSeries(cmdi); + + /* check if previously selected channel */ + if ((selChanMsg) && (selMsgHash == cmdi -> mh)) + { + selCMDI = cmdi; + } + } + + chmb -> ItemSeriesDone(); + if (selCMDI) + { + chmb -> selectDD(selCMDI); + } + } + + channel_msg_list_ok = true; + channel_msgs_changed = true; + } + + + /* Finally do the File List .... but need to do gui first */ + // save data on currently selected. + DisplayData *selChanFile = chfb -> getCurrentItem(); + std::string selName; + int selSize; + ChanFileDisItem *selCFDI = NULL; + + if (selChanFile) + { + selName = ((ChanFileDisItem *) selChanMsg) -> name; + selSize = ((ChanFileDisItem *) selChanMsg) -> size; + } + + if ((channel_msgs_changed) || (!channel_msg_item_ok)) + { + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, + "fltkserver::update_channels() (channel_changed) || (!channel_msg_item_ok)"); + + if ((!selCMDI) || (!selCDI)) + { + chfb->clear(); + // selCMDI == NULL as well (so empty Msg Display) + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, + "fltkserver::update_channels() No Msg Selected"); + } + else + { + // a channel is selected! + // signature is in selChanSign. + + channelMsg *cm = NULL; +#ifdef PQI_USE_CHANNELS + cm = server->getChannelMsg(selChanSign,selMsgHash); +#endif + if (!cm) + { + channel_msg_item_ok = true; + chfb -> clear(); + /* should never get here! */ + pqioutput(PQL_DEBUG_ALERT, fltksrvrzone, + "fltkserver::update_channels() Channels not enabled"); + return 1; + } + + // Fill in the details. + + // the msg. + Fl_Text_Buffer *buf = ui -> chan_msgdetails_msg -> buffer(); + buf -> text(cm->msg->msg.c_str()); + + // the files.... + PQChanItem::FileList::const_iterator it; + + chfb -> clear(); + for(it = cm->msg->files.begin(); it != cm->msg->files.end(); ++it) + { + ChanFileDisItem *cfdi = new ChanFileDisItem(it->name, it->size); + chfb -> addItemSeries(cfdi); + + /* check if previously selected channel */ + if ((selChanFile) && + (selName == cfdi -> name) && + (selSize == cfdi -> size)) + { + selCFDI = cfdi; + } + } + + chfb -> ItemSeriesDone(); + if (selCMDI) + { + chfb -> selectDD(selCFDI); + } + } + + channel_msg_item_ok = true; + // not needed, channel_msg_item_changed = true; + } + + return 1; +} + +#endif + + +#include + +std::string sizeToString(int size) +{ + std::ostringstream out; + float fsize = size; + int mag = 1; + while(fsize > 1000) + { + fsize /= 1000; + mag++; + } + + out << std::setw(4) << std::setprecision(3) << fsize; + switch(mag) + { + case 1: + out << " B"; + break; + case 2: + out << " kB"; + break; + case 3: + out << " MB"; + break; + case 4: + out << " GB"; + break; + case 5: + out << " TB"; + break; + default: + out << " ??"; + break; + } + return out.str(); +} + + +int ensureExtension(std::string &name, std::string def_ext) +{ + /* if it has an extension, don't change */ + int len = name.length(); + int extpos = name.find_last_of('.'); + + std::ostringstream out; + out << "ensureExtension() name: " << name << std::endl; + out << "\t\t extpos: " << extpos; + out << " len: " << len << std::endl; + + /* check that the '.' has between 1 and 4 char after it (an extension) */ + if ((extpos > 0) && (extpos < len - 1) && (extpos + 6 > len)) + { + /* extension there */ + std::string curext = name.substr(extpos, len); + out << "ensureExtension() curext: " << curext << std::endl; + std::cerr << out.str(); + return 0; + } + + if (extpos != len - 1) + { + name += "."; + } + name += def_ext; + + out << "ensureExtension() added ext: " << name << std::endl; + + std::cerr << out.str(); + return 1; +} + + diff --git a/libretroshare/src/fltkgui/fltkserver.h b/libretroshare/src/fltkgui/fltkserver.h new file mode 100644 index 000000000..8ce8bca30 --- /dev/null +++ b/libretroshare/src/fltkgui/fltkserver.h @@ -0,0 +1,222 @@ +/* + * "$Id: fltkserver.h,v 1.15 2007-02-18 21:46:49 rmf24 Exp $" + * + * FltkGUI for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + + +#ifndef MRK_FLTK_PQI_INTERFACE +#define MRK_FLTK_PQI_INTERFACE + +#include "server/filedexserver.h" +#include "pqi/pqipersongrp.h" +#include "pqi/pqissl.h" + +#include "fltkgui/Fl_Funky_Browser.h" +#include "fltkgui/pqistrings.h" + + +#include "fltkgui/alertbox.h" +#include "fltkgui/guitab.h" + +#include "pqi/p3disc.h" + +class fltkserver +{ + public: + fltkserver(); + ~fltkserver(); + +int init(); +int run(); + + // setup pqissl +int setuppqissl(filedexserver *fd, pqipersongrp *ph, sslroot *r, UserInterface *u); +int addAutoDiscovery(p3disc *a) {ad = a; return 1; } + +int addAlerts(alertBox *msg, alertBox *chat); +int ownchatmsg(std::string); +int chatmsg(std::string msg, std::string source); +int alertmsg(int type, int sev, std::string msg, std::string source); + + + // flags to indicate if something needs updating. + // This are public advisory flags that + // can be altered by callbacks. + bool cert_list_ok; + bool cert_item_ok; + bool cert_neighbour_list_ok; + bool cert_neighbour_item_ok; + bool search_list_ok; + bool result_list_ok; + bool result_item_ok; + bool msg_list_ok; + bool msg_item_ok; + bool msg_dialog_ok; + + bool transfer_ok; + bool transfer_item_ok; + bool dir_list_ok; + bool save_dir_ok; + bool server_set_ok; + + bool transfer_rates_ok; + + // Neighbour fns +cert * cert_get_current_neighbour(); + +int cert_add_neighbour(); +int neigh_display(cert*); +int neigh_update_auth(); + +cert * cert_get_current(); + +int cert_allow_current(); +int cert_deny_current(); +int cert_listen_current(); +int cert_connect_current(); +int cert_remove_current(); +int cert_tag_current(); +/* int cert_save_config(const char *fname); */ +int cert_save_config(); +int cert_load_gui_config(); +int cert_save_servaddr(); +int cert_saveaddr_connect(); +int cert_check_auto(); +int cert_toggle_auto(); +int cert_sign_current(); +int cert_trust_current_toggle(); +int cert_update_auth(); + +std::string getHomePath(); +int config_remove_dir(); +int file_select(int); +int file_updateName(); +int file_completeIO(); + +int config_server_update(); +int config_server_change(); + +int fselect_type; // what type of file selection is in progress. + + +int search_new(); // read words from keyboard. +int search_download(); +int search_recommend(); +int search_remove(); + + // new results display system. +int update_search_browser(); + +int set_recommend(PQFileItem *rec); +PQFileItem *get_recommend(); + +int getnsend_chat(); +int msg_send(); +int msg_channel_select(); +int msg_remove(); +int msg_reply(); +int download_recommend(); + +int transfer_select(); +int transfer_cancel(); +int transfer_clear(); +int transfer_rates(); + +int load_dir(std::string person, std::string dir); +int dirlist_download(); +int dirlist_recommend(); + + private: + +int update(); + +int update_quick_stats(); +int update_other_stats(); + +int update_certs(); + // display certificate details. +int cert_display(cert*, bool); + +int update_neighbour_certs(); +int update_search(); +int update_msgs(); +int update_transfer(); +int update_config(); + +int update_dirs(); +int update_dirlist(); +int check_dirlist(); +int check_dirlist2(); + +#ifdef PQI_USE_CHANNELS + +int update_channels(); +bool channel_list_ok; +bool channel_msg_list_ok; +bool channel_msg_item_ok; + +#endif + + +std::list transfers; + + // pointers to pqissl stuff. + filedexserver *server; + pqipersongrp *pqih; + sslroot *sslr; + UserInterface *ui; + + p3disc *ad; + + alertBox *msg; + alertBox *chat; + + // recommendation. + PQFileItem *recommend; + + // File Import/Export Flags. + bool fileio_import; + + int loop; + + Fl_Funky_Browser *search_browser; +}; + + +#define FILE_CHOOSER_IMPORT 1 +#define FILE_CHOOSER_EXPORT 2 +#define FILE_CHOOSER_DIR 3 +#define FILE_CHOOSER_SAVEDIR 4 +#define FILE_CHOOSER_KEY 5 +#define FILE_CHOOSER_CERT 6 + +/* Helper function to convert windows paths + * into unix (ie switch \ to /) for FLTK's file chooser + */ + +std::string make_path_unix(std::string winpath); + + +#endif diff --git a/libretroshare/src/fltkgui/guitab.cc b/libretroshare/src/fltkgui/guitab.cc new file mode 100644 index 000000000..c89db6e94 --- /dev/null +++ b/libretroshare/src/fltkgui/guitab.cc @@ -0,0 +1,675 @@ +// generated by Fast Light User Interface Designer (fluid) version 1.0107 + +#include "guitab.h" + +Fl_Double_Window* UserInterface::make_windows() { + Fl_Double_Window* w; + { Fl_Double_Window* o = main_win = new Fl_Double_Window(710, 535, "RetroShare"); + w = o; + o->box(FL_DOWN_BOX); + o->user_data((void*)(this)); + { Fl_Tabs* o = gui_tabs = new Fl_Tabs(10, 10, 690, 470); + o->box(FL_UP_BOX); + { Fl_Group* o = neighbours_tab = new Fl_Group(15, 40, 680, 435, "Connect"); + o->labelfont(1); + { Fl_Button* o = new Fl_Button(50, 439, 280, 31, "Load Certificate from File"); + o->callback((Fl_Callback*)file_import); + } + { Fl_Funky_Browser* o = cert_neighbour_list = new Fl_Funky_Browser(25, 70, 350, 355, "", 4); + o->box(FL_NO_BOX); + o->color(FL_BACKGROUND2_COLOR); + o->selection_color(FL_SELECTION_COLOR); + o->labeltype(FL_NORMAL_LABEL); + o->labelfont(0); + o->labelsize(14); + o->labelcolor(FL_FOREGROUND_COLOR); + o->textfont(4); + o->callback((Fl_Callback*)cert_neighbour_list_select); + o->align(FL_ALIGN_BOTTOM); + o->when(FL_WHEN_RELEASE_ALWAYS); + } + { Fl_Button* o = neigh_add_button = new Fl_Button(420, 440, 240, 30, "Sign + Add to Friends >>>"); + o->callback((Fl_Callback*)cert_move_to_friends); + } + { Fl_Box* o = new Fl_Box(35, 49, 290, 20, "Your Neighbour List"); + o->box(FL_FLAT_BOX); + o->labelfont(1); + } + { Fl_Input* o = neigh_authcode = new Fl_Input(540, 397, 70, 30, "AUTH CODE:"); + o->labelfont(1); + o->callback((Fl_Callback*)neigh_auth_callback); + o->when(FL_WHEN_CHANGED); + } + { Fl_Group* o = new Fl_Group(390, 54, 295, 305); + o->box(FL_DOWN_BOX); + { Fl_Box* o = new Fl_Box(395, 65, 125, 20, "Peer Details"); + o->box(FL_FLAT_BOX); + o->labelfont(1); + o->labelsize(16); + } + { Fl_Browser* o = neigh_signers = new Fl_Browser(440, 195, 225, 140, "Certificate signers"); + o->type(2); + o->textfont(4); + o->callback((Fl_Callback*)cert_neigh_signers_select); + Fl_Group::current()->resizable(o); + } + neigh_name = new Fl_Output(450, 90, 226, 20, "Name:"); + neigh_org = new Fl_Output(450, 115, 226, 20, "Org:"); + neigh_loc = new Fl_Output(450, 140, 225, 20, "Loc:"); + neigh_country = new Fl_Output(495, 165, 168, 20, "Country:"); + neigh_trust = new Fl_Output(565, 65, 110, 20, "Trust:"); + o->end(); + } + { Fl_Box* o = neigh_auth_notice = new Fl_Box(405, 369, 270, 26, "AUTH CODE REQUIRED"); + o->box(FL_FLAT_BOX); + o->labelfont(1); + o->labelsize(18); + o->labelcolor(FL_YELLOW); + } + o->end(); + } + { Fl_Group* o = connect_tab = new Fl_Group(15, 40, 680, 435, "Friends"); + o->labelfont(1); + o->hide(); + { Fl_Button* o = new Fl_Button(62, 440, 185, 25, "<<< Remove Friend"); + o->callback((Fl_Callback*)cert_remove_cert); + } + { Fl_Button* o = new Fl_Button(264, 440, 185, 25, "Configure Friend"); + o->callback((Fl_Callback*)cert_show_config); + } + { Fl_Funky_Browser* o = cert_list = new Fl_Funky_Browser(25, 70, 660, 360, "", 5); + o->type(2); + o->box(FL_NO_BOX); + o->color(FL_BACKGROUND2_COLOR); + o->selection_color(FL_SELECTION_COLOR); + o->labeltype(FL_NORMAL_LABEL); + o->labelfont(0); + o->labelsize(14); + o->labelcolor(FL_FOREGROUND_COLOR); + o->textfont(4); + o->callback((Fl_Callback*)cert_list_select); + o->align(FL_ALIGN_BOTTOM); + o->when(FL_WHEN_RELEASE_ALWAYS); + } + { Fl_Button* o = new Fl_Button(466, 440, 185, 25, "Export Friend"); + o->callback((Fl_Callback*)file_export); + } + { Fl_Box* o = new Fl_Box(190, 50, 340, 20, "Your Friends "); + o->box(FL_FLAT_BOX); + o->labelfont(1); + } + o->end(); + } + { Fl_Group* o = new Fl_Group(15, 40, 680, 435, "File Listing"); + o->labelfont(1); + o->hide(); + { Fl_Widget *o = file_results = make_tree_browser(25, 50, 660, 380); + } +// { Fl_File_Browser* o = file_results = new Fl_File_Browser(45, 50, 625, 380); +// o->callback((Fl_Callback*)file_result_select); +// } + { Fl_Button* o = file_download_button = new Fl_Button(65, 440, 185, 25, "Download"); + o->callback((Fl_Callback*)file_download); + } + { Fl_Button* o = file_recommend_button = new Fl_Button(465, 440, 185, 25, "Recommend to Friends"); + o->callback((Fl_Callback*)file_recommend); + o->deactivate(); + } + { Fl_Button* o = file_channel_button = new Fl_Button(265, 440, 185, 25, "Broadcast on Channel"); + o->callback((Fl_Callback*)file_channel_broadcast); + o->deactivate(); + } + o->end(); + } + { Fl_Group* o = new Fl_Group(15, 40, 680, 435, "Search "); + o->labelfont(1); + o->hide(); + { Fl_Input* o = new_search = new Fl_Input(105, 50, 225, 25, "Terms:"); + o->labelfont(1); + o->callback((Fl_Callback*)do_new_search); + } + { Fl_Button* o = new Fl_Button(535, 50, 125, 25, "Remove Search"); + o->callback((Fl_Callback*)search_remove); + } + { Fl_Button* o = recommend_button = new Fl_Button(460, 440, 185, 25, "Recommend to Friends"); + o->callback((Fl_Callback*)search_recommend); + o->deactivate(); + } + { Fl_Funky_Browser* o = srch_results = new Fl_Funky_Browser(25, 80, 660, 350, "", 5); + o->type(2); + o->box(FL_NO_BOX); + o->color(FL_BACKGROUND2_COLOR); + o->selection_color(FL_SELECTION_COLOR); + o->labeltype(FL_NORMAL_LABEL); + o->labelfont(0); + o->labelsize(14); + o->labelcolor(FL_FOREGROUND_COLOR); + o->callback((Fl_Callback*)search_result_select); + o->align(FL_ALIGN_BOTTOM); + o->when(FL_WHEN_RELEASE_ALWAYS); + } + { Fl_Button* o = search_button = new Fl_Button(340, 50, 79, 25, "Search"); + o->labelfont(1); + o->callback((Fl_Callback*)do_search_button); + } + { Fl_Button* o = download_button = new Fl_Button(60, 440, 185, 25, "Download"); + o->callback((Fl_Callback*)search_download); + } + { Fl_Button* o = search_channel_button = new Fl_Button(260, 440, 185, 25, "Broadcast on Channel"); + o->callback((Fl_Callback*)search_channel_broadcast); + o->deactivate(); + } + o->end(); + } + { Fl_Group* o = new Fl_Group(15, 40, 680, 435, "File Transfer"); + o->hide(); + { Fl_Funky_Browser* o = transfer_downloads = new Fl_Funky_Browser(25, 50, 660, 250, "", 5); + o->type(2); + o->box(FL_NO_BOX); + o->color(FL_BACKGROUND2_COLOR); + o->selection_color(FL_SELECTION_COLOR); + o->labeltype(FL_NORMAL_LABEL); + o->labelfont(0); + o->labelsize(14); + o->labelcolor(FL_FOREGROUND_COLOR); + o->callback((Fl_Callback*)transfer_select); + o->align(FL_ALIGN_BOTTOM); + o->when(FL_WHEN_RELEASE_ALWAYS); + } + { Fl_Button* o = transfer_cancel = new Fl_Button(70, 310, 165, 25, "Cancel"); + o->callback((Fl_Callback*)file_transfer_cancel); + } + { Fl_Button* o = transfer_clear = new Fl_Button(275, 310, 155, 25, "Clear Finished"); + o->callback((Fl_Callback*)file_transfer_clear); + } + { Fl_Text_Display* o = transfer_overview = new Fl_Text_Display(25, 345, 450, 120); + o->textfont(5); + } + { Fl_Counter* o = rate_total = new Fl_Counter(510, 380, 135, 25, "Max Total Data Rate (kB/s)"); + o->step(0.1); + o->callback((Fl_Callback*)file_transfer_total_rate); + } + { Fl_Counter* o = rate_indiv = new Fl_Counter(510, 425, 135, 25, "Rate Per Person (kB/s)"); + o->step(0.1); + o->callback((Fl_Callback*)file_transfer_indiv_rate); + } + o->end(); + } + { Fl_Group* o = new Fl_Group(15, 40, 680, 435, "Messages"); + o->labelfont(1); + o->hide(); + o->deactivate(); + { Fl_Funky_Browser* o = msg_list = new Fl_Funky_Browser(25, 65, 660, 270, "", 5); + o->type(2); + o->box(FL_NO_BOX); + o->color(FL_BACKGROUND2_COLOR); + o->selection_color(FL_SELECTION_COLOR); + o->labeltype(FL_NORMAL_LABEL); + o->labelfont(0); + o->labelsize(14); + o->labelcolor(FL_FOREGROUND_COLOR); + o->callback((Fl_Callback*)msg_select); + o->align(FL_ALIGN_BOTTOM); + o->when(FL_WHEN_RELEASE_ALWAYS); + } + { Fl_Button* o = new Fl_Button(45, 350, 125, 25, "New Msg"); + o->callback((Fl_Callback*)msg_dialog_show); + } + { Fl_Button* o = new Fl_Button(45, 380, 125, 25, "Reply to Msg"); + o->callback((Fl_Callback*)msg_dialog_reply); + } + { Fl_Button* o = new Fl_Button(245, 450, 380, 25, "(2) -- Get The Recommended File"); + o->labelfont(1); + o->callback((Fl_Callback*)msg_get_recommendation); + } + { Fl_Button* o = new Fl_Button(45, 410, 125, 25, "Remove Msg"); + o->callback((Fl_Callback*)msg_remove); + } + { Fl_Text_Display* o = msg_details = new Fl_Text_Display(180, 340, 485, 105); + o->textfont(5); + } + { Fl_Box* o = new Fl_Box(55, 45, 305, 20, "(1) -- Select Message"); + o->box(FL_FLAT_BOX); + o->labelfont(1); + } + o->end(); + } + { Fl_Group* o = channels = new Fl_Group(15, 40, 680, 435, "Channels"); + o->hide(); + o->deactivate(); + { Fl_Funky_Browser* o = channel_list = new Fl_Funky_Browser(25, 80, 660, 225, "", 5); + o->type(2); + o->box(FL_NO_BOX); + o->color(FL_BACKGROUND2_COLOR); + o->selection_color(FL_SELECTION_COLOR); + o->labeltype(FL_NORMAL_LABEL); + o->labelfont(0); + o->labelsize(14); + o->labelcolor(FL_FOREGROUND_COLOR); + o->callback((Fl_Callback*)channel_list_select); + o->align(FL_ALIGN_BOTTOM); + o->when(FL_WHEN_RELEASE_ALWAYS); + } + { Fl_Box* o = new Fl_Box(40, 61, 170, 19, "Available Channels"); + o->labelfont(1); + } + { Fl_Group* o = new Fl_Group(25, 310, 655, 160); + o->box(FL_DOWN_BOX); + { Fl_Funky_Browser* o = channel_file_list = new Fl_Funky_Browser(35, 345, 635, 120, "", 5); + o->box(FL_NO_BOX); + o->color(FL_BACKGROUND2_COLOR); + o->selection_color(FL_SELECTION_COLOR); + o->labeltype(FL_NORMAL_LABEL); + o->labelfont(0); + o->labelsize(14); + o->labelcolor(FL_FOREGROUND_COLOR); + o->callback((Fl_Callback*)channel_file_list_select); + o->align(FL_ALIGN_BOTTOM); + o->when(FL_WHEN_RELEASE_ALWAYS); + } + { Fl_Output* o = channel_selected_name = new Fl_Output(185, 315, 270, 25, "Msgs on Channel"); + o->labelfont(1); + } + { Fl_Button* o = channel_show_button = new Fl_Button(485, 315, 160, 25, "Show Msg Details"); + o->callback((Fl_Callback*)channel_show_callback); + } + o->end(); + } + { Fl_Button* o = channel_delete_button = new Fl_Button(290, 50, 160, 25, "Delete Channel"); + o->callback((Fl_Callback*)channel_delete_callback); + } + { Fl_Button* o = channel_create_button = new Fl_Button(475, 50, 160, 25, "Create Channel Msg"); + o->callback((Fl_Callback*)channel_create); + } + o->end(); + } + { Fl_Group* o = new Fl_Group(15, 40, 680, 435, "Config"); + o->hide(); + { Fl_Group* o = new Fl_Group(460, 55, 210, 80); + o->box(FL_DOWN_BOX); + o->hide(); + { Fl_Check_Button* o = config_local_disc = new Fl_Check_Button(490, 80, 145, 25, "local discovery"); + o->down_box(FL_DOWN_BOX); + } + { Fl_Check_Button* o = config_remote_disc = new Fl_Check_Button(490, 100, 145, 25, "remote discovery"); + o->down_box(FL_DOWN_BOX); + } + { Fl_Box* o = new Fl_Box(470, 60, 165, 20, "Discovery Options:"); + o->box(FL_FLAT_BOX); + o->labelfont(1); + } + o->end(); + } + { Fl_Group* o = new Fl_Group(25, 225, 405, 240); + o->box(FL_DOWN_BOX); + { Fl_Browser* o = config_search_dir = new Fl_Browser(40, 245, 355, 105); + o->type(2); + } + { Fl_Button* o = new Fl_Button(40, 370, 135, 25, "Add Directory"); + o->callback((Fl_Callback*)config_add_dir); + } + { Fl_Button* o = new Fl_Button(40, 400, 135, 25, "Remove Directory"); + o->callback((Fl_Callback*)config_remove_dir); + } + config_save_dir = new Fl_Output(145, 435, 250, 20, "Save Directory"); + { Fl_Button* o = new Fl_Button(230, 405, 165, 25, "Select save directory"); + o->callback((Fl_Callback*)config_save_dir_change); + } + { Fl_Box* o = new Fl_Box(41, 230, 174, 15, "Share Directories:"); + o->box(FL_FLAT_BOX); + o->labelfont(1); + } + o->end(); + } + { Fl_Group* o = new Fl_Group(25, 55, 405, 160); + o->box(FL_DOWN_BOX); + config_local_addr = new Fl_Input(165, 80, 130, 20, "Local Address:"); + config_local_port = new Fl_Value_Input(335, 80, 60, 20, "Port:"); + config_server_addr = new Fl_Input(165, 145, 130, 25, "External Address:"); + config_server_port = new Fl_Value_Input(335, 145, 60, 25, "Port:"); + { Fl_Check_Button* o = config_firewall = new Fl_Check_Button(195, 100, 190, 25, "behind firewall"); + o->down_box(FL_DOWN_BOX); + o->callback((Fl_Callback*)config_server_update); + } + { Fl_Check_Button* o = config_forward = new Fl_Check_Button(195, 120, 190, 25, "forwarded external port"); + o->down_box(FL_DOWN_BOX); + o->callback((Fl_Callback*)config_server_update); + } + { Fl_Box* o = new Fl_Box(45, 60, 150, 20, "Server Settings:"); + o->box(FL_FLAT_BOX); + o->labelfont(1); + } + { Fl_Button* o = config_server_button = new Fl_Button(185, 180, 190, 25, "Change + Restart Server"); + o->callback((Fl_Callback*)config_server_change); + } + o->end(); + } + { Fl_Button* o = new Fl_Button(485, 434, 170, 25, "Save Configuration"); + o->callback((Fl_Callback*)cert_save_config); + } + o->end(); + } + { Fl_Group* o = about_help_tab = new Fl_Group(15, 40, 680, 435, "About"); + o->hide(); + help_view = new Fl_Help_View(25, 50, 660, 415); + o->end(); + } + o->end(); + } + onlinecounter = new Fl_Value_Output(100, 485, 35, 20, "#Online:"); + new Fl_Value_Output(100, 505, 35, 20, "New Msgs:"); + { Fl_Button* o = new Fl_Button(605, 490, 85, 30, "Hide"); + o->callback((Fl_Callback*)gui_quit); + } + new Fl_Text_Display(140, 485, 360, 40); + { Fl_Button* o = chat_button = new Fl_Button(510, 490, 85, 30, "Chat"); + o->callback((Fl_Callback*)chat_open_callback); + } + o->end(); + } + { Fl_Double_Window* o = msg_dialog = new Fl_Double_Window(580, 355, "Msg Dialog"); + w = o; + o->user_data((void*)(this)); + msg_online = new Fl_Check_Browser(20, 25, 140, 215); + { Fl_Button* o = msg_button_select = new Fl_Button(20, 240, 140, 25, "Select All/None"); + o->callback((Fl_Callback*)msg_toggle_select); + } + { Fl_Text_Editor* o = msg_text = new Fl_Text_Editor(175, 25, 385, 240, "(1) -- Enter Message Text:"); + o->labelfont(1); + } + msg_recommend = new Fl_Output(175, 275, 385, 30, "Recommendation:"); + { Fl_Button* o = new Fl_Button(245, 315, 160, 30, "(2) -- Send Msg"); + o->labelfont(1); + o->callback((Fl_Callback*)msg_send); + } + { Fl_Button* o = new Fl_Button(415, 315, 115, 30, "Cancel"); + o->callback((Fl_Callback*)msg_dialog_hide); + } + o->end(); + } + { Fl_Double_Window* o = cert_config = new Fl_Double_Window(430, 535, "Certificate Configuration"); + w = o; + o->user_data((void*)(this)); + { Fl_Group* o = new Fl_Group(10, 10, 410, 490); + o->box(FL_UP_BOX); + { Fl_Group* o = new Fl_Group(25, 355, 380, 135); + o->box(FL_DOWN_BOX); + cert_server = new Fl_Input(155, 430, 130, 25, "Server Address:"); + { Fl_Button* o = new Fl_Button(165, 460, 220, 25, "Save and attempt to Connect"); + o->callback((Fl_Callback*)cert_save_n_connect); + } + { Fl_Button* o = new Fl_Button(35, 460, 115, 25, "Save Address"); + o->callback((Fl_Callback*)cert_save_servaddr); + } + cert_port = new Fl_Value_Input(325, 430, 60, 25, "Port:"); + { Fl_Check_Button* o = cert_connect = new Fl_Check_Button(30, 410, 365, 20, "Outgoing Connections (Server Address Required)"); + o->down_box(FL_DOWN_BOX); + o->callback((Fl_Callback*)cert_connect_change); + } + { Fl_Check_Button* o = cert_allow = new Fl_Check_Button(30, 380, 115, 20, "Allow Access"); + o->down_box(FL_DOWN_BOX); + o->callback((Fl_Callback*)cert_allow_change); + } + { Fl_Check_Button* o = cert_listen = new Fl_Check_Button(30, 395, 170, 20, "Listen for connection"); + o->down_box(FL_DOWN_BOX); + o->callback((Fl_Callback*)cert_listen_change); + } + { Fl_Check_Button* o = cert_local = new Fl_Check_Button(220, 385, 130, 20, "Local Network"); + o->down_box(FL_DOWN_BOX); + o->callback((Fl_Callback*)cert_local_change); + } + { Fl_Check_Button* o = cert_auto = new Fl_Check_Button(220, 362, 140, 20, "Auto Connect"); + o->down_box(FL_DOWN_BOX); + o->labelfont(1); + o->callback((Fl_Callback*)cert_auto_change); + } + { Fl_Box* o = new Fl_Box(32, 363, 190, 20, "Connectivity Options:"); + o->box(FL_FLAT_BOX); + o->labelfont(1); + } + o->end(); + } + cert_status = new Fl_Output(80, 20, 130, 25, "Status:"); + cert_details = new Fl_Text_Display(25, 50, 380, 210); + { Fl_Group* o = new Fl_Group(25, 267, 380, 82); + o->box(FL_DOWN_BOX); + { Fl_Button* o = cert_sign_button = new Fl_Button(239, 295, 145, 29, "Sign Certificate"); + o->callback((Fl_Callback*)cert_sign); + } + { Fl_Check_Button* o = cert_trust_person = new Fl_Check_Button(95, 323, 230, 25, "Trust This Person\'s Signature"); + o->down_box(FL_DOWN_BOX); + o->callback((Fl_Callback*)cert_trust_person_change); + } + { Fl_Input* o = cert_authcode = new Fl_Input(145, 295, 80, 28, "AUTH CODE:"); + o->labelfont(1); + o->callback((Fl_Callback*)cert_auth_callback); + o->when(FL_WHEN_CHANGED); + } + { Fl_Box* o = new Fl_Box(35, 272, 360, 20, "Authenticate Friend By Entering Their Code"); + o->box(FL_FLAT_BOX); + o->labelfont(1); + } + o->end(); + } + cert_trust = new Fl_Output(260, 20, 140, 25, "Trust:"); + o->end(); + } + { Fl_Button* o = new Fl_Button(305, 505, 100, 25, "Done"); + o->callback((Fl_Callback*)cert_hide_config); + } + o->end(); + } + { Fl_Double_Window* o = new Fl_Double_Window(360, 290); + w = o; + o->user_data((void*)(this)); + { //Fl_File_Chooser* o = file_chooser = new Fl_File_Chooser(5, 5, 350, 280); + Fl_File_Chooser* o = file_chooser = new Fl_File_Chooser("/", + "Certificate Files (*.{pem,pqi})", 0, "Select File/Dir"); + +// o->box(FL_NO_BOX); +// o->color(FL_BACKGROUND_COLOR); +// o->selection_color(FL_BACKGROUND_COLOR); +// o->labeltype(FL_NORMAL_LABEL); +// o->labelfont(0); +// o->labelsize(14); +// o->labelcolor(FL_FOREGROUND_COLOR); +// o->callback((Fl_Callback*)file_chooser_select); + o->callback(file_chooser_select); +// o->align(FL_ALIGN_TOP); +// o->when(FL_WHEN_RELEASE); +// o->end(); + } + o->end(); + } + { Fl_Double_Window* o = welcome_window = new Fl_Double_Window(405, 580, "RetroShare Setup"); + w = o; + o->user_data((void*)(this)); + { Fl_Group* o = new Fl_Group(10, 10, 385, 35); + o->box(FL_DOWN_BOX); + { Fl_Box* o = new Fl_Box(85, 15, 230, 20, "Welcome to RetroShare"); + o->box(FL_FLAT_BOX); + o->labelfont(1); + o->labelsize(16); + } + o->end(); + } + { Fl_Group* o = new Fl_Group(10, 55, 385, 140); + o->box(FL_DOWN_BOX); + { Fl_Box* o = new Fl_Box(75, 65, 285, 20, "Please login ...."); + o->box(FL_FLAT_BOX); + o->labelfont(1); + } + load_name = new Fl_Output(90, 90, 250, 25, "Name:"); + { Fl_Input* o = load_passwd = new Fl_Input(90, 125, 250, 25, "Password"); + o->type(5); + o->callback((Fl_Callback*)load_passwd_callback); + o->when(FL_WHEN_ENTER_KEY); + } + { Fl_Button* o = load_button = new Fl_Button(110, 160, 210, 30, "Load Existing User"); + o->callback((Fl_Callback*)load_existing); + } + o->end(); + } + { Fl_Group* o = new Fl_Group(10, 205, 385, 365); + o->box(FL_DOWN_BOX); + { Fl_Box* o = new Fl_Box(55, 210, 300, 20, "Or create a New User..."); + o->box(FL_FLAT_BOX); + o->labelfont(1); + } + { Fl_Group* o = new Fl_Group(50, 360, 300, 5); + o->box(FL_UP_BOX); + o->end(); + } + { Fl_Group* o = new Fl_Group(50, 440, 300, 5); + o->box(FL_UP_BOX); + o->end(); + } + { Fl_Group* o = new Fl_Group(50, 511, 300, 5); + o->box(FL_UP_BOX); + o->end(); + } + gen_name = new Fl_Input(120, 235, 250, 25, "Name:"); + gen_org = new Fl_Input(120, 265, 250, 25, "Organisation:"); + gen_loc = new Fl_Input(120, 295, 250, 25, "Location:"); + gen_country = new Fl_Input(120, 325, 250, 25, "Country:"); + { Fl_Input* o = gen_passwd = new Fl_Input(170, 375, 130, 25, "New Password"); + o->type(5); + } + { Fl_Input* o = gen_passwd2 = new Fl_Input(170, 405, 130, 25, "Password (Again)"); + o->type(5); + } + { Fl_Check_Button* o = gen_trusted_tick_box = new Fl_Check_Button(50, 450, 305, 20, "Load Trusted Certificate (Optional)"); + o->down_box(FL_DOWN_BOX); + o->labelfont(1); + o->callback((Fl_Callback*)gen_trusted_tick_callback); + } + gen_trusted_peer = new Fl_Output(105, 474, 135, 25, "Friend:"); + { Fl_Button* o = gen_trusted_select_button = new Fl_Button(252, 470, 93, 30, "Select File"); + o->callback((Fl_Callback*)gen_load_trusted); + } + { Fl_Button* o = gen_button = new Fl_Button(100, 528, 210, 30, "Generate New Certificate"); + o->callback((Fl_Callback*)generate_certificate); + } + o->end(); + } + o->end(); + } + { Fl_Double_Window* o = chatter_window = new Fl_Double_Window(455, 435, "ChatterBox"); + w = o; + o->user_data((void*)(this)); + chatter_box = new Fl_Text_Display(5, 10, 445, 370); + { Fl_Input* o = chatter_input = new Fl_Input(5, 390, 445, 40); + o->callback((Fl_Callback*)chatterbox_message); + o->when(FL_WHEN_ENTER_KEY); + } + o->end(); + } + { Fl_Double_Window* o = alert_window = new Fl_Double_Window(540, 200, "Alerts"); + w = o; + o->user_data((void*)(this)); + { Fl_Return_Button* o = alert_okay = new Fl_Return_Button(75, 175, 180, 20, "OK"); + o->callback((Fl_Callback*)alert_okay_msg); + } + alert_box = new Fl_Text_Display(15, 5, 515, 165); + { Fl_Button* o = alert_cancel = new Fl_Button(270, 175, 180, 20, "Cancel"); + o->labelfont(3); + o->labelsize(16); + o->labelcolor((Fl_Color)80); + o->callback((Fl_Callback*)alert_cancel_msg); + } + o->end(); + } + { Fl_Double_Window* o = channel_create_window = new Fl_Double_Window(460, 535, "Create New Channel Msg"); + w = o; + o->user_data((void*)(this)); + { Fl_Funky_Browser* o = chan_createmsg_filelist = new Fl_Funky_Browser(10, 195, 440, 265, "", 2); + o->type(2); + o->box(FL_NO_BOX); + o->color(FL_BACKGROUND2_COLOR); + o->selection_color(FL_SELECTION_COLOR); + o->labeltype(FL_NORMAL_LABEL); + o->labelfont(0); + o->labelsize(14); + o->labelcolor(FL_FOREGROUND_COLOR); + o->callback((Fl_Callback*)chan_createmsg_list_select); + o->align(FL_ALIGN_BOTTOM); + o->when(FL_WHEN_RELEASE_ALWAYS); + } + { Fl_Button* o = chan_createmsg_sendmsg_button = new Fl_Button(25, 500, 125, 25, "Send Msg"); + o->callback((Fl_Callback*)chan_createmsg_sendmsg_callback); + } + { Fl_Button* o = chan_createmsg_postpone_button = new Fl_Button(165, 500, 125, 25, "Postpone Msg"); + o->callback((Fl_Callback*)chan_createmsg_postpone_callback); + } + { Fl_Button* o = chan_createmsg_cancel_button = new Fl_Button(305, 500, 125, 25, "Cancel Msg"); + o->callback((Fl_Callback*)chan_createmsg_cancel_callback); + } + chan_createmsg_msg = new Fl_Text_Editor(10, 110, 440, 75); + { Fl_Box* o = new Fl_Box(10, 91, 135, 19, "Message Text:"); + o->labelfont(1); + } + { Fl_Button* o = chan_createmsg_remove_button = new Fl_Button(305, 470, 125, 25, "Remove File"); + o->callback((Fl_Callback*)chan_createmsg_remove_callback); + } + { Fl_Group* o = new Fl_Group(10, 5, 440, 80); + o->box(FL_DOWN_BOX); + { Fl_Input* o = chan_createmsg_newname = new Fl_Input(155, 50, 280, 25); + o->callback((Fl_Callback*)chan_createmsg_newname_callback); + } + chan_createmsg_title = new Fl_Output(155, 15, 280, 25); + { Fl_Round_Button* o = chan_createmsg_newname_button = new Fl_Round_Button(20, 55, 135, 20, "Create Channel"); + o->type(102); + o->down_box(FL_ROUND_DOWN_BOX); + o->callback((Fl_Callback*)chan_createmsg_newname_button_callback); + } + { Fl_Round_Button* o = chan_createmsg_title_button = new Fl_Round_Button(20, 15, 135, 20, "Active Channel"); + o->type(102); + o->down_box(FL_ROUND_DOWN_BOX); + o->callback((Fl_Callback*)chan_createmsg_title_button_callback); + } + { Fl_Box* o = new Fl_Box(45, 33, 70, 22, "OR"); + o->labelfont(3); + } + o->end(); + } + o->end(); + } + { Fl_Double_Window* o = channel_details_window = new Fl_Double_Window(460, 445, "Channel Msg Details"); + w = o; + o->user_data((void*)(this)); + { Fl_Funky_Browser* o = chan_msgdetails_filelist = new Fl_Funky_Browser(10, 146, 440, 255, "", 2); + o->type(2); + o->box(FL_NO_BOX); + o->color(FL_BACKGROUND2_COLOR); + o->selection_color(FL_SELECTION_COLOR); + o->labeltype(FL_NORMAL_LABEL); + o->labelfont(0); + o->labelsize(14); + o->labelcolor(FL_FOREGROUND_COLOR); + o->callback((Fl_Callback*)chan_msgdetails_list_select); + o->align(FL_ALIGN_BOTTOM); + o->when(FL_WHEN_RELEASE_ALWAYS); + } + { Fl_Button* o = chan_msgdetails_download_button = new Fl_Button(165, 410, 125, 25, "Download Files"); + o->callback((Fl_Callback*)chan_msgdetails_download_callback); + } + { Fl_Box* o = new Fl_Box(10, 42, 135, 19, "Message Text:"); + o->labelfont(1); + } + { Fl_Button* o = chan_msgdetails_subscribe_button = new Fl_Button(25, 410, 125, 25, "Subscribe "); + o->callback((Fl_Callback*)chan_msgdetails_subscribe_callback); + } + { Fl_Output* o = chan_msgdetails_title = new Fl_Output(75, 10, 210, 25, "Channel"); + o->labelfont(1); + } + chan_msgdetails_msg = new Fl_Text_Display(10, 61, 440, 75); + { Fl_Output* o = chan_msgdetails_date = new Fl_Output(330, 10, 120, 25, "Date"); + o->labelfont(1); + } + { Fl_Button* o = chan_msgdetails_close_button = new Fl_Button(305, 410, 125, 25, "Close WIndow"); + o->callback((Fl_Callback*)chan_msgdetails_close_callback); + } + o->end(); + } + return w; +} diff --git a/libretroshare/src/fltkgui/guitab.fld b/libretroshare/src/fltkgui/guitab.fld new file mode 100644 index 000000000..3328241b8 --- /dev/null +++ b/libretroshare/src/fltkgui/guitab.fld @@ -0,0 +1,788 @@ +# data file for the Fltk User Interface Designer (fluid) +version 1.0107 +header_name {.h} +code_name {.cxx} +class UserInterface {open +} { + Function {make_windows()} {open + } { + Fl_Window main_win { + label RetroShare open + xywh {10 180 710 535} type Double box DOWN_BOX visible + } { + Fl_Tabs gui_tabs {open + xywh {10 10 690 470} box UP_BOX + } { + Fl_Group neighbours_tab { + label Connect + xywh {15 40 680 435} labelfont 1 + } { + Fl_Button {} { + label {Load Certificate from File} + callback file_import + xywh {50 439 280 31} + } + Fl_Browser cert_neighbour_list { + callback cert_neighbour_list_select + xywh {25 70 350 355} type Hold textfont 4 + code0 {\#include "Fl_Funky_Browser.h"} + class Fl_Funky_Browser + } + Fl_Button neigh_add_button { + label {Sign + Add to Friends >>>} + callback cert_move_to_friends + xywh {420 440 240 30} + } + Fl_Box {} { + label {Your Neighbour List} + xywh {35 49 290 20} box FLAT_BOX labelfont 1 + } + Fl_Input neigh_authcode { + label {AUTH CODE:} + callback neigh_auth_callback selected + xywh {540 397 70 30} labelfont 1 + } + Fl_Group {} {open + xywh {390 54 295 305} box DOWN_BOX + } { + Fl_Box {} { + label {Peer Details} + xywh {395 65 125 20} box FLAT_BOX labelfont 1 labelsize 16 + } + Fl_Browser neigh_signers { + label {Certificate signers} + callback cert_neigh_signers_select + xywh {440 195 225 140} type Hold textfont 4 resizable + } + Fl_Output neigh_name { + label {Name:} + xywh {450 90 226 20} + } + Fl_Output neigh_org { + label {Org:} + xywh {450 115 226 20} + } + Fl_Output neigh_loc { + label {Loc:} + xywh {450 140 225 20} + } + Fl_Output neigh_country { + label {Country:} + xywh {495 165 168 20} + } + Fl_Output neigh_trust { + label {Trust:} + xywh {565 65 110 20} + } + } + Fl_Box neigh_auth_notice { + label {AUTH CODE REQUIRED} + xywh {405 369 270 26} box FLAT_BOX labelfont 1 labelsize 18 labelcolor 95 + } + } + Fl_Group connect_tab { + label Friends + xywh {15 40 680 435} labelfont 1 hide + } { + Fl_Button {} { + label {<<< Remove Friend} + callback cert_remove_cert + xywh {62 440 185 25} + } + Fl_Button {} { + label {Configure Friend} + callback cert_show_config + xywh {264 440 185 25} + } + Fl_Browser cert_list { + callback cert_list_select + xywh {25 70 660 360} type Hold textfont 4 + code0 {\#include "Fl_Funky_Browser.h"} + class Fl_Funky_Browser + } + Fl_Button {} { + label {Export Friend} + callback file_export + xywh {466 440 185 25} + } + Fl_Box {} { + label {Your Friends } + xywh {190 50 340 20} box FLAT_BOX labelfont 1 + } + } + Fl_Group {} { + label {File Listing} + xywh {15 40 680 435} labelfont 1 hide + } { + Fl_File_Browser file_results { + callback file_result_select + xywh {25 50 660 380} + } + Fl_Button file_download_button { + label Download + callback file_download + xywh {65 440 185 25} + } + Fl_Button file_recommend_button { + label {Recommend to Friends} + callback file_recommend + xywh {465 440 185 25} deactivate + } + Fl_Button file_channel_button { + label {Broadcast on Channel} + callback file_channel_broadcast + xywh {265 440 185 25} deactivate + } + } + Fl_Group {} { + label {Search } + xywh {15 40 680 435} labelfont 1 hide + } { + Fl_Input new_search { + label {Terms:} + callback do_new_search + xywh {105 50 225 25} labelfont 1 + } + Fl_Button {} { + label {Remove Search} + callback search_remove + xywh {535 50 125 25} + } + Fl_Button recommend_button { + label {Recommend to Friends} + callback search_recommend + xywh {460 440 185 25} deactivate + } + Fl_Browser srch_results { + callback search_result_select + xywh {25 80 660 350} type Hold + code0 {\#include "Fl_Funky_Browser.h"} + class Fl_Funky_Browser + } + Fl_Button search_button { + label Search + callback do_search_button + xywh {340 50 79 25} labelfont 1 + } + Fl_Button download_button { + label Download + callback search_download + xywh {60 440 185 25} + } + Fl_Button search_channel_button { + label {Broadcast on Channel} + callback search_channel_broadcast + xywh {260 440 185 25} deactivate + } + } + Fl_Group {} { + label {File Transfer} open + xywh {15 40 680 435} hide + } { + Fl_Browser transfer_downloads { + callback transfer_select + xywh {25 50 660 250} type Hold + class Fl_Funky_Browser + } + Fl_Button transfer_cancel { + label Cancel + callback file_transfer_cancel + xywh {70 310 165 25} + } + Fl_Button transfer_clear { + label {Clear Finished} + callback file_transfer_clear + xywh {275 310 155 25} + } + Fl_Text_Display transfer_overview { + xywh {25 345 450 120} textfont 5 + } + Fl_Counter rate_total { + label {Max Total Data Rate (kB/s)} + callback file_transfer_total_rate + xywh {510 380 135 25} + } + Fl_Counter rate_indiv { + label {Rate Per Person (kB/s)} + callback file_transfer_indiv_rate + xywh {510 425 135 25} + } + } + Fl_Group {} { + label Messages + xywh {15 40 680 435} labelfont 1 hide deactivate + } { + Fl_Browser msg_list { + callback msg_select + xywh {25 65 660 270} type Hold + class Fl_Funky_Browser + } + Fl_Button {} { + label {New Msg} + callback msg_dialog_show + xywh {45 350 125 25} + } + Fl_Button {} { + label {Reply to Msg} + callback msg_dialog_reply + xywh {45 380 125 25} + } + Fl_Button {} { + label {(2) -- Get The Recommended File} + callback msg_get_recommendation + xywh {245 450 380 25} labelfont 1 + } + Fl_Button {} { + label {Remove Msg} + callback msg_remove + xywh {45 410 125 25} + } + Fl_Text_Display msg_details { + xywh {180 340 485 105} textfont 5 + } + Fl_Box {} { + label {(1) -- Select Message} + xywh {55 45 305 20} box FLAT_BOX labelfont 1 + } + } + Fl_Group channels { + label Channels + xywh {15 40 680 435} hide deactivate + } { + Fl_Browser channel_list { + callback channel_list_select + xywh {25 80 660 225} type Hold + code0 {\#include "Fl_Funky_Browser.h"} + class Fl_Funky_Browser + } + Fl_Box {} { + label {Available Channels} + xywh {40 61 170 19} labelfont 1 + } + Fl_Group {} {open + xywh {25 310 655 160} box DOWN_BOX + } { + Fl_Browser channel_file_list { + callback channel_file_list_select + xywh {35 345 635 120} + code0 {\#include "Fl_Funky_Browser.h"} + class Fl_Funky_Browser + } + Fl_Output channel_selected_name { + label {Msgs on Channel} + xywh {185 315 270 25} labelfont 1 + } + Fl_Button channel_show_button { + label {Show Msg Details} + callback channel_show_callback + xywh {485 315 160 25} + } + } + Fl_Button channel_delete_button { + label {Delete Channel} + callback channel_delete_callback + xywh {290 50 160 25} + } + Fl_Button channel_create_button { + label {Create Channel Msg} + callback channel_create + xywh {475 50 160 25} + } + } + Fl_Group {} { + label Config + xywh {15 40 680 435} hide + } { + Fl_Group {} {open + xywh {460 55 210 80} box DOWN_BOX hide + } { + Fl_Check_Button config_local_disc { + label {local discovery} + xywh {490 80 145 25} down_box DOWN_BOX + } + Fl_Check_Button config_remote_disc { + label {remote discovery} + xywh {490 100 145 25} down_box DOWN_BOX + } + Fl_Box {} { + label {Discovery Options:} + xywh {470 60 165 20} box FLAT_BOX labelfont 1 + } + } + Fl_Group {} {open + xywh {25 225 405 240} box DOWN_BOX + } { + Fl_Browser config_search_dir { + xywh {40 245 355 105} type Hold + } + Fl_Button {} { + label {Add Directory} + callback config_add_dir + xywh {40 370 135 25} + } + Fl_Button {} { + label {Remove Directory} + callback config_remove_dir + xywh {40 400 135 25} + } + Fl_Output config_save_dir { + label {Save Directory} + xywh {145 435 250 20} + } + Fl_Button {} { + label {Select save directory} + callback config_save_dir_change + xywh {230 405 165 25} + } + Fl_Box {} { + label {Share Directories:} + xywh {41 230 174 15} box FLAT_BOX labelfont 1 + } + } + Fl_Group {} {open + xywh {25 55 405 160} box DOWN_BOX + } { + Fl_Input config_local_addr { + label {Local Address:} + xywh {165 80 130 20} + } + Fl_Value_Input config_local_port { + label {Port:} + xywh {335 80 60 20} + } + Fl_Input config_server_addr { + label {External Address:} + xywh {165 145 130 25} + } + Fl_Value_Input config_server_port { + label {Port:} + xywh {335 145 60 25} + } + Fl_Check_Button config_firewall { + label {behind firewall} + callback config_server_update + xywh {195 100 190 25} down_box DOWN_BOX + } + Fl_Check_Button config_forward { + label {forwarded external port} + callback config_server_update + xywh {195 120 190 25} down_box DOWN_BOX + } + Fl_Box {} { + label {Server Settings:} + xywh {45 60 150 20} box FLAT_BOX labelfont 1 + } + Fl_Button config_server_button { + label {Change + Restart Server} + callback config_server_change + xywh {185 180 190 25} + } + } + Fl_Button {} { + label {Save Configuration} + callback cert_save_config + xywh {485 434 170 25} + } + } + Fl_Group about_help_tab { + label About + xywh {15 40 680 435} hide + } { + Fl_Help_View help_view { + xywh {25 50 660 415} + } + } + } + Fl_Value_Output onlinecounter { + label {\#Online:} + xywh {100 485 35 20} + } + Fl_Value_Output {} { + label {New Msgs:} + xywh {100 505 35 20} + } + Fl_Button {} { + label Hide + callback gui_quit + xywh {605 490 85 30} + } + Fl_Text_Display {} { + xywh {140 485 360 40} + } + Fl_Button chat_button { + label Chat + callback chat_open_callback + xywh {510 490 85 30} + } + } + Fl_Window msg_dialog { + label {Msg Dialog} + xywh {1 30 580 355} type Double hide + } { + Fl_Check_Browser msg_online { + xywh {20 25 140 215} + } + Fl_Button msg_button_select { + label {Select All/None} + callback msg_toggle_select + xywh {20 240 140 25} + } + Fl_Text_Editor msg_text { + label {(1) -- Enter Message Text:} + xywh {175 25 385 240} labelfont 1 + } + Fl_Output msg_recommend { + label {Recommendation:} + xywh {175 275 385 30} + } + Fl_Button {} { + label {(2) -- Send Msg} + callback msg_send + xywh {245 315 160 30} labelfont 1 + } + Fl_Button {} { + label Cancel + callback msg_dialog_hide + xywh {415 315 115 30} + } + } + Fl_Window cert_config { + label {Certificate Configuration} + xywh {168 116 430 535} type Double hide + } { + Fl_Group {} {open + xywh {10 10 410 490} box UP_BOX + } { + Fl_Group {} { + xywh {25 355 380 135} box DOWN_BOX + } { + Fl_Input cert_server { + label {Server Address:} + xywh {155 430 130 25} + } + Fl_Button {} { + label {Save and attempt to Connect} + callback cert_save_n_connect + xywh {165 460 220 25} + } + Fl_Button {} { + label {Save Address} + callback cert_save_servaddr + xywh {35 460 115 25} + } + Fl_Value_Input cert_port { + label {Port:} + xywh {325 430 60 25} + } + Fl_Check_Button cert_connect { + label {Outgoing Connections (Server Address Required)} + callback cert_connect_change + xywh {30 410 365 20} down_box DOWN_BOX + } + Fl_Check_Button cert_allow { + label {Allow Access} + callback cert_allow_change + xywh {30 380 115 20} down_box DOWN_BOX + } + Fl_Check_Button cert_listen { + label {Listen for connection} + callback cert_listen_change + xywh {30 395 170 20} down_box DOWN_BOX + } + Fl_Check_Button cert_local { + label {Local Network} + callback cert_local_change + xywh {220 385 130 20} down_box DOWN_BOX + } + Fl_Check_Button cert_auto { + label {Auto Connect} + callback cert_auto_change + xywh {220 362 140 20} down_box DOWN_BOX labelfont 1 + } + Fl_Box {} { + label {Connectivity Options:} + xywh {32 363 190 20} box FLAT_BOX labelfont 1 + } + } + Fl_Output cert_status { + label {Status:} + xywh {80 20 130 25} + } + Fl_Text_Display cert_details { + xywh {25 50 380 210} + } + Fl_Group {} { + xywh {25 267 380 82} box DOWN_BOX + } { + Fl_Button cert_sign_button { + label {Sign Certificate} + callback cert_sign + xywh {239 295 145 29} + } + Fl_Check_Button cert_trust_person { + label {Trust This Person's Signature} + callback cert_trust_person_change + xywh {95 323 230 25} down_box DOWN_BOX + } + Fl_Input cert_authcode { + label {AUTH CODE:} + callback cert_auth_callback + xywh {145 295 80 28} labelfont 1 when 1 + } + Fl_Box {} { + label {Authenticate Friend By Entering Their Code} + xywh {35 272 360 20} box FLAT_BOX labelfont 1 + } + } + Fl_Output cert_trust { + label {Trust:} + xywh {260 20 140 25} + } + } + Fl_Button {} { + label Done + callback cert_hide_config + xywh {305 505 100 25} + } + } + Fl_Window {} { + xywh {-32000 -32000 360 290} type Double hide + } { + Fl_Group file_chooser { + callback file_chooser_select open + xywh {5 5 350 280} + code0 {\#include } + class Fl_File_Chooser + } {} + } + Fl_Window welcome_window { + label {RetroShare Setup} + xywh {618 195 405 580} type Double hide + } { + Fl_Group {} {open + xywh {10 10 385 35} box DOWN_BOX + } { + Fl_Box {} { + label {Welcome to RetroShare} + xywh {85 15 230 20} box FLAT_BOX labelfont 1 labelsize 16 + } + } + Fl_Group {} {open + xywh {10 55 385 140} box DOWN_BOX + } { + Fl_Box {} { + label {Please login ....} + xywh {75 65 285 20} box FLAT_BOX labelfont 1 + } + Fl_Output load_name { + label {Name:} + xywh {90 90 250 25} + } + Fl_Input load_passwd { + label Password + callback load_passwd_callback + xywh {90 125 250 25} type Secret when 8 + } + Fl_Button load_button { + label {Load Existing User} + callback load_existing + xywh {110 160 210 30} + } + } + Fl_Group {} {open + xywh {10 205 385 365} box DOWN_BOX + } { + Fl_Box {} { + label {Or create a New User...} + xywh {55 210 300 20} box FLAT_BOX labelfont 1 + } + Fl_Group {} { + xywh {50 360 300 5} box UP_BOX + } {} + Fl_Group {} { + xywh {50 440 300 5} box UP_BOX + } {} + Fl_Group {} { + xywh {50 511 300 5} box UP_BOX + } {} + Fl_Input gen_name { + label {Name:} + xywh {120 235 250 25} + } + Fl_Input gen_org { + label {Organisation:} + xywh {120 265 250 25} + } + Fl_Input gen_loc { + label {Location:} + xywh {120 295 250 25} + } + Fl_Input gen_country { + label {Country:} + xywh {120 325 250 25} + } + Fl_Input gen_passwd { + label {New Password} + xywh {170 375 130 25} type Secret + } + Fl_Input gen_passwd2 { + label {Password (Again)} + xywh {170 405 130 25} type Secret + } + Fl_Check_Button gen_trusted_tick_box { + label {Load Trusted Certificate (Optional)} + callback gen_trusted_tick_callback + xywh {50 450 305 20} down_box DOWN_BOX labelfont 1 + } + Fl_Output gen_trusted_peer { + label {Friend:} + xywh {105 474 135 25} + } + Fl_Button gen_trusted_select_button { + label {Select File} + callback gen_load_trusted + xywh {252 470 93 30} + } + Fl_Button gen_button { + label {Generate New Certificate} + callback generate_certificate + xywh {100 528 210 30} + } + } + } + Fl_Window chatter_window { + label ChatterBox + xywh {457 94 455 435} type Double hide + } { + Fl_Text_Display chatter_box { + xywh {5 10 445 370} + } + Fl_Input chatter_input { + callback chatterbox_message + xywh {5 390 445 40} when 8 + } + } + Fl_Window alert_window { + label Alerts + xywh {46 543 540 200} type Double hide + } { + Fl_Return_Button alert_okay { + label OK + callback alert_okay_msg + xywh {75 175 180 20} + } + Fl_Text_Display alert_box { + xywh {15 5 515 165} + } + Fl_Button alert_cancel { + label Cancel + callback alert_cancel_msg + xywh {270 175 180 20} labelfont 3 labelsize 16 labelcolor 80 + } + } + Fl_Window channel_create_window { + label {Create New Channel Msg} + xywh {30 127 460 535} type Double hide + } { + Fl_Browser chan_createmsg_filelist { + callback chan_createmsg_list_select + xywh {10 195 440 265} type Hold + code0 {\#include "Fl_Funky_Browser.h"} + class Fl_Funky_Browser + } + Fl_Button chan_createmsg_sendmsg_button { + label {Send Msg} + callback chan_createmsg_sendmsg_callback + xywh {25 500 125 25} + } + Fl_Button chan_createmsg_postpone_button { + label {Postpone Msg} + callback chan_createmsg_postpone_callback + xywh {165 500 125 25} + } + Fl_Button chan_createmsg_cancel_button { + label {Cancel Msg} + callback chan_createmsg_cancel_callback + xywh {305 500 125 25} + } + Fl_Text_Editor chan_createmsg_msg { + xywh {10 110 440 75} + } + Fl_Box {} { + label {Message Text:} + xywh {10 91 135 19} labelfont 1 + } + Fl_Button chan_createmsg_remove_button { + label {Remove File} + callback chan_createmsg_remove_callback + xywh {305 470 125 25} + } + Fl_Group {} { + xywh {10 5 440 80} box DOWN_BOX + } { + Fl_Input chan_createmsg_newname { + callback chan_createmsg_newname_callback + xywh {155 50 280 25} + } + Fl_Output chan_createmsg_title { + xywh {155 15 280 25} + } + Fl_Round_Button chan_createmsg_newname_button { + label {Create Channel} + callback chan_createmsg_newname_button_callback + xywh {20 55 135 20} type Radio down_box ROUND_DOWN_BOX + } + Fl_Round_Button chan_createmsg_title_button { + label {Active Channel} + callback chan_createmsg_title_button_callback + xywh {20 15 135 20} type Radio down_box ROUND_DOWN_BOX + } + Fl_Box {} { + label OR + xywh {45 33 70 22} labelfont 3 + } + } + } + Fl_Window channel_details_window { + label {Channel Msg Details} + xywh {714 557 460 445} type Double hide + } { + Fl_Browser chan_msgdetails_filelist { + callback chan_msgdetails_list_select + xywh {10 146 440 255} type Hold + code0 {\#include "Fl_Funky_Browser.h"} + class Fl_Funky_Browser + } + Fl_Button chan_msgdetails_download_button { + label {Download Files} + callback chan_msgdetails_download_callback + xywh {165 410 125 25} + } + Fl_Box {} { + label {Message Text:} + xywh {10 42 135 19} labelfont 1 + } + Fl_Button chan_msgdetails_subscribe_button { + label {Subscribe } + callback chan_msgdetails_subscribe_callback + xywh {25 410 125 25} + } + Fl_Output chan_msgdetails_title { + label Channel + xywh {75 10 210 25} labelfont 1 + } + Fl_Text_Display chan_msgdetails_msg { + xywh {10 61 440 75} + } + Fl_Output chan_msgdetails_date { + label Date + xywh {330 10 120 25} labelfont 1 + } + Fl_Button chan_msgdetails_close_button { + label {Close WIndow} + callback chan_msgdetails_close_callback + xywh {305 410 125 25} + } + } + } +} diff --git a/libretroshare/src/fltkgui/guitab.h b/libretroshare/src/fltkgui/guitab.h new file mode 100644 index 000000000..ef65bca78 --- /dev/null +++ b/libretroshare/src/fltkgui/guitab.h @@ -0,0 +1,226 @@ +// generated by Fast Light User Interface Designer (fluid) version 1.0107 + +#ifndef guitab_h +#define guitab_h +#include +#include +#include +#include +#include +extern void file_import(Fl_Button*, void*); +#include "Fl_Tree_Browser.h" +#include "Fl_Funky_Browser.h" +extern void cert_neighbour_list_select(Fl_Funky_Browser*, void*); +extern void cert_move_to_friends(Fl_Button*, void*); +#include +#include +extern void neigh_auth_callback(Fl_Input*, void*); +#include +extern void cert_neigh_signers_select(Fl_Browser*, void*); +#include +extern void cert_remove_cert(Fl_Button*, void*); +extern void cert_show_config(Fl_Button*, void*); +extern void cert_list_select(Fl_Funky_Browser*, void*); +extern void file_export(Fl_Button*, void*); +#include +extern void file_result_select(Fl_File_Browser*, void*); +extern void file_download(Fl_Button*, void*); +extern void file_recommend(Fl_Button*, void*); +extern void file_channel_broadcast(Fl_Button*, void*); +extern void do_new_search(Fl_Input*, void*); +extern void search_remove(Fl_Button*, void*); +extern void search_recommend(Fl_Button*, void*); +extern void search_result_select(Fl_Funky_Browser*, void*); +extern void do_search_button(Fl_Button*, void*); +extern void search_download(Fl_Button*, void*); +extern void search_channel_broadcast(Fl_Button*, void*); +extern void transfer_select(Fl_Funky_Browser*, void*); +extern void file_transfer_cancel(Fl_Button*, void*); +extern void file_transfer_clear(Fl_Button*, void*); +#include +#include +extern void file_transfer_total_rate(Fl_Counter*, void*); +extern void file_transfer_indiv_rate(Fl_Counter*, void*); +extern void msg_select(Fl_Funky_Browser*, void*); +extern void msg_dialog_show(Fl_Button*, void*); +extern void msg_dialog_reply(Fl_Button*, void*); +extern void msg_get_recommendation(Fl_Button*, void*); +extern void msg_remove(Fl_Button*, void*); +extern void channel_list_select(Fl_Funky_Browser*, void*); +extern void channel_file_list_select(Fl_Funky_Browser*, void*); +extern void channel_show_callback(Fl_Button*, void*); +extern void channel_delete_callback(Fl_Button*, void*); +extern void channel_create(Fl_Button*, void*); +#include +extern void config_add_dir(Fl_Button*, void*); +extern void config_remove_dir(Fl_Button*, void*); +extern void config_save_dir_change(Fl_Button*, void*); +#include +extern void config_server_update(Fl_Check_Button*, void*); +extern void config_server_change(Fl_Button*, void*); +extern void cert_save_config(Fl_Button*, void*); +#include +#include +extern void gui_quit(Fl_Button*, void*); +extern void chat_open_callback(Fl_Button*, void*); +#include +extern void msg_toggle_select(Fl_Button*, void*); +#include +extern void msg_send(Fl_Button*, void*); +extern void msg_dialog_hide(Fl_Button*, void*); +extern void cert_save_n_connect(Fl_Button*, void*); +extern void cert_save_servaddr(Fl_Button*, void*); +extern void cert_connect_change(Fl_Check_Button*, void*); +extern void cert_allow_change(Fl_Check_Button*, void*); +extern void cert_listen_change(Fl_Check_Button*, void*); +extern void cert_local_change(Fl_Check_Button*, void*); +extern void cert_auto_change(Fl_Check_Button*, void*); +extern void cert_sign(Fl_Button*, void*); +extern void cert_trust_person_change(Fl_Check_Button*, void*); +extern void cert_auth_callback(Fl_Input*, void*); +extern void cert_hide_config(Fl_Button*, void*); +#include +extern void file_chooser_select(Fl_File_Chooser*, void*); +extern void load_passwd_callback(Fl_Input*, void*); +extern void load_existing(Fl_Button*, void*); +extern void gen_trusted_tick_callback(Fl_Check_Button*, void*); +extern void gen_load_trusted(Fl_Button*, void*); +extern void generate_certificate(Fl_Button*, void*); +extern void chatterbox_message(Fl_Input*, void*); +#include +extern void alert_okay_msg(Fl_Return_Button*, void*); +extern void alert_cancel_msg(Fl_Button*, void*); +extern void chan_createmsg_list_select(Fl_Funky_Browser*, void*); +extern void chan_createmsg_sendmsg_callback(Fl_Button*, void*); +extern void chan_createmsg_postpone_callback(Fl_Button*, void*); +extern void chan_createmsg_cancel_callback(Fl_Button*, void*); +extern void chan_createmsg_remove_callback(Fl_Button*, void*); +extern void chan_createmsg_newname_callback(Fl_Input*, void*); +#include +extern void chan_createmsg_newname_button_callback(Fl_Round_Button*, void*); +extern void chan_createmsg_title_button_callback(Fl_Round_Button*, void*); +extern void chan_msgdetails_list_select(Fl_Funky_Browser*, void*); +extern void chan_msgdetails_download_callback(Fl_Button*, void*); +extern void chan_msgdetails_subscribe_callback(Fl_Button*, void*); +extern void chan_msgdetails_close_callback(Fl_Button*, void*); + +class UserInterface { +public: + Fl_Double_Window* make_windows(); + Fl_Double_Window *main_win; + Fl_Tabs *gui_tabs; + Fl_Group *neighbours_tab; + Fl_Funky_Browser *cert_neighbour_list; + Fl_Button *neigh_add_button; + Fl_Input *neigh_authcode; + Fl_Browser *neigh_signers; + Fl_Output *neigh_name; + Fl_Output *neigh_org; + Fl_Output *neigh_loc; + Fl_Output *neigh_country; + Fl_Output *neigh_trust; + Fl_Box *neigh_auth_notice; + Fl_Group *connect_tab; + Fl_Funky_Browser *cert_list; + Fl_Widget *file_results; + Fl_Button *file_download_button; + Fl_Button *file_recommend_button; + Fl_Button *file_channel_button; + Fl_Input *new_search; + Fl_Button *recommend_button; + Fl_Funky_Browser *srch_results; + Fl_Button *search_button; + Fl_Button *download_button; + Fl_Button *search_channel_button; + Fl_Funky_Browser *transfer_downloads; + Fl_Button *transfer_cancel; + Fl_Button *transfer_clear; + Fl_Text_Display *transfer_overview; + Fl_Counter *rate_total; + Fl_Counter *rate_indiv; + Fl_Funky_Browser *msg_list; + Fl_Text_Display *msg_details; + Fl_Group *channels; + Fl_Funky_Browser *channel_list; + Fl_Funky_Browser *channel_file_list; + Fl_Output *channel_selected_name; + Fl_Button *channel_show_button; + Fl_Button *channel_delete_button; + Fl_Button *channel_create_button; + Fl_Check_Button *config_local_disc; + Fl_Check_Button *config_remote_disc; + Fl_Browser *config_search_dir; + Fl_Output *config_save_dir; + Fl_Input *config_local_addr; + Fl_Value_Input *config_local_port; + Fl_Input *config_server_addr; + Fl_Value_Input *config_server_port; + Fl_Check_Button *config_firewall; + Fl_Check_Button *config_forward; + Fl_Button *config_server_button; + Fl_Group *about_help_tab; + Fl_Help_View *help_view; + Fl_Value_Output *onlinecounter; + Fl_Button *chat_button; + Fl_Double_Window *msg_dialog; + Fl_Check_Browser *msg_online; + Fl_Button *msg_button_select; + Fl_Text_Editor *msg_text; + Fl_Output *msg_recommend; + Fl_Double_Window *cert_config; + Fl_Input *cert_server; + Fl_Value_Input *cert_port; + Fl_Check_Button *cert_connect; + Fl_Check_Button *cert_allow; + Fl_Check_Button *cert_listen; + Fl_Check_Button *cert_local; + Fl_Check_Button *cert_auto; + Fl_Output *cert_status; + Fl_Text_Display *cert_details; + Fl_Button *cert_sign_button; + Fl_Check_Button *cert_trust_person; + Fl_Input *cert_authcode; + Fl_Output *cert_trust; + Fl_File_Chooser *file_chooser; + Fl_Double_Window *welcome_window; + Fl_Output *load_name; + Fl_Input *load_passwd; + Fl_Button *load_button; + Fl_Input *gen_name; + Fl_Input *gen_org; + Fl_Input *gen_loc; + Fl_Input *gen_country; + Fl_Input *gen_passwd; + Fl_Input *gen_passwd2; + Fl_Check_Button *gen_trusted_tick_box; + Fl_Output *gen_trusted_peer; + Fl_Button *gen_trusted_select_button; + Fl_Button *gen_button; + Fl_Double_Window *chatter_window; + Fl_Text_Display *chatter_box; + Fl_Input *chatter_input; + Fl_Double_Window *alert_window; + Fl_Return_Button *alert_okay; + Fl_Text_Display *alert_box; + Fl_Button *alert_cancel; + Fl_Double_Window *channel_create_window; + Fl_Funky_Browser *chan_createmsg_filelist; + Fl_Button *chan_createmsg_sendmsg_button; + Fl_Button *chan_createmsg_postpone_button; + Fl_Button *chan_createmsg_cancel_button; + Fl_Text_Editor *chan_createmsg_msg; + Fl_Button *chan_createmsg_remove_button; + Fl_Input *chan_createmsg_newname; + Fl_Output *chan_createmsg_title; + Fl_Round_Button *chan_createmsg_newname_button; + Fl_Round_Button *chan_createmsg_title_button; + Fl_Double_Window *channel_details_window; + Fl_Funky_Browser *chan_msgdetails_filelist; + Fl_Button *chan_msgdetails_download_button; + Fl_Button *chan_msgdetails_subscribe_button; + Fl_Output *chan_msgdetails_title; + Fl_Text_Display *chan_msgdetails_msg; + Fl_Output *chan_msgdetails_date; + Fl_Button *chan_msgdetails_close_button; +}; +#endif diff --git a/libretroshare/src/fltkgui/pqibrowseitem.cc b/libretroshare/src/fltkgui/pqibrowseitem.cc new file mode 100644 index 000000000..89d659f94 --- /dev/null +++ b/libretroshare/src/fltkgui/pqibrowseitem.cc @@ -0,0 +1,996 @@ +/* + * "$Id: pqibrowseitem.cc,v 1.11 2007-02-18 21:46:49 rmf24 Exp $" + * + * FltkGUI for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "fltkgui/pqibrowseitem.h" + +#include "pqi/pqichannel.h" /* for mode bits */ + + +// for a helper fn. +#include "fltkgui/pqistrings.h" +#include + + + // a couple of functions that do the work. +int FileDisItem::ndix() // Number of Indices. +{ + return 4; +} + +static const int FI_COL_SOURCE_NAME = 0; +static const int FI_COL_SEARCH_TERMS = 1; +static const int FI_COL_NAME = 2; +static const int FI_COL_SIZE = 3; + +std::string FileDisItem::txt(int col) +{ + char numstr[100]; // this will be used regularly.... + std::string out; + switch(col) + { + case FI_COL_SOURCE_NAME: + if ((item -> p) != NULL) + { + out = item -> p -> Name(); + //std::cerr << "FDI::txt() Returning sn: " << out << std::endl; + return out; + } + return std::string("Local"); + //std::cerr << "FDI::txt() person = NULL" << std::endl; + break; + case FI_COL_SEARCH_TERMS: + if (terms != NULL) + { + out = terms -> data; + //std::cerr << "FDI::txt() Returning terms: " << out << std::endl; + return out; + } + //std::cerr << "FDI::txt() terms = NULL" << std::endl; + break; + case FI_COL_NAME: + out = item -> name; + //std::cerr << "FDI::txt() Returning name: " << out << std::endl; + return out; + break; + case FI_COL_SIZE: + sprintf(numstr, "%d kB", item -> size / 1000); + out = numstr; + //std::cerr << "FDI::txt() Returning size: " << out << std::endl; + return out; + break; + default: + break; + } + out = ""; + return out; +} + +int FileDisItem::cmp(int col, DisplayData *fdi) +{ + FileDisItem *other = (FileDisItem *) fdi; + int ret = 0; + switch(col) + { + case FI_COL_SOURCE_NAME: + // std::cerr << "FileDisItem::cmp() SRC NAME" << std::endl; + if (item -> p == + other -> item -> p) + { + ret = 0; + break; + } + if (item -> p == NULL) + { + ret = -1; + break; + } + if (other -> item -> p == NULL) + { + ret = 1; + break; + } + ret = strcmp((item -> p -> Name()).c_str(), + (other -> item -> p -> Name()).c_str()); + break; + case FI_COL_SEARCH_TERMS: + // std::cerr << "FileDisItem::cmp() TERMS" << std::endl; + if (terms == other -> terms) + { + ret = 0; + break; + } + if (terms == NULL) + { + ret = -1; + break; + } + if (other -> terms == NULL) + { + ret = 1; + break; + } + ret = strcmp((terms -> data).c_str(), + (other -> terms -> data).c_str()); + break; + case FI_COL_NAME: + // std::cerr << "FileDisItem::cmp() NAME" << std::endl; + ret = strcmp((item -> name).c_str(), + (other -> item -> name).c_str()); + break; + case FI_COL_SIZE: + // std::cerr << "FileDisItem::cmp() SIZE" << std::endl; + if (item -> size == other -> item -> size) + { + ret = 0; + break; + } + if (item -> size > other -> item -> size) + { + ret = 1; + break; + } + ret = -1; + break; + default: + // std::cerr << "FileDisItem::cmp() Default" << std::endl; + ret = 0; + break; + } + //std::cerr << "FileDisItem::cmp() ret: " << ret << std::endl; + return ret; +} + + + + // a couple of functions that do the work. +int PersonDisItem::ndix() // Number of Indices. +{ + return 5; +} + +static const int PI_COL_NAME = 0; +static const int PI_COL_STATUS = 1; +static const int PI_COL_AUTOCONNECT = 2; +static const int PI_COL_TRUST = 3; +static const int PI_COL_SERVER = 4; + +std::string PersonDisItem::txt(int col) +{ + char numstr[100]; // this will be used regularly.... + std::string out; + if (item == NULL) + return out; + + switch(col) + { + case PI_COL_NAME: + out = item -> Name(); + break; + case PI_COL_STATUS: + out = get_status_string(item -> Status()); + break; + case PI_COL_AUTOCONNECT: + out = get_autoconnect_string(item); + break; + case PI_COL_TRUST: + out = get_trust_string(item); + break; + case PI_COL_SERVER: + out = get_server_string(item); + break; + default: + break; + } + return out; +} + +int PersonDisItem::cmp(int col, DisplayData *fdi) +{ + PersonDisItem *other = (PersonDisItem *) fdi; + switch(col) + { + case PI_COL_NAME: + return strcmp((item -> Name()).c_str(), + (other -> item -> Name()).c_str()); + break; + case PI_COL_STATUS: + if (item -> Connected() == + other -> item -> Connected()) + { + if (item -> Accepted() == + other -> item -> Accepted()) + { + return 0; + } + if (item -> Accepted()) + return -1; + return 1; + } + if (item -> Connected()) + return -1; + return 1; + break; + + case PI_COL_AUTOCONNECT: + return 0; + break; + case PI_COL_TRUST: + return other->item->trustLvl - item->trustLvl; + break; + case PI_COL_SERVER: + return 0; + break; + default: + return 0; + break; + } + return 0; +} + + + // a couple of functions that do the work. +int NeighDisItem::ndix() // Number of Indices. +{ + return 3; +} + +static const int NI_COL_STATUS = 0; +static const int NI_COL_TRUST = 1; +static const int NI_COL_CONNECT = 2; +static const int NI_COL_NAME = 3; + +std::string NeighDisItem::txt(int col) +{ + char numstr[100]; // this will be used regularly.... + std::string out; + if (item == NULL) + return out; + + switch(col) + { + + case NI_COL_STATUS: + if (item->Accepted()) + { + out = "Accept"; + } + else + { + out = "Deny"; + } + break; + case NI_COL_TRUST: + out = get_trust_string(item); + break; + case NI_COL_CONNECT: + out = get_lastconnecttime_string(item); + break; + case NI_COL_NAME: + out = item -> Name(); + break; + default: + break; + } + return out; +} + +int NeighDisItem::cmp(int col, DisplayData *fdi) +{ + NeighDisItem *other = (NeighDisItem *) fdi; + switch(col) + { + case NI_COL_STATUS: + if (item -> Accepted() == + other -> item -> Accepted()) + { + return 0; + } + if (item -> Accepted()) + return 1; + return -1; + break; + + case NI_COL_TRUST: + return other->item->trustLvl - item->trustLvl; + break; + case NI_COL_CONNECT: + return get_lastconnecttime(item) + - get_lastconnecttime(other->item); + break; + case NI_COL_NAME: + return strcmp((item -> Name()).c_str(), + (other -> item -> Name()).c_str()); + break; + default: + return 0; + break; + } + return 0; +} + + + + // a couple of functions that do the work. +int MsgDisItem::ndix() // Number of Indices. +{ + return 5; +} + +static const int MI_COL_NAME = 0; +static const int MI_COL_MSG = 1; +static const int MI_COL_DATE = 2; +static const int MI_COL_REC_NAME = 3; +static const int MI_COL_REC_SIZE = 4; + +std::string MsgDisItem::txt(int col) +{ + char numstr[100]; // this will be used regularly.... + std::string out; + switch(col) + { + case MI_COL_NAME: + if ((item -> p) != NULL) + { + out = item -> p -> Name(); + return out; + } + return std::string("Local"); + break; + case MI_COL_MSG: + out = ""; + // remove \n and \t... + for(unsigned int i =0; i < item -> msg.length(); i++) + { + if ((item -> msg[i] == '\n') || + (item -> msg[i] == '\t')) + { + out += " "; + } + else + { + out += item -> msg[i]; + } + } + return out; + break; + case MI_COL_DATE: + out = timeFormat(item->epoch, TIME_FORMAT_OLDVAGUE); + //out = "Today!"; + return out; + break; + case MI_COL_REC_NAME: + out = item -> recommendname; + return out; + break; + case MI_COL_REC_SIZE: + //sprintf(numstr, "%d kB", item -> recommendsize / 1000); + //out = numstr; + out = "N/A"; + return out; + break; + default: + break; + } + out = ""; + return out; +} + +int MsgDisItem::cmp(int col, DisplayData *fdi) +{ + MsgDisItem *other = (MsgDisItem *) fdi; + switch(col) + { + case MI_COL_NAME: + if (item -> p == + other -> item -> p) + { + return 0; + } + if (item -> p == NULL) + { + return -1; + } + if (other -> item -> p == NULL) + { + return 1; + } + return strcmp((item -> p -> Name()).c_str(), + (other -> item -> p -> Name()).c_str()); + break; + + case MI_COL_MSG: + return strcmp((item -> msg).c_str(), + (other -> item -> msg).c_str()); + break; + case MI_COL_DATE: + return 0; + break; + case MI_COL_REC_NAME: + return strcmp((item -> recommendname).c_str(), + (other -> item -> recommendname).c_str()); + break; + case MI_COL_REC_SIZE: + return 0; +// if (item -> recommend_size == +// other -> item -> recommend_size) +// { +// return 0; +// } +// if (item -> recommend_size > +// other -> item -> recommend_size) +// { +// return 1; +// } +// return -1; + break; + default: + return 0; + break; + } + return 0; +} + + + // a couple of functions that do the work. +int FTDisItem::ndix() // Number of Indices. +{ + return 5; +} + +static const int FT_COL_SOURCE_NAME = 0; +static const int FT_COL_DIRECTION = 1; +static const int FT_COL_FILE_NAME = 2; +static const int FT_COL_FILE_SIZE = 3; +static const int FT_COL_FILE_RATE = 4; + + +static const int SEC_PER_DAY = 24 * 3600; + +std::string FTDisItem::txt(int col) +{ + char numstr[100]; // this will be used regularly.... + std::string out; + switch(col) + { + case FT_COL_SOURCE_NAME: + if ((item -> p) != NULL) + { + out = item -> p -> Name(); + return out; + } + return std::string("Unknown"); + break; + + case FT_COL_DIRECTION: /* This has now become state.... */ + switch(item -> state) + { + case FT_STATE_OKAY: + if (item->crate > 0) + { + out += "Downloading"; + } + else + { + out += "Waiting"; + } + break; + case FT_STATE_FAILED: + out += "Failed"; + break; + case FT_STATE_COMPLETE: + out += "Complete"; + break; + default: + out += "UNKNOWN"; + break; + } + return out; + break; + + case FT_COL_FILE_NAME: + out = item -> name; + return out; + break; + + case FT_COL_FILE_SIZE: + { + + float trans = item -> transferred; + float size = item -> size; + float percent = 100 * trans / size; + char lets[] = "kMGT"; + char let = ' '; + + // if bigger than 50 kbytes -> display + for(int i = 0; (i < 4) && (size / 1024 > 1); i++) + { + size /= 1024; + trans /= 1024; + let = lets[i]; + } + sprintf(numstr, "%.2f/%.2f %cBytes (%.2f%%)", + trans, size, let, percent); + + out = numstr; + return out; + } + break; + + case FT_COL_FILE_RATE: + if (item->size == item->transferred) + { + sprintf(numstr, "Done"); + } + else if (item->crate > 0.01) /* 10 bytes / sec */ + { + float secs = item->size - item->transferred; + secs /= (item -> crate * 1000.0); + + + if (secs > SEC_PER_DAY) + { + sprintf(numstr, "%.2f kB/s, %d days to go.", item -> crate, + (int) (secs + SEC_PER_DAY / 2) / SEC_PER_DAY); + } + else + { + int hours = (int) secs / 3600; + secs -= 3600 * hours; + int min = (int) secs / 60; + secs -= 60 * min; + sprintf(numstr, "%.2f kB/s, %d:%02d:%02d to go.", item -> crate, + hours, min, (int) secs); + } + } + else + { + sprintf(numstr, "%.2f kB/s, ... Forever", item -> crate); + + } + out = numstr; + return out; + break; + default: + break; + } + out = ""; + return out; +} + +int FTDisItem::cmp(int col, DisplayData *fdi) +{ + FTDisItem *other = (FTDisItem *) fdi; + switch(col) + { + case FT_COL_SOURCE_NAME: + if (item -> p == + other -> item -> p) + { + return 0; + } + if (item -> p == NULL) + { + return -1; + } + if (other -> item -> p == NULL) + { + return 1; + } + return strcmp((item -> p -> Name()).c_str(), + (other -> item -> p -> Name()).c_str()); + break; + case FT_COL_DIRECTION: + if (item -> in == other -> item -> in) + { + return 0; + } + if (item -> in == true) + { + return 1; + } + return -1; + break; + + case FT_COL_FILE_NAME: + return strcmp((item -> name).c_str(), + (other -> item -> name).c_str()); + break; + case FT_COL_FILE_SIZE: + if (item -> size == other -> item -> size) + { + return 0; + } + if (item -> size > other -> item -> size) + { + return 1; + } + return -1; + break; + + case FT_COL_FILE_RATE: + if (item -> crate == other -> item -> crate) + { + return 0; + } + if (item -> crate > other -> item -> crate) + { + return 1; + } + return -1; + break; + default: + return 0; + break; + } + return 0; +} + + + // a couple of functions that do the work. +int ChanDisItem::ndix() // Number of Indices. +{ + return 5; +} + + +static const int CDI_COL_MODE = 0; +static const int CDI_COL_RANK = 1; +static const int CDI_COL_TITLE = 2; +static const int CDI_COL_COUNT = 3; +static const int CDI_COL_SIGN = 4; + +ChanDisItem::ChanDisItem(pqichannel *i) + :mode(0), name("NULL CHANNEL") +{ + if (!i) + { + mode = -1; + return; + } + + cs = i->getSign(); + mode = i->getMode(); + name = i->getName(); + ranking = i->getRanking(); + msgcount = i->getMsgCount(); + return; +} + + +std::string ChanDisItem::txt(int col) +{ + char numstr[100]; // this will be used regularly.... + std::ostringstream out; + switch(col) + { + case CDI_COL_MODE: + { + if (mode == -1) + { + out << "Invalid"; + } + else if (mode & 0x040) + { + out << "Publisher"; + } + else if (mode & 0x020) + { + out << "Subscriber"; + } + else if (mode & 0x010) + { + out << "Listener"; + } + else + { + out << "Other"; + } + + return out.str(); + } + break; + + case CDI_COL_RANK: + { + out << ranking; + return out.str(); + } + break; + + case CDI_COL_TITLE: + { + return name; + } + break; + + + case CDI_COL_COUNT: + { + out << msgcount; + return out.str(); + } + break; + + case CDI_COL_SIGN: + { + cs.printHex(out); + return out.str(); + } + return std::string(""); + break; + + + default: + break; + } + return out.str(); +} + + +int ChanDisItem::cmp(int col, DisplayData *fdi) +{ + ChanDisItem *other = (ChanDisItem *) fdi; + switch(col) + { + case CDI_COL_MODE: + { + return mode - other->mode; + } + case CDI_COL_RANK: + { + return (int) (100.0 * (ranking - other->ranking)); + } + case CDI_COL_TITLE: + { + return strcmp(name.c_str(), other->name.c_str()); + } + case CDI_COL_COUNT: + { + return msgcount-other->msgcount; + } + break; + case CDI_COL_SIGN: + { + if (cs == other->cs) + return 0; + if (cs < other->cs) + return -1; + return 1; + } + break; + + default: + break; + } + return 0; +} + + + // a couple of functions that do the work. +int ChanMsgDisItem::ndix() // Number of Indices. +{ + return 5; +} + +static const int CMDI_COL_DATE = 0; +static const int CMDI_COL_MSG = 1; +static const int CMDI_COL_NOFILES = 2; +static const int CMDI_COL_SIZE = 3; +static const int CMDI_COL_MSGHASH = 4; + + +ChanMsgDisItem::ChanMsgDisItem(chanMsgSummary &s) + :msg(s.msg), mh(s.mh), nofiles(s.nofiles), + totalsize(s.totalsize), recvd(s.recvd) +{ + /* change \t & \n into " " */ + for(unsigned int i =0; i < msg.length(); i++) + { + if ((msg[i] == '\n') || + (msg[i] == '\t')) + { + msg[i] = ' '; + } + } +} + + +std::string ChanMsgDisItem::txt(int col) +{ + char numstr[100]; // this will be used regularly.... + std::ostringstream out; + switch(col) + { + case CMDI_COL_DATE: + { + int t = time(NULL); + int ago_sec = t - recvd; + out << ago_sec << " secs"; + return out.str(); + } + break; + case CMDI_COL_MSG: + // remove \n and \t... (done at init) + return msg; + break; + case CMDI_COL_NOFILES: + { + out << nofiles; + return out.str(); + } + break; + case CMDI_COL_SIZE: + { + if (totalsize > 1000000) + { + out << (totalsize / 1000000.0) << " MB"; + } + else if (totalsize > 1000) + { + out << (totalsize / 1000.0) << " kB"; + } + else + { + out << totalsize << " B"; + } + + return out.str(); + } + break; + + case CMDI_COL_MSGHASH: + { + mh.printHex(out); + return out.str(); + } + break; + + default: + break; + } + return out.str(); +} + +int ChanMsgDisItem::cmp(int col, DisplayData *fdi) +{ + ChanMsgDisItem *other = (ChanMsgDisItem *) fdi; + switch(col) + { + case CMDI_COL_DATE: + { + return recvd - other->recvd; + } + break; + + case CMDI_COL_MSG: + { + return strcmp(msg.c_str(), + other->msg.c_str()); + } + break; + + case CMDI_COL_NOFILES: + { + return nofiles-other->nofiles; + } + break; + + case CMDI_COL_SIZE: + { + return totalsize-other->totalsize; + } + break; + + case CMDI_COL_MSGHASH: + { + if (mh == other->mh) + return 0; + if (mh < other->mh) + return -1; + return 1; + } + break; + + default: + break; + } + return 0; +} + + +static const int CFDI_COL_SIZE = 0; +static const int CFDI_COL_NAME = 1; + + // a couple of functions that do the work. +int ChanFileDisItem::ndix() // Number of Indices. +{ + return 2; +} + + +ChanFileDisItem::ChanFileDisItem(std::string n, int s) + :name(n), size(s) +{ + return; +} + +std::string ChanFileDisItem::txt(int col) +{ + char numstr[100]; // this will be used regularly.... + std::ostringstream out; + switch(col) + { + case CFDI_COL_SIZE: + { + if (size > 1000000) + { + out << (size / 1000000.0) << " MB"; + } + else if (size > 1000) + { + out << (size / 1000.0) << " kB"; + } + else + { + out << size << " B"; + } + return out.str(); + } + break; + case CFDI_COL_NAME: + return name; + break; + default: + break; + } + return out.str(); +} + +int ChanFileDisItem::cmp(int col, DisplayData *fdi) +{ + ChanFileDisItem *other = (ChanFileDisItem *) fdi; + switch(col) + { + case CFDI_COL_SIZE: + { + return size - other->size; + } + break; + + case CFDI_COL_NAME: + { + return strcmp(name.c_str(), + other->name.c_str()); + } + break; + + default: + break; + } + return 0; +} + diff --git a/libretroshare/src/fltkgui/pqibrowseitem.h b/libretroshare/src/fltkgui/pqibrowseitem.h new file mode 100644 index 000000000..fd1497a9d --- /dev/null +++ b/libretroshare/src/fltkgui/pqibrowseitem.h @@ -0,0 +1,219 @@ +/* + * "$Id: pqibrowseitem.h,v 1.7 2007-02-18 21:46:49 rmf24 Exp $" + * + * FltkGUI for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + +#ifndef MRKS_PQI_BROWSER_ITEMS +#define MRKS_PQI_BROWSER_ITEMS + +/* My new funky browser..... + * + * - Designed to sort/display a tree brower + * for search results.... + * + * First we need the basic interface class that + * must wrap the Data.... + */ + +#include "fltkgui/Fl_Funky_Browser.h" +#include "pqi/pqi.h" +#include "pqi/p3channel.h" + +class FileDisItem: public DisplayData +{ + public: + FileDisItem(PQFileItem *i, SearchItem *s) :item(i), terms(s) { return; } + + // a couple of functions that do the work. +virtual int ndix(); // Number of Indices. +virtual std::string txt(int col); +virtual int cmp(int col, DisplayData *); + + PQFileItem *getItem() { return item;} + void setItem(PQFileItem *i) {item = i;} + SearchItem *getSearchItem() { return terms;} + void setSearchItem(SearchItem *s) {terms = s;} + + private: + PQFileItem *item; + SearchItem *terms; +}; + + +class PersonDisItem: public DisplayData +{ + public: + PersonDisItem(Person *i) :item(i), checked(false) { return; } + + // a couple of functions that do the work. +virtual int ndix(); // Number of Indices. +virtual std::string txt(int col); +virtual int cmp(int col, DisplayData *); +virtual int check(int n, int v = -1) + { + if (v == -1) + return (int) checked; + if (v == 0) + return checked = false; + return checked = true; + }; + + Person *getItem() { return item;} + void setItem(Person *i) {item = i;} + + private: + Person *item; + bool checked; +}; + + +class NeighDisItem: public DisplayData +{ + public: + NeighDisItem(Person *i) :item(i) { return; } + + // a couple of functions that do the work. +virtual int ndix(); // Number of Indices. +virtual std::string txt(int col); +virtual int cmp(int col, DisplayData *); + + Person *getItem() { return item;} + void setItem(Person *i) {item = i;} + + private: + Person *item; +}; + + +class MsgDisItem: public DisplayData +{ + public: + MsgDisItem(MsgItem *i) :item(i) { return; } + + // a couple of functions that do the work. +virtual int ndix(); // Number of Indices. +virtual std::string txt(int col); +virtual int cmp(int col, DisplayData *); + + MsgItem *getItem() { return item;} + void setItem(MsgItem *i) {item = i;} + + private: + MsgItem *item; +}; + + +class FTDisItem: public DisplayData +{ + public: + FTDisItem(FileTransferItem *i) :item(i) { return; } + + // a couple of functions that do the work. +virtual int ndix(); // Number of Indices. +virtual std::string txt(int col); +virtual int cmp(int col, DisplayData *); + + FileTransferItem *getItem() { return item;} + void setItem(FileTransferItem *i) {item = i;} + + private: + FileTransferItem *item; +}; + +/* NOTE The Channel classes should be changed to just + * carry the channelSign around.... this is enough + * to refer to the channels.... + * + * don't want pointers to pqichannels.... + */ + +class ChanDisItem: public DisplayData +{ + public: + ChanDisItem(pqichannel *i); + + // a couple of functions that do the work. +virtual int ndix(); // Number of Indices. +virtual std::string txt(int col); +virtual int cmp(int col, DisplayData *); +virtual int check(int n, int v = -1) + { + if (v == -1) + return (int) checked; + if (v == 0) + return checked = false; + return checked = true; + }; + + public: + + channelSign cs; + int mode; + std::string name; + float ranking; + int msgcount; + + bool checked; // subscribed.. +}; + + +class ChanMsgDisItem: public DisplayData +{ + public: + ChanMsgDisItem(chanMsgSummary &s); + + // a couple of functions that do the work. +virtual int ndix(); // Number of Indices. +virtual std::string txt(int col); +virtual int cmp(int col, DisplayData *); + + public: + + std::string msg; + MsgHash mh; + int nofiles; + int totalsize; + long recvd; + +}; + +class ChanFileDisItem: public DisplayData +{ + public: + ChanFileDisItem(std::string n, int s); + + // a couple of functions that do the work. +virtual int ndix(); // Number of Indices. +virtual std::string txt(int col); +virtual int cmp(int col, DisplayData *); + + //private: + std::string name; + int size; +}; + + +#endif + diff --git a/libretroshare/src/fltkgui/pqistrings.cc b/libretroshare/src/fltkgui/pqistrings.cc new file mode 100644 index 000000000..8db222426 --- /dev/null +++ b/libretroshare/src/fltkgui/pqistrings.cc @@ -0,0 +1,745 @@ +/* + * "$Id: pqistrings.cc,v 1.11 2007-02-18 21:46:49 rmf24 Exp $" + * + * FltkGUI for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "pqi/pqi.h" +#include "pqi/pqinetwork.h" + +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + +#include "pqi/xpgpcert.h" + +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + +#include "pqi/sslcert.h" + +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + +#include "fltkgui/pqistrings.h" + +#include +#include +#include +#include + +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) +std::string getXPGPInfo(XPGP *cert); +#endif /* XPGP Certificates */ +/**************** PQI_USE_XPGP ******************/ + +std::string get_status_string(int status) +{ + std::string sstr(""); + if (status & PERSON_STATUS_CONNECTED) + { + sstr += "Online"; + return sstr; + } + if (!(status & PERSON_STATUS_ACCEPTED)) + { + sstr += "Denied Access"; + return sstr; + } + + if (status & PERSON_STATUS_INUSE) + { + sstr += "Connecting"; + /* + if (status & PERSON_STATUS_WILL_LISTEN) + { + sstr += "Listening"; + } + sstr += "/"; + if (status & PERSON_STATUS_WILL_CONNECT) + { + sstr += "Connecting"; + } + sstr += "]"; + */ + return sstr; + } + sstr += "Unknown"; + return sstr; +} + + +std::string get_neighbourstatus_string(Person *p) +{ + // if connected - show how long + // if !autoconnected - tick to connect. + // + // if connecting. + // show time to next connect attempt. + // else show the last connect time. + + std::ostringstream connstr; + + connstr << "Last Conn/Recv: "; + int lct = time(NULL) - p -> lc_timestamp; + int lrt = time(NULL) - p -> lr_timestamp; + if (lct < 100000000) + { + connstr << get_timeperiod_string(lct); + } + else + { + connstr << "Never"; + } + connstr << "/"; + if (lrt < 100000000) + { + connstr << get_timeperiod_string(lrt); + } + else + { + connstr << "Never"; + } + + return connstr.str(); +} + + +int get_lastconnecttime(Person *p) +{ + std::ostringstream connstr; + + int lct = time(NULL) - p -> lc_timestamp; + int lrt = time(NULL) - p -> lr_timestamp; + if (lrt < lct) + { + lct = lrt; + } + return lct; +} + +std::string get_lastconnecttime_string(Person *p) +{ + int lct = get_lastconnecttime(p); + if (lct < 32000000) + { + return get_timeperiod_string(lct); + } + else + { + return std::string("Never"); + } +} + + +std::string get_autoconnect_string(Person *p) +{ + // if connected - show how long + // if !autoconnected - tick to connect. + // + // if connecting. + // show time to next connect attempt. + // else show the last connect time. + + std::ostringstream connstr; + + Person *own = getSSLRoot() -> getOwnCert(); + if (p == own) + { + connstr << "Yourself"; + return connstr.str(); + } + + if (p -> Connected()) + { + /* + long ct = p->lc_timestamp; + if (ct < p->lr_timestamp) + ct = p->lr_timestamp; + + connstr << "Online: " << get_timeperiod_string(time(NULL) - ct); + */ + connstr << "Online"; + } + else if (p -> Manual()) + { + if (p->trustLvl < TRUST_SIGN_AUTHEN) + { + connstr << "Please Authenticate"; + } + else + { + connstr << "Tick to Connect"; + } + } + else + { + connstr << "Offline"; + } + + /* + else if (p -> WillConnect()) + { + connstr << "Connect in:"; + connstr << get_timeperiod_string(p->nc_timestamp - time(NULL)); + } + else + { + connstr << "Last Conn:"; + long ct = p->lc_timestamp; + if (ct < p->lr_timestamp) + { + ct = p->lr_timestamp; + connstr << "(I):"; + } + else + { + connstr << "(O):"; + } + connstr << get_timeperiod_string(time(NULL) - ct); + } + */ + + return connstr.str(); +} + + +std::string get_trust_string(Person *p) +{ + std::ostringstream srvstr; + + /* This is now changing to display 2 things. + * + * (1) - Proxy + * (2) - Auth Level. + */ + + Person *own = getSSLRoot() -> getOwnCert(); + if (p == own) + { + srvstr << "Yourself"; // Certificate"; + return srvstr.str(); + } + + switch(p -> trustLvl) + { + case TRUST_SIGN_OWN: + srvstr << "Auth (S)"; //Good: Own Signature"; + break; + case TRUST_SIGN_TRSTED: + srvstr << "Trusted (ST)"; //Good: Trusted Signer"; + break; + case TRUST_SIGN_AUTHEN: + srvstr << "Auth"; //Good: Authenticated"; + break; + case TRUST_SIGN_BASIC: + srvstr << "Untrusted"; // : Acquaintance "; + break; + case TRUST_SIGN_UNTRUSTED: + srvstr << "Unknown (2)"; + break; + case TRUST_SIGN_UNKNOWN: + srvstr << "Unknown (1)"; + break; + case TRUST_SIGN_NONE: + srvstr << "Unknown (0)"; + break; + case TRUST_SIGN_BAD: /* not checked yet */ + srvstr << "Not Avail"; + break; + default: + srvstr << "UNKNOWN"; + break; + } + return srvstr.str(); +} + + + +std::string get_server_string(Person *p) +{ + std::ostringstream srvstr; + + if ((0 == inaddr_cmp(p -> serveraddr, 0)) || (p -> Local())) + { + if (0 == inaddr_cmp(p -> localaddr, 0)) + { + srvstr << "Unknown Addr"; + } + else + { + srvstr << "L: " << inet_ntoa(p -> localaddr.sin_addr); + srvstr << ":" << ntohs(p -> localaddr.sin_port); + } + } + else + { + srvstr << "S: " << inet_ntoa(p -> serveraddr.sin_addr); + srvstr << ":" << ntohs(p -> serveraddr.sin_port); + } + + // need own cert! + Person *own = getSSLRoot() -> getOwnCert(); + + if ((isValidNet(&(p->serveraddr.sin_addr))) && + (!isPrivateNet(&(p->serveraddr.sin_addr))) && + (!sameNet(&(own->localaddr.sin_addr), &(p->serveraddr.sin_addr)))) + { + srvstr << " (Proxy-S) "; + } + else if ((!p->Firewalled()) && (isValidNet(&(p->localaddr.sin_addr))) && + (!isPrivateNet(&(p->localaddr.sin_addr))) && + (!sameNet(&(own->localaddr.sin_addr), &(p->localaddr.sin_addr)))) + { + srvstr << " (Proxy-L) "; + } + return srvstr.str(); +} + +const int sec_per_min = 60; +const int sec_per_hour = 3600; +const int sec_per_day = 3600 * 24; + +std::string get_timeperiod_string(int secs) +{ + + int days = secs / sec_per_day; + secs -= days * sec_per_day; + int hours = secs / sec_per_hour; + secs -= hours * sec_per_hour; + int mins = secs / sec_per_min; + secs -= mins * sec_per_min; + + std::ostringstream srvstr; + + if (days > 0) + { + srvstr << days << " days "; + } + else if (hours > 0) + { + srvstr << hours << ":" << mins << " hours"; + } + else + { + srvstr << mins << ":" << secs << " min"; + } + return srvstr.str(); +} + +std::string get_neighbour_info(cert *c) +{ + std::ostringstream ostr; + +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + ostr << getX509CNString(c -> certificate -> subject -> subject); +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + ostr << getX509CNString(c -> certificate -> cert_info -> subject); +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + + + ostr << "\t" << get_neighbourstatus_string(c); + return ostr.str(); +} + +std::string get_cert_info(cert *c) +{ + std::ostringstream ostr; + ostr << "************ Certificate **************" << std::endl; +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + ostr << getXPGPInfo(c -> certificate); +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + ostr << getX509Info(c -> certificate); +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + ostr << "********** Connection Info ************" << std::endl; + ostr << "Local Addr : " << inet_ntoa(c -> localaddr.sin_addr); + ostr << ":" << ntohs(c -> localaddr.sin_port) << std::endl; + ostr << "Server Addr : " << inet_ntoa(c -> serveraddr.sin_addr); + ostr << ":" << ntohs(c -> serveraddr.sin_port) << std::endl; + ostr << "FLAGS: "; + if (!c -> Firewalled()) + { + ostr << "Not "; + } + ostr << "Firewalled, "; + if (!c -> Forwarded()) + { + ostr << "Not "; + } + ostr << "Forwarded" << std::endl; + ostr << std::endl; + + + ostr << "Last Connect Addr: " << inet_ntoa(c -> lastaddr.sin_addr); + ostr << ":" << ntohs(c -> lastaddr.sin_port) << std::endl; + + ostr << "Last Connect Time: "; + ostr << get_timeperiod_string(time(NULL) - c -> lc_timestamp); + ostr << std::endl; + ostr << "Last Receive Time: "; + ostr << get_timeperiod_string(time(NULL) - c -> lr_timestamp); + ostr << std::endl; + ostr << std::endl; + + ostr << "Next Connect in : "; + ostr << get_timeperiod_string(c->nc_timestamp - time(NULL)); + ostr << std::endl; + + ostr << "AutoConnect: " << get_autoconnect_string(c); + ostr << std::endl; + + ostr << "***************************************" << std::endl; + + return ostr.str(); +} + + +std::string getX509Info(X509 *cert) +{ + // Details from the structure + // cert_info (X509_CINF *) + // sig_alg (X509_ALGOR *) + // signature (ASN1_BIT_STRING *) + // valid (int) + // references (int) + // name (char *) + // + // random flags + // + // skid (ASN1_OCTET_STRING *) + // akid (AUTHORITY_KEYID *) + // aux (X509_CERT_AUX *) + std::string certstr; + char numstr[1000]; + + sprintf(numstr, "%ld", ASN1_INTEGER_get(cert -> cert_info -> version)); + certstr += "Version: "; + certstr += numstr; + + sprintf(numstr, "%ld", ASN1_INTEGER_get(cert -> + cert_info -> serialNumber)); + certstr += "\nSerial Number: "; + certstr += numstr; + +// switch(cert -> cert_info -> signature) +// { +// case STANDRD: +// certstr += "\nSig Algorithm: Standard"; +// break; +// default: +// certstr += "\nSig Algorithm: Unknown"; +// break; +// } +// + + + certstr += "\nSubject:\n"; + certstr += getX509NameString(cert -> cert_info -> subject); + + // Validity in Here. cert -> cert_info -> validity; + + certstr += "\nIssuer:\n"; + certstr += getX509NameString(cert -> cert_info -> issuer); + + // Key cert -> cert_info -> key; + // + // IDS + extensions. cert -> cert_info -> issuerUID/subjectUID; + // cert -> cert_info -> extensions; + + // END OF INFO. + + // Next sigalg again? + // next sig... + certstr += "\nSignature:"; + for(int i = 0; i < cert -> signature -> length;) + { + if (i % 128 == 0) + { + certstr += "\n\t"; + } + char hbyte = 0; + for(int j = 0; (j < 4) && (i < cert -> signature -> length); + j++, i++) + { + hbyte = hbyte << 1; + if (ASN1_BIT_STRING_get_bit(cert -> signature, i) == 1) + { + hbyte++; + //std::cerr << "1"; + } + else + { + //std::cerr << "0"; + } + } + if (hbyte > 9) + { + certstr += ('a' + (hbyte - 10)); + } + else + { + certstr += ('0' + hbyte); + } + //std::cerr << " " << i << " " << (char) ('0' + hbyte); + //std::cerr << " " << (int) hbyte << std::endl; + } + + + sprintf(numstr, "%d/%d", cert -> valid, cert -> references); + certstr += "\nValid/References: "; + certstr += numstr; + certstr += "\n"; + + // That will do for now. + return certstr; +} + +/* Helper function to convert a Epoch Timestamp + * into a string. + */ + +static char *TIME_FORMAT_STR_BRIEF = "%H:%M:%S"; +static char *TIME_FORMAT_STR_OLDVAGUE_NOW = "%H:%M:%S"; +static char *TIME_FORMAT_STR_OLDVAGUE_WEEK = "%a %H:%M"; +static char *TIME_FORMAT_STR_OLDVAGUE_OLD = "%a, %d %b"; +static char *TIME_FORMAT_STR_LONG = "%c"; +static char *TIME_FORMAT_STR_NORMAL = "%a, %H:%M:%S"; + +std::string timeFormat(int epoch, int format) +{ + time_t ctime = epoch; + struct tm *stime = localtime(&ctime); + + size_t msize = 1024; + char space[msize]; + char *fmtstr = NULL; + + if (format == TIME_FORMAT_OLDVAGUE) + { + int itime = time(NULL); + int delta = abs(itime - ctime); + if (delta < 12 * 3600) + { + format = TIME_FORMAT_OLDVAGUE_NOW; + } + else if (delta < 3 * 24 * 3600) + { + format = TIME_FORMAT_OLDVAGUE_WEEK; + } + else + { + format = TIME_FORMAT_OLDVAGUE_OLD; + } + } + + switch(format) + { + case TIME_FORMAT_BRIEF: + fmtstr = TIME_FORMAT_STR_BRIEF; + break; + case TIME_FORMAT_OLDVAGUE_NOW: + fmtstr = TIME_FORMAT_STR_OLDVAGUE_NOW; + break; + case TIME_FORMAT_OLDVAGUE_WEEK: + fmtstr = TIME_FORMAT_STR_OLDVAGUE_WEEK; + break; + case TIME_FORMAT_OLDVAGUE_OLD: + fmtstr = TIME_FORMAT_STR_OLDVAGUE_OLD; + break; + case TIME_FORMAT_LONG: + fmtstr = TIME_FORMAT_STR_LONG; + break; + case TIME_FORMAT_NORMAL: + default: + fmtstr = TIME_FORMAT_STR_NORMAL; + break; + } + + if (fmtstr != NULL) // Short -> Only Time. + { + int usize = strftime(space, msize, fmtstr, stime); + if (usize > 0) + return std::string(space); + } + return std::string(""); +} + +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + + +std::string getXPGPInfo(XPGP *cert) +{ + std::stringstream out; + long l; + int i,j; + + out << "XPGP Certificate:" << std::endl; + l=XPGP_get_version(cert); + out << " Version: " << l+1 << "(0x" << l << ")" << std::endl; + out << " Subject: " << std::endl; + out << " " << getX509NameString(cert -> subject -> subject); + out << std::endl; + out << std::endl; + out << " Signatures:" << std::endl; + + for(i = 0; i < sk_XPGP_SIGNATURE_num(cert->signs); i++) + { + out << "Sign[" << i << "] -> ["; + + XPGP_SIGNATURE *sig = sk_XPGP_SIGNATURE_value(cert->signs,i); + ASN1_BIT_STRING *signature = sig->signature; + int signlen = ASN1_STRING_length(signature); + unsigned char *signdata = ASN1_STRING_data(signature); + + /* only show the first 8 bytes */ + if (signlen > 8) + signlen = 8; + for(j=0;jissuer); + out << std::endl; + out << std::endl; + } + + return out.str(); +} + + + +std::string getXPGPAuthCode(XPGP *xpgp) +{ + /* get the self signature -> the first signature */ + + std::stringstream out; + if (1 > sk_XPGP_SIGNATURE_num(xpgp->signs)) + { + out.str(); + } + + XPGP_SIGNATURE *sig = sk_XPGP_SIGNATURE_value(xpgp->signs,0); + ASN1_BIT_STRING *signature = sig->signature; + int signlen = ASN1_STRING_length(signature); + unsigned char *signdata = ASN1_STRING_data(signature); + + /* extract the authcode from the signature */ + /* convert it to a string, inverse of 2 bytes of signdata */ + if (signlen > 2) + signlen = 2; + int j; + for(j=0;j getXPGPsigners(XPGP *cert) +{ + std::list signers; + int i; + + for(i = 0; i < sk_XPGP_SIGNATURE_num(cert->signs); i++) + { + XPGP_SIGNATURE *sig = sk_XPGP_SIGNATURE_value(cert->signs,i); + std::string str = getX509CNString(sig->issuer); + signers.push_back(str); + std::cerr << "XPGPsigners(" << i << ")" << str << std::endl; + } + return signers; +} + + +#endif /* XPGP Certificates */ +/**************** PQI_USE_XPGP ******************/ + + +std::string get_cert_name(cert *c) +{ +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + return getX509CNString(c->certificate->subject -> subject); +#else + return getX509CNString(c->certificate->cert_info -> subject); +#endif /* XPGP Certificates */ +/**************** PQI_USE_XPGP ******************/ +} + +std::string get_cert_org(cert *c) +{ +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + return getX509OrgString(c->certificate->subject -> subject); +#else + return getX509OrgString(c->certificate->cert_info -> subject); +#endif /* XPGP Certificates */ +/**************** PQI_USE_XPGP ******************/ +} + +std::string get_cert_loc(cert *c) +{ +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + return getX509LocString(c->certificate->subject -> subject); +#else + return getX509LocString(c->certificate->cert_info -> subject); +#endif /* XPGP Certificates */ +/**************** PQI_USE_XPGP ******************/ +} + +std::string get_cert_country(cert *c) +{ +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + return getX509CountryString(c->certificate->subject -> subject); +#else + return getX509CountryString(c->certificate->cert_info -> subject); +#endif /* XPGP Certificates */ +/**************** PQI_USE_XPGP ******************/ +} + + + + + diff --git a/libretroshare/src/fltkgui/pqistrings.h b/libretroshare/src/fltkgui/pqistrings.h new file mode 100644 index 000000000..e79cf77ed --- /dev/null +++ b/libretroshare/src/fltkgui/pqistrings.h @@ -0,0 +1,79 @@ +/* + * "$Id: pqistrings.h,v 1.6 2007-02-18 21:46:49 rmf24 Exp $" + * + * FltkGUI for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + +#ifndef PQI_STRINGS_H +#define PQI_STRINGS_H + +#include +#include + +class Person; +class cert; + +#include + +std::string get_cert_country(cert *c); +std::string get_cert_loc(cert *c); +std::string get_cert_org(cert *c); +std::string get_cert_name(cert *c); + +std::string get_status_string(int status); +std::string get_autoconnect_string(Person *p); +std::string get_server_string(Person *p); +std::string get_trust_string(Person *p); +std::string get_timeperiod_string(int secs); + +std::string get_cert_info(cert *c); +std::string get_neighbour_info(cert *c); + +int get_lastconnecttime(Person *p); +std::string get_lastconnecttime_string(Person *p); + +std::string getX509NameString(X509_NAME *name); +std::string getX509Info(X509 *cert); +std::string getX509CNString(X509_NAME *name); + +#define TIME_FORMAT_BRIEF 0x001 +#define TIME_FORMAT_LONG 0x002 +#define TIME_FORMAT_NORMAL 0x003 +#define TIME_FORMAT_OLDVAGUE 0x004 +#define TIME_FORMAT_OLDVAGUE_NOW 0x005 +#define TIME_FORMAT_OLDVAGUE_WEEK 0x006 +#define TIME_FORMAT_OLDVAGUE_OLD 0x007 + +std::string timeFormat(int epoch, int format); + +#if defined(PQI_USE_XPGP) + +std::string getXPGPInfo(XPGP *cert); +std::string getXPGPAuthCode(XPGP *xpgp); +std::list getXPGPsigners(XPGP *cert); + +#endif /* XPGP Certificates */ + + +#endif diff --git a/libretroshare/src/fltkgui/retrotray.cc b/libretroshare/src/fltkgui/retrotray.cc new file mode 100644 index 000000000..6c74ae571 --- /dev/null +++ b/libretroshare/src/fltkgui/retrotray.cc @@ -0,0 +1,338 @@ +/* + * "$Id: retrotray.cc,v 1.5 2007-02-18 21:46:49 rmf24 Exp $" + * + * FltkGUI for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 +#include +#include + +#include "fltkgui/retroTray.h" +#include "pqi/pqidebug.h" + +static retroTray tray; +static NOTIFYICONDATA s_nid; +static std::string icn_path; + + +int SetIconPath(const char *iconpath) +{ + icn_path = iconpath; + return 1; +} + + +int InitialiseRetroTray(HINSTANCE hi, HICON icn, UserInterface *ui) +{ + tray.init(hi); + + std::string iconpath = "/programs/icons"; + std::string fname = "tst.ico"; + + // for now install a default one. +// if (icn == (HICON) NULL) + { + //icn = LoadCursorFromFile(fname.c_str()); + icn = LoadCursorFromFile(icn_path.c_str()); + //icn = (HICON) LoadImage(hi, fname.c_str(), IMAGE_ICON, 16, 16, 0); + std::cerr << "Loaded ICON: " << icn << std::endl; + } + + //tray.loadIcons(iconpath); + tray.installIcon(icn, ui); + +// while(1) +// Sleep(1000); + return 1; +} + + + + +static LRESULT CALLBACK systray_handler(HWND hwnd, UINT msg, WPARAM type0, LPARAM type) { + static UINT taskbarRestartMsg; /* static here means value is kept across multiple calls to this func */ + + + std::cerr << "Call of The Handler(" << msg << ","; + std::cerr << type0 << "," << type << ")" << std::endl; + + switch(msg) { + case WM_CREATE: + std::cerr << "WM_CREATE"; + //taskbarRestartMsg = RegisterWindowMessage("TaskbarCreated"); + break; + + case WM_TIMER: + std::cerr << "WM_TIMER"; + break; + + case WM_DESTROY: + std::cerr << "WM_DESTROY"; + break; + + case WM_USER: + { + std::cerr << "WM_USER"; + tray.buttonPressed(type0, type); + break; + } + default: + std::cerr << "default"; + if (msg == taskbarRestartMsg) + { + std::cerr << " RESTART MSG"; + //tray.InstallIcon(0); + } + break; + } + + std::cerr << std::endl; + //return CallDefWindowProc(hwnd, msg, type0, type); + return CallWindowProc(DefWindowProc, hwnd, msg, type0, type); +} + + +retroTray::retroTray() + :hInst(0) +{ + //ZeroMemory(&hwin, sizeof(hwin)); + ZeroMemory(&nid, sizeof(nid)); + return; +} + + +int retroTray::init(HINSTANCE hi) +{ + hInst = hi; + return 1; +} + + +int retroTray::installIcon(HICON ic, UserInterface *ui) +{ + retroRoot = ui; + hIcon = ic; +//(HICON) IDI_QUESTION; +//icn; + + // First create hidden window (could be RetroShare) + if (nid.cbSize!=sizeof(NOTIFYICONDATA)) + { + WNDCLASSEX wcex; + wcex.style = 0; + wcex.cbClsExtra = 0; + wcex.cbWndExtra = 0; + wcex.hIcon = NULL; + wcex.hIconSm = NULL; + wcex.hCursor = NULL; + wcex.hbrBackground = NULL; + wcex.lpszMenuName = NULL; + wcex.lpszClassName = "retroTray"; + + wcex.hInstance = hInst; + wcex.lpfnWndProc = (WNDPROC) systray_handler; + wcex.cbSize = sizeof(WNDCLASSEX); + + RegisterClassEx(&wcex); + + hWnd = CreateWindow("retroTray", "", 0,0,0,0,0, + GetDesktopWindow(), NULL, hInst, 0); + + std::cerr << "Created Hidden Window" << std::endl; + } + + ZeroMemory(&nid, sizeof(nid)); + nid.hWnd = hWnd; + nid.uID = 0; //nextid++; + nid.uFlags= NIF_ICON | NIF_MESSAGE | NIF_TIP; + nid.uCallbackMessage=WM_USER; + nid.hIcon=hIcon; + + strcpy(nid.szTip, "Hello World from RetroShare"); + nid.cbSize=sizeof(NOTIFYICONDATA); + + s_nid = nid; + + if (Shell_NotifyIcon(NIM_ADD, &s_nid)) + { + std::cerr << "Notify Success" << std::endl; + } + else + { + std::cerr << "Notify Failure" << std::endl; + } + + std::cerr << "Icon Installed??" << std::endl; + return 1; +} + +int retroTray::buttonPressed(int type0, int type) +{ + std::cerr << "retroTray::buttonPressed(" << type0; + std::cerr << "," << type << ")" << std::endl; + + if (type == WM_LBUTTONDBLCLK) + { + std::cerr << "Showing RetroShare!" << std::endl; + showRetroShare(); + } + else if (type == WM_LBUTTONUP) + { + std::cerr << "Showing RetroShare(B)!" << std::endl; + showRetroShare(); + } + else if (type == WM_MBUTTONUP) + { + std::cerr << "Hiding RetroShare!" << std::endl; + hideRetroShare(); + } + else if (type == WM_RBUTTONDOWN) + { + std::cerr << "Showing TaskMenu!" << std::endl; + showTrayMenu(); + } + else //if (type == WM_RBUTTONUP) + { + std::cerr << "Leaving RetroShare!" << std::endl; + // do nothing. + } + return 1; +} + +// +//int retroTray::addIcon() +//{ +// return 1; +//} +// +// +//int retroTray::removeIcon() +//{ +// return 1; +//} +// +// +//int retroTray::exitCall() +//{ +// // if +//static int times = 0; +// if (++times > 20) +// removeIcon(); +// return 1; +//} +// +// +// + + + +#define RTRAY_MENU_NULL 0 +#define RTRAY_MENU_HIDE 1 +#define RTRAY_MENU_SHOW 2 +#define RTRAY_MENU_QUIT 3 + + +int retroTray::showTrayMenu(void) +{ + long menuChoice; + +// First We need a Menu. + HMENU popup; + unsigned int flag; + + popup = ::CreatePopupMenu(); + + flag = MF_BYPOSITION; + ::InsertMenu(popup, 0, flag, RTRAY_MENU_QUIT, "Quit"); + flag = MF_BYPOSITION | MF_SEPARATOR; + ::InsertMenu(popup, 0, flag, 0x000, "Seperator"); + flag = MF_BYPOSITION; + ::InsertMenu(popup, 0, flag, RTRAY_MENU_HIDE, "Hide RetroShare"); + ::InsertMenu(popup, 0, flag, RTRAY_MENU_SHOW, "Open RetroShare"); + + flag = MF_BYPOSITION | MF_SEPARATOR; + ::InsertMenu(popup, 0, flag, 0x000, "Seperator"); + flag = MF_BYPOSITION; + ::InsertMenu(popup, 0, flag, 0x001, "About RetroShare"); + + POINT pp; + + RECT rect; + rect.left = 0; + rect.top = 0; + rect.right = 1000; + rect.bottom = 1000; + + ::GetCursorPos(&pp); + menuChoice = ::TrackPopupMenu(popup, + TPM_LEFTALIGN | + TPM_LEFTBUTTON | + TPM_RIGHTBUTTON | + TPM_NONOTIFY | + TPM_RETURNCMD, + pp.x,pp.y, 0, hWnd, &rect); + ::DestroyMenu(popup); + + // The value of SelectionMade is the id of the command selected or 0 if no + // selection was made + + + switch(menuChoice) + { + case RTRAY_MENU_NULL: +/* + AfxMessageBox("Starting Null"); +*/ + break; + + case RTRAY_MENU_HIDE: + hideRetroShare(); + break; + case RTRAY_MENU_SHOW: + showRetroShare(); + break; + + case RTRAY_MENU_QUIT: + /* before exiting - clear the debug log */ + clearDebugCrashLog(); + exit(1); + break; + } + return 1; +} + + +/********************** +HWND CreateDialog( + + HINSTANCE hInstance, + LPCTSTR lpTemplate, + HWND hWndParent, + DLGPROC lpDialogFunc +); + +**********************/ + diff --git a/libretroshare/src/fltkgui/retrotray.h b/libretroshare/src/fltkgui/retrotray.h new file mode 100644 index 000000000..0d17780a7 --- /dev/null +++ b/libretroshare/src/fltkgui/retrotray.h @@ -0,0 +1,112 @@ +/* + * "$Id: retrotray.h,v 1.5 2007-02-18 21:46:49 rmf24 Exp $" + * + * FltkGUI for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + +#ifndef MRK_RETRO_TRAY_H +#define MRK_RETRO_TRAY_H + +/** + * + * This class encapsulates the windows? system tray icon. + * + */ + +#include +#include +#include +//#include +//#include +#include +#include + +// The Gui type of Window. +#include "fltkgui/guitab.h" + +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + +#include "pqi/xpgpcert.h" + +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + +#include "pqi/sslcert.h" + +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + +int SetIconPath(const char *path); + +int InitialiseRetroTray(HINSTANCE hi, HICON icn, UserInterface *ui); + +class retroTray +{ + +public: + retroTray(); +int init(HINSTANCE hi); +int installIcon(HICON icn, UserInterface *ui); + +int buttonPressed(int, int); +private: +void showRetroShare() +{ + if (getSSLRoot() -> active()) + { + retroRoot -> main_win -> show(); + visible = true; + } + else + { + retroRoot -> welcome_window -> show(); + } +} + +void hideRetroShare() +{ + retroRoot -> main_win -> hide(); + retroRoot -> welcome_window -> hide(); + retroRoot -> alert_window -> hide(); + retroRoot -> chatter_window -> hide(); + + visible = false; +} + +int showTrayMenu(); + + HINSTANCE hInst; + HWND hWnd; + HICON hIcon; + NOTIFYICONDATA nid; + UserInterface *retroRoot; + bool visible; +}; + + +#endif + + + diff --git a/libretroshare/src/licence b/libretroshare/src/licence new file mode 100644 index 000000000..0f1320391 --- /dev/null +++ b/libretroshare/src/licence @@ -0,0 +1,27 @@ +/* + * "$Id: licence,v 1.1 2007-02-18 21:46:42 rmf24 Exp $" + * + * TOU + 3P/PQI + RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + diff --git a/libretroshare/src/make.opt b/libretroshare/src/make.opt new file mode 100644 index 000000000..58715d679 --- /dev/null +++ b/libretroshare/src/make.opt @@ -0,0 +1,249 @@ +#### +#Define OS. +# +OS = Linux +#OS = Cygwin +#OS = Win # MinGw. +# +# +# +# +# +########################################################################### +########################################################################### +# Please Define these Variables before Compiling. (Examples below:) +# Linux (SSL_DIR & KADC_DIR) +# Cygwin (SSL_DIR & KADC_DIR & FLTK_DIR & PTHREADS_DIR) +# MinGW (SSL_DIR & KADC_DIR & FLTK_DIR & PTHREADS_DIR) + +#### Linux/Cygwin Parameters. +#SSL_DIR=/home/xxx/prog/src/openssl-0.9.7g-xpgp-0.1c +#KADC_DIR=/home/xxx/prog/src/KadC +# +#### Cygwin Only.... +#FLTK_DIR=/MinGWlibs/FLTK-1.1.6 +#PTHREADS_DIR=/cygdrive/c/home/dev/prog/MinGw/pthreads/Pre-built.2 +#KADC_DIR=/cygdrive/c/home/dev/prog/MinGW/KadC +#ZLIB_DIR=/cygdrive/c/home/dev/prog/MinGW/zlib-1.2.3 +# +########################################################################### +# My Versions +ifeq ($(OS),Linux) + #Linux. + SSL_DIR=../../../../../../src/openssl-0.9.7g-xpgp-0.1c + KADC_DIR=../../../../../../src/KadC + UPNPC_DIR=../../../../../../src/miniupnpc-20070515 +else +########################################################################### + ifeq ($(OS),Cygwin) + + #Cygwin.... + CYGWIN_SRC_ROOT=/cygdrive/c/home/rmfern/prog/MinGW + SSL_DIR=/home/rmfern/prog/src/openssl-0.9.7g + #SSL_DIR=$(CYGWIN_SRC_ROOT)/openssl-0.9.7g + FLTK_DIR=$(CYGWIN_SRC_ROOT)/FLTK-1.1.6 + PTHREADS_DIR=$(CYGWIN_SRC_ROOT)/pthreads/pthreads.2 + KADC_DIR=$(CYGWIN_SRC_ROOT)/debug/KadC-2006-Oct-19 + ZLIB_DIR=$(CYGWIN_SRC_ROOT)/zlib-1.2.3 + UPNPC_DIR=$(CYGWIN_SRC_ROOT)/libs/src/miniupnpc-20070515 + + else + + #MinGw.... + MINGW_SRC_ROOT=c:\home\rmfern\prog\MinGW + SSL_DIR=$(MINGW_SRC_ROOT)\openssl-0.9.7g + FLTK_DIR=$(MINGW_SRC_ROOT)\FLTK-1.1.6 + PTHREADS_DIR=$(MINGW_SRC_ROOT)\pthreads\pthreads.2 + KADC_DIR=$(MINGW_SRC_ROOT)\debug\KadC-2006-Oct-19 + ZLIB_DIR=$(MINGW_SRC_ROOT)\zlib-1.2.3 + UPNPC_DIR=$(MINGW_SRC_ROOT)\miniupnpc-20070515 + + endif + +########################################################################### +endif +########################################################################### + +ifndef RS_TOP_DIR +dummy: + echo "RS_TOP_DIR is not defined in your makefile" +endif + +RS_DIR=$(RS_TOP_DIR) + +ifndef SSL_DIR +dummy: + echo "you must define SSL_DIR before you can compile" + +endif + +ifndef KADC_DIR +dummy: + echo "you must define KADC_DIR before you can compile" + +endif + +ifneq ($(OS),Linux) +# no longer dependancy +# ifndef FLTK_DIR +#dummy: +# echo "you must define FLTK_DIR before you can compile" + +# endif +# + ifndef PTHREADS_DIR +dummy: + echo "you must define PTHREADS_DIR before you can compile" + + endif +endif + +############ ENFORCE DIRECTORY NAMING ######################## + +CC = g++ + + +# flags for components.... +PQI_USE_XPGP = 1 +PQI_USE_PROXY = 1 +#PQI_USE_CHANNELS = 1 +USE_FILELOOK = 1 + +ifeq ($(OS),Win) + # MinGw + INCLUDE = -I $(RS_DIR) -I$(KADC_DIR) + ifdef PQI_USE_XPGP + INCLUDE += -I $(SSL_DIR)\include + endif +else + # Unix: Linux/Cygwin + INCLUDE = -I $(RS_DIR) -I$(KADC_DIR) + ifdef PQI_USE_XPGP + INCLUDE += -I $(SSL_DIR)/include + endif +endif + +CFLAGS = -Wall -g $(INCLUDE) + +RANLIB = ranlib +LIBRS = ../lib/libretroshare.a +RSCFLAGS = -Wall -g $(INCLUDE) + +ifdef PQI_USE_XPGP + CFLAGS += -DPQI_USE_XPGP +endif + +ifdef PQI_USE_PROXY + CFLAGS += -DPQI_USE_PROXY +endif + +ifdef PQI_USE_CHANNELS + CFLAGS += -DPQI_USE_CHANNELS +endif + +ifdef USE_FILELOOK + CFLAGS += -DUSE_FILELOOK +endif + + +######################################################################### +# OS specific Includes/Libs. +# LINUX... +ifeq ($(OS),Linux) + + + # XLIBS arent needed for basic libretroshare. + # only needed for FLTK interface. + + #XLIB = -lXft -lpthread -lXext -lX11 \ + # -lXrender -lexpat -L/usr/X11R6/lib -lXau \ + # -lXinerama -lXdmcp -lXext \ + # -lfontconfig -lfreetype -lz + + RM = /bin/rm + + LIBDIR = $(RS_DIR)/lib + LIBS = -L$(LIBDIR) -lretroshare + ifdef PQI_USE_XPGP + LIBS += -L$(SSL_DIR) + endif + LIBS += -lssl -lcrypto -lpthread + LIBS += -L$(KADC_DIR) -lKadC + LIBS += -L$(UPNPC_DIR) -lminiupnpc + LIBS += $(XLIB) -ldl -lz + + RSLIBS = $(LIBS) + +else # windows (Cygwin or MinGW) + +# for static pthread libs.... +WININC += -DPTW32_STATIC_LIB +WINLIB = -lws2_32 -luuid -lole32 -liphlpapi + + ifeq ($(OS),Cygwin) + # Cygwin + WININC += -mno-cygwin -mwindows -fno-exceptions -fomit-frame-pointer -DWINDOWS_SYS + WINLIB += -lcrypt32 + + # Cygwin + #CFLAGS += -I$(FLTK_DIR)/include + CFLAGS += -I$(PTHREADS_DIR) $(WININC) + CFLAGS += -I$(ZLIB_DIR) + + LIBDIR = $(RS_DIR)/lib + LIBS = -L$(LIBDIR) -lretroshare + ifdef PQI_USE_XPGP + LIBS += -L$(SSL_DIR) + endif + LIBS += -lssl -lcrypto + LIBS += -L$(KADC_DIR) -lKadC + LIBS += -L$(UPNPC_DIR) -lminiupnpc + LIBS += -L$(ZLIB_DIR) -lz + + RSLIBS += $(LIBS) + RSLIBS += -L$(PTHREADS_DIR) -lpthreadGC2d + + RSLIBS += $(WINLIB) + LIBS += $(WINLIB) + + + RSCFLAGS += $(WININC) + + RM = /bin/rm + + else # MinGw. + + #WININC += -mwindows -fno-exceptions -fomit-frame-pointer -DWINDOWS_SYS + WININC += -frtti -fexceptions -DWINDOWS_SYS + WINLIB += -lcrypt32-cygwin + + # Cygwin + CFLAGS += -I$(PTHREADS_DIR) $(WININC) + CFLAGS += -I$(ZLIB_DIR) + #CFLAGS += -I$(FLTK_DIR)\include + + LIBDIR = $(RS_DIR)\lib + LIBS = -L$(LIBDIR) -lretroshare + ifdef PQI_USE_XPGP + LIBS += -L$(SSL_DIR) + endif + LIBS += -lssl -lcrypto + LIBS += -L$(KADC_DIR) -lKadC + LIBS += -L$(UPNPC_DIR) -lminiupnpc + LIBS += -L$(ZLIB_DIR) -lz + + RSLIBS = $(LIBS) + RSLIBS += -L$(PTHREADS_DIR) -lpthreadGC2d + + LIBS += $(WINLIB) + RSLIBS += $(WINLIB) + + + RSCFLAGS += $(WININC) + + RM = del + endif +endif + + + diff --git a/libretroshare/src/pqi/Makefile b/libretroshare/src/pqi/Makefile new file mode 100644 index 000000000..ca252b644 --- /dev/null +++ b/libretroshare/src/pqi/Makefile @@ -0,0 +1,89 @@ + +RS_TOP_DIR = .. +include ../make.opt + +# All the executables that should be generated. +EXECS = # test_p3items + +BASE_OBJ = pqi_base.o pqi.o pqipacket.o \ + pqidebug.o pqisecurity.o pqinetwork.o \ + pqistreamer.o pqibin.o pqimon.o + +TUNN_OBJ = pqitunnel.o pqitunneltst.o +LOOP_OBJ = pqiloopback.o p3loopback.o +DISC_OBJ = discItem.o p3disc.o + +ifdef PQI_USE_XPGP + SSL_OBJ = xpgpcert.o +# Disabled for release... EXECS += p3supernode +else + SSL_OBJ = sslcert.o +endif + +SSL_OBJ += pqissl.o pqiarchive.o pqissllistener.o + +GRP_OBJ = pqiperson.o pqihandler.o pqipersongrp.o + + +UDP_OBJ = pqistunner.o pqiudpproxy.o pqissludp.o pqitunnelproxyudp.o + +PRXY_OBJ = pqiproxy.o pqitunnelproxy.o +CHAN_OBJ = p3channel.o pqichannel.o +SN_OBJ = pqisupernode.o + +OBJ = $(BASE_OBJ) $(TUNN_OBJ) $(LOOP_OBJ) $(DISC_OBJ) \ + $(GRP_OBJ) $(SSL_OBJ) $(CHAN_OBJ) $(PRXY_OBJ) $(UDP_OBJ) + +# Linux only parts. +ifeq ($(OS),Linux) + OBJ += $(SN_OBJ) +endif + +BASE_HDR = pqi_base.h pqi.h pqi_data.h pqipacket.h pqisecurity.h pqinetwork.h \ + pqidebug.h pqistreamer.h pqiarchive.h pqiindic.h pqibin.h +TUNN_HDR = pqitunnel.h pqitunneltst.h +LOOP_HDR = p3loopback.h pqiloopback.h +DISC_HDR = discItem.h p3disc.h +SSL_HDR = pqissl.h pqissllistener.h xpgpcert.h +GPR_HDR = pqihandler.h pqiperson.h pqipersongrp.h +UDP_HDR = pqistunner.h pqiudpproxy.h pqissludp.h pqitunnelproxyudp.h +PRXY_HDR = pqitunnelproxy.h pqiproxy.h +CHAN_HDR = pqichannel.h p3channel.h +SN_HDR = pqisupernode.h + +HDR = $(BASE_HDR) $(TUNN_HDR) $(LOOP_HDR) $(DISC_HDR) \ + $(GRP_HDR) $(SSL_HDR) $(CHAN_HDR) $(PRXY_HDR) $(UDP_HDR) + +LIBPQIA = $(LIBDIR)/libpqi.a +LIBPQISO = $(LIBDIR)/libpqi.so + +# decide on output format...... Lib for Unix, Objs for windows, +ifeq ($(OS),Linux) + +all : librs $(EXECS) + +else + +all : librs + +endif + +librs: $(OBJ) + $(AR) r $(LIBRS) $(OBJ) + $(RANLIB) $(LIBRS) + +$(OBJ) : $(HDR) + +p3supernode: p3supernode.o librs + $(CC) $(CFLAGS) -o p3supernode p3supernode.o $(RSLIBS) + +.cc.o: + $(CC) $(CFLAGS) -c $< + +clean: + -/bin/rm $(OBJ) p3supernode.o + +clobber: clean + -/bin/rm $(EXECS) $(LIBPQIA) $(LIBPQISO) + + diff --git a/libretroshare/src/pqi/discItem.cc b/libretroshare/src/pqi/discItem.cc new file mode 100644 index 000000000..6aaaadf29 --- /dev/null +++ b/libretroshare/src/pqi/discItem.cc @@ -0,0 +1,353 @@ +/* + * "$Id: discItem.cc,v 1.8 2007-02-18 21:46:49 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "pqi/discItem.h" + +static const int pqidizone = 44863; + +#include "pqi/pqidebug.h" +#include + +PQTunnel *createDiscItems(void *d, int n) +{ + pqioutput(PQL_DEBUG_BASIC, pqidizone, + "createDiscItems()"); + + // check the discType of DiscItem; + if ( ((int *) d)[0] == 0) + { + return new DiscItem(); + } + return new DiscReplyItem(); +} + +DiscItem::DiscItem() + :PQTunnel(PQI_TUNNEL_DISC_ITEM_TYPE), discType(0), discFlags(0) +{ + pqioutput(PQL_DEBUG_BASIC, pqidizone, + "DiscItem::DiscItem()"); + + return; +} + +DiscItem *DiscItem::clone() +{ + pqioutput(PQL_DEBUG_BASIC, pqidizone, + "DiscItem::clone()"); + + DiscItem *di = new DiscItem(); + di -> copy(this); + return di; +} + +void DiscItem::copy(const DiscItem *di) +{ + pqioutput(PQL_DEBUG_BASIC, pqidizone, + "DiscItem::copy()"); + + PQTunnel::copy(di); + + discType = di -> discType; + saddr = di -> saddr; + laddr = di -> laddr; + receive_tr = di -> receive_tr; + connect_tr = di -> connect_tr; + discFlags = di -> discFlags; +} + // Overloaded from PQTunnel. +const int DiscItem::getSize() const +{ + return 3 * 4 + 2 * sizeof(struct sockaddr_in); +} + +int DiscItem::out(void *data, const int size) const +{ + { + std::ostringstream out; + out << "DiscItem::out() Data: " << data; + out << " Size: " << size << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqidizone, out.str()); + } + + if (size < DiscItem::getSize()) + { + pqioutput(PQL_DEBUG_BASIC, pqidizone, + "DiscItem::out() Packet Too Small!"); + return -1; + } + + char *dta = (char *) data; + ((int *) dta)[0] = discType; + dta += 4; + ((struct sockaddr_in *) dta)[0] = saddr; + dta += sizeof(sockaddr_in); + ((struct sockaddr_in *) dta)[0] = laddr; + dta += sizeof(sockaddr_in); + + // version 1.... + // : 4 bytes for receive_tr + // : 4 bytes for connect_tr + //((int *) dta)[0] = receive_tr; + //dta += 4; + //((int *) dta)[0] = connect_tr; + //dta += 4; + + // version 2.... + // : 2 bytes for receive_tf + // : 2 bytes for connect_tf + // : 4 bytes for cert->flags. + ((unsigned short *) dta)[0] = htons(receive_tr); + dta += 2; + ((unsigned short *) dta)[0] = htons(connect_tr); + dta += 2; + ((unsigned long *) dta)[0] = htonl(discFlags); + dta += 4; + + return DiscItem::getSize(); +} + +int DiscItem::in(const void *data, const int size) +{ + { + std::ostringstream out; + out << "DiscItem::in() Data: " << data; + out << " Size: " << size << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqidizone, out.str()); + } + + if (size < DiscItem::getSize()) + { + std::ostringstream out; + out << "DiscItem::in() Pkt to small"; + pqioutput(PQL_DEBUG_BASIC, pqidizone, out.str()); + return -1; + } + + char *dta = (char *) data; + discType = ((int *) dta)[0]; + dta += 4; + saddr = ((struct sockaddr_in *) dta)[0]; + dta += sizeof(sockaddr_in); + laddr = ((struct sockaddr_in *) dta)[0]; + dta += sizeof(sockaddr_in); + + // version 1.... + // : 4 bytes for receive_tr + // : 4 bytes for connect_tr + //receive_tf = ((int *) dta)[0]; + //dta += 4; + //connect_tf = ((int *) dta)[0]; + //dta += 4; + + // version 2.... + // : 2 bytes for receive_tr + // : 2 bytes for connect_tr + // : 4 bytes for cert->flags. + receive_tr = ntohs(((unsigned short *) dta)[0]); + dta += 2; + connect_tr = ntohs(((unsigned short *) dta)[0]); + dta += 2; + discFlags = ntohl(((unsigned long *) dta)[0]); + dta += 4; + + return getSize(); +} + +std::ostream &DiscItem::print(std::ostream &out) +{ + out << "-------- DiscItem" << std::endl; + PQItem::print(out); + + out << "Peer Details" << std::endl; + out << "Local Address: " << inet_ntoa(laddr.sin_addr); + out << " Port: " << ntohs(laddr.sin_port) << std::endl; + + out << "Server Address: " << inet_ntoa(saddr.sin_addr); + out << " Port: " << ntohs(saddr.sin_port) << std::endl; + out << "[R/C]_TF: " << receive_tr; + out << "/" << connect_tr << std::endl; + out << "discFlags: " << discFlags << std::endl; + + return out << "--------" << std::endl; +} + + +DiscReplyItem::DiscReplyItem() + :DiscItem(), certDER(NULL), certLen(0) +{ + pqioutput(PQL_DEBUG_BASIC, pqidizone, + "DiscReplyItem::DiscReplyItem()"); + + discType = 1; + return; +} + +DiscReplyItem::~DiscReplyItem() +{ + pqioutput(PQL_DEBUG_BASIC, pqidizone, + "DiscReplyItem::~DiscReplyItem()"); + + if (certDER != NULL) + { + free(certDER); + certDER = NULL; + certLen = 0; + } +} + +DiscReplyItem *DiscReplyItem::clone() +{ + pqioutput(PQL_DEBUG_BASIC, pqidizone, + "DiscReplyItem::clone()"); + + DiscReplyItem *di = new DiscReplyItem(); + di -> copy(this); + return di; +} + +void DiscReplyItem::copy(const DiscReplyItem *di) +{ + pqioutput(PQL_DEBUG_BASIC, pqidizone, + "DiscReplyItem::copy()"); + + DiscItem::copy(di); + + + if (di -> certDER != NULL) + { + certLen = di -> certLen; + certDER = (unsigned char *) malloc(certLen); + memcpy(certDER, di -> certDER, certLen); + } + else + { + certLen = 0; + certDER = NULL; + } + + return; +} + + // Overloaded from PQTunnel. +const int DiscReplyItem::getSize() const +{ + return DiscItem::getSize() + 4 + certLen; +} + +int DiscReplyItem::out(void *data, const int maxsize) const +{ + { + std::ostringstream out; + out << "DiscReplyItem::out() Data: " << data; + out << " Size: " << maxsize << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqidizone, out.str()); + } + + if (maxsize < getSize()) + { + std::ostringstream out; + out << "DiscReplyItem::out() Not Enough space"; + pqioutput(PQL_DEBUG_BASIC, pqidizone, out.str()); + + return -1; + } + + int basesize = DiscItem::getSize(); + // put out the DiscItem Part. + DiscItem::out(data, basesize); + char *loc = ((char *) data) + basesize; + ((int *) loc)[0] = certLen; + loc += 4; + memcpy(loc, certDER, certLen); + return getSize(); +} + +int DiscReplyItem::in(const void *data, const int size) +{ + { + std::ostringstream out; + out << "DiscReplyItem::in() Data: " << data; + out << " Size: " << size << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqidizone, out.str()); + } + + // harder. + int basesize = DiscItem::getSize(); + if (basesize + 4 > size) + { + pqioutput(PQL_DEBUG_BASIC, pqidizone, + "DiscReplyItem::in() Not enough space for Base Class!"); + return -1; // cant be us. + } + + // read in the DiscItem part. + DiscItem::in(data, DiscItem::getSize()); + char *loc = ((char *) data) + basesize; + int certsize = ((int *) loc)[0]; + // check the size again. + if (basesize + 4 + certsize != size) + { + pqioutput(PQL_DEBUG_BASIC, pqidizone, + "DiscReplyItem::in() Not enough space for Certificate"); + return -1; + } + loc += 4; + // allocate memory for certDER.... + if ((certLen != certsize) && (!certLen)) + { + if (certDER) + free(certDER); + } + certLen = certsize; + if (!certDER) + { + certDER = (unsigned char *) malloc(certsize); + } + + memcpy(certDER, loc, certLen); + return getSize(); +} + +std::ostream &DiscReplyItem::print(std::ostream &out) +{ + out << "---------------- DiscReplyItem" << std::endl; + out << "A Friend of a Friend:" << std::endl; + DiscItem::print(out); + + if (certDER != NULL) + { + out << "CertLen: " << certLen << std::endl; + } + else + { + out << "No Certificate" << std::endl; + } + + return out << "----------------" << std::endl; +} + diff --git a/libretroshare/src/pqi/discItem.h b/libretroshare/src/pqi/discItem.h new file mode 100644 index 000000000..8f81b1412 --- /dev/null +++ b/libretroshare/src/pqi/discItem.h @@ -0,0 +1,90 @@ +/* + * "$Id: discItem.h,v 1.6 2007-02-18 21:46:49 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + +#ifndef MRK_PQI_DISCITEM_H +#define MRK_PQI_DISCITEM_H + +#include "pqi/pqitunnel.h" + +#define PQI_TUNNEL_DISC_ITEM_TYPE 121 + +PQTunnel *createDiscItems(void *d, int n); + +class DiscItem: public PQTunnel +{ + protected: + DiscItem(int st); + public: + DiscItem(); +virtual DiscItem *clone(); +void copy(const DiscItem *di); +virtual std::ostream &print(std::ostream &out); + + // Overloaded from PQTunnel. +virtual const int getSize() const; +virtual int out(void *data, const int size) const; +virtual int in(const void *data, const int size); + + int discType; // specifies subtypes. + + struct sockaddr_in laddr; + struct sockaddr_in saddr; + + // time frame of recent connections. + unsigned short connect_tr; + unsigned short receive_tr; + // flags... + unsigned long discFlags; +}; + +class DiscReplyItem: public DiscItem +{ + public: + + DiscReplyItem(); +virtual ~DiscReplyItem(); +virtual DiscReplyItem *clone(); +void copy(const DiscReplyItem *di); +virtual std::ostream &print(std::ostream &out); + + // Overloaded from PQTunnel. +virtual const int getSize() const; +virtual int out(void *data, const int size) const; +virtual int in(const void *data, const int size); + + + unsigned char *certDER; + int certLen; +}; + +#define AUTODISC_RDI_SUBTYPE_PING 1 +#define AUTODISC_RDI_SUBTYPE_RPLY 2 + +#define AUTODISC_LDI_SUBTYPE_PING 1 +#define AUTODISC_LDI_SUBTYPE_RPLY 2 + +#endif // MRK_PQI_DISCITEM_H diff --git a/libretroshare/src/pqi/p3channel.cc b/libretroshare/src/pqi/p3channel.cc new file mode 100644 index 000000000..7444aa9ea --- /dev/null +++ b/libretroshare/src/pqi/p3channel.cc @@ -0,0 +1,1322 @@ +/* + * "$Id: p3channel.cc,v 1.8 2007-04-07 08:40:54 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "pqi/p3channel.h" + +// for active local cert stuff. +#include "pqi/pqissl.h" + +#include +#include +#include + +#include +#include +#include "pqi/pqidebug.h" + +const int pqichannelzone = 3334; + +/* + * Compile Flag to generate Rnd messages frequently. + * + * PQI_CHANNEL_GENERATE_RND 1 + */ +#define PQI_CHANNEL_GENERATE_RND 1 + + + + // | Publisher Bit. + // v + // | Subscriber Bit + // | (download) + // v + // | Listen Bit + // | (reBroadcast) + // v + +const int P3Chan_Publisher_Bit = 0x040; // 0100 0000 +const int P3Chan_Subscriber_Bit = 0x020; // 0010 0000 +const int P3Chan_Listener_Bit = 0x010; // 0001 0000 +const int P3Chan_No_Bit = 0x000; // 0000 0000 + +const int P3Chan_Publisher = 0x050; // 0101 0000 +const int P3Chan_Subscriber = 0x030; // 0011 0000 +const int P3Chan_Listener = 0x010; // 0001 0000 +const int P3Chan_Other = 0x000; // 0000 0000 + +/**** + * This is our channel class. + * It performs various functions. + * 1) collect channel messages. + * 2) save/restore messages. + * 3) manage their downloads.... + * 4) rebroadcast messages. + * + * You need to be able to categorise the channels + * 1) Favourites. + * 2) Standard Subscription + * 3) Listen + * 4) Others. + * + * The first three groups will be maintained. + * + * Controllable how long lists are maintained. (1 week standard) + * + * Messages are rebroadcast, At a random interval (0 - 4 hours) after + * receiving the message. (and downloading it???) + * + * Maximum Download Cache per channel. + * + * Flag stuff to keep. + * + * Popularity rating on how much each is rebroadcast. + * + * There should be a couple of rating schemes to decide + * on how long something stays downloaded. + * + * 1) Time, Old stuff first. + * 2) Volume.... + * 3) Size. + * 4) Popularity. + * + */ + +#include +#include + +#include "pqi.h" + +#include "discItem.h" +#include "pqitunnel.h" + +/************************** +class channelSign +**************************/ +bool channelSign::operator<(const channelSign &s) const +{ + return (memcmp(sign, s.sign, CHAN_SIGN_SIZE) < 0); +} + +bool channelSign::operator==(const channelSign &s) const +{ + return (memcmp(sign, s.sign, CHAN_SIGN_SIZE) == 0); +} + +std::ostream &channelSign::print(std::ostream &out) const +{ + out << "channelSign :"; + for(int i = 0; i < CHAN_SIGN_SIZE; i++) + { + unsigned char n = ((unsigned char *) sign)[i]; + out << (unsigned int) n << ":"; + } + return out; +} + + +std::ostream &channelSign::printHex(std::ostream &out) const +{ + out << std::hex << "["; + for(int i = 0; i < CHAN_SIGN_SIZE; i++) + { + unsigned char n = ((unsigned char *) sign)[i]; + out << std::setw(2) << (unsigned int) n; + if (i < CHAN_SIGN_SIZE-1) + { + out << ":"; + } + else + { + out << "]"; + } + + } + out << std::dec; + return out; +} + +/************************** +class channelKey +**************************/ + +bool channelKey::operator<(const channelKey &s) const +{ + return (memcmp(sign, s.sign, CHAN_SIGN_SIZE) < 0); +} + +bool channelKey::operator==(const channelKey &s) const +{ + return (memcmp(sign, s.sign, CHAN_SIGN_SIZE) == 0); +} + + +std::ostream &channelKey::print(std::ostream &out) const +{ + out << "channelKey :"; + for(int i = 0; i < CHAN_SIGN_SIZE; i++) + { + unsigned char n = ((unsigned char *) sign)[i]; + out << (unsigned int) n << ":"; + } + return out; +} + + +channelKey::channelKey() + :key(NULL) +{ +} + + +channelKey::channelKey(EVP_PKEY *k) + :key(k) +{ + // work out sign. + calcSign(); +} + +int channelKey::setKey(EVP_PKEY *k) +{ + + { + std::ostringstream out; + out << "channelKey::setKey()"; + pqioutput(PQL_DEBUG_BASIC, pqichannelzone, out.str()); + } + + key = k; + calcSign(); + return 1; +} + +channelKey::~channelKey() +{ + if (key) + { + EVP_PKEY_free(key); + } +} + +int channelKey::load(const unsigned char *d, int len) +{ + const unsigned char *ptr = d; + + { + std::ostringstream out; + out << "channelKey::load(" << len << ") "; + pqioutput(PQL_DEBUG_BASIC, pqichannelzone, out.str()); + } + + RSA *rsa; + + if (NULL == (rsa = d2i_RSAPublicKey(NULL, &ptr, len))) + { + std::ostringstream out; + out << "channelKey::in() Failed to Load RSA Key."; + pqioutput(PQL_DEBUG_BASIC, pqichannelzone, out.str()); + + return -1; + } + + // get the signature + + + // read in using ssl stylee. + key = EVP_PKEY_new(); + + EVP_PKEY_assign_RSA(key, rsa); + + return calcSign(); +} + +int channelKey::calcSign() +{ + // The signature will be extracted from the + // public exponential. + + RSA *rsa = EVP_PKEY_get1_RSA(key); + int len = BN_num_bytes(rsa -> n); + unsigned char tmp[len]; + BN_bn2bin(rsa -> n, tmp); + + // copy first CHAN_SIGN_SIZE bytes... + if (len > CHAN_SIGN_SIZE) + { + len = CHAN_SIGN_SIZE; + } + + std::ostringstream out; + out << "channelKey::calcSign()"; + + for(int i = 0; i < len; i++) + { + sign[i] = tmp[i]; + unsigned char c = ((unsigned char *) sign)[i]; + out << (unsigned int) c; + if (i != len - 1) + out << ":"; + } + pqioutput(PQL_DEBUG_BASIC, pqichannelzone, out.str()); + + RSA_free(rsa); + return 1; +} + + +int channelKey::out(unsigned char *data, int len) +{ + unsigned char *ptr = data; + + if (!key) + { + std::ostringstream out; + out << "channelKey::out() Key = NULL"; + pqioutput(PQL_DEBUG_BASIC, pqichannelzone, out.str()); + return -1; + } + + RSA *trsa = EVP_PKEY_get1_RSA(key); + int reqspace = i2d_RSAPublicKey(trsa, NULL); + + if (data == NULL) + { + std::ostringstream out; + out << "channelKey::out() Returning Size"; + pqioutput(PQL_DEBUG_BASIC, pqichannelzone, out.str()); + RSA_free(trsa); + return reqspace; + } + + if (len < reqspace) + { + std::ostringstream out; + out << "channelKey::out() not enough space"; + pqioutput(PQL_DEBUG_BASIC, pqichannelzone, out.str()); + RSA_free(trsa); + return -1; + } + + int val = i2d_RSAPublicKey(trsa, &ptr); + + // delete the rsa key. + RSA_free(trsa); + + return val; +} + + + +bool channelKey::valid() +{ + return (key != 0); +} + +EVP_PKEY *channelKey::getKey() const +{ + return key; +} + +channelSign channelKey::getSign() const +{ + std::ostringstream out; + out << "channelKey::getSign()"; + + channelSign s; + for(int i = 0; i < CHAN_SIGN_SIZE; i++) + { + s.sign[i] = sign[i]; + unsigned char c = ((unsigned char *) s.sign)[i]; + out << (unsigned int) c; + if (i != CHAN_SIGN_SIZE-1) + out << ":"; + } + + pqioutput(PQL_DEBUG_BASIC, pqichannelzone, out.str()); + return s; +} + +/************************** +class channelMsg +**************************/ + +channelMsg::channelMsg(PQChanItem *in, TimeStamp now, TimeStamp reb) + :msg(in), receivedCount(1), recvTime(now), rebroadcast(false), + rbcTime(reb), downloaded(false), save(false) +{ + { + std::ostringstream out; + out << "channelMsg::channelMsg()"; + pqioutput(PQL_DEBUG_BASIC, pqichannelzone, out.str()); + } + return; +} + +/************************** +class pqichannel +**************************/ + +pqichannel::pqichannel(sslroot *s, channelKey *k, std::string title, int m) + :sroot(s), mode(m), channelTitle(title), ranking(0), key(k) {} + +// retrieving msgs. +int pqichannel::getMsgSummary(std::list &summary) +{ + if (msgByHash.size() == 0) + { + return 0; + } + std::map::const_iterator it; + PQChanItem::FileList::const_iterator flit; + + for(it = msgByHash.begin(); it != msgByHash.end(); it++) + { + chanMsgSummary ms; + PQChanItem *item = it -> second -> msg; + //ms.msg = item -> title; + ms.msg = item -> msg; + ms.mh = it -> first; + ms.nofiles = item -> files.size(); + + ms.totalsize = 0; + for(flit = item->files.begin(); flit != item->files.end(); flit++) + { + ms.totalsize += flit->size; + } + ms.recvd = it->second->recvTime; + + summary.push_back(ms); + } + return 1; +} + + +channelMsg *pqichannel::findMsg(MsgHash mh) +{ + std::map::const_iterator it; + it = msgByHash.find(mh); + if (it == msgByHash.end()) + { + return NULL; + } + return (it -> second); +} + + +int pqichannel::processMsg(PQChanItem *in) +{ + { + std::ostringstream out; + out << "pqichannel::processMsg()"; + pqioutput(PQL_DEBUG_BASIC, pqichannelzone, out.str()); + } + if (!checkPktSignature(in)) + { + std::ostringstream out; + out << "pqichannel::processMsg() Failed Signature Check!"; + out << std::endl; + out << "pqichannel::processMsg() Deleting Incoming Pkt."; + out << std::endl; + + std::cerr << out.str(); + delete in; + return -1; + } + + // get time stamp. + TimeStamp now = time(NULL); + MsgHash hash = getMsgHash(in); + std::map::iterator it; + + if (msgByHash.end() != (it = msgByHash.find(hash))) + { + // already there.... (check). + + // increment the counter. + it -> second -> receivedCount++; + + // discard. + std::ostringstream out; + out << "pqichannel::processMsg() Msg Already There! Received"; + out << it -> second -> receivedCount << " times" << std::endl; + out << "pqichannel::processMsg() Deleting Incoming Pkt."; + out << std::endl; + + std::cerr << out.str(); + + delete in; + return -1; + } + else + { + // new.... + // calc Rebroadcast time. + TimeStamp reb = now; + +#ifdef PQI_CHANNEL_GENERATE_RND + float secIn10min = 60 * 10; + int rndsec = (int) (rand() * secIn10min / RAND_MAX); +#else + float secIn4hrs = 60 * 4 * 60; + int rndsec = (int) (rand() * secIn4hrs / RAND_MAX); +#endif + reb += rndsec; + + // create channelMsg. + channelMsg *msg = new channelMsg(in, now, reb); + + // save it. + msgByHash[hash] = msg; + + std::ostringstream out; + out << "pqichannel::processMsg() Saved New Msg"; + out << std::endl; + + std::cerr << out.str(); + } + return 1; +} + + + // fill with outgoing +int pqichannel::reBroadcast(std::list &outgoing) +{ + { + std::ostringstream out; + out << "pqichannel::reBroadcast()"; + pqioutput(PQL_DEBUG_BASIC, pqichannelzone, out.str()); + } + TimeStamp now = time(NULL); + + // iterate through the messages. + // if the rebroadcast flag is unset, + // and the RBC is in the past.... + // add to the queue. + + std::map::iterator it; + for(it = msgByHash.begin(); it != msgByHash.end(); it++) + { + if ((!it -> second -> rebroadcast) && + (it -> second -> rbcTime < now)) + { + PQChanItem *nitem = it -> second -> msg -> clone(); + // reset address to everyone. + // XXX FIX. + for(int i = 0; i < 10; i++) + nitem -> cid.route[i] = 0; + + // add to list. + outgoing.push_back(nitem); + + std::ostringstream out; + out << "pqichannel::reBroadcast() Sending Msg"; + out << std::endl; + nitem->print(out); + out << std::endl; + + std::cerr << out.str(); + + // set flag. + it -> second -> rebroadcast = true; + } + else + { + std::ostringstream out; + if (it -> second -> rebroadcast) + { + out << "pqichannel::reBroadcast() Msg Already Rebroadcast"; + } + else + { + out << "pqichannel::reBroadcast() Not ready for rebroadcast"; + } + out << std::endl; + std::cerr << out.str(); + } + } + return 1; +} + +channelSign pqichannel::getSign() +{ + return key -> getSign(); +} + +channelKey *pqichannel::getKey() +{ + return key; +} + +/************************** +class pqichanneler +// specialisation with the private key, and output. + + **************************/ + +pqichanneler::pqichanneler(sslroot *s, + channelKey *priv, channelKey *pub, + std::string title) + :pqichannel(s, pub, title, P3Chan_Publisher), privkey(priv) {} + + +int pqichanneler::sendmsg(PQChanItem *msg) +{ + { + std::ostringstream out; + out << "pqichanneler::sendmsg()"; + pqioutput(PQL_DEBUG_BASIC, pqichannelzone, out.str()); + } + // Takes a partially constructed Msg, + // fills in the signature.... + // then all it has to do is pass it + // to the pqichannel which will handle the + // distribution. + + if ((!key -> valid()) || (!privkey -> valid())) + { + std::ostringstream out; + out << "pqichanneler::sendmsg() Keys Not Valid!"; + pqioutput(PQL_DEBUG_BASIC, pqichannelzone, out.str()); + delete msg; + return -1; + } + + // + msg -> certLen = key -> out(NULL, 0); + msg -> certDER = (unsigned char *) malloc(msg -> certLen); + key -> out(msg -> certDER, msg -> certLen); + msg -> signLen = 0; + + // some nasty complexity here. + // we are going to write it to a buffer (as is) + // and then chop out the bit we need to sign. + int tmpsize = msg -> PQChanItem::getSize(); + char *tmpspace = (char *) malloc(tmpsize); + if (tmpsize != msg -> out(tmpspace, tmpsize)) + { + std::ostringstream out; + out << "pqichanneler::sendmsg() msg -> out() Failure!"; + pqioutput(PQL_DEBUG_BASIC, pqichannelzone, out.str()); + delete msg; + return -1; + } + + char *sign = tmpspace + msg -> PQTunnel::getSize(); + tmpsize -= msg -> PQTunnel::getSize(); + + msg -> signLen = EVP_PKEY_size(privkey -> getKey()); + msg -> signature = (unsigned char *) malloc(msg->signLen); + + sroot -> signDigest(privkey -> getKey(), sign, tmpsize, + msg->signature, msg->signLen); + + // now we can free the tmp space. + free(tmpspace); + + return pqichannel::processMsg(msg); +} + +/************************** +class p3channel +// the Tunnel Service. + + **************************/ + +p3channel::p3channel(sslroot *r) + :PQTunnelService(PQI_TUNNEL_CHANNEL_ITEM_TYPE), sroot(r) +{ + { + std::ostringstream out; + out << "p3channel::p3channel()"; + pqioutput(PQL_DEBUG_BASIC, pqichannelzone, out.str()); + } + // configure... + load_configuration(); + return; +} + +p3channel::~p3channel() +{ + { + std::ostringstream out; + out << "p3channel::~p3channel()"; + pqioutput(PQL_DEBUG_BASIC, pqichannelzone, out.str()); + } + return; +} + +// The PQTunnelService interface. +int p3channel::receive(PQTunnel *i) +{ + { + std::ostringstream out; + out << "p3channel::receive()"; + pqioutput(PQL_DEBUG_BASIC, pqichannelzone, out.str()); + } + inpkts.push_back(i); + + std::ostringstream out; + out << "p3channel::receive() InQueue:" << inpkts.size() << std::endl; + out << "incoming packet: " << std::endl; + i -> print(out); + pqioutput(PQL_DEBUG_BASIC, pqichannelzone, out.str()); + + return 1; +} + +PQTunnel *p3channel::send() +{ + std::ostringstream out; + out << "p3channel::send(" << outpkts.size() << ")" << std::endl; + + if (outpkts.size() < 1) + { + out << "------------------> No Packet" << std::endl; + pqioutput(PQL_DEBUG_ALL, pqichannelzone, out.str()); + return NULL; + } + PQTunnel *pkt = (PQTunnel *) outpkts.front(); + outpkts.pop_front(); + + out << "outgoing packet: " << std::endl; + pkt -> print(out); + pqioutput(PQL_DEBUG_BASIC, pqichannelzone, out.str()); + + return pkt; +} + + + +int p3channel::tick() +{ + // regularly run reBroadcast. + pqioutput(PQL_DEBUG_ALL, pqichannelzone, + "p3channel::tick()"); + + handleIncoming(); + + if (ts_nextlp == 0) + { + pqioutput(PQL_DEBUG_BASIC, pqichannelzone, + "p3channel::tick() ReBroadcast Cycle!"); + reBroadcast(); + min10Count++; + // hourly. + if (min10Count > 5) + { + min10Count = 0; + // prune + pruneOldMsgs(); + } + } + +#ifdef PQI_CHANNEL_GENERATE_RND + if (ts_nextlp % 300 == 0) + { + generateRandomMsg(); + printMsgs(); + reBroadcast(); + } +#endif + + + // ten minute counter. + if (--ts_nextlp < 0) + { + ts_nextlp = 600; + } + + return 1; +} + +// load and save configuration. +int p3channel::save_configuration() +{ + { + std::ostringstream out; + out << "p3channel::save_configuration()"; + pqioutput(PQL_DEBUG_BASIC, pqichannelzone, out.str()); + } + // save to an independent file. + return 1; +} + +int p3channel::load_configuration() +{ + { + std::ostringstream out; + out << "p3channel::load_configuration()"; + pqioutput(PQL_DEBUG_BASIC, pqichannelzone, out.str()); + } + // load from independent file. + return 1; +} + + +// retrieving channels. +pqichannel *p3channel::findChannel(channelSign s) +{ + std::map::const_iterator it; + it = channels.find(s); + if (it == channels.end()) + { + return NULL; + } + return (it -> second); +} + + +int p3channel::getChannelList(std::list &chans) +{ + if (channels.size() == 0) + { + return 0; + } + + std::map::const_iterator it; + for(it = channels.begin(); it != channels.end(); it++) + { + chans.push_back(it->second); + } + return 1; +} + + // maintainance. +int p3channel::pruneOldMsgs() +{ + std::ostringstream out; + out << "p3channel::pruneOldMsgs()"; + + std::map::iterator it; + int pcount = 0; + for(it = channels.begin(); it != channels.end(); it++, pcount++) + { + it -> second -> pruneOldMsgs(); + } + + pqioutput(PQL_DEBUG_BASIC, pqichannelzone, out.str()); + return 1; +} + + + // maintainance. +int pqichannel::pruneOldMsgs() +{ + std::ostringstream out; + out << "p3channel::pruneOldMsgs()"; + + + std::map::iterator it, it2; + int i = 0; + int t = time(NULL); + for(it = msgByHash.begin(); it != msgByHash.end(); i++) + { + // still in Hours, + // but should change to days.... + float tpHr = (t - it->second->recvTime) / 3600.0; + float pop = (it->second->receivedCount) / (float) tpHr - tpHr / 2.0; + if ((pop > 0) || (tpHr < 7)) + { + // leave it.. + it++; + continue; + } + out << "Deleting->->-> Msg(" << i << ")" << std::endl; + out << "Msg(" << i << ") : " << it->second->msg->msg; + out << std::endl; + out << "Received Count -> " << it->second->receivedCount; + out << std::endl; + + out << "Time Since Arrival -> " << t - it->second->recvTime; + out << std::endl; + out << "Popularity: " << pop; + out << std::endl; + out << "ReB(" << it->second->rebroadcast; + out << ") TS: " << it->second->rbcTime; + out << " or RTS: " << it->second->rbcTime - time(NULL) << std::endl; + out << "Down(" << it->second->downloaded; + out << ") TS: " << it->second->dldTime; + out << " or RTS: " << it->second->dldTime - time(NULL) << std::endl; + + channelSign s = getChannelSign(it->second->msg); + MsgHash h = getMsgHash(it->second->msg); + + s.print(out); + out << std::endl; + h.print(out); + out << std::endl; + out << "<-<-<--------"; + + // very dubious.... will it work.?? + it2 = it; + it++; + msgByHash.erase(it2); + } + pqioutput(PQL_DEBUG_BASIC, pqichannelzone, out.str()); + return 1; +} + +int p3channel::handleIncoming() +{ + { + std::ostringstream out; + out << "p3channel::handleIncoming()"; + pqioutput(PQL_DEBUG_ALL, pqichannelzone, out.str()); + } + // loop through all incoming pkts. + // send off to correct pqichannel. + + while(inpkts.size() > 0) + { + PQItem *in = inpkts.front(); + inpkts.pop_front(); + + { + std::ostringstream out; + out << "p3channel::handleIncoming() Handling Pkt"; + pqioutput(PQL_DEBUG_BASIC, pqichannelzone, out.str()); + } + + + PQChanItem *msg; + if (NULL==(msg=dynamic_cast(in))) + { + // error with the packet!. + + delete in; + continue; + } + // At this point we need to validate the signature. + bool validSign = true; + + // save the sign size, so we can blank it for a moment. + int signlen = msg -> signLen; + msg -> signLen = 0; + + // some nasty complexity here. + // we are going to write it to a buffer (as is) + // and then chop out the bit we need to sign. + int tmpsize = msg -> PQChanItem::getSize(); + char *tmpspace = (char *) malloc(tmpsize); + if (0 > msg -> out(tmpspace, tmpsize)) + { + std::ostringstream out; + out << "p3channel::handleIncoming() msg Failed out()"; + pqioutput(PQL_DEBUG_BASIC, pqichannelzone, out.str()); + validSign = false; + } + // this is okay even if out() fails. + char *signdata = tmpspace + msg -> PQTunnel::getSize(); + tmpsize -= msg -> PQTunnel::getSize(); + + // restore signLen before verifying signature. + msg -> signLen = signlen; + + // generate the key. + channelKey tmpkey; + if (validSign) + { + std::ostringstream out; + out << "p3channel::handleIncoming() loading key"; + pqioutput(PQL_DEBUG_BASIC, pqichannelzone, out.str()); + + validSign = (1 == tmpkey.load( + msg -> certDER, msg -> certLen)); + } + + if (validSign) + { + std::ostringstream out; + out << "p3channel::handleIncoming() verifying Digest"; + pqioutput(PQL_DEBUG_BASIC, pqichannelzone, out.str()); + + validSign = (1 == sroot -> verifyDigest( + tmpkey.getKey(), signdata, tmpsize, + msg->signature, msg->signLen)); + + } + + // now we can free the tmp space. + // tmpkey will free itself. + free(tmpspace); + + if (!validSign) + { + std::ostringstream out; + out << "p3channel::handleIncoming() Msg Failed Check!"; + pqioutput(PQL_DEBUG_BASIC, pqichannelzone, out.str()); + + // error somewhere along the way. + delete in; + continue; + } + + + // get the channel signature from the pkt. + channelSign sign = getChannelSign(msg); + std::map::iterator it; + if (channels.end() != (it=channels.find(sign))) + { + // add to that channel. + it -> second -> processMsg(msg); + } + else + { + // create a new channel. + channelKey *k = getChannelKey(msg); + + // Temporarily Make all Listeners... + pqichannel *npc = new pqichannel(sroot, k, + msg->title, P3Chan_Listener); + channels[sign] = npc; + npc -> processMsg(msg); + } + } + return 1; +} + +int p3channel::reBroadcast() +{ + { + std::ostringstream out; + out << "p3channel::reBroadcast()"; + pqioutput(PQL_DEBUG_BASIC, pqichannelzone, out.str()); + } + // + std::list outgoing; + std::map::iterator it; + for(it = channels.begin(); it != channels.end(); it++) + { + if (it -> second -> getMode() & P3Chan_Listener_Bit) + { + it -> second -> reBroadcast(outgoing); + } + } + + std::list::iterator tit; + for(tit = outgoing.begin(); tit!=outgoing.end();tit++) + { + outpkts.push_back(*tit); + } + return 1; +} + + +channelSign getChannelSign(PQChanItem *ci) +{ + std::ostringstream out; + channelSign s; + + out << "getChannelSign() "; + + channelKey tmpkey; + if (1 != tmpkey.load(ci -> certDER, ci -> certLen)) + { + out << "FAILED!"; + } + else + { + s = tmpkey.getSign(); + } + + pqioutput(PQL_DEBUG_BASIC, pqichannelzone, out.str()); + return s; +} + + +channelKey *getChannelKey(PQChanItem *ci) +{ + std::ostringstream out; + out << "p3channel::getChannelKey()"; + + channelKey *k = new channelKey(); + if (0 > k -> load(ci -> certDER, ci -> certLen)) + { + out << "FAILED!" << std::endl; + delete k; + k = NULL; + } + else + { + channelSign s = getChannelSign(ci); + s.print(out); + } + + pqioutput(PQL_DEBUG_BASIC, pqichannelzone, out.str()); + return k; +} + + +/* Helper function */ +MsgHash getMsgHash(PQChanItem *in) +{ + std::ostringstream out; + + MsgHash h; + int len = in -> signLen; + + out << "getMsgHash(" << len << ") "; + if (len > CHAN_SIGN_SIZE) + len = CHAN_SIGN_SIZE; + + for (int i = 0; i < len; i++) + { + h.sign[i] = in -> signature[i]; + unsigned char c = ((unsigned char *) h.sign)[i]; + out << (unsigned int) c; + if (i != len - 1) + out << ":"; + } + + pqioutput(PQL_DEBUG_BASIC, pqichannelzone, out.str()); + + return h; +} + + +bool pqichannel::checkPktSignature(PQChanItem *in) +{ + { + std::ostringstream out; + out << "pqichannel::checkPktSignature"; + pqioutput(PQL_DEBUG_BASIC, pqichannelzone, out.str()); + } + return true; +} + + + +int p3channel::generateRandomMsg() +{ + { + std::ostringstream out; + out << "p3channel::generateRandomMsg()"; + pqioutput(PQL_DEBUG_BASIC, pqichannelzone, out.str()); + } + // count how many publisher channels we have. + // generate Rnd with range (0 -> pchan) + // if 0 -> create a new pqichanneler. + // else select that one. + // + // using that pqichanneler, generate a message. + + std::map::iterator it; + int pcount = 0; + int i; + + for(it = channels.begin(); it != channels.end(); it++) + { + if (it -> second -> getMode() & P3Chan_Publisher_Bit) + { + pcount++; + } + } + + int rnd = (int) (rand() * (pcount + 1.0) / RAND_MAX); + pqichanneler *pc = NULL; + channelKey *pub = NULL; + channelKey *priv = NULL; + if (rnd == 0) + { + // create a new pqichanneler!. + pub = new channelKey(); + priv = new channelKey(); + generateRandomKeys(priv, pub); + + pc = new pqichanneler(sroot, priv, pub, "pqiChanneler"); + channelSign sign = pub -> getSign(); + channels[sign] = pc; + } + else + { + // select the chosen one. + i = 0; + for(it = channels.begin(); (i < rnd) && + (it != channels.end()); it++) + { + if (it -> second -> getMode() & + P3Chan_Publisher_Bit) + { + i++; + } + } + if (it != channels.end()) + { + pqichannel *c = it -> second; + pc = dynamic_cast(c); + } + } + + if (pc == NULL) + { + // failed this time! + return -1; + } + + pub = pc -> getKey(); + + // create a new message for the world. + PQChanItem *msg = new PQChanItem(); + +static int count = 0; + std::ostringstream out; + + cert *own = sroot -> getOwnCert(); + + out << "U:" << own -> Name() << " Says "; + out << "Hello World #" << count++; + msg -> msg = out.str(); + + /* now add in some files */ + int nfiles = (int) ((rand() * 5.0) / RAND_MAX); + for(i = 0; i < nfiles; i++) + { + PQChanItem::FileItem fi; + std::ostringstream out; + out << "file-" << count << "-" << nfiles; + out << "-" << "i" << ".dta"; + fi.name = out.str(); + fi.size = count * nfiles + i + 12354; + + msg -> files.push_back(fi); + } + + // keys and signing are handled in sendmsg(). + pc -> sendmsg(msg); + return 1; +} + + +int p3channel::generateRandomKeys(channelKey *priv, channelKey *pub) +{ + // sslroot will generate the pair... + // we need to split it into an pub/private. + + EVP_PKEY *keypair = EVP_PKEY_new(); + EVP_PKEY *pubkey = EVP_PKEY_new(); + sroot -> generateKeyPair(keypair, 0); + + RSA *rsa1 = EVP_PKEY_get1_RSA(keypair); + RSA *rsa2 = RSAPublicKey_dup(rsa1); + + { + std::ostringstream out; + out << "p3channel::generateRandomKeys()" << std::endl; + out << "Rsa1: " << (void *) rsa1 << " & Rsa2: "; + out << (void *) rsa2 << std::endl; + + pqioutput(PQL_DEBUG_BASIC, pqichannelzone, out.str()); + } + + EVP_PKEY_assign_RSA(pubkey, rsa1); + RSA_free(rsa1); // decrement ref count! + + priv -> setKey(keypair); + pub -> setKey(pubkey); + + { + std::ostringstream out; + out << "p3channel::generateRandomKey(): "; + priv -> print(out); + pqioutput(PQL_DEBUG_BASIC, pqichannelzone, out.str()); + } + return 1; +} + + + +int p3channel::printMsgs() +{ + std::ostringstream out; + out << "p3channel::printMsgs()"; + + std::map::iterator it; + int pcount = 0; + for(it = channels.begin(); it != channels.end(); it++, pcount++) + { + out << std::endl << "Channel[" << pcount << "] : "; + it->first.print(out); + out << std::endl; + it -> second -> print(out); + } + + pqioutput(PQL_DEBUG_BASIC, pqichannelzone, out.str()); + return 1; +} + + + +std::ostream &pqichannel::print(std::ostream &out) +{ + out << "pqichannel::print()------------------"; + std::map::iterator it; + int i = 0; + int t = time(NULL); + int oldmsgs = 0; + for(it = msgByHash.begin(); it != msgByHash.end(); it++, i++) + { + float tpHr = (t - it->second->recvTime) / 3600.0; + float pop = (it->second->receivedCount) / (float) tpHr - tpHr / 2.0; + if (pop < 0) + { + oldmsgs++; + out << "->->-> Skipped Old Msg(" << i << ")" << std::endl; + continue; + } + + out << "-------->->->" << std::endl; + out << "Msg(" << i << ") : " << it->second->msg->msg; + out << std::endl; + out << "Received Count -> " << it->second->receivedCount; + out << std::endl; + + out << "Time Since Arrival -> " << t - it->second->recvTime; + out << std::endl; + out << "Popularity: " << pop; + out << std::endl; + out << "ReB(" << it->second->rebroadcast; + out << ") TS: " << it->second->rbcTime; + out << " or RTS: " << it->second->rbcTime - time(NULL) << std::endl; + out << "Down(" << it->second->downloaded; + out << ") TS: " << it->second->dldTime; + out << " or RTS: " << it->second->dldTime - time(NULL) << std::endl; + + channelSign s = getChannelSign(it->second->msg); + MsgHash h = getMsgHash(it->second->msg); + + s.print(out); + out << std::endl; + h.print(out); + out << std::endl; + out << "<-<-<--------"; + } + out << ">>>> Total Skipped Msgs: " << oldmsgs << std::endl; + out << "-------------------------------------"; + return out; +} + + diff --git a/libretroshare/src/pqi/p3channel.h b/libretroshare/src/pqi/p3channel.h new file mode 100644 index 000000000..56015ab20 --- /dev/null +++ b/libretroshare/src/pqi/p3channel.h @@ -0,0 +1,314 @@ +/* + * "$Id: p3channel.h,v 1.6 2007-03-05 21:26:03 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + +#ifndef MRK_P3_CHANNEL_H +#define MRK_P3_CHANNEL_H + +#include "pqi/pqichannel.h" + +/**** + * This is our channel class. + * It performs various functions. + * 1) collect channel messages. + * 2) save/restore messages. + * 3) manage their downloads.... + * 4) rebroadcast messages. + * + * You need to be able to categorise the channels + * 1) Favourites. + * 2) Standard Subscription + * 3) Listen + * 4) Others. + * + * The first three groups will be maintained. + * + * Controllable how long lists are maintained. (1 week standard) + * + * Messages are rebroadcast, At a random interval (0 - 4 hours) after + * receiving the message. + * + * Popularity rating on how much each is rebroadcast. + * + * + * There should be a couple of rating schemes to decide + * on how long something stays downloaded. + * + * 1) Time, Old stuff first. + * 2) Volume.... + * 3) Size. + * 4) Popularity. + * + */ + +#include +#include +#include + +#include "pqi/pqi.h" + +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + +#include "pqi/xpgpcert.h" + +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + +#include "pqi/sslcert.h" + +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + +#include "pqi/discItem.h" +#include "pqi/pqitunnel.h" + +/* Size of these should match the RsInterface (for ease of use ) - 16 bytes */ + +//#define CHAN_SIGN_SIZE 16 + +class channelSign +{ + public: +bool operator<(const channelSign &s) const; +bool operator==(const channelSign &s) const; +std::ostream& print(std::ostream&) const; +std::ostream& printHex(std::ostream&) const; + char sign[CHAN_SIGN_SIZE]; + +}; + +typedef channelSign MsgHash; + +class channelKey +{ + public: + channelKey(EVP_PKEY *k); + channelKey(); +virtual ~channelKey(); + +bool valid(); +int load(const unsigned char *d, int len); +int setKey(EVP_PKEY *k); +int out(unsigned char *d, int len); + +bool operator<(const channelKey &k) const; +bool operator==(const channelKey &k) const; +std::ostream& print(std::ostream&) const; + +channelSign getSign() const; +EVP_PKEY * getKey() const; + + private: +int calcSign(); + + EVP_PKEY *key; + char sign[CHAN_SIGN_SIZE]; +}; + +typedef time_t TimeStamp; + +//class TimeStamp +//{ +// public: +// +// int yr, month, day, hour, min, sec; +//}; +// + +class chanMsgSummary +{ + public: + std::string msg; + MsgHash mh; + int nofiles; + int totalsize; + TimeStamp recvd; +}; + + + +// This is used For Msg + Info storage. +class channelMsg +{ + public: +channelMsg(PQChanItem *in, TimeStamp now, TimeStamp reb); + + PQChanItem *msg; + + int receivedCount; + TimeStamp recvTime; + + bool rebroadcast; + TimeStamp rbcTime; + + bool downloaded; + TimeStamp dldTime; + + bool save; +}; + +// a little helper function. +channelSign getChannelSign(PQChanItem *ci); +channelKey * getChannelKey(PQChanItem *ci); +MsgHash getMsgHash(PQChanItem *ci); + +class pqichannel +{ + public: + + pqichannel(sslroot *, channelKey *, std::string title, int mode); +virtual ~pqichannel() { return; } + + // retrieval. + +channelMsg *findMsg(MsgHash mh); +int getMsgSummary(std::list &summary); + + +int processMsg(PQChanItem *in); +int pruneOldMsgs(); + + // check packet signature (with channel key) + // check key matches ours. + // if we have it, increment the counter. + // else add in. + + // fill with outgoing +int reBroadcast(std::list &outgoing); + +channelSign getSign(); +channelKey *getKey(); + +int getMode() { return mode; } +std::string getName() { return channelTitle; } +float getRanking() { return ranking; } +int getMsgCount() { return msgByHash.size(); } + +std::ostream& print(std::ostream&); + + protected: +sslroot *sroot; + + private: + + // analysis functions +TimeStamp getCurrentTimeStamp(); +bool checkPktSignature(PQChanItem*); +//MsgHash getPktHash(PQChanItem*); + + int mode; // Fav, Sub, Listen, Other. + std::map msgByHash; + + std::string channelTitle; + float ranking; + + protected: // needed by pqichanneler. + channelKey *key; +}; + +// specialisation with the private key, and output. +class pqichanneler: public pqichannel +{ + public: + pqichanneler(sslroot *s, + channelKey *priv, channelKey *pub, + std::string title); + +virtual ~pqichanneler() { return; } + + // Takes a partially constructed Msg, + // fills in the signature.... + // then all it has to do is pass it + // to the pqichannel which will handle the + // distribution. +int sendmsg(PQChanItem *); + + private: + channelKey *privkey; +}; + + +class p3channel: public PQTunnelService +{ + public: + p3channel(sslroot *r); +virtual ~p3channel(); + + // PQTunnelService functions. +virtual int receive(PQTunnel *); +virtual PQTunnel *send(); + +virtual int tick(); + + // doesn't use the init functions. +virtual int receive(PQTunnelInit *i) { delete i; return 1; } +virtual PQTunnelInit *sendInit() { return NULL; } + + // End of PQTunnelService functions. + + // load and save configuration. + int save_configuration(); + int load_configuration(); + + // test functions. +int generateRandomMsg(); +int generateRandomKeys(channelKey *priv, channelKey *pub); + + // retrieval fns. +pqichannel *findChannel(channelSign s); +int getChannelList(std::list &chans); + + private: + + // so we need an interface for the data. + +int handleIncoming(); + +int printMsgs(); + + // first storage. + std::map channels; + + + // +int reBroadcast(); + // maintainance. +int pruneOldMsgs(); + + // counters. +int ts_nextlp; +int min10Count; + + std::list discovered; + sslroot *sroot; + + // Storage for incoming/outgoing. + std::list inpkts; + std::list outpkts; +}; + +#endif // MRK_P3_CHANNEL_H diff --git a/libretroshare/src/pqi/p3disc.cc b/libretroshare/src/pqi/p3disc.cc new file mode 100644 index 000000000..e5a6fd3e2 --- /dev/null +++ b/libretroshare/src/pqi/p3disc.cc @@ -0,0 +1,2276 @@ +/* + * "$Id: p3disc.cc,v 1.23 2007-02-18 21:46:49 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "pqi/p3disc.h" + +// for active local cert stuff. +#include "pqi/pqissl.h" + +#include +#include +#include + +const int PQI_DISC_ITEM_TYPE = 0x69532; + +#include +#include "pqi/pqidebug.h" + +const int pqidisczone = 2482; + + +static int updateAutoServer(autoserver *as, DiscItem *di); +static int convertTDeltaToTRange(double tdelta); +static int convertTRangeToTDelta(int trange); +static int updateCertAvailabilityFlags(cert *c, unsigned long discFlags); +static unsigned long determineCertAvailabilityFlags(cert *c); + +// Operating System specific includes. +#include "pqi/pqinetwork.h" + +p3disc::p3disc(sslroot *r) + :PQTunnelService(PQI_TUNNEL_DISC_ITEM_TYPE), sroot(r) +{ + ldata = NULL; + ldlenmax = 1024; + + local_disc = false; //true; + remote_disc = true; + + // set last check to current time, this prevents queued. + // messages at the start! (actually shouldn't matter - as they aren't connected). + ts_lastcheck = time(NULL); // 0; + + // configure... + load_configuration(); + localSetup(); + + return; +} + +p3disc::~p3disc() +{ + return; +} + +// The PQTunnelService interface. +int p3disc::receive(PQTunnel *i) +{ + inpkts.push_back(i); + + std::ostringstream out; + out << "p3disc::receive() InQueue:" << inpkts.size() << std::endl; + out << "incoming packet: " << std::endl; + i -> print(out); + pqioutput(PQL_DEBUG_BASIC, pqidisczone, out.str()); + + return 1; +} + +PQTunnel *p3disc::send() +{ + std::ostringstream out; + out << "p3disc::send() To Send:" << outpkts.size() << std::endl; + + if (outpkts.size() < 1) + { + out << "No Packet" << std::endl; + pqioutput(PQL_DEBUG_ALL, pqidisczone, out.str()); + return NULL; + } + PQTunnel *pkt = (PQTunnel *) outpkts.front(); + outpkts.pop_front(); + + out << "outgoing packet: " << std::endl; + pkt -> print(out); + pqioutput(PQL_DEBUG_BASIC, pqidisczone, out.str()); + + return pkt; +} + +PQTunnel *p3disc::getObj() +{ + return new DiscItem(); +} + + +int p3disc::tick() +{ + pqioutput(PQL_DEBUG_ALL, pqidisczone, + "p3disc::tick()"); + + if (local_disc) + { + if (ts_nextlp == 0) + { + pqioutput(PQL_DEBUG_ALL, pqidisczone, + "Local Discovery On!"); + localPing(baddr); + localListen(); + } + } + else + { + pqioutput(PQL_DEBUG_ALL, pqidisczone, + "Local Discovery Off!"); + } + + // ten minute counter. + if (--ts_nextlp < 0) + { + ts_nextlp = 600; + } + + if (ts_nextlp % 300 == 0) + idServers(); + + + /* remote discovery can run infrequently.... + * this is a good idea, as it ensures that + * multiple Pings aren't sent to neighbours.... + * + * only run every 5 seconds. + */ + + if (ts_nextlp % 5 != 0) + { + return 1; + } + + // important bit + int nr = handleReplies(); // discards packets if not running. + if (remote_disc) + { + pqioutput(PQL_DEBUG_ALL, pqidisczone, + "Remote Discovery On!"); + newRequests(); + if ((sroot -> collectedCerts()) || (nr > 0)) + { + distillData(); + } + } + else + { + pqioutput(PQL_DEBUG_ALL, pqidisczone, + "Remote Discovery Off!"); + } + return 1; +} + +static int local_disc_def_port = 7770; +static int local_disc_secondary_port = 7870; + +int p3disc::setLocalAddress(struct sockaddr_in srvaddr) +{ + saddr = srvaddr; + return 1; +} + + +int p3disc::determineLocalNetAddr() +{ + // laddr filled in by load_configuration. + laddr.sin_port = htons(local_disc_def_port); + +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS // ie UNIX + // broadcast address. + baddr.sin_family = AF_INET; + inet_aton("0.0.0.0", &(baddr.sin_addr)); + baddr.sin_port = htons(local_disc_def_port); +#else // WIN + + baddr. sin_family = AF_INET; + + // So as recommended on this site.. will use |+& to calc it. + unsigned long netmask = inet_addr("255.255.255.0"); + unsigned long netaddr = saddr.sin_addr.s_addr & netmask; + baddr.sin_addr.s_addr = netaddr | (~netmask); + + // direct works! + //baddr.sin_addr.s_addr = inet_addr("10.0.0.59"); + //baddr.sin_addr.s_addr = inet_addr("127.0.0.1"); + // broadcast! + baddr.sin_addr.s_addr = INADDR_BROADCAST; + baddr.sin_port = htons(local_disc_def_port); + + + + + +#endif +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ + + { + std::ostringstream out; + out << "p3disc::determineLocalNetAddr() baddr: "; + out << inet_ntoa(baddr.sin_addr) << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqidisczone, out.str()); + } + + return 1; +} + +int p3disc::setupLocalPacket(int type, struct sockaddr_in *home, + struct sockaddr_in *server) +{ + if (ldata == NULL) + { + ldata = malloc(ldlenmax); + } + + // setup packet. + // 8 bytes - tag + ((char *) ldata)[0] = 'P'; + ((char *) ldata)[1] = 'Q'; + ((char *) ldata)[2] = 'I'; + ((char *) ldata)[3] = 'L'; + if (type == AUTODISC_LDI_SUBTYPE_PING) + { + ((char *) ldata)[4] = 'D'; + ((char *) ldata)[5] = 'I'; + ((char *) ldata)[6] = 'S'; + ((char *) ldata)[7] = 'C'; + } + else + { + ((char *) ldata)[4] = 'R'; + ((char *) ldata)[5] = 'P'; + ((char *) ldata)[6] = 'L'; + ((char *) ldata)[7] = 'Y'; + } + + // sockaddr copy. + ldlen = 8; + for(unsigned int i = 0; i < sizeof(*home); i++) + { + ((char *) ldata)[ldlen + i] = ((char *) home)[i]; + } + + ldlen += sizeof(*home); + for(unsigned int i = 0; i < sizeof(*server); i++) + { + ((char *) ldata)[ldlen + i] = ((char *) server)[i]; + } + ldlen += sizeof(*server); + + return 1; +} + + + + + +int p3disc::localSetup() +{ + + if (!local_disc) + { + pqioutput(PQL_DEBUG_BASIC, pqidisczone, + "p3disc::localSetup() Warning local_disc OFF!"); + return -1; + } + + //First we must attempt to open the default socket + determineLocalNetAddr(); + + int err = 0; + + lsock = socket(PF_INET, SOCK_DGRAM, 0); +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS // ie UNIX + + if (lsock < 0) + { + pqioutput(PQL_DEBUG_BASIC, pqidisczone, + "p3disc::localSetup() Cannot open UDP socket!"); + local_disc = false; + return -1; + } + + err = fcntl(lsock, F_SETFL, O_NONBLOCK); + if (err < 0) + { + pqioutput(PQL_DEBUG_BASIC, pqidisczone, + "p3disc::localSetup() Error: Cannot make socket NON-Blocking: "); + + local_disc = false; + return -1; + } + + int on = 1; + if(0 != (err =setsockopt(lsock, SOL_SOCKET, SO_BROADCAST,(void *) &on, sizeof(on)))) + { + pqioutput(PQL_DEBUG_BASIC, pqidisczone, + "p3disc::localSetup() Error: Cannot make socket Broadcast: "); + local_disc = false; + return -1; + } + else + { + pqioutput(PQL_DEBUG_BASIC, pqidisczone, + "p3disc::localSetup() Broadcast Flag Set!"); + } + +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#else //WINDOWS_SYS + + if (lsock == INVALID_SOCKET) + { + pqioutput(PQL_DEBUG_BASIC, pqidisczone, + "p3disc::localSetup() Cannot open UDP socket!"); + local_disc = false; + return -1; + } + + unsigned long int on = 1; + if (0 != (err = ioctlsocket(lsock, FIONBIO, &on))) + { + pqioutput(PQL_DEBUG_BASIC, pqidisczone, + "p3disc::localSetup() Error: Cannot make socket NON-Blocking: "); + local_disc = false; + return -1; + } + + on = 1; + if(0 != (err=setsockopt(lsock, SOL_SOCKET, SO_BROADCAST,(char *) &on, sizeof(on)))) + { + pqioutput(PQL_DEBUG_BASIC, pqidisczone, + "p3disc::localSetup() Error: Cannot make socket Broadcast: "); + + local_disc = false; + return -1; + } + else + { + pqioutput(PQL_DEBUG_BASIC, pqidisczone, + "p3disc::localSetup() Broadcast Flag Set!"); + } + +#endif +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ + + { + std::ostringstream out; + out << "p3disc::localSetup()" << std::endl; + out << "\tSetup Family: " << laddr.sin_family; + out << std::endl; + out << "\tSetup Address: " << inet_ntoa(laddr.sin_addr); + out << std::endl; + out << "\tSetup Port: " << ntohs(laddr.sin_port) << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqidisczone, out.str()); + } + + if (0 != (err = bind(lsock, (struct sockaddr *) &laddr, sizeof(laddr)))) + { + std::ostringstream out; + out << "p3disc::localSetup()"; + out << " Cannot Bind to Default Address!" << std::endl; + showSocketError(out); + out << std::endl; + out << " Trying Secondary Address." << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqidisczone, out.str()); + + } + else + { + // ifsucessful then call localPing + // set ts to -1 and don't worry about outgoing until + // we receive a packet + std::ostringstream out; + out << "p3disc::localSetup()" << std::endl; + out << " Bound to Address." << std::endl; + out << "\tSetup Address: " << inet_ntoa(laddr.sin_addr); + out << std::endl; + out << "\tSetup Port: " << ntohs(laddr.sin_port) << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqidisczone, out.str()); + + ts_nextlp = -1; + ts_nextlp = 10; + localPing(baddr); + return 1; + } + + laddr.sin_port = htons(local_disc_secondary_port); + if (0 != (err = bind(lsock, (struct sockaddr *) &laddr, sizeof(laddr)))) + { + std::ostringstream out; + out << "p3disc::localSetup()"; + out << " Cannot Bind to Secondary Address!" << std::endl; + showSocketError(out); + out << std::endl; + out << " Giving Up!" << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqidisczone, out.str()); + local_disc = false; + return -1; + } + else + { + std::ostringstream out; + out << "p3disc::localSetup()" << std::endl; + out << " Bound to Secondary Address." << std::endl; + out << "\tSetup Address: " << inet_ntoa(laddr.sin_addr); + out << std::endl; + out << "\tSetup Port: " << ntohs(laddr.sin_port) << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqidisczone, out.str()); + + ts_nextlp = 10; + localPing(baddr); + return 1; + } + + // else we open a random port and set the timer + // ie - don't bind to a port..... + ts_nextlp = 10; // ping every 10 minutes. + localPing(baddr); + return 1; +} + +int p3disc::localPing(struct sockaddr_in reply_to) +{ + //This function sends a meessage out containing both cert + // and server address, as well as the ping address (if not standard) + + // so we send a packet out to that address + // (most likely broadcast address). + + // setup up the data for connection. + setupLocalPacket(AUTODISC_LDI_SUBTYPE_PING,&laddr, &saddr); + + // Cast to char for windows benefit. + int len = sendto(lsock, (char *) ldata, ldlen, 0, (struct sockaddr *) &reply_to, sizeof(reply_to)); + if (len != ldlen) + { + std::ostringstream out; + out << "p3disc::localPing()"; + out << " Failed to send Packet." << std::endl; + out << "Sent (" << len << "/" << ldlen; + out << std::endl; + out << "Addr:" << inet_ntoa(reply_to.sin_addr) << std::endl; + out << "Port:" << ntohs(reply_to.sin_port) << std::endl; + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqidisczone, out.str()); + } + else + { + std::ostringstream out; + out << "p3disc::localPing() Success!" << std::endl; + out << "Sent To Addr:" << inet_ntoa(reply_to.sin_addr) << std::endl; + out << "Sent To Port:" << ntohs(reply_to.sin_port) << std::endl; + out << "Message Size: " << len << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqidisczone, out.str()); + } + return 1; +} + +int p3disc::localReply(struct sockaddr_in reply_to) +{ + //This function sends a meessage out containing both cert + // and server address, as well as the ping address (if not standard) + + // so we send a packet out to that address + // (most likely broadcast address). + + // setup up the data for connection. + setupLocalPacket(AUTODISC_LDI_SUBTYPE_RPLY,&laddr, &saddr); + + // Cast to char for windows benefit. + int len = sendto(lsock, (char *) ldata, ldlen, 0, (struct sockaddr *) &reply_to, sizeof(reply_to)); + if (len != ldlen) + { + std::ostringstream out; + out << "p3disc::localPing()"; + out << " Failed to send Packet." << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqidisczone, out.str()); + } + + return 1; +} + + +int p3disc::localListen() +{ + //This function listens to the ping address. + //For each reply, store the result in the structure and mark as local + struct sockaddr_in addr; + struct sockaddr_in neighbour; + struct sockaddr_in server; + socklen_t alen = sizeof(addr); + int nlen = sizeof(neighbour); + int len; + int size = 0; + + while(0 < (size = recvfrom(lsock, (char *) ldata, ldlen, 0, + (struct sockaddr *) &addr, &alen))) + { + std::ostringstream out; + out << "Recved Message" << std::endl; + out << "From Addr:" << inet_ntoa(addr.sin_addr) << std::endl; + out << "From Port:" << ntohs(addr.sin_port) << std::endl; + out << "Message Size: " << size << std::endl; + + for(int i = 0; i < 8; i++) + { + out << ((char *) ldata)[i]; + } + out << std::endl; + + len = 8; + // sockaddr copy. + for(int i = 0; i < nlen; i++) + { + ((char *) &neighbour)[i] = ((char *) ldata)[len + i]; + } + len += nlen; + for(int i = 0; i < nlen; i++) + { + ((char *) &server)[i] = ((char *) ldata)[len + i]; + } + len += nlen; + + + out << "Neighbour Addr:" << inet_ntoa(neighbour.sin_addr) << std::endl; + out << "Neighbour Port:" << ntohs(neighbour.sin_port) << std::endl; + out << "Server Addr:" << inet_ntoa(server.sin_addr) << std::endl; + out << "Server Port:" << ntohs(server.sin_port) << std::endl; + + if ((laddr.sin_addr.s_addr == neighbour.sin_addr.s_addr) && + (laddr.sin_port == neighbour.sin_port)) + { + // Then We Sent it!!!! + // ignore.. + out << "Found Self! Addr - " << inet_ntoa(neighbour.sin_addr); + out << ":" << ntohs(neighbour.sin_port) << std::endl; + } + else + { + if ('D' == (((char *) ldata)[4])) // Then Ping. + { + // reply. + localReply(neighbour); + } + + addLocalNeighbour(&neighbour, &server); + } + + pqioutput(PQL_DEBUG_BASIC, pqidisczone, out.str()); + } + +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS // ie UNIX + + if ((size < 0) && (errno != EAGAIN)) + { + std::ostringstream out; + out << "Error Recieving Message" << std::endl; + out << "Errno: " << errno << std::endl; + out << socket_errorType(errno) << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqidisczone, out.str()); + } + +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#else // WINDOWS_SYS + + if (size == SOCKET_ERROR) + { + int err = WSAGetLastError(); + if (err != WSAEWOULDBLOCK) + { + std::ostringstream out; + out << "Error Recieving Message" << std::endl; + out << "WSE: " << err << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqidisczone, out.str()); + } + } + +#endif +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ + + return 1; +} + +// This needs to be fixed up.... +// Local dicsovery disabled for the moment.... + +int p3disc::addLocalNeighbour(struct sockaddr_in *n, struct sockaddr_in *s) +{ + std::list::iterator it; + for(it = neighbours.begin(); it != neighbours.end(); it++) + { + // if the server address matches one already! + // make sure its flags as local and return. + if (0 == memcmp((char *) &((*it) -> server_addr), (char *) s, sizeof(*s))) + { + (*it) -> local = true; + return 1; + } + } + // else add it in! + autoneighbour *ln = new autoneighbour(); + ln -> server_addr = (*s); + ln -> local = true; + ln -> id = NULL; // null cert + + std::string nname = "Local Neighbour ("; + nname += inet_ntoa(ln -> server_addr.sin_addr); + nname += ")"; + + //ln -> id -> Name(nname); + + // now we call the dummy connect... + // this will only be done once per local neighbour. + // connectForExchange(ln -> server_addr); + + neighbours.push_back(ln); + // update dicovered. + distillData(); + return 1; +} + + +// Code Fragment that might be useful when local is patched up.... +/**************************************************** +int p3disc::distillLocalData() +{ + // This transforms the autoneighbour tree into + // a list of certificates with the best guess settings. + + discovered.clear(); + + pqioutput(PQL_DEBUG_BASIC, pqidisczone, "p3disc::distillData()"); + + std::list::iterator it; + std::list::iterator it2; + + // Now check for local -> remote duplicates.... + for(it = neighbours.begin(); it != neighbours.end();) + { + cert *c = (cert *) ((*it) -> id); + if (((*it) -> local) && (c == NULL)) + { + // potentially a duplicate. + bool found = false; + for(it2 = neighbours.begin(); it2 != neighbours.end(); it2++) + { + // if address is the same -> remove first version. + if ((it != it2) && (0 == memcmp((char *) &((*it) -> addr), + (char *) &((*it2) -> addr), + sizeof(struct sockaddr)))) + { + (*it2) -> local = true; + found = true; + } + } + if (found == true) + { + // remove the certless local. + it = neighbours.erase(it); + } + else + { + it++; + } + } + else + { + it++; + } + } + +******************************************/ + + +int p3disc::idServers() +{ + std::list::iterator it; + std::list::iterator nit; + int cts = time(NULL); + + std::ostringstream out; + out << "::::AutoDiscovery Neighbours::::" << std::endl; + for(it = neighbours.begin(); it != neighbours.end(); it++) + { + if ((*it) -> local) + { + out << "Local Neighbour: "; + } + else + { + out << "Friend of a friend: "; + } + cert *c = (cert *) ((*it) -> id); + + if (c != NULL) + { + if (c -> certificate != NULL) + { + out << c -> certificate -> name; + } + else + { + out << c -> Name(); + } + } + else + { + out << "UnIdentified"; + } + + out << std::endl; + out << "BG LocalAddr: "; + out << inet_ntoa((*it) -> local_addr.sin_addr); + out << ":" << ntohs((*it) -> local_addr.sin_port) << std::endl; + out << "BG Server: "; + out << inet_ntoa((*it) -> server_addr.sin_addr); + out << ":" << ntohs((*it) -> server_addr.sin_port) << std::endl; + out << " Listen TR: "; + if (((*it) -> listen) && ((*it) -> l_ts)) + { + out << cts - (*it) -> l_ts << " sec ago"; + } + else + { + out << "Never"; + } + out << " "; + + out << "Connect TR: "; + if (((*it) -> connect) && ((*it) -> c_ts)) + { + out << cts - (*it) -> c_ts << " sec ago"; + } + else + { + out << "Never"; + } + + if ((*it) -> active) + { + out << " Active!!!"; + } + out << std::endl; + + out << " -->DiscFlags: 0x" << std::hex << (*it)->discFlags; + out << std::dec << std::endl; + + for(nit = ((*it) -> neighbour_of).begin(); + nit != ((*it) -> neighbour_of).end(); nit++) + { + out << "\tConnected via: "; + if ((*nit) -> id != NULL) + { + out << ((*nit) ->id) -> Name() << "("; + out << inet_ntoa(((*nit) -> id) -> lastaddr.sin_addr); + out << ":" << ntohs(((*nit) -> id) -> lastaddr.sin_port); + out << ")"; + } + out << std::endl; + out << "\t\tServer: "; + out << inet_ntoa((*nit) -> server_addr.sin_addr); + out <<":"<< ntohs((*nit) -> server_addr.sin_port); + out << std::endl; + out << "\t\tLocalAddr: "; + out << inet_ntoa((*nit) -> local_addr.sin_addr); + out <<":"<< ntohs((*nit) -> local_addr.sin_port); + + out << std::endl; + if ((*nit) -> listen) + { + out << "\t\tListen TR:"; + out << cts - (*nit) -> l_ts << " sec ago"; + } + else + { + out << "\t\tNever Received!"; + } + out << std::endl; + if ((*nit) -> connect) + { + out << "\t\tConnect TR:"; + out << cts - (*nit) -> c_ts << " sec ago"; + } + else + { + out << "\t\tNever Connected!"; + } + out << std::endl; + out << "\t\tDiscFlags: 0x" << std::hex << (*nit)->discFlags; + out << std::dec << std::endl; + } + } + pqioutput(PQL_WARNING, pqidisczone, out.str()); + return 1; +} + + + + +int p3disc::newRequests() +{ + // Check the timestamp against the list of certs. + // If any are newer and currently active, then + // send out Discovery Request. + // This initiates the p3disc procedure. + + if (!remote_disc) + { + pqioutput(PQL_DEBUG_ALL, pqidisczone, + "p3disc::newRequests() Remote Discovery is turned off"); + return -1; + } + + pqioutput(PQL_DEBUG_ALL, pqidisczone, + "p3disc::newRequests() checkin for new neighbours"); + + // Perform operation on the cert list. + std::list::iterator it; + // Temp variable + std::list &certlist = sroot -> getCertList(); + + { + std::ostringstream out; + out << "Checking CertList!" << std::endl; + out << "last_check: " << ts_lastcheck; + out << " time(): " << time(NULL); + pqioutput(PQL_DEBUG_ALL, pqidisczone, out.str()); + } + + for(it = certlist.begin(); it != certlist.end(); it++) + { + { + std::ostringstream out; + out << "Cert: " << (*it) -> Name(); + out << " lc_ts: " << (*it) -> lc_timestamp; + out << " lr_ts: " << (*it) -> lr_timestamp; + pqioutput(PQL_DEBUG_ALL, pqidisczone, out.str()); + } + + // This should be Connected(), rather than Accepted(). + // should reply with all Accepted(), but only send to all connected(). + // if (((*it) -> Accepted()) && + // + // need >= to ensure that it will happen, + // about 1 in 5 chance of multiple newRequests if called every 5 secs. + // can live with this. (else switch to fractional seconds). + + if (((*it) -> Connected()) && + (((*it) -> lc_timestamp >= ts_lastcheck) + || ((*it) -> lr_timestamp >= ts_lastcheck))) + { + + // also must not have already sent message. + // (unless reconnection?) + // actually - this should occur, even if last + // exchange not complete. + // reconnect + +/***************************************************************************** + * No more need for ad_init silliness.... + * + //if (ad_init.end() == + // find(ad_init.begin(),ad_init.end(),*it)) + // infact - we need the opposite behaviour. + // remove if in the init list. + + std::list::iterator it2; + if (ad_init.end() != + (it2 = find(ad_init.begin(),ad_init.end(),*it))) + { + ad_init.erase(it2); + } + * + * + * + ****************************************************************************/ + + + { + // Then send message. + { + std::ostringstream out; + out << "p3disc::newRequests()"; + out << "Constructing a Message!" << std::endl; + out << "Sending to: " << (*it) -> Name(); + out << " lc_ts: " << (*it) -> lc_timestamp; + out << " lr_ts: " << (*it) -> lr_timestamp; + pqioutput(PQL_DEBUG_BASIC, pqidisczone, out.str()); + } + + // Construct a message + DiscItem *di = new DiscItem(); + + // get our details..... + cert *own = sroot -> getOwnCert(); + + // Fill the message + di -> cid = (*it) -> cid; + di -> laddr = own -> localaddr; + di -> saddr = own -> serveraddr; + + // if we are firewalled..... (and no forwarding...) + // set received as impossible. + if (own -> Firewalled() && (!(own -> Forwarded()))) + di -> receive_tr = 0; /* invalid */ + else + di -> receive_tr = 1; /* zero time */ + + di -> connect_tr = 1; /* zero time */ + di -> discFlags = determineCertAvailabilityFlags(own); + + // Send off message + outpkts.push_back(di); + //p3i -> SendOtherPQItem(di); + +/***************************************************************************** + * No more need for ad_init silliness.... + // push onto init list. + ad_init.push_back(*it); + * + ****************************************************************************/ + + // Finally we should also advertise the + // new connection to our neighbours???? + // SHOULD DO - NOT YET. + + } + } + } + ts_lastcheck = time(NULL); + return 1; +} + +bool isDiscItem(PQItem *item) +{ + if (item -> type == PQI_ITEM_TYPE_AUTODISCITEM) + return true; + return false; +} + +int p3disc::handleReplies() +{ + DiscItem *di = NULL; + pqioutput(PQL_DEBUG_ALL, pqidisczone, "p3disc::handleReplies()"); + + // if off discard item. + if (!remote_disc) + { + //while(NULL != (di = (DiscItem *) p3i -> SelectOtherPQItem(isDiscItem))) + while(inpkts.size() > 0) + { + std::ostringstream out; + out << "p3disc::handleReplies()"; + out << " Deleting - Cos RemoteDisc Off!" << std::endl; + + di = (DiscItem *) inpkts.front(); + inpkts.pop_front(); + + di -> print(out); + pqioutput(PQL_DEBUG_BASIC, pqidisczone, out.str()); + + delete di; + } + return 0; + } + + int nhandled = 0; + // While messages read + //while(NULL != (di = (DiscItem *) p3i -> SelectOtherPQItem(isDiscItem))) + while(inpkts.size() > 0) + { + PQItem *item = inpkts.front(); + inpkts.pop_front(); + + DiscItem *di = NULL; + DiscReplyItem *dri = NULL; + + if (NULL == (di = dynamic_cast (item))) + { + std::ostringstream out; + out << "p3disc::handleReplies()"; + out << "Deleting Non DiscItem Msg" << std::endl; + item -> print(out); + pqioutput(PQL_DEBUG_BASIC, pqidisczone, out.str()); + + // delete and continue to next loop. + delete item; + + continue; + } + nhandled++; + + { + std::ostringstream out; + out << "p3disc::handleReplies()"; + out << " Received Message!" << std::endl; + di -> print(out); + pqioutput(PQL_DEBUG_BASIC, pqidisczone, out.str()); + } + + + // if discovery reply then respondif haven't already. + if (NULL != (dri = dynamic_cast (di))) + { + +/********************************************************************************* + * Shouldn't Reply to a Reply - end up with silly traffic..... + * only reply to a ping.... + * + std::list::iterator it; + if (ad_init.end() != (it = find(ad_init.begin(), ad_init.end(), + (cert *) (dri -> p)))) + { + // Should send our answer! + sendDiscoveryReply((cert *) dri -> p); + pqioutput(PQL_DEBUG_BASIC, pqidisczone, + "After Reply to Reply"); + // remove from reply list. + ad_init.erase(it); + } + * + * + ********************************************************************************/ + + // add to data tree. + handleDiscoveryData(dri); + } + else if (di -> discType == 0) + { + handleDiscoveryPing(di); + sendDiscoveryReply((cert *) di -> p); + pqioutput(PQL_DEBUG_BASIC, pqidisczone, + "After Reply to Ping"); + + } + delete di; + } + return nhandled; +} + +int p3disc::sendDiscoveryReply(cert *p) +{ + if (!remote_disc) + return -1; + + // So to send a discovery reply .... we need to.... + // 1) generate a list of our neighbours..... + pqioutput(PQL_DEBUG_BASIC, pqidisczone, + "p3disc::sendDiscoveryReply() Generating Messages!"); + + std::list::iterator it; + // Temp variable + std::list &certlist = sroot -> getCertList(); + int good_certs = 0; + int cts = time(NULL); + + for(it = certlist.begin(); it != certlist.end(); it++) + { + // if accepted and has connected (soon) + if ((*it) -> Accepted()) + { + good_certs++; + + { + std::ostringstream out; + out << "p3disc::sendDiscoveryReply()"; + out << " Found Neighbour Cert!" << std::endl; + out << "Encoding: "<<(*it)->Name() << std::endl; + out << "Encoding(2): "<<(*it)->certificate->name << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqidisczone, out.str()); + } + + // Construct a message + DiscReplyItem *di = new DiscReplyItem(); + + // Fill the message + // Set Target as input cert. + di -> cid = p -> cid; + + // set the server address. + di -> laddr = (*it) -> localaddr; + di -> saddr = (*it) -> serveraddr; + + // set the timeframe since last connection. + if ((*it) -> lr_timestamp <= 0) + { + di -> receive_tr = 0; + } + else + { + di -> receive_tr = convertTDeltaToTRange(cts - (*it) -> lr_timestamp); + } + + if ((*it) -> lc_timestamp <= 0) + { + di -> connect_tr = 0; + } + else + { + di -> connect_tr = convertTDeltaToTRange(cts - (*it) -> lc_timestamp); + } + di -> discFlags = determineCertAvailabilityFlags(*it); + + // irrelevent + di -> p = NULL; + + // actually ned to copy certificate to array + // for proper cert stuff. + +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + int len = i2d_XPGP((*it) -> certificate, &(di -> certDER)); +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + int len = i2d_X509((*it) -> certificate, &(di -> certDER)); +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + if (len > 0) + { + di -> certLen = len; + std::ostringstream out; + out << "Cert Encoded(" << len << ")" << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqidisczone, out.str()); + } + else + { + pqioutput(PQL_DEBUG_BASIC, pqidisczone, "Failed to Encode Cert"); + di -> certLen = 0; + } + + // Send off message + outpkts.push_back(di); + pqioutput(PQL_DEBUG_BASIC, pqidisczone, "Sent DI Message"); + } + else + { + std::ostringstream out; + out << "p3disc::sendDiscoveryReply()"; + out << "Not Sending Cert: " << std::endl; + out << (*it) -> Name() << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqidisczone, out.str()); + } + + } + + { + std::ostringstream out; + out << "p3disc::sendDiscoveryReply()"; + out << "Found " << good_certs << " Certs" << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqidisczone, out.str()); + } + + return 1; +} + + +int p3disc::handleDiscoveryPing(DiscItem *di) +{ + std::list::iterator it; + + // as already connected.... certificate available. + cert *c = (cert *) di -> p; + + if (c == NULL) + return -1; + + { + std::ostringstream out; + out << "p3disc::handleDiscoveryPing()" << std::endl; + di -> print(out); + out << "RECEIVED Self Describing DiscItem!"; + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqidisczone, out.str()); + } + + // The first check is whether this packet came from + // the cert in the reply. + + // Local address is always right! + // No User control anyway! + c -> localaddr = di -> laddr; + + // The Rest of this should only be set + // if we are in autoconnect mode..... + // else should be done manually. + // ----> Think we should do this always (is disc from then) + /**************************** + if (!(c -> Manual())) + ****************************/ + { + + // if the connect addr isn't valid. + if (!isValidNet(&(c -> lastaddr.sin_addr))) + { + // set it all + c -> serveraddr = di -> saddr; + pqioutput(PQL_WARNING, pqidisczone, + "lastaddr !Valid -> serveraddr=di->saddr"); + } + // if the connect addr == dispkt.local + else if (0 == inaddr_cmp(c -> lastaddr, di -> laddr)) + { + // set it all + c -> serveraddr = di -> saddr; + c -> Local(true); + pqioutput(PQL_WARNING, pqidisczone, + "lastaddr=di->laddr -> Local & serveraddr=di->saddr"); + } + else if (0 == inaddr_cmp(c -> lastaddr, di -> saddr)) + { + pqioutput(PQL_WARNING, pqidisczone, + "lastaddr=di->saddr -> !Local & serveraddr=di->saddr"); + c -> serveraddr = di -> saddr; + c -> Local(false); + } + else + { + pqioutput(PQL_WARNING, pqidisczone, + "lastaddr!=(di->laddr|di->saddr) -> !Local,serveraddr left"); + c -> Local(false); + } + + updateCertAvailabilityFlags(c, di->discFlags); + + } + /**************************** + else + { + pqioutput(PQL_WARNING, pqidisczone, + "peer is Manual -> leaving server settings"); + if (0 == inaddr_cmp(c -> lastaddr, di -> laddr)) + { + pqioutput(PQL_WARNING, pqidisczone, + "c->lastaddr=di->laddr -> local"); + c -> Local(true); + } + else + { + pqioutput(PQL_WARNING, pqidisczone, + "c->lastaddr!=di->laddr -> !local"); + c -> Local(false); + } + + } + ****************************/ + + // Now add it into the system. + // check if it exists already...... + for(it = neighbours.begin(); it != neighbours.end(); it++) + { + cert *c2 = (cert *) (*it) -> id; +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + if ((c2 != NULL) && (0 == XPGP_cmp( + c -> certificate, c2 -> certificate))) +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + if ((c2 != NULL) && (0 == X509_cmp( + c -> certificate, c2 -> certificate))) +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + { + // matching.... + // update it....; + pqioutput(PQL_DEBUG_BASIC, pqidisczone, "Updating Certificate (AN)!"); + + (*it)-> local = c -> Local(); + updateAutoServer((*it), di); + + /* now look through the neighbours_of */ + std::list::iterator nit; + for(nit = ((*it) -> neighbour_of).begin(); + nit != ((*it) -> neighbour_of).end(); nit++) + { + + /* check if we already have a autoserver.... */ + if ((*it)->id == (*nit)->id) + { + /* we already have one */ + // update it....; + pqioutput(PQL_DEBUG_BASIC, pqidisczone, + "Updating Certificate (AS)!"); + + updateAutoServer(*nit, di); + return 0; + } + } + + pqioutput(PQL_DEBUG_BASIC, pqidisczone, + "Adding Certificate (AS)!"); + + /* if we get here, we need to add an autoserver */ + autoserver *as = new autoserver(); + as -> id = c; + updateAutoServer(as, di); + (*it) -> neighbour_of.push_back(as); + + return 1; + } + } + + // if get here must add a autoneighbour + an autoserver. + + autoneighbour *an = new autoneighbour(); + an -> id = c; + an -> local = c -> Local(); + updateAutoServer(an, di); + + // add autoserver to an. + autoserver *as = new autoserver(); + as -> id = c; + updateAutoServer(as, di); + + an -> neighbour_of.push_back(as); + neighbours.push_back(an); + + return 1; +} + + +int p3disc::handleDiscoveryData(DiscReplyItem *di) +{ + std::list::iterator it; + + { + std::ostringstream out; + out << "p3disc::handleDiscoveryData()" << std::endl; + di -> print(out); + pqioutput(PQL_DEBUG_BASIC, pqidisczone, out.str()); + } + + /* WIN/LINUX Difference. + */ +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS // ie UNIX + const unsigned char *certptr = di -> certDER; +#else + unsigned char *certptr = di -> certDER; +#endif +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ + + + // load up the certificate..... +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + + XPGP *tmp = NULL; + XPGP *xpgp = d2i_XPGP(&tmp, (unsigned char **) &certptr, di -> certLen); + if (xpgp == NULL) + return -1; + { + std::ostringstream out; + out << "p3disc::handleDiscoveryData()" << std::endl; + out << "certificate name: " << xpgp -> name << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqidisczone, out.str()); + } + + // if a duplicate with ad/or sslroot; + cert *c = sroot -> makeCertificateXPGP(xpgp); + if (c == NULL) + { + pqioutput(PQL_DEBUG_BASIC, pqidisczone, + "Failed to Create Certificate"); + // delete the cert. + XPGP_free(xpgp); + return -1; + } + + +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + + X509 *tmp = NULL; + X509 *x509 = d2i_X509(&tmp, &certptr, di -> certLen); + if (x509 == NULL) + return -1; + { + std::ostringstream out; + out << "p3disc::handleDiscoveryData()" << std::endl; + out << "certificate name: " << x509 -> name << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqidisczone, out.str()); + } + + // if a duplicate with ad/or sslroot; + cert *c = sroot -> makeCertificate(x509); + if (c == NULL) + { + pqioutput(PQL_DEBUG_BASIC, pqidisczone, + "Failed to Create Certificate"); + // delete the cert. + X509_free(x509); + return -1; + } + +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + + + // So have new/existing cert; + // check if it exists already...... + for(it = neighbours.begin(); it != neighbours.end(); it++) + { + cert *c2 = (cert *) (*it) -> id; + +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + if ((c2 != NULL) && (0 == XPGP_cmp( + c -> certificate, c2 -> certificate))) +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + if ((c2 != NULL) && (0 == X509_cmp( + c -> certificate, c2 -> certificate))) +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + { + // matching.... check neighbours of.... + // for the source of the message. + + std::list::iterator nit; + for(nit = ((*it) -> neighbour_of).begin(); + nit != ((*it) -> neighbour_of).end(); nit++) + { +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + if (0 == XPGP_cmp( +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + if (0 == X509_cmp( +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + ((cert *) (*nit) -> id) -> certificate, + ((cert *) (di -> p)) -> certificate)) + { + + // update it....; + pqioutput(PQL_DEBUG_BASIC, pqidisczone, + "Updating Certificate!"); + + updateAutoServer(*nit, di); + + return 0; + } + } + + // if we get to here - add neighbour of info. + autoserver *as = new autoserver(); + as -> id = (cert *) (di -> p); + + // add in some more ....as -> addr = (di -> ); + + updateAutoServer(as, di); + + (*it) -> neighbour_of.push_back(as); + + return 1; + } + } + + // if get here must add a autoneighbour + autoserver. + + { + std::ostringstream out; + out << "p3disc::handleDiscoveryData()" << std::endl; + out << "Adding New AutoNeighbour:" << c -> Name() << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqidisczone, out.str()); + } + + autoneighbour *an = new autoneighbour(); + an -> id = c; + // initial guess. + an -> local_addr = di -> laddr; + an -> server_addr = di -> saddr; + an -> local = false; + + autoserver *as = new autoserver(); + as -> id = (cert *) di -> p; + + updateAutoServer(as, di); + + an -> neighbour_of.push_back(as); + + neighbours.push_back(an); + + return 1; +} + +int p3disc::collectCerts() +{ + + // First get any extras from the CollectedCerts Queue. + // if the cert matches an existing one.... update + discard + // else add in.... + + std::list::iterator it; + std::list::iterator it2; + + cert *nc; + while(NULL != (nc = sroot -> getCollectedCert())) + { + // check for matching certs. + bool found = false; + + { + std::ostringstream out; + out << "p3disc::collectCert: " << std::endl; + out << "Name: " << nc -> Name() << std::endl; + out << "CN: " << nc -> certificate -> name << std::endl; + + out << " From: "; + out << inet_ntoa(nc -> lastaddr.sin_addr); + out << ":" << ntohs(nc -> lastaddr.sin_port) << std::endl; + out << " Local: "; + out << inet_ntoa(nc -> localaddr.sin_addr); + out << ":" << ntohs(nc -> localaddr.sin_port) << std::endl; + out << " Server: "; + out << inet_ntoa(nc -> serveraddr.sin_addr); + out << ":" << ntohs(nc -> serveraddr.sin_port) << std::endl; + out << " Listen TS:"; + out << nc -> lr_timestamp << " "; + out << "Connect TR:"; + out << nc -> lc_timestamp << std::endl; + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqidisczone, out.str()); + } + + + for(it = neighbours.begin(); (!found) && (it != neighbours.end()); it++) + { + cert *c = (cert *) ((*it) -> id); +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + if ((c != NULL) && + (0 == XPGP_cmp(c -> certificate, nc -> certificate))) +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + if ((c != NULL) && + (0 == X509_cmp(c -> certificate, nc -> certificate))) +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + { + /* addresses handled already .... + * by sslroot. (more intelligent decisions). + * update timestamps so we don't overwrite + * the uptodate cert data. + */ + + found = true; + if ((nc -> lc_timestamp > 0) && + ((unsigned) nc -> lc_timestamp > (*it) -> c_ts)) + { + // connect.... timestamp + (*it) -> connect = true; + (*it) -> c_ts = nc -> lc_timestamp; + // don't make this decision here. + //(*it) -> server_addr = nc -> lastaddr; + } + + if ((nc -> lr_timestamp > 0) && + ((unsigned) nc -> lr_timestamp > (*it) -> l_ts)) + { + // received.... timestamp + (*it) -> listen = true; + (*it) -> l_ts = nc -> lr_timestamp; + } + + if ((c != nc) || + (c -> certificate != nc -> certificate)) + { + std::ostringstream out; + out << "Warning Dup/Diff Mem "; + out << " Found in p3Disc!"; + out << std::endl; + pqioutput(PQL_ALERT, pqidisczone, out.str()); + exit(1); + } + } + } + if (!found) + { + // add into the list..... + autoneighbour *an = new autoneighbour(); + an -> id = nc; + + // initial guess. + an -> local_addr = nc -> localaddr; + an -> server_addr = nc -> serveraddr; + an -> local = false; + + if (nc -> lc_timestamp > 0) + { + an -> c_ts = nc -> lc_timestamp; + an -> connect = true; + } + else + { + an -> c_ts = 0; + an -> connect = false; + } + + if (nc -> lr_timestamp > 0) + { + an -> l_ts = nc -> lr_timestamp; + an -> listen = true; + } + else + { + an -> l_ts = 0; + an -> listen = false; + } + + neighbours.push_back(an); + } + } + return 1; +} + +int p3disc::distillData() +{ + // This transforms the autoneighbour tree into + // a list of certificates with the best guess settings. + + // get any extra. from sslroot. + collectCerts(); + + discovered.clear(); + + std::ostringstream out; + out << "p3disc::distillData()" << std::endl; + + std::list::iterator it; + std::list::iterator it2; + std::list::iterator nit; + cert *own = sroot -> getOwnCert(); + + for(it = neighbours.begin(); it != neighbours.end(); it++) + { + /* for the moment this is going to be a simplistic + * (and non-fault tolerent design).... + * we will take the most up-to-date values.... from the friends of neighbours. + * + * if these are more up-to-date than both the + * (1) neighbour (*it) and + * (2) the actual certificate and + * (3) we are not connected... then + * + * (a) we update the addresses and timestamps on the neighbour. + * (b) addresses on the certificate. + * + * Therefore + * cert has (1) our connect times, (2) best guess server. + * neighbour has uptodate times/servers from last distill. + * + * NOTE this requires a better algorithm. + * + */ + + unsigned int mr_connect = 0; + unsigned int mr_listen = 0; + + unsigned int mr_both = 0; /* connect or receive */ + /* three fields below match most recent (of either) */ + struct sockaddr_in mr_server; + struct sockaddr_in mr_local; + unsigned int mr_flags = 0; + + /* if we find a neighbour_of, which is the same cert. + * then we have the definitive answer already + * (and it has been installed) + */ + + bool haveDefinitive = false; + + cert *c = (cert *) (*it) -> id; + for(nit = ((*it) -> neighbour_of).begin(); + nit != ((*it) -> neighbour_of).end(); nit++) + { + out << "\tDistill Connected via: "; + if ((*nit) -> id != NULL) + { + out << ((*nit) ->id) -> Name(); + } + out << std::endl; + out << "\t\tServer: "; + out << inet_ntoa((*nit)->server_addr.sin_addr); + out << ":" << ntohs((*nit)->server_addr.sin_port); + out << std::endl; + if ((*nit)->id == (*it)->id) + { + haveDefinitive = true; + out << "\t\tIs Definitive Answer!"; + out << std::endl; + } + + if ((*nit) -> listen) + { + if ((*nit)->l_ts > mr_listen) + { + mr_listen = (*nit)->l_ts; + if (mr_listen > mr_both) + { + mr_both = mr_listen; + mr_server = (*nit) -> server_addr; + mr_local = (*nit) -> local_addr; + mr_flags = (*nit) -> discFlags; + } + } + } + + if ((*nit) -> connect) + { + if ((*nit) -> c_ts > mr_connect) + { + mr_connect = (*nit)->c_ts; + if (mr_connect > mr_both) + { + mr_both = mr_connect; + mr_server = (*nit) -> server_addr; + mr_local = (*nit) -> local_addr; + mr_flags = (*nit) -> discFlags; + } + } + } + } + + if ((c == own) || (haveDefinitive)) + { + out << c -> Name(); + out << ": Is Own or Definitive: no Update..."; + out << std::endl; + + discovered.push_back(c); + continue; + } + + if ((mr_both > (*it)-> c_ts) && (mr_both > (*it)-> l_ts)) + { + (*it) -> server_addr = mr_server; + (*it) -> local_addr = mr_local; + (*it) -> discFlags = mr_flags; + + } + + /* now we can check against (*it) */ + if ((!(*it)->listen) || ((*it)-> l_ts < mr_listen)) + { + (*it) -> listen = true; + (*it)-> l_ts = mr_listen; + } + + if ((!(*it)->connect) || ((*it)-> c_ts < mr_connect)) + { + (*it) -> connect = true; + (*it)-> c_ts = mr_connect; + } + + /* XXX fixme ***/ + // Finally we can update the certificate, if auto + // is selected.... or not in use. + if (!(c -> Connected())) + { + out << "Checking: " << c -> Name() << std::endl; + + // if empty local + if (0 == inaddr_cmp(c -> localaddr, INADDR_ANY)) + { + out << "\tUpdating NULL Local Addr:" << std::endl; + out << "\t\tOld: "; + out << inet_ntoa(c->localaddr.sin_addr); + out << ":" << ntohs(c->localaddr.sin_port); + c -> localaddr = (*it) -> local_addr; + out << "\t\tNew: "; + out << inet_ntoa(c->localaddr.sin_addr); + out << ":" << ntohs(c->localaddr.sin_port); + } + + // if empty server ..... + if (0 == inaddr_cmp(c -> serveraddr, INADDR_ANY)) + { + out << "\tUpdating NULL Serv Addr:" << std::endl; + out << "\t\tOld: "; + out << inet_ntoa(c->serveraddr.sin_addr); + out << ":" << ntohs(c->serveraddr.sin_port); + c -> serveraddr = (*it) -> server_addr; + out << "\t\tNew: "; + out << inet_ntoa(c->serveraddr.sin_addr); + out << ":" << ntohs(c->serveraddr.sin_port); + } + // if local (second as should catch empty) + else if ((0 == inaddr_cmp((*it) -> server_addr, + c -> localaddr))) + //&& (inaddr_local(c -> localaddr)) + { + out << "\tMaking Local..." << std::endl; + c -> Local(true); + } + + // Finally the key update .... + // check only against the latest data.... + + if (mr_both) + { + // + unsigned int cert_both = c -> lc_timestamp; + if (cert_both < (unsigned) c -> lr_timestamp) + { + cert_both = c -> lr_timestamp; + } + + int log_delta = -1; /* invalid log */ + if (mr_both > cert_both) + { + log_delta = (int) log10((double) (mr_both - cert_both)); + } + + /* if a peer has connected more recently than us */ + if (log_delta > 3) // or > 10000 (secs), or ~3 hours. + { + out << "\tUpdating OLD Addresses:" << std::endl; + out << "\t\tOld Local: "; + out << inet_ntoa(c->serveraddr.sin_addr); + out << ":" << ntohs(c->serveraddr.sin_port); + out << std::endl; + out << "\t\tOld Server: "; + out << inet_ntoa(c->serveraddr.sin_addr); + out << ":" << ntohs(c->serveraddr.sin_port); + out << std::endl; + if (c->Firewalled()) + { + out << "\t\tFireWalled/"; + } + else + { + out << "\t\tNot FireWalled/"; + } + if (c->Forwarded()) + { + out << "Forwarded"; + } + else + { + out << "Not Forwarded"; + } + out << std::endl; + + if (0!=inaddr_cmp(mr_server, INADDR_ANY)) + { + c -> serveraddr = mr_server; + } + + if (0!=inaddr_cmp(mr_local, INADDR_ANY)) + { + c -> localaddr = mr_local; + } + + updateCertAvailabilityFlags(c, mr_flags); + + out << "\t\tNew: "; + out << inet_ntoa(c->serveraddr.sin_addr); + out << ":" << ntohs(c->serveraddr.sin_port); + out << "\t\tNew Local: "; + out << inet_ntoa(c->serveraddr.sin_addr); + out << ":" << ntohs(c->serveraddr.sin_port); + out << std::endl; + out << "\t\tNew Server: "; + out << inet_ntoa(c->serveraddr.sin_addr); + out << ":" << ntohs(c->serveraddr.sin_port); + out << std::endl; + if (c->Firewalled()) + { + out << "\t\tFireWalled/"; + } + else + { + out << "\t\tNot FireWalled/"; + } + if (c->Forwarded()) + { + out << "Forwarded"; + } + else + { + out << "Not Forwarded"; + } + out << std::endl; + } + } + } + discovered.push_back(c); + } + pqioutput(PQL_DEBUG_BASIC, pqidisczone, out.str()); + idServers(); + return 1; +} + +std::list &p3disc::getDiscovered() +{ + return discovered; +} + +static const std::string pqi_adflags("PQI_ADFLAGS"); + +int p3disc::save_configuration() +{ + if (sroot == NULL) + return -1; + + std::string localflags; + if (local_disc) + localflags += "L"; + if (remote_disc) + localflags += "R"; + sroot -> setSetting(pqi_adflags, localflags); + return 1; +} + + +// load configuration from sslcert -> owncert() +// instead of from the configuration files. + +int p3disc::load_configuration() +{ + unsigned int i = 0; + + if (sroot == NULL) + return -1; + + Person *p = sroot -> getOwnCert(); + if (p == NULL) + return -1; + laddr = p -> localaddr; + //laddr.sin_family = AF_INET; + + saddr = p -> serveraddr; + local_firewalled = p -> Firewalled(); + local_forwarded = p -> Forwarded(); + + std::string localflags = sroot -> getSetting(pqi_adflags); + // initially drop out gracefully. + if (localflags.length() == 0) + return 1; + if (i < localflags.length()) + if (local_disc = ('L' == localflags[i])) + i++; + if (i < localflags.length()) + if (remote_disc = ('R' == localflags[i])) + i++; + // temp turn on! + local_disc = false; // true; + remote_disc = true; + return 1; +} + + +std::list p3disc::potentialproxy(cert *target) +{ + std::list certs; + // search the discovery tree for proxies for target. + + std::list::iterator it; + std::list::iterator nit; + + pqioutput(PQL_DEBUG_BASIC, pqidisczone, + "p3disc::potentialproxy()"); + + for(it = neighbours.begin(); it != neighbours.end(); it++) + { + cert *c = (cert *) (*it) -> id; + if (c == target) + { + // found target. + for(nit = ((*it) -> neighbour_of).begin(); + nit != ((*it) -> neighbour_of).end(); nit++) + { + /* can't use target as proxy */ + cert *pp = (cert *) (*nit)->id; + if ((pp -> Connected()) && (target != pp)) + { + std::ostringstream out; + out << "Potential Proxy: "; + out << pp -> Name(); + certs.push_back(pp); + pqioutput(PQL_DEBUG_BASIC, pqidisczone, + out.str()); + } + } + + return certs; + } + } + + pqioutput(PQL_DEBUG_BASIC, pqidisczone, + "p3disc::potentialproxy() No proxies found"); + // empty list. + return certs; +} + +std::list p3disc::requestStunServers() +{ + + /* loop through all the possibilities + * + * find the ones which aren't firewalled. + * + * get their addresses. + */ + cert *own = sroot -> getOwnCert(); + + std::list stunList; + + std::list::iterator it; + for(it = neighbours.begin(); it != neighbours.end(); it++) + { + cert *c = (cert *) (*it) -> id; + + /* if flags are correct, and the address looks + * valid. + */ + +/* switch on Local Stun for testing */ +/* + * #define STUN_ALLOW_LOCAL_NET 1 + */ + + +#ifdef STUN_ALLOW_LOCAL_NET + bool isExtern = true; +#else + bool isExtern = (!c->Firewalled()) || + (c->Firewalled() && c->Forwarded()); +#endif + + if (isExtern) + { + // second level of checks. + // if we will connect, and haven't -> they are probably + // offline. + if (c->Accepted() && (!c->Connected())) + { + std::ostringstream out; + out << "Offline Friend: "; + out << c -> Name(); + out << " not available for Stun"; + pqioutput(PQL_DEBUG_ALERT, pqidisczone, out.str()); + isExtern = false; + } + + // and address looks good. + // + // and not in our subnet (external to us) + } + + + if (isExtern) + { + std::ostringstream out; + out << "Potential Stun Server: "; + out << c -> Name(); + out << std::endl; + out << " ServerAddr: " << inet_ntoa(c->serveraddr.sin_addr); + out << " : " << ntohs(c->serveraddr.sin_port); + out << std::endl; + out << " LocalAddr: " << inet_ntoa(c->localaddr.sin_addr); + out << " : " << ntohs(c->localaddr.sin_port); + out << std::endl; + +#ifdef STUN_ALLOW_LOCAL_NET + if (isValidNet(&(c->serveraddr.sin_addr)) && + (!sameNet(&(own->serveraddr.sin_addr), &(c->serveraddr.sin_addr)))) +#else + if ((isValidNet(&(c->serveraddr.sin_addr))) && + (!isPrivateNet(&(c->serveraddr.sin_addr))) && + (!sameNet(&(own->localaddr.sin_addr), &(c->serveraddr.sin_addr))) && + (!sameNet(&(own->serveraddr.sin_addr), &(c->serveraddr.sin_addr)))) +#endif + { + out << " -- Chose Server Address"; + out << std::endl; + stunList.push_back(c->serveraddr); + } +#ifdef STUN_ALLOW_LOCAL_NET + else if (isValidNet(&(c->localaddr.sin_addr))) +#else + else if ((!c->Firewalled()) && + (isValidNet(&(c->localaddr.sin_addr))) && + (!isPrivateNet(&(c->localaddr.sin_addr))) && + (!sameNet(&(own->localaddr.sin_addr), &(c->localaddr.sin_addr)))) +#endif + { + out << " -- Chose Local Address"; + out << std::endl; + stunList.push_back(c->localaddr); + } + else + { + out << "<=> Invalid / Private Addresses"; + out << std::endl; + } + pqioutput(PQL_DEBUG_ALERT, pqidisczone, out.str()); + } + else + { + std::ostringstream out; + out << "Non-Stun Neighbour: "; + out << c -> Name(); + pqioutput(PQL_DEBUG_ALERT, pqidisczone, out.str()); + } + } + + return stunList; +} + + + + + +// tdelta -> trange. +// -inf...<0 0 (invalid) +// 0.. <9 1 +// 9...<99 2 +// 99...<999 3 +// 999...<9999 4 +// etc... + +int convertTDeltaToTRange(double tdelta) +{ + if (tdelta < 0) + return 0; + int trange = 1 + (int) log10(tdelta + 1.0); + return trange; + +} + +// trange -> tdelta +// -inf...0 -1 (invalid) +// 1 8 +// 2 98 +// 3 998 +// 4 9998 +// etc... + +int convertTRangeToTDelta(int trange) +{ + if (trange <= 0) + return -1; + + return (int) (pow(10.0, trange) - 1.5); // (int) xxx98.5 -> xxx98 +} + +// fn which updates: connect, c_ts, +// listen, l_ts, +// local_addr, server_addr, +// and discFlags. +int updateAutoServer(autoserver *as, DiscItem *di) +{ + int cts = time(NULL); + + + as->listen = (di->receive_tr != 0); + as->connect= (di->connect_tr != 0); + + /* convert [r|c]_tf to timestamps.... + * + * Conversion to a _tf.... + * + * + * */ + if (as->listen) + { + as->l_ts = cts - convertTRangeToTDelta(di->receive_tr); + } + + if (as->connect) + { + as->c_ts = cts - convertTRangeToTDelta(di->connect_tr); + + } + as->local_addr = di->laddr; + as->server_addr = di->saddr; + as->discFlags = di->discFlags; + + return 1; +} + + +static const int PQI_DISC_FLAGS_FIREWALLED = 0x0001; +static const int PQI_DISC_FLAGS_FORWARDED = 0x0002; +static const int PQI_DISC_FLAGS_LOCAL = 0x0004; + +int updateCertAvailabilityFlags(cert *c, unsigned long discFlags) +{ + if (c) + { + c->Firewalled(discFlags & PQI_DISC_FLAGS_FIREWALLED); + c->Forwarded(discFlags & PQI_DISC_FLAGS_FORWARDED); + + if (discFlags & PQI_DISC_FLAGS_FIREWALLED) + { + pqioutput(PQL_WARNING, pqidisczone, + "updateCertAvailabilityFlags() Setting Firewalled Flag = true"); + } + else + { + pqioutput(PQL_WARNING, pqidisczone, + "updateCertAvailabilityFlags() Setting Firewalled Flag = false"); + } + + if (discFlags & PQI_DISC_FLAGS_FORWARDED) + { + pqioutput(PQL_WARNING, pqidisczone, + "updateCertAvailabilityFlags() Setting Forwarded Flag = true"); + } + else + { + pqioutput(PQL_WARNING, pqidisczone, + "updateCertAvailabilityFlags() Setting Forwarded Flag = false"); + } + + return 1; + } + return 0; +} + + +unsigned long determineCertAvailabilityFlags(cert *c) +{ + unsigned long flags = 0; + if (c->Firewalled()) + { + flags |= PQI_DISC_FLAGS_FIREWALLED; + } + + if (c->Forwarded()) + { + flags |= PQI_DISC_FLAGS_FORWARDED; + } + + if (c->Local()) + { + flags |= PQI_DISC_FLAGS_LOCAL; + } + + return flags; +} + diff --git a/libretroshare/src/pqi/p3disc.h b/libretroshare/src/pqi/p3disc.h new file mode 100644 index 000000000..9ca8ca538 --- /dev/null +++ b/libretroshare/src/pqi/p3disc.h @@ -0,0 +1,186 @@ +/* + * "$Id: p3disc.h,v 1.11 2007-02-18 21:46:49 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + +#ifndef MRK_PQI_AUTODISC_H +#define MRK_PQI_AUTODISC_H + + +// The AutoDiscovery Class + +#include +#include + +// system specific network headers +#include "pqi/pqinetwork.h" + +#include "pqi/pqi.h" + +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + +#include "pqi/xpgpcert.h" + +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + +#include "pqi/sslcert.h" + +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + + +#include "pqi/discItem.h" +#include "pqi/pqitunnel.h" + +class autoserver +{ + public: + autoserver() + :id(NULL), ca(NULL), connect(false), c_ts(0), + listen(false), l_ts(0), discFlags(0) { return;} + + Person *id; + Person *ca; + bool connect; + unsigned int c_ts; // this is connect_tf converted to timestamp, 0 invalid. + + bool listen; + unsigned int l_ts; // this is receive_tf converted to timestamp, 0 invalid. + + struct sockaddr_in local_addr; + struct sockaddr_in server_addr; + unsigned long discFlags; +}; + + +class autoneighbour: public autoserver +{ + public: + autoneighbour() + :autoserver(), local(false), active(false) {} + + bool local; + bool active; // meaning in ssl's list. + std::list neighbour_of; + +}; + + +class p3disc: public PQTunnelService +{ + public: + bool local_disc; + bool remote_disc; + //sslroot *sslbase; + + p3disc(sslroot *r); +virtual ~p3disc(); + + // PQTunnelService functions. +virtual int receive(PQTunnel *); +virtual PQTunnel *send(); +virtual PQTunnel *getObj(); + +virtual int tick(); + + // doesn't use the init functions. +virtual int receive(PQTunnelInit *i) { delete i; return 1; } +virtual PQTunnelInit *sendInit() { return NULL; } +virtual PQTunnelInit *getObjInit() { return NULL; } + + // End of PQTunnelService functions. + // + // For Proxy Information. +std::list requestStunServers(); +std::list potentialproxy(cert *target); + + // load and save configuration to sslroot. + int save_configuration(); + int load_configuration(); + + int ts_lastcheck; + + int idServers(); + + // Handle Local Discovery. + int localListen(); + int localSetup(); + + int lsock; // local discovery socket. + struct sockaddr_in laddr; // local addr + struct sockaddr_in baddr; // local broadcast addr. + struct sockaddr_in saddr; // pqi ssl server addr. + + // bonus configuration flags. + bool local_firewalled; + bool local_forwarded; + + + // local message construction/destruction. + void *ldata; + int ldlen; + int ldlenmax; + + + bool std_port; // if we have bound to default. + int ts_nextlp; // -1 for never (if on default) + + // helper functions. + int setLocalAddress(struct sockaddr_in srvaddr); + int determineLocalNetAddr(); + int setupLocalPacket(int type, struct sockaddr_in *home, + struct sockaddr_in *server); + int localPing(struct sockaddr_in); + int localReply(struct sockaddr_in); + int addLocalNeighbour(struct sockaddr_in*, struct sockaddr_in*); + + // remote discovery function. + int newRequests(); + int handleReplies(); + + int handleDiscoveryData(DiscReplyItem *di); + int handleDiscoveryPing(DiscItem *di); + int sendDiscoveryReply(cert *); + int collectCerts(); + int distillData(); + + //cert *checkDuplicateX509(X509 *x509); + std::list &getDiscovered(); + + // Main Storage + std::list neighbours; + std::list ad_init; + + std::list discovered; + sslroot *sroot; + + // Storage for incoming/outgoing. + std::list inpkts; + std::list outpkts; +}; + +#endif // MRK_PQI_AUTODISC_H diff --git a/libretroshare/src/pqi/p3loopback.cc b/libretroshare/src/pqi/p3loopback.cc new file mode 100644 index 000000000..08c3d34e1 --- /dev/null +++ b/libretroshare/src/pqi/p3loopback.cc @@ -0,0 +1,341 @@ +/* + * "$Id: p3loopback.cc,v 1.3 2007-02-18 21:46:49 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "pqi/pqi.h" +#include "pqi/p3loopback.h" + +// Test Interface (LoopBack) + + +p3loopback::~p3loopback() +{ + // should clean up lists ... + // delete all random search items... + // fix later.. + return; +} + +int p3loopback::Search(SearchItem *si) +{ + // no more copy - just use. + + // tag as new. + si -> flags = 1; + + // add to requested searches. + searches[si -> sid] = si; + + return 1; +} + +int p3loopback::CancelSearch(SearchItem *item) +{ + std::map::iterator it; + std::list::iterator it2; + + unsigned int sid = item -> sid; + + // Quick Sanity Check. + it = searches.find(sid); + if (it == searches.end()) + { + std::cerr << "p3loopback::CancelSearch(" << sid; + std::cerr << ") Search Not Found!" << std::endl; + return -2; + } + + // found search delete. + SearchItem *osi = it -> second; + searches.erase(it); + + // find anything matching in the list. + for(it2 = searchResults.begin(); it2 != searchResults.end();) + { + if ((*it2) -> sid == sid) // erase + { + PQFileItem *osr = (*it2); + it2 = searchResults.erase(it2); + delete osr; + } + else + { + it2++; + } + } + + cancelledSearches.push_back(osi); + // clean up input. + delete item; + return 1; +} + + +PQFileItem * p3loopback::GetSearchResult() +{ + std::list::iterator it; + + it = searchResults.begin(); + if (it == searchResults.end()) // empty list + { + return NULL; + } + PQFileItem *osr = (*it); + searchResults.erase(it); + + // set as local... + osr -> flags |= PQI_ITEM_FLAG_LOCAL; + return osr; +} + +int p3loopback::GetFile(PQFileItem *item, std::ostream &in) +{ + // save a stream .... + // send on the request. + //fixme("p3loopback::GetFile()", 1); + return 1; +} + +int p3loopback::CancelFile(PQFileItem *item) +{ + // close down stream (if we created it) + // send on request. + //fixme("p3loopback::CancelFile()", 1); + return 1; +} + + +// Remote Requests. + +SearchItem *p3loopback::RequestedSearch() +{ + std::map::iterator it; + SearchItem *ns; + + for(it = searches.begin(); it != searches.end(); it++) + { + // check if new... + if ((it -> second) -> flags == 1) + { + // generate new sid number. + int rsid = getPQIsearchId(); + int sid = (it -> second) -> sid; + + // setup translation stuff. + sid2rsid[sid] = rsid; + + ns = new SearchItem(); + ns -> copy(it -> second); + (it -> second) -> flags = 0; + + ns -> sid = rsid; + + return ns; + } + } + return NULL; +} + + + +SearchItem *p3loopback::CancelledSearch() +{ + std::list::iterator it; + std::map::iterator mit; + + it = cancelledSearches.begin(); + if (it == cancelledSearches.end()) // empty list + { + return NULL; + } + // else copy into structure. + SearchItem *ncs = (*it); + cancelledSearches.erase(it); + + // get from mapping. + mit = sid2rsid.find(ncs -> sid); + + if (mit == sid2rsid.end()) // error + { + std::cerr << "Error No Mapping (Cancelling the Cancel)!"; + std::cerr << "But Still deleting item"; + std::cerr << std::endl; + delete ncs; + return NULL; + } + else + { + ncs -> sid = mit -> second; + sid2rsid.erase(mit); + } + + return ncs; +} + +int p3loopback::SendSearchResult(PQFileItem *item) +{ + //std::list >::iterator it; + std::map::iterator it; + + int rsid = item -> sid; + int sid = 0; + + // get from mapping. + for(it = sid2rsid.begin(); ((it != sid2rsid.end()) && (sid == 0)); it++) + { + if (rsid == (it -> second)) + { + sid = it -> first; + } + } + + // if no mapping. + if (sid == 0) + { + std::cerr << "SendSearchResult::Error No Mapping (Removing Item)!"; + std::cerr << std::endl; + delete item; + return 0; + } + + // have mapping.... translate. + item -> sid = sid; + + // stick on the queue. + searchResults.push_back(item); + + return 1; +} + +PQFileItem *p3loopback::RequestedFile() +{ + // check for searches with new tag... + // if none return 0; + // copy data from first. + + // mark old. + //fixme("p3loopback::RequestedFile()", 1); + return NULL; +} + + +PQFileItem *p3loopback::CancelledFile() +{ + // check for cancelled files. + // if none return 0; + // copy data from first. + + // remove/cleanup + //fixme("p3loopback::CancelledFile()", 1); + return NULL; +} + +int p3loopback::SendFile(PQFileItem *, std::istream &out) +{ + // get data... + // attach streams..... + // + //fixme("p3loopback::SendFile()", 1); + return 1; +} + + +// +//// control interface. +//int p3loopback::RequestInfo(InfoItem *item) +//{ +// switch(item -> querytype) +// { +// case PQI_II_QUERYTYPE_TAG: +// item -> answer = "<++Local++>"; +// return 1; +// break; +// +// case PQI_II_QUERYTYPE_CLASS: +// item -> answer = "p3loopback"; +// return 1; +// break; +// +// default: +// return 0; +// break; +// } +// return -1; +// +// return 0; +//} +// +//int p3loopback::doCommand(CommandItem *) +//{ +// //fixme("p3loopback::doCommand()", 1); +// return 0; +//} +// + +// // chat interface. +int p3loopback::SendMsg(ChatItem *item) +{ + //fixme("p3loopback::SendMsg()", 1); + return 0; +} + +ChatItem *p3loopback::GetMsg() +{ + //fixme("p3loopback::GetMsg()", 1); + return NULL; +} + +int p3loopback::SendOtherPQItem(PQItem *item) +{ + other.push_back(item); + return 1; +} + +PQItem *p3loopback::GetOtherPQItem() +{ + if (other.size() != 0) + { + PQItem *i = other.front(); + other.pop_front(); + return i; + } + return NULL; +} + + +// // PQI interface. +int p3loopback::tick() +{ + //fixme("p3loopback::tick()", 1); + return 0; +} + +int p3loopback::status() +{ + //fixme("p3loopback::status()", 1); + return 0; +} diff --git a/libretroshare/src/pqi/p3loopback.h b/libretroshare/src/pqi/p3loopback.h new file mode 100644 index 000000000..d06df6bc0 --- /dev/null +++ b/libretroshare/src/pqi/p3loopback.h @@ -0,0 +1,91 @@ +/* + * "$Id: p3loopback.h,v 1.4 2007-02-18 21:46:49 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + +#ifndef MRK_P3_LOOPBACK_HEADER +#define MRK_P3_LOOPBACK_HEADER + + +// The standard data types and the search interface. +#include "pqi/pqi.h" + +#include +#include + + +// Test Interface (LoopBack) +// public interface .... includes the whole p3interface. +class p3loopback: public P3Interface +{ +public: +virtual ~p3loopback(); + +// search Interface. +virtual int Search(SearchItem *item); +virtual int CancelSearch(SearchItem *item); +virtual PQFileItem *GetSearchResult(); + +virtual int GetFile(PQFileItem *item, std::ostream &in); +virtual int CancelFile(PQFileItem *); + +virtual SearchItem *RequestedSearch(); +virtual SearchItem *CancelledSearch(); +virtual int SendSearchResult(PQFileItem *item); + +virtual PQFileItem *RequestedFile(); +virtual PQFileItem *CancelledFile(); +virtual int SendFile(PQFileItem *, std::istream &out); + +// control interface. +//virtual int RequestInfo(InfoItem *); +//virtual int doCommand(CommandItem *); + +// chat interface. +virtual int SendMsg(ChatItem *item); +virtual ChatItem *GetMsg(); + +// PQI interface. +virtual int tick(); +virtual int status(); + +virtual int SendOtherPQItem(PQItem *); +virtual PQItem *GetOtherPQItem(); + + private: + std::list searchResults; + std::map searches; + std::map files; + std::list cancelledSearches; + std::list cancelledFiles; + std::list other; + + // remote mapping + std::map sid2rsid; +}; + + + +#endif //MRK_P3_LOOPBACK_HEADER diff --git a/libretroshare/src/pqi/p3supernode.cc b/libretroshare/src/pqi/p3supernode.cc new file mode 100644 index 000000000..ab6c6f744 --- /dev/null +++ b/libretroshare/src/pqi/p3supernode.cc @@ -0,0 +1,317 @@ +/* + * "$Id: p3supernode.cc,v 1.3 2007-02-18 21:46:49 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "pqi/pqisupernode.h" + +#include +#include + +// Includes for directory creation. +#include +#include +#include +// Conflicts with FLTK def - hope they are the same. +//#include + +// for blocking signals +#include + +#include "pqi/pqidebug.h" + +void load_check_basedir(); + +// Global Pointers for the callback functions. + +// initial configuration bootstrapping... +static const std::string config_init_file = "default_cert.txt"; +static const std::string config_file = "config.rs"; +static const std::string cert_dir = "friends"; +static const std::string key_dir = "keys"; +static const std::string ca_file = "cacerts.pem"; + +static std::string config_basedir; +static std::string load_cert; +static std::string load_key; +static std::string load_cacert; + +void load_check_basedir(); + +static const char dirSeperator = '/'; // For unix. + +// standard start for unix. +int main(int argc, char **argv) +{ + // setup debugging for desired zones. + setOutputLevel(PQL_ALERT); // to show the others. + setZoneLevel(PQL_ALERT, 38422); // pqipacket. + setZoneLevel(PQL_ALERT, 96184); // pqinetwork; + setZoneLevel(PQL_ALERT, 82371); // pqiperson. + setZoneLevel(PQL_ALERT, 60478); // pqitunnel. + setZoneLevel(PQL_ALERT, 34283); // pqihandler. + setZoneLevel(PQL_ALERT, 44863); // discItems. + setZoneLevel(PQL_DEBUG_BASIC, 2482); // p3disc + setZoneLevel(PQL_ALERT, 1728); // proxy + setZoneLevel(PQL_ALERT, 1211); // sslroot. + setZoneLevel(PQL_ALERT, 37714); // pqissl. + setZoneLevel(PQL_ALERT, 8221); // pqistreamer. + setZoneLevel(PQL_ALERT, 354); // pqipersongrp. + + std::list dirs; + + short port = 7812; // default port. + bool forceLocalAddr = false; + + char inet[256] = "127.0.0.1"; + char passwd[256] = ""; + char logfname[1024] = ""; + + int c; + bool havePasswd = false; + bool haveLogFile = false; + + while((c = getopt(argc, argv,"i:p:c:s:w:l:")) != -1) + { + switch (c) + { + case 'l': + strncpy(logfname, optarg, 1024); + std::cerr << "LogFile (" << logfname; + std::cerr << ") Selected" << std::endl; + haveLogFile = true; + break; + case 'w': + strncpy(passwd, optarg, 256); + std::cerr << "Password Specified(" << passwd; + std::cerr << ") Selected" << std::endl; + havePasswd = true; + break; + case 'i': + strncpy(inet, optarg, 256); + std::cerr << "New Inet Addr(" << inet; + std::cerr << ") Selected" << std::endl; + forceLocalAddr = true; + break; + case 'p': + port = atoi(optarg); + std::cerr << "New Listening Port(" << port; + std::cerr << ") Selected" << std::endl; + break; + case 'c': + config_basedir = optarg; + std::cerr << "New Base Config Dir("; + std::cerr << config_basedir; + std::cerr << ") Selected" << std::endl; + break; + case 's': + dirs.push_back(std::string(optarg)); + std::cerr << "Adding Search Directory (" << optarg; + std::cerr << ")" << std::endl; + break; + default: + std::cerr << "Unknown Option!"; + exit(1); + } + } + + // Can only log under linux. + // set the debug file. + if (haveLogFile) + { + setDebugFile(logfname); + } + + // first check config directories, and set bootstrap values. + load_check_basedir(); + + // SWITCH off the SIGPIPE - kills process on Linux. + struct sigaction sigact; + sigact.sa_handler = SIG_IGN; + sigact.sa_flags = 0; + + if (0 == sigaction(SIGPIPE, &sigact, NULL)) + { + std::cerr << "RetroShare:: Successfully Installed"; + std::cerr << "the SIGPIPE Block" << std::endl; + } + else + { + std::cerr << "RetroShare:: Failed to Install"; + std::cerr << "the SIGPIPE Block" << std::endl; + } + + if (!havePasswd) + { + std::cerr << "main() - Fatal Error....." << std::endl; + std::cerr << "Missing Passwd!" << std::endl; + std::cerr << std::endl; + exit(1); + } + + /* determine the cert/key parameters.... + */ + load_check_basedir(); + + bool sslroot_ok = false; + sslroot *sr = getSSLRoot(); + +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + if (0 < sr -> initssl(load_cert.c_str(), load_key.c_str(), passwd)) + { + sslroot_ok = true; + } +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + if (0 < sr -> initssl(load_cert.c_str(), load_key.c_str(), + load_cacert.c_str(), passwd)) + { + sslroot_ok = true; + } +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + if (!sslroot_ok) + { + std::cerr << "main() - Fatal Error....." << std::endl; + std::cerr << "Invalid Certificate configuration!" << std::endl; + std::cerr << std::endl; + exit(1); + } + + // wait for this window to be finished.... + if(!(sr -> active())) + { + std::cerr << "main() - Fatal Error....." << std::endl; + std::cerr << "SSLRoot Failed to start" << std::endl; + std::cerr << std::endl; + exit(1); + } + + // set the directories for full configuration load. + sr -> setConfigDirs(config_basedir.c_str(), cert_dir.c_str()); + sr -> loadCertificates(config_file.c_str()); + sr -> checkNetAddress(); + + SecurityPolicy *none = secpolicy_create(); + + if (forceLocalAddr) + { + struct sockaddr_in laddr; + + laddr.sin_family = AF_INET; + laddr.sin_port = htons(port); + + // universal + laddr.sin_addr.s_addr = inet_addr(inet); + // unix specific + //inet_aton(inet, &(laddr.sin_addr)); + + cert *own = sr -> getOwnCert(); + if (own != NULL) + { + own -> localaddr = laddr; + } + } + + +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + /* can only do this in XPGP */ + sr -> superNodeMode(); +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + + pqisupernode psn(none, sr); + psn.load_config(); + + psn.run(); + + return 1; +} + + +void load_check_basedir() +{ + // get the default configuration location. + + if (config_basedir == "") + { + std::cerr << "load_check_basedir() - Fatal Error....." << std::endl; + std::cerr << "Missing config_basedir" << std::endl; + std::cerr << std::endl; + exit(1); + } + + std::string key_subdir = config_basedir + dirSeperator; + key_subdir += key_dir; + + // will catch bad files later. + + // Check for config file. + std::string initfile = config_basedir + dirSeperator; + initfile += config_init_file; + + /* setup the ca cert file */ + load_cacert = key_dir + dirSeperator; + load_cacert += ca_file; + + // open and read in the lines. + FILE *ifd = fopen(initfile.c_str(), "r"); + char path[1024]; + int i; + + if (ifd != NULL) + { + if (NULL != fgets(path, 1024, ifd)) + { + for(i = 0; (path[i] != '\0') && (path[i] != '\n'); i++); + path[i] = '\0'; + load_cert = path; + } + if (NULL != fgets(path, 1024, ifd)) + { + for(i = 0; (path[i] != '\0') && (path[i] != '\n'); i++); + path[i] = '\0'; + load_key = path; + } + fclose(ifd); + } + else + { + std::cerr << "load_check_basedir() - Fatal Error....." << std::endl; + std::cerr << "Cannot open initfile." << std::endl; + std::cerr << std::endl; + exit(1); + } + + return; +} + + + + diff --git a/libretroshare/src/pqi/pqi.cc b/libretroshare/src/pqi/pqi.cc new file mode 100644 index 000000000..ce6cf7db9 --- /dev/null +++ b/libretroshare/src/pqi/pqi.cc @@ -0,0 +1,440 @@ +/* + * "$Id: pqi.cc,v 1.8 2007-03-21 18:45:41 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "pqi/pqi.h" +#include "pqi/pqi_data.h" + +#include + +// local functions. +//int pqiroute_setshift(PQItem *item, int chan); +//int pqiroute_getshift(PQItem *item); +//int pqicid_clear(ChanId *cid); +//int pqicid_copy(const ChanId *cid, ChanId *newcid); + +// Helper functions for the PQInterface. + +int fixme(char *str, int n) +{ + for(int i = 0; i < n; i++) + { + std::cerr << "FIXME:: " << str << std::endl; + } + return 1; +} + +SearchItem::SearchItem() + :PQItem(PQI_ITEM_TYPE_SEARCHITEM, PQI_SI_SUBTYPE_SEARCH), + datatype(PQI_SI_DATATYPE_TERMS) + +{ + //std::cerr << "Creating SearchItem()" << std::endl; + return; +} + +SearchItem::SearchItem(int st) + :PQItem(PQI_ITEM_TYPE_SEARCHITEM, st), datatype(PQI_SI_DATATYPE_TERMS) +{ + //std::cerr << "Creating SearchItem()" << std::endl; + return; +} + +SearchItem::~SearchItem() +{ + //std::cerr << "Deleting SearchItem()" << std::endl; + return; +} + + +// These need to be recursive. +SearchItem *SearchItem::clone() +{ + SearchItem *nsi = new SearchItem(); + nsi -> copy(this); + + return nsi; +} + +void SearchItem::copy(const SearchItem *si) +{ + // copy below. + PQItem::copy(si); + + // do elements of searchItem. + + datatype = si -> datatype; + data = si -> data; +} + +std::ostream &SearchItem::print(std::ostream &out) +{ + out << "---- SearchItem" << std::endl; + PQItem::print(out); + + out << "Search Type: " << datatype << std::endl; + out << "Search: " << data << std::endl; + return out << "----" << std::endl; +} + + + ChatItem::ChatItem() + :PQItem(PQI_ITEM_TYPE_CHATITEM, PQI_MI_SUBTYPE_CHAT) +{ + //std::cerr << "Creating ChatItem()" << std::endl; + return; +} + + ChatItem::ChatItem(int st) + :PQItem(PQI_ITEM_TYPE_CHATITEM, st) +{ + //std::cerr << "Creating ChatItem()" << std::endl; + return; +} + + +ChatItem::~ChatItem() +{ + //std::cerr << "Deleting ChatItem()" << std::endl; + return; +} + + +MsgItem::MsgItem() + :ChatItem(PQI_MI_SUBTYPE_MSG), msgflags(0), sendTime(0) +{ + //std::cerr << "Creating MsgItem()" << std::endl; + return; +} + + +MsgItem::~MsgItem() +{ + //std::cerr << "Deleting MsgItem()" << std::endl; + return; +} + + +ChatItem *ChatItem::clone() +{ + ChatItem *nsi = new ChatItem(); + nsi -> copy(this); + + return nsi; +} + +void ChatItem::copy(const ChatItem *si) +{ + // copy below. + PQItem::copy(si); + + msg = si -> msg; + + return; +} + + +std::ostream &ChatItem::print(std::ostream &out) +{ + out << "---- ChatItem" << std::endl; + PQItem::print(out); + + out << "Msg: " << msg; + out << std::endl << "----"; + return out << std::endl; +} + + +MsgItem *MsgItem::clone() +{ + MsgItem *nsi = new MsgItem(); + nsi -> copy(this); + + return nsi; +} + +void MsgItem::copy(const MsgItem *mi) +{ + // copy below. + ChatItem::copy(mi); + + msgflags = mi -> msgflags; + sendTime = mi -> sendTime; + title = mi -> title; + header = mi -> header; + files = mi -> files; + +} + +std::ostream &MsgItem::print(std::ostream &out) +{ + out << "-------- MsgItem" << std::endl; + ChatItem::print(out); + + out << "MsgFlags: " << msgflags; + out << std::endl; + out << "SendTime: " << sendTime; + out << std::endl; + out << "Title: " << title; + out << std::endl; + out << "Header: " << header; + out << std::endl; + out << "NoFiles: " << files.size(); + out << std::endl; + std::list::iterator it; + for(it = files.begin(); it != files.end(); it++) + { + out << "File: " << it->name; + out << " Size: " << it->size; + out << " Hash: " << it->hash; + out << std::endl; + } + out << std::endl << "--------"; + return out << std::endl; +} + + +//void FileItem::fillsi(SearchItem *si) +//{ +// // first copy lowlevel stuff. +// si -> PQItem::copyIDs(this); +// if (hash.length() > 5) +// { +// // use hash. +// si -> data = hash; +// si -> datatype = PQI_SI_DATATYPE_HASH; +// } +// else +// { +// si -> data = name; +// si -> datatype = PQI_SI_DATATYPE_NAME; +// } +// return; +//} + + +// This uses some helper functions for +// string matching... these +// functions are located at the end +// of this file. + +int PQFileItem::match(std::string term) +{ + std::string lowerterm = strtolower(term); + + std::string haystack = strtolower(path); + if (strstr(haystack.c_str(), lowerterm.c_str()) != NULL) + { + return 1; + } + + haystack = strtolower(name); + if (strstr(haystack.c_str(), lowerterm.c_str()) != NULL) + { + return 1; + } + return 0; +} + + + + +MediaItem::MediaItem() +{ + //std::cerr << "Creating MediaItem()" << std::endl; + return; +} + +MediaItem::~MediaItem() +{ + //std::cerr << "Deleting MediaItem()" << std::endl; + return; +} + +MediaItem *MediaItem::clone() +{ + MediaItem *nmi = new MediaItem(); + nmi -> copy(this); + return nmi; +} + + +void MediaItem::copy(const MediaItem *src) +{ + // copy fileitem stuff. + PQFileItem::copy(src); + + mimetype = src -> mimetype; + title = src -> title; + author = src -> author; + collection = src -> collection; + genre = src -> genre; + len = src -> len; + + return; +} + +int MediaItem::match(std::string term) +{ + std::string lowerterm = strtolower(term); + + std::string haystack = strtolower(title); + if (strstr(haystack.c_str(), lowerterm.c_str()) != NULL) + { + return 1; + } + + haystack = strtolower(author); + if (strstr(haystack.c_str(), lowerterm.c_str()) != NULL) + { + return 1; + } + + haystack = strtolower(collection); + if (strstr(haystack.c_str(), lowerterm.c_str()) != NULL) + { + return 1; + } + haystack = strtolower(genre); + if (strstr(haystack.c_str(), lowerterm.c_str()) != NULL) + { + return 1; + } + + return PQFileItem::match(term); +} + + +/*********************** STRING HELPERS *************************/ + +std::string strtolower(std::string in) +{ + std::string out = in; + for(int i = 0; i < (signed) out.length(); i++) + { + if (isupper(out[i])) + { + out[i] += 'a' - 'A'; + } + } + return out; +} + +std::string fileextension(std::string in) +{ + std::string out; + bool found = false; + for(int i = (signed) in.length() -1; (i >= 0) && (found == false); i--) + { + if (in[i] == '.') + { + found = true; + for(int j = i+1; j < (signed) in.length(); j++) + { + out += in[j]; + } + } + } + return strtolower(out); +} + + +std::list createtermlist(std::string in) +{ + std::list terms; + char str[1024]; + strncpy(str, in.c_str(), 1024); + str[1023] = '\0'; + + int len = strlen(str); + int i; + + int sword = 0; + for(i = 0; (i < len - 1) && (str[i] != '\0'); i++) + { + if (isspace(str[i])) + { + str[i] = '\0'; + if (i - sword > 0) + { + terms.push_back(std::string(&(str[sword]))); + //std::cerr << "Found Search Term: (" << &(str[sword]); + //std::cerr << ")" << std::endl; + } + sword = i+1; + } + } + // do the final term. + if (i - sword > 0) + { + terms.push_back(std::string(&(str[sword]))); + //std::cerr << "Found Search Term: (" << &(str[sword]); + //std::cerr << ")" << std::endl; + } + return terms; +} + + + + + + + +int match(PQFileItem *fi, SearchItem *si) +{ + if (si -> datatype == PQI_SI_DATATYPE_HASH) + { + if (0 == strcmp((fi -> hash).c_str(), (si -> data).c_str())) + return 1; + return 0; + } + else if (si -> datatype == PQI_SI_DATATYPE_NAME) + { + if (0 == strcmp((fi -> name).c_str(), (si -> data).c_str())) + return 1; + return 0; + } + else // try it as terms.... + { + std::list terms = createtermlist(si -> data); + std::list::iterator it; + if (terms.size() == 0) + { + return 0; + } + + for(it = terms.begin(); it != terms.end(); it++) + { + if (0 == fi -> match(*it)) + { + return 0; + } + } + return 1; + } +} + diff --git a/libretroshare/src/pqi/pqi.h b/libretroshare/src/pqi/pqi.h new file mode 100644 index 000000000..8f54e616a --- /dev/null +++ b/libretroshare/src/pqi/pqi.h @@ -0,0 +1,114 @@ +/* + * "$Id: pqi.h,v 1.8 2007-03-31 09:41:32 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + +#ifndef MRK_P3_PUBLIC_INTERFACE_HEADER +#define MRK_P3_PUBLIC_INTERFACE_HEADER + +// This is the overall include, for public usage +// + extension of the p3 interface. + +#include "pqi/pqi_data.h" + +#include +#include +#include + + +/********************** SEARCH INTERFACE ***************************/ +// this is an interface.... so should be +// classified as virtual = 0; + +class SearchInterface +{ +public: + SearchInterface() { return; } + +virtual ~SearchInterface() { return; } + + // OutGoing Searches... + +virtual int Search(SearchItem *) = 0; // Search All people... +virtual int SearchSpecific(SearchItem *) = 0; // Search One person only... +virtual int CancelSearch(SearchItem *) = 0; // no longer used? +virtual PQFileItem *GetSearchResult() = 0; + + + // Incoming Searches... +virtual SearchItem *RequestedSearch() = 0; +virtual SearchItem *CancelledSearch() = 0; +virtual int SendSearchResult(PQFileItem *item) = 0; + + // FileTransfer. +virtual PQFileItem *GetFileItem() = 0; +virtual int SendFileItem(PQFileItem *) = 0; + +}; + +class ChatInterface +{ +public: + ChatInterface() {return; }; +virtual ~ChatInterface() {return; }; + +virtual int SendMsg(ChatItem *item) = 0; +virtual int SendGlobalMsg(ChatItem *ns) = 0; +virtual ChatItem *GetMsg() = 0; + +}; + +// This can potentially be moved to where the +// discovery code is!!!! + +class HostItem: public PQItem { }; + +class DiscoveryInterface +{ + public: +virtual ~DiscoveryInterface() { return; } + // Discovery Request. +virtual int DiscoveryRequest(PQItem *) = 0; // item is just for direction. +virtual HostItem *DiscoveryResult() = 0; +}; + + +class P3Interface: public SearchInterface, + public ChatInterface +{ +public: + P3Interface() {return; } +virtual ~P3Interface() {return; } + +virtual int tick() { return 1; } +virtual int status() { return 1; } + +virtual int SendOtherPQItem(PQItem *) = 0; +virtual PQItem *GetOtherPQItem() = 0; +virtual PQItem *SelectOtherPQItem(bool (*tst)(PQItem *)) = 0; + +}; + +#endif //MRK_PQI_BASE_HEADER diff --git a/libretroshare/src/pqi/pqi_base.cc b/libretroshare/src/pqi/pqi_base.cc new file mode 100644 index 000000000..ed8db1a32 --- /dev/null +++ b/libretroshare/src/pqi/pqi_base.cc @@ -0,0 +1,791 @@ +/* + * "$Id: pqi_base.cc,v 1.17 2007-03-31 09:41:32 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "pqi/pqi_base.h" + +#include + +// local functions. +int pqiroute_setshift(ChanId *item, int chan); +int pqiroute_getshift(ChanId *item); + +// these ones are also exported! +int pqicid_clear(ChanId *cid); +int pqicid_copy(const ChanId *cid, ChanId *newcid); +int pqicid_cmp(const ChanId *cid1, ChanId *cid2); + +// Helper functions for the PQInterface. + +static int next_search_id = 1; + +int getPQIsearchId() +{ + return next_search_id++; +} + +// SI Operations. +PQItem::PQItem() + :sid(0), type(0), subtype(0), p(0) +{ + //std::cerr << "Creating PQItem(0,0)@" << std::endl; + //std::cerr << (void *) this << std::endl; + pqicid_clear(&cid); + return; +} + +PQItem::~PQItem() +{ + //std::cerr << "Deleting PQItem(" << type << ","; + //std::cerr << subtype << ")@" << (void *) this << std::endl; + return; +} + +PQItem::PQItem(int t, int st) + :sid(0), type(t), subtype(st), flags(0), p(0) +{ + //std::cerr << "Creating PQItem(" << t << "," << st << ")@"; + //std::cerr << (void *) this << std::endl; + pqicid_clear(&cid); + return; +} + +PQItem *PQItem::clone() +{ + PQItem *npqi = new PQItem(); + npqi -> copy(this); + + return npqi; +} + +void PQItem::copy(const PQItem *pqi) +{ + sid = pqi -> sid; + pqicid_copy(&(pqi -> cid), &(cid)); + type = pqi -> type; + subtype = pqi -> subtype; + flags = pqi -> flags; + p = pqi -> p; + return; +} + +void PQItem::copyIDs(const PQItem *pqi) +{ + sid = pqi -> sid; + pqicid_copy(&(pqi -> cid), &(cid)); + // Person ref should also be part of the id. + p = pqi -> p; + return; +} + + +std::ostream &PQItem::print(std::ostream &out) +{ + out << "-- PQItem" << std::endl; + out << "CID [" << cid.route[0]; + for(int i = 0; i < 10; i++) + out << ":" << cid.route[i]; + out << "] SID: " << sid << std::endl; + out << "Type: " << type << "/" << subtype; + out << " Flags: " << flags << std::endl; + out << " Source: "; + if (p == NULL) + { + out << "*Unknown*" << std::endl; + } + else + { + out << p -> Name() << std::endl; + } + return out << "--" << std::endl; +} + + +int PQItem::cidpop() +{ + return pqiroute_getshift(&cid); +} + +void PQItem::cidpush(int id) +{ + pqiroute_setshift(&cid, id); + return; +} + +PQFileItem::PQFileItem() + :PQItem(PQI_ITEM_TYPE_FILEITEM, PQI_FI_SUBTYPE_GENERAL), + reqtype(PQIFILE_STD) +{ + //std::cerr << "Creating PQFileItem()" << std::endl; + return; +} + +PQFileItem::PQFileItem(int subtype) + :PQItem(PQI_ITEM_TYPE_FILEITEM, subtype), + reqtype(PQIFILE_STD) +{ + //std::cerr << "Creating PQFileItem()" << std::endl; + return; +} + +PQFileItem::~PQFileItem() +{ + //std::cerr << "Deleting PQFileItem()" << std::endl; + return; +} + + +PQFileItem *PQFileItem::clone() +{ + PQFileItem *nfi = new PQFileItem(); + nfi -> copy(this); + return nfi; +} + + +void PQFileItem::copy(const PQFileItem *src) +{ + PQItem::copy(src); + + hash = src -> hash; + name = src -> name; + path = src -> path; + ext = src -> ext; + + size = src -> size; + fileoffset = src -> fileoffset; + chunksize = src -> chunksize; + + exttype = src -> exttype; + reqtype = src -> reqtype; + return; +} + +std::ostream &PQFileItem::print(std::ostream &out) +{ + out << "-------- PQFileItem" << std::endl; + PQItem::print(out); + + out << "Name: " << name << std::endl; + out << "Hash: " << hash << std::endl; + out << "Path: " << path << std::endl; + out << "Ext: " << ext << std::endl; + out << "Size: " << size << std::endl; + out << "FileOffset: " << fileoffset << std::endl; + out << "ChunkSize: " << chunksize << std::endl; + out << "Ext/Req Types: " << exttype << "/" << reqtype << std::endl; + return out << "--------" << std::endl; +} + + +PQFileData::PQFileData() + :PQFileItem(PQI_FI_SUBTYPE_DATA), + datalen(0), data(NULL), fileflags(0) +{ + //std::cerr << "Creating PQFileData()" << std::endl; + flags = 0; + return; +} + + +PQFileData::~PQFileData() +{ + if (data != NULL) + { + free(data); + } + //std::cerr << "Deleting PQFileData()" << std::endl; + return; +} + +PQFileData *PQFileData::clone() +{ + PQFileData *nfd = new PQFileData(); + nfd -> copy(this); + + return nfd; +} + +void PQFileData::copy(const PQFileData *fd) +{ + // copy below. + PQItem::copy(fd); + + if (data != NULL) + { + free(data); + } + data = malloc(fd -> datalen); + memcpy(data, fd -> data, fd -> datalen); + datalen = fd -> datalen; + fileflags = fd -> fileflags; + return; +} + +std::ostream &PQFileData::print(std::ostream &out) +{ + out << "-------- PQFileData" << std::endl; + PQItem::print(out); + + out << "DataLen: " << datalen << std::endl; + out << "FileFlags: " << fileflags << std::endl; + return out << "--------" << std::endl; +} + + +int PQFileData::writedata(std::ostream &out) +{ + //std::cerr << "PQFileData::writedata() len: " << datalen << std::endl; + if (data != NULL) + { + out.write((char *) data, datalen); + if (out.bad()) + { + //std::cerr << "PQFileData::writedata() Bad ostream!" << std::endl; + return -1; + } + return 1; + } + return 1; +} + + +int PQFileData::readdata(std::istream &in, int maxbytes) +{ + if (data != NULL) + { + free(data); + } + data = malloc(maxbytes); + in.read((char *) data, maxbytes); + + int read = in.gcount(); + + // if read < maxread then finished? + if (read < maxbytes) + { + // check if finished. + if (in.eof()) + { + isend(); + } + else + { + //std::cerr << "pqi_makeFilePkt() Only Read: "; + //std::cerr << read << "/" << maxbytes << " Why?"; + //std::cerr << std::endl; + } + // adjust the space. + void *tmpdata = data; + data = malloc(read); + memcpy(data, tmpdata, read); + free(tmpdata); + } + datalen = read; + return 1; +} + +int PQFileData::endstream() +{ + if (fileflags & PQI_FD_FLAG_ENDSTREAM) + return 1; + return 0; +} + + +void PQFileData::isend() +{ + fileflags |= PQI_FD_FLAG_ENDSTREAM; + return; +} + +FileTransferItem::FileTransferItem() + :PQFileItem(PQI_FI_SUBTYPE_TRANSFER), + transferred(0), state(FT_STATE_OKAY), + crate(0), trate(0), in(false), ltransfer(0), lrate(0) +{ + //std::cerr << "Creating FileTransferItem()" << std::endl; + return; +} + + +FileTransferItem::~FileTransferItem() +{ + //std::cerr << "Deleting FileTransferItem()" << std::endl; + return; +} + +FileTransferItem *FileTransferItem::clone() +{ + FileTransferItem *nfd = new FileTransferItem(); + nfd -> copy(this); + + return nfd; +} + +void FileTransferItem::copy(const FileTransferItem *fd) +{ + // copy below. + PQFileItem::copy(fd); + + transferred = fd -> transferred; + state = fd -> state; + crate = fd -> crate; + trate = fd -> trate; + in = fd -> in; + ltransfer = fd -> ltransfer; + lrate = fd -> lrate; + return; +} + +std::ostream &FileTransferItem::print(std::ostream &out) +{ + out << "-------- FileTransferItem" << std::endl; + PQFileItem::print(out); + + if (in == true) + { + out << "Incoming File....."; + } + else + { + out << "Outgoing File....."; + } + out << "Transferred: " << transferred << std::endl; + out << "Transfer State: " << state << std::endl; + out << "Current/Total Rate: " << crate << "/" << trate << std::endl; + out << "LTransfer/LRate: " << ltransfer << "/" << lrate << std::endl; + return out << "--------" << std::endl; +} + + +RateCntrlItem::RateCntrlItem() + :PQFileItem(PQI_FI_SUBTYPE_RATE), + total(0), individual(0) +{ + //std::cerr << "Creating RateCntrlItem()" << std::endl; + return; +} + + +RateCntrlItem::~RateCntrlItem() +{ + //std::cerr << "Deleting RateCntrlItem()" << std::endl; + return; +} + +RateCntrlItem *RateCntrlItem::clone() +{ + RateCntrlItem *nfd = new RateCntrlItem(); + nfd -> copy(this); + + return nfd; +} + +void RateCntrlItem::copy(const RateCntrlItem *fd) +{ + // copy below. + PQFileItem::copy(fd); + + total = fd -> total; + individual = fd -> individual; + return; +} + +std::ostream &RateCntrlItem::print(std::ostream &out) +{ + out << "-------- RateCntrlItem" << std::endl; + PQFileItem::print(out); + + out << "Total Rate: " << total << std::endl; + out << "Individual Rate: " << individual << std::endl; + return out << "--------" << std::endl; +} + + +// CHANID Operations. +int pqicid_clear(ChanId *cid) +{ + for(int i = 0; i < 10; i++) + { + cid -> route[i] = 0; + } + return 1; +} + +int pqicid_copy(const ChanId *cid, ChanId *newcid) +{ + for(int i = 0; i < 10; i++) + { + (newcid -> route)[i] = (cid -> route)[i]; + } + return 1; +} + +int pqicid_cmp(const ChanId *cid1, ChanId *cid2) +{ + int ret = 0; + for(int i = 0; i < 10; i++) + { + ret = cid1->route[i] - cid2->route[i]; + if (ret != 0) + { + return ret; + } + } + return 0; +} + + + + +int pqiroute_getshift(ChanId *id) +{ + int *array = id -> route; + int next = array[0]; + + // shift. + for(int i = 0; i < 10 - 1; i++) + { + array[i] = array[i+1]; + } + array[10 - 1] = 0; + + return next; +} + +int pqiroute_setshift(ChanId *id, int chan) +{ + int *array = id -> route; + + // shift. + for(int i = 10 - 1; i > 0; i--) + { + array[i] = array[i-1]; + } + array[0] = chan; + + return 1; +} + +/****************** PERSON DETAILS ***********************/ + +Person::Person() + :dhtFound(false), dhtFlags(0), + lc_timestamp(0), lr_timestamp(0), + nc_timestamp(0), nc_timeintvl(5), + name("Unknown"), status(PERSON_STATUS_MANUAL) + + + { + for(int i = 0; i < (signed) sizeof(lastaddr); i++) + { + ((unsigned char *) (&lastaddr))[i] = 0; + ((unsigned char *) (&localaddr))[i] = 0; + ((unsigned char *) (&serveraddr))[i] = 0; + ((unsigned char *) (&dhtaddr))[i] = 0; + } + pqicid_clear(&cid); + + + return; + } + +Person::~Person() + { + } + + +int Person::cidpop() +{ + return pqiroute_getshift(&cid); +} + +void Person::cidpush(int id) +{ + pqiroute_setshift(&cid, id); + return; +} + +bool Person::Group(std::string in) + { + std::list::iterator it; + for(it = groups.begin(); it != groups.end(); it++) + { + if (in == (*it)) + { + return true; + } + } + return false; + } + + +int Person::addGroup(std::string in) + { + groups.push_back(in); + return 1; + } + +int Person::removeGroup(std::string in) + { + std::list::iterator it; + for(it = groups.begin(); it != groups.end(); it++) + { + if (in == (*it)) + { + groups.erase(it); + return 1; + } + } + return 0; + } + + + +bool Person::Valid() + { + return (status & PERSON_STATUS_VALID); + } + +void Person::Valid(bool b) + { + if (b) + status |= PERSON_STATUS_VALID; + else + status &= ~PERSON_STATUS_VALID; + } + +bool Person::Accepted() + { + return (status & PERSON_STATUS_ACCEPTED); + } + +void Person::Accepted(bool b) + { + if (b) + status |= PERSON_STATUS_ACCEPTED; + else + status &= ~PERSON_STATUS_ACCEPTED; + } + +bool Person::InUse() + { + return (status & PERSON_STATUS_INUSE); + } + +void Person::InUse(bool b) + { + if (b) + status |= PERSON_STATUS_INUSE; + else + status &= ~(PERSON_STATUS_INUSE); + } + + +bool Person::Listening() + { + return (status & PERSON_STATUS_LISTENING); + } + +void Person::Listening(bool b) + { + if (b) + status |= PERSON_STATUS_LISTENING; + else + status &= ~PERSON_STATUS_LISTENING; + } + +bool Person::Connected() + { + return (status & PERSON_STATUS_CONNECTED); + } + +void Person::Connected(bool b) + { + if (b) + status |= PERSON_STATUS_CONNECTED; + else + status &= ~PERSON_STATUS_CONNECTED; + } + +bool Person::WillListen() + { + return (status & PERSON_STATUS_WILL_LISTEN); + } + +void Person::WillListen(bool b) + { + if (b) + status |= PERSON_STATUS_WILL_LISTEN; + else + status &= ~PERSON_STATUS_WILL_LISTEN; + } + +bool Person::WillConnect() + { + return (status & PERSON_STATUS_WILL_CONNECT); + } + +void Person::WillConnect(bool b) + { + if (b) + status |= PERSON_STATUS_WILL_CONNECT; + else + status &= ~PERSON_STATUS_WILL_CONNECT; + } + +bool Person::Manual() + { + return (status & PERSON_STATUS_MANUAL); + } + +void Person::Manual(bool b) + { + if (b) + status |= PERSON_STATUS_MANUAL; + else + status &= ~PERSON_STATUS_MANUAL; + } + +bool Person::Firewalled() + { + return (status & PERSON_STATUS_FIREWALLED); + } + +void Person::Firewalled(bool b) + { + if (b) + status |= PERSON_STATUS_FIREWALLED; + else + status &= ~PERSON_STATUS_FIREWALLED; + } + +bool Person::Forwarded() + { + return (status & PERSON_STATUS_FORWARDED); + } + +void Person::Forwarded(bool b) + { + if (b) + status |= PERSON_STATUS_FORWARDED; + else + status &= ~PERSON_STATUS_FORWARDED; + } + +bool Person::Local() + { + return (status & PERSON_STATUS_LOCAL); + } + +void Person::Local(bool b) + { + if (b) + status |= PERSON_STATUS_LOCAL; + else + status &= ~PERSON_STATUS_LOCAL; + } + + +bool Person::Trusted() + { + return (status & PERSON_STATUS_TRUSTED); + } + +void Person::Trusted(bool b) + { + if (b) + status |= PERSON_STATUS_TRUSTED; + else + status &= ~PERSON_STATUS_TRUSTED; + } + + +unsigned int Person::Status() + { + return status; + } + + +void Person::Status(unsigned int s) + { + status = s; + } + +std::string Person::Name() + { + return name; + } + + +void Person::Name(std::string n) + { + name = n; + } + + /* Dynamic Address Foundation */ +bool Person::hasDHT() +{ + return dhtFound; +} + +void Person::setDHT(struct sockaddr_in addr, unsigned int flags) +{ + dhtFound = true; + dhtFlags = flags; + dhtaddr = addr; +} + +/* GUI Flags */ +bool Person::InChat() + { + return (status & PERSON_STATUS_INCHAT); + } + +void Person::InChat(bool b) + { + if (b) + status |= PERSON_STATUS_INCHAT; + else + status &= ~PERSON_STATUS_INCHAT; + } + +bool Person::InMessage() + { + return (status & PERSON_STATUS_INMSG); + } + +void Person::InMessage(bool b) + { + if (b) + status |= PERSON_STATUS_INMSG; + else + status &= ~PERSON_STATUS_INMSG; + } + + diff --git a/libretroshare/src/pqi/pqi_base.h b/libretroshare/src/pqi/pqi_base.h new file mode 100644 index 000000000..560679fb7 --- /dev/null +++ b/libretroshare/src/pqi/pqi_base.h @@ -0,0 +1,596 @@ +/* + * "$Id: pqi_base.h,v 1.18 2007-05-05 16:10:05 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + +#ifndef PQI_BASE_ITEM_HEADER +#define PQI_BASE_ITEM_HEADER + +#include +#include +#include +#include +#include + +#include "pqi/pqinetwork.h" + + +#define PQI_MIN_PORT 1024 +#define PQI_MAX_PORT 16000 +#define PQI_DEFAULT_PORT 7812 + +int getPQIsearchId(); +int fixme(char *str, int n); + +struct chan_id +{ + int route[10]; +}; + +typedef unsigned long SearchId; /* unsigned 32 bits */ +typedef struct chan_id ChanId; + +/* basic worker fns on cids */ +int pqicid_clear(ChanId *cid); +int pqicid_copy(const ChanId *cid, ChanId *newcid); +int pqicid_cmp(const ChanId *cid1, ChanId *cid2); + + +// So the basic pqi interface defines +// +// 1) Person -> reference object +// 2) PQItem +// 3) PQInterface +// which defines: +// - send/recieve objs +// - send/recieve files +// +// This is then extended to +// 4) SInterface +// which seperates the data into providing a basic search interface. +// chat/messages/files/search objs. +// + +// TODO IN THIS CLASS. +// 1) Add serialisation.... (later) +// 2) reduce base interface to the minimum. +// 3) Convert cid -> std::stack. + +// Base for all Security/Id/Certificate schemes. +// The list of these must be maintained seperately +// from the PQItems.... + + +// Person - includes +// 1) name + signature (unique id) +// 2) address + timestamps of connections. +// 3) status +// 4) groups. +// +// only requires certificate. to complete... + +#define PERSON_STATUS_VALID 0x0001 +#define PERSON_STATUS_ACCEPTED 0x0002 +#define PERSON_STATUS_INUSE 0x0004 +#define PERSON_STATUS_LISTENING 0x0008 +#define PERSON_STATUS_CONNECTED 0x0010 +#define PERSON_STATUS_WILL_LISTEN 0x0020 +#define PERSON_STATUS_WILL_CONNECT 0x0040 + +#define PERSON_STATUS_MANUAL 0x0080 +#define PERSON_STATUS_FIREWALLED 0x0100 +#define PERSON_STATUS_FORWARDED 0x0200 +#define PERSON_STATUS_LOCAL 0x0400 +#define PERSON_STATUS_TRUSTED 0x0800 + +/* some extra flags for advising the gui.... + * have no affect on the pqi networking. + */ + +#define PERSON_STATUS_INCHAT 0x1000 +#define PERSON_STATUS_INMSG 0x2000 + +class Person +{ +public: + + Person(); +virtual ~Person(); + +std::string Name(); +void Name(std::string); + + // Signature needs to be defined. +virtual std::string Signature() { return Name(); }; + + // These operate on the status. +bool Valid(); +void Valid(bool); +bool Accepted(); +void Accepted(bool); +bool InUse(); +void InUse(bool); +bool Listening(); +void Listening(bool); +bool Connected(); +void Connected(bool); +bool WillListen(); +void WillListen(bool); +bool WillConnect(); +void WillConnect(bool); +bool Manual(); +void Manual(bool); +bool Firewalled(); +void Firewalled(bool); +bool Forwarded(); +void Forwarded(bool); +bool Local(); +void Local(bool); +bool Trusted(); +void Trusted(bool); + +/* GUI Flags */ +bool InChat(); +void InChat(bool); +bool InMessage(); +void InMessage(bool); + +unsigned int Status(); +void Status(unsigned int s); + +int addGroup(std::string); +int removeGroup(std::string); +bool Group(std::string); + +int cidpop(); +void cidpush(int id); + + /* Dynamic Address Foundation */ +bool hasDHT(); +std::string getDHTId(); +void setDHT(struct sockaddr_in addr, unsigned int flags); + + // public for the moment. + struct sockaddr_in lastaddr, localaddr, serveraddr; + std::string dynDNSaddr; + + bool dhtFound; + unsigned int dhtFlags; + struct sockaddr_in dhtaddr; + + time_t lc_timestamp; // last connect timestamp + time_t lr_timestamp; // last receive timestamp + + time_t nc_timestamp; // next connect timestamp. + time_t nc_timeintvl; // next connect time interval. + + ChanId cid; // to get to the correct pqissl. + + int trustLvl; /* new field */ + +private: + std::string name; + + unsigned int status; + std::list groups; +}; + + +class PQItem +{ + // include serialisation (Boost) functions... + + // private copy constructor... prevent copying... + PQItem(const PQItem &) {return; } +public: + PQItem(); + PQItem(int t, int st); // initialise with subtypes. +virtual ~PQItem(); + + // other type of serialise.... +virtual std::ostream &print(std::ostream &out); + + // copy functions. +virtual PQItem *clone(); +void copy(const PQItem *pqi); +void copyIDs(const PQItem *pqi); + + // stack operations -> could be converted to STL stack. +int cidpop(); +void cidpush(int id); + + // data + ChanId cid; + SearchId sid; + + int type; + int subtype; + + int flags; + + Person *p; // This is shallow copied inside to itself, + // Over serialisation - becomes a name.... +}; + + +// Some Functional Objects for operations on PQItems + +class PQItem_MatchSid +//: public unary_function +{ + unsigned long sid; + + public: + explicit PQItem_MatchSid(const unsigned long s) : sid(s) {} + + bool operator()(const PQItem *pqi) const + { + if (pqi == NULL) + return false; + return (pqi -> sid == sid); + } +}; + + +class PQItem_MatchType +//: public unary_function +{ + int type, subtype; + + public: + explicit PQItem_MatchType(const int t, const int s = 0) + : type(t), subtype(s) {} + + bool operator()(const PQItem *pqi) const + { + if (pqi == NULL) + return false; + if (type == pqi -> type) + { + if (subtype == 0) + return true; + return (pqi -> subtype == subtype); + } + return false; + } +}; + + +#define PQIFILE_STD 0x0001 +#define PQIFILE_DIRLIST_FILE 0x0002 +#define PQIFILE_DIRLIST_DIR 0x0004 + + +class PQFileItem: public PQItem +{ + // private copy constructor... prevent copying... + PQFileItem(const PQFileItem &) {return; } +public: + PQFileItem(); + PQFileItem(int st); // initialise with subtypes. +virtual ~PQFileItem(); + + // copy functions. +virtual PQFileItem *clone(); +void copy(const PQFileItem *src); + +std::ostream &print(std::ostream &out); +virtual int match(std::string term); + + std::string hash; + std::string name; + std::string path; + std::string ext; + + + int size; // total size of file. + long fileoffset; // used for file requests. + long chunksize; // used for file requests. + + int reqtype; + int exttype; + +}; + + +class PQFileData: public PQFileItem +{ +public: + PQFileData(); +virtual ~PQFileData(); +virtual PQFileData *clone(); +void copy(const PQFileData *fd); + +virtual std::ostream &print(std::ostream &out); + +int writedata(std::ostream &out); +int readdata(std::istream &in, int maxbytes); +int endstream(); + +void isend(); + + // data + int datalen; + void *data; + + int fileflags; +}; + +// And finally the Control/Info Interface. + + +class FileTransferItem: public PQFileItem +{ + // private copy constructor... prevent copying... + // FileTransferItem(const FileTransferItem &) {return; } +public: + FileTransferItem(); +virtual ~FileTransferItem(); + +virtual FileTransferItem *clone(); +void copy(const FileTransferItem *ft); + +virtual std::ostream &print(std::ostream &out); + + int transferred; + int state; + float crate; + float trate; + bool in; + + int ltransfer; + float lrate; +}; + +#define FT_STATE_FAILED 0 +#define FT_STATE_OKAY 1 +#define FT_STATE_COMPLETE 2 + + + +class RateCntrlItem: public PQFileItem +{ +public: + RateCntrlItem(); +virtual ~RateCntrlItem(); + +virtual RateCntrlItem *clone(); +void copy(const RateCntrlItem *ft); + +virtual std::ostream &print(std::ostream &out); + + float total; + float individual; +}; + + + + + +class RateInterface +{ +// controlling data rates. +public: + + RateInterface() + :bw_in(0), bw_out(0), bwMax_in(0), bwMax_out(0) { return; } +virtual ~RateInterface() { return; } + +virtual float getRate(bool in) + { + if (in) + return bw_in; + return bw_out; + } + +virtual float getMaxRate(bool in) + { + if (in) + return bwMax_in; + return bwMax_out; + } + +virtual void setMaxRate(bool in, float val) + { + if (in) + bwMax_in = val; + else + bwMax_out = val; + return; + } + +protected: + +void setRate(bool in, float val) + { + if (in) + bw_in = val; + else + bw_out = val; + return; + } + + private: +float bw_in, bw_out, bwMax_in, bwMax_out; +}; + + + + + +/*********************** PQI INTERFACE ******************************\ + * The basic exchange interface. + * This inherits the RateInterface, as Bandwidth control + * is a critical to a networked application. + * + */ +class NetInterface; + +class PQInterface: public RateInterface +{ +public: + PQInterface() { return; } +virtual ~PQInterface() { return; } + +virtual int SendItem(PQItem *) = 0; +virtual PQItem *GetItem() = 0; + +// also there are tick + person id functions. +virtual int tick() { return 0; } +virtual int status() { return 0; } +virtual Person *getContact() { return NULL; } + + // the callback from NetInterface Connection Events. +virtual int notifyEvent(NetInterface *ni, int event) { return 0; } +}; + +/********************** Binary INTERFACE **************************** + * This defines the binary interface used by Network/loopback/file + * interfaces + */ + +#define BIN_FLAGS_NO_CLOSE 0x0001 +#define BIN_FLAGS_READABLE 0x0002 +#define BIN_FLAGS_WRITEABLE 0x0004 + +class BinInterface +{ +public: + BinInterface() { return; } +virtual ~BinInterface() { return; } + +virtual int tick() = 0; + +virtual int senddata(void *data, int len) = 0; +virtual int readdata(void *data, int len) = 0; +virtual int netstatus() = 0; +virtual int isactive() = 0; +virtual bool moretoread() = 0; +virtual bool cansend() = 0; + /* used by pqistreamer to limit transfers */ +virtual bool bandwidthLimited() { return true; } +}; + + +/********************** Network INTERFACE *************************** + * This defines the Network interface used by sockets/SSL/XPGP + * interfaces + * + * NetInterface: very pure interface, so no tick.... + * + * It is passed a pointer to a PQInterface *parent, + * this is used to notify the system of Connect/Disconnect Events. + * + * Below are the Events for callback. + */ + +static const int NET_CONNECT_RECEIVED = 1; +static const int NET_CONNECT_SUCCESS = 2; +static const int NET_CONNECT_UNREACHABLE = 3; +static const int NET_CONNECT_FIREWALLED = 4; +static const int NET_CONNECT_FAILED = 5; + +class NetInterface +{ +public: + NetInterface(PQInterface *p_in, Person *person_in) + :p(p_in), person(person_in) { return; } + +virtual ~NetInterface() + { return; } + +// virtual int tick() = 0; // Already defined for BinInterface. + +virtual int connectattempt() = 0; +virtual int listen() = 0; +virtual int stoplistening() = 0; +virtual int disconnect() = 0; +virtual int reset() = 0; +virtual Person *getContact() { return person; } + +protected: +PQInterface *parent() { return p; } + +private: + PQInterface *p; + Person *person; +}; + + +class NetBinInterface: public NetInterface, public BinInterface +{ +public: + NetBinInterface(PQInterface *parent, Person *person) + :NetInterface(parent, person) + { return; } +virtual ~NetBinInterface() { return; } +}; + +#define CHAN_SIGN_SIZE 16 +#define CERTSIGNLEN 16 + +class certsign +{ + public: + bool operator<(const certsign &ref) const; + bool operator==(const certsign &ref) const; + char data[CERTSIGNLEN]; +}; + + +// IDS aren't inportant in the base class. + +// EXCEPT FOR MAYBE THE FLAGS. + +// These are OR'ed together. +const int PQI_ITEM_FLAG_NEW = 0x001; +const int PQI_ITEM_FLAG_LOCAL = 0x002; +const int PQI_ITEM_FLAG_PRIVATE = 0x004; + +const int PQI_ITEM_TYPE_ITEM = 0x000; +const int PQI_ITEM_TYPE_FILEITEM = 0x001; +const int PQI_ITEM_TYPE_SEARCHITEM = 2; +const int PQI_ITEM_TYPE_CHATITEM = 3; +const int PQI_ITEM_TYPE_INFOITEM = 5; +const int PQI_ITEM_TYPE_COMMANDITEM = 6; +const int PQI_ITEM_TYPE_AUTODISCITEM = 7; + +const int PQI_ITEM_TYPE_TUNNELITEM = 777; +const int PQI_ITEM_TYPE_TUNNELINITITEM = 778; + +// Sub Type. +const int PQI_FI_SUBTYPE_GENERAL = 1; +const int PQI_FI_SUBTYPE_DATA = 2; +const int PQI_FI_SUBTYPE_CANCELRECV = 3; +const int PQI_FI_SUBTYPE_CANCELSEND = 4; +const int PQI_FI_SUBTYPE_REQUEST = 5; +const int PQI_FI_SUBTYPE_TRANSFER = 6; +const int PQI_FI_SUBTYPE_RATE = 7; +const int PQI_FI_SUBTYPE_ERROR = 8; + +const int PQI_FD_FLAG_ENDSTREAM = 1; + +#endif // PQI_BASE_ITEM_HEADER + diff --git a/libretroshare/src/pqi/pqi_data.h b/libretroshare/src/pqi/pqi_data.h new file mode 100644 index 000000000..45758d090 --- /dev/null +++ b/libretroshare/src/pqi/pqi_data.h @@ -0,0 +1,169 @@ +/* + * "$Id: pqi_data.h,v 1.8 2007-04-07 08:40:55 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + +#ifndef PQI_ITEM_HEADER +#define PQI_ITEM_HEADER + +#include "pqi/pqi_base.h" + +#include +#include +#include + +// Definitions of some of the commonly used classes. +// These will all be made streamable! via Boost C++ + +class SearchItem: public PQItem +{ +public: + SearchItem(); + SearchItem(int st); +virtual ~SearchItem(); +virtual SearchItem *clone(); + +void copy(const SearchItem *si); +virtual std::ostream &print(std::ostream &out); + + // data + int datatype; + std::string data; + + int siflags; +}; + + +int match(PQFileItem *fi, SearchItem *si); + +class MediaItem: public PQFileItem +{ +public: + MediaItem(); +virtual ~MediaItem(); +virtual MediaItem *clone(); + +void copy(const MediaItem *src); +int match(std::string term); + + // data. +std::string mimetype; + +std::string title; +std::string author; +std::string collection; +std::string genre; + +int len; + +}; + +class ChatItem: public PQItem +{ +public: + ChatItem(); + ChatItem(int st); +virtual ~ChatItem(); +virtual ChatItem *clone(); +void copy(const ChatItem *si); +virtual std::ostream &print(std::ostream &out); + + // data +std::string msg; + // Timestamp (Not transmitted currently!). + // Stamped on arrival. + int epoch; +}; + + +class MsgFileItem +{ + public: + std::string name; /* and dir! */ + std::string hash; + unsigned long size; +}; + + +class MsgItem: public ChatItem +{ +public: + MsgItem(); +virtual ~MsgItem(); + +virtual MsgItem *clone(); +void copy(const MsgItem *mi); +std::ostream &print(std::ostream &out); + + // Note this breaks the old client.... +// Old data..... +//int mode; +//std::string recommendname; +//std::string recommendhash; +//std::string channel; +//int recommendsize; +//int datalen; +//void *data; + + // Flags + unsigned long msgflags; + unsigned long sendTime; + + std::string title; + std::string header; + + std::list files; +}; + + +std::string strtolower(std::string in); +std::string fileextension(std::string in); +std::list createtermlist(std::string in); + + +// IDS + +const int PQI_SI_SUBTYPE_SEARCH = 1; +const int PQI_SI_SUBTYPE_CANCEL = 2; +const int PQI_SI_SUBTYPE_FILEREQ = 3; +const int PQI_SI_SUBTYPE_FILECANCEL = 4; + +const int PQI_SI_DATATYPE_TERMS = 1; +const int PQI_SI_DATATYPE_HASH = 2; +const int PQI_SI_DATATYPE_NAME = 3; +const int PQI_SI_DATATYPE_DIR = 4; + +const int PQI_MI_SUBTYPE_CHAT = 1; +const int PQI_MI_SUBTYPE_MSG = 2; + + +/* not really used here, but at higher layers */ +const unsigned long PQI_MI_FLAGS_OUTGOING = 0x0001; +const unsigned long PQI_MI_FLAGS_PENDING = 0x0002; +const unsigned long PQI_MI_FLAGS_DRAFT = 0x0004; +const unsigned long PQI_MI_FLAGS_NEW = 0x0010; + +#endif // PQI_ITEM_HEADER + diff --git a/libretroshare/src/pqi/pqiaddrstore.h b/libretroshare/src/pqi/pqiaddrstore.h new file mode 100644 index 000000000..f0dbe5039 --- /dev/null +++ b/libretroshare/src/pqi/pqiaddrstore.h @@ -0,0 +1,22 @@ +#ifndef PQI_ADDR_STORE_H +#define PQI_ADDR_STORE_H + +#include "pqi/pqinetwork.h" + +#include + +class pqiAddrStore +{ + public: + virtual ~pqiAddrStore() { return; } + /* pqiAddrStore ... called prior to connect */ + virtual bool addrFriend(std::string id, struct sockaddr_in &addr, unsigned int &flags) = 0; +}; + + +/* implemented elsewhere, to provide pqi with AddrStore */ + +extern pqiAddrStore *getAddrStore(); + + +#endif /* PQI_ADDR_STORE_H */ diff --git a/libretroshare/src/pqi/pqiarchive.cc b/libretroshare/src/pqi/pqiarchive.cc new file mode 100644 index 000000000..21f0ae333 --- /dev/null +++ b/libretroshare/src/pqi/pqiarchive.cc @@ -0,0 +1,471 @@ +/* + * "$Id: pqiarchive.cc,v 1.5 2007-03-21 18:45:41 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + + +/* This is dependent on the sslroot at the moment. + * -> as we need to create/restore references to the Person. + * -> and store the signatures to do this. + */ + +/******************************************************************* + * pqiarchive provides an archive stream. + * This stores PQItem + Person Reference + Timestamp, + * + * and allows Objects to be replayed or restored, + * independently of the rest of the pqi system. + * + */ + +#include "pqi/pqiarchive.h" +#include "pqi/pqipacket.h" +#include +#include + +#include +#include "pqi/pqidebug.h" + +const int pqiarchivezone = 9326; + +struct pqiarchive_header +{ + uint32_t type; + uint32_t length; + uint32_t ts; + uint8_t personSig[CERTSIGNLEN]; +}; + +const int PQIARCHIVE_TYPE_PQITEM = 0x0001; + +pqiarchive::pqiarchive(BinInterface *bio_in, int bio_flags_in, sslroot *s) + :bio(bio_in), bio_flags(bio_flags_in), + nextPkt(NULL), nextPktTS(0), firstPktTS(0), initTS(0), + sslr(s) +{ + { + std::ostringstream out; + out << "pqiarchive::pqiarchive()"; + out << " Initialisation!" << std::endl; + pqioutput(PQL_DEBUG_ALL, pqiarchivezone, out.str()); + } + + if (!bio_in) + { + std::ostringstream out; + out << "pqiarchive::pqiarchive()"; + out << " NULL bio, FATAL ERROR!" << std::endl; + pqioutput(PQL_ALERT, pqiarchivezone, out.str()); + exit(1); + } + + return; +} + +pqiarchive::~pqiarchive() +{ + { + std::ostringstream out; + out << "pqiarchive::~pqiarchive()"; + out << " Destruction!" << std::endl; + pqioutput(PQL_DEBUG_ALL, pqiarchivezone, out.str()); + } + + if (bio_flags & BIN_FLAGS_NO_CLOSE) + { + std::ostringstream out; + out << "pqiarchive::~pqiarchive()"; + out << " Not Closing BinInterface!" << std::endl; + pqioutput(PQL_DEBUG_ALL, pqiarchivezone, out.str()); + } + else if (bio) + { + std::ostringstream out; + out << "pqiarchive::~pqiarchive()"; + out << " Deleting BinInterface!" << std::endl; + pqioutput(PQL_DEBUG_ALL, pqiarchivezone, out.str()); + + delete bio; + } + + if (nextPkt) + { + pqipkt_delete(nextPkt); + } + return; +} + + +// Get/Send Items. +int pqiarchive::SendItem(PQItem *si) +{ + { + std::ostringstream out; + out << "pqiarchive::SendItem()" << std::endl; + si -> print(out); + pqioutput(PQL_DEBUG_BASIC, pqiarchivezone, out.str()); + } + + // check if this is a writing bio. + + if (!(bio_flags & BIN_FLAGS_WRITEABLE)) + { + delete si; + return -1; + } + + int ret = writePkt(si); + return ret; /* 0 - failure, 1 - success*/ +} + +PQItem *pqiarchive::GetItem() +{ + { + std::ostringstream out; + out << "pqiarchive::GetItem()"; + pqioutput(PQL_DEBUG_ALL, pqiarchivezone, out.str()); + } + + // check if this is a reading bio. + if (!(bio_flags & BIN_FLAGS_READABLE)) + { + std::ostringstream out; + out << "pqiarchive::GetItem()"; + out << "Error Not Readable" << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqiarchivezone, out.str()); + return NULL; + } + + // load if we dont have a packet. + if (!nextPkt) + { + if (!readPkt(&nextPkt, &nextPktTS)) + { + std::ostringstream out; + out << "pqiarchive::GetItem()"; + out << "Failed to ReadPkt" << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqiarchivezone, out.str()); + return NULL; + } + } + + if (!nextPkt) return NULL; + + + /* if realtime - check delta */ + bool rtnPkt = true; + if ((realTime) && (initTS)) + { + int delta = time(NULL) - initTS; + int delta2 = nextPktTS - firstPktTS; + if (delta >= delta2) + { + rtnPkt = true; + } + else + { + rtnPkt = false; + } + } + + if (rtnPkt) + { + if (!initTS) + { + /* first read! */ + initTS = time(NULL); + firstPktTS = nextPktTS; + } + PQItem *outPkt = nextPkt; + nextPkt = NULL; + + if (outPkt != NULL) + { + std::ostringstream out; + out << "pqiarchive::GetItem() Returning:" << std::endl; + outPkt -> print(out); + pqioutput(PQL_DEBUG_BASIC, pqiarchivezone, out.str()); + } + return outPkt; + } + return NULL; +} + +// // PQInterface +int pqiarchive::tick() +{ + { + std::ostringstream out; + out << "pqiarchive::tick()"; + out << std::endl; + } + return 0; +} + +int pqiarchive::status() +{ + { + std::ostringstream out; + out << "pqiarchive::status()"; + pqioutput(PQL_DEBUG_ALL, pqiarchivezone, out.str()); + } + return 0; +} + +// +/**************** HANDLE OUTGOING TRANSLATION + TRANSMISSION ******/ + +int pqiarchive::writePkt(PQItem *pqi) +{ + { + std::ostringstream out; + out << "pqiarchive::writePkt()"; + pqioutput(PQL_DEBUG_ALL, pqiarchivezone, out.str()); + } + + void *ptr = pqipkt_makepkt(pqi); + if (NULL == ptr) + { + std::ostringstream out; + out << "pqiarchive::writePkt() Null Pkt generated!"; + out << std::endl; + out << "Caused By: " << std::endl; + pqi -> print(out); + pqioutput(PQL_ALERT, pqiarchivezone, out.str()); + + pqipkt_delete(ptr); + delete pqi; + return 0; + } + + /* extract the extra details */ + int len = pqipkt_rawlen(ptr); + + if (!(bio->cansend())) + { + std::ostringstream out; + out << "pqiarchive::writePkt() BIO cannot write!"; + out << std::endl; + out << "Discarding: " << std::endl; + pqi -> print(out); + pqioutput(PQL_ALERT, pqiarchivezone, out.str()); + + pqipkt_delete(ptr); + delete pqi; + + return 0; + } + + std::ostringstream out; + out << "Writing Pkt Header" << std::endl; + struct pqiarchive_header hdr; + hdr.type = PQIARCHIVE_TYPE_PQITEM; + hdr.length = len; + hdr.ts = time(NULL); + certsign sig; + + // NB: At the moment, the messages we have sent don't have + // pqi->p set, and so they will be discarded...... + if (!sslr -> getcertsign((cert *) (pqi -> p), sig)) + { + out << "pqiarchive::writePkt() cannot get certsign!"; + out << std::endl; + out << "Caused By: " << std::endl; + pqi -> print(out); + pqioutput(PQL_ALERT, pqiarchivezone, out.str()); + + pqipkt_delete(ptr); + delete pqi; + return 0; + } + + memcpy(hdr.personSig, sig.data, CERTSIGNLEN); + + // write packet header. + if (sizeof(hdr) != bio->senddata(&hdr, sizeof(hdr))) + { + out << "Trouble writing header!"; + out << std::endl; + pqioutput(PQL_ALERT, pqiarchivezone, out.str()); + + pqipkt_delete(ptr); + delete pqi; + + return 0; + } + + out << "Writing Pkt Body" << std::endl; + + // write packet. + if (len != bio->senddata(ptr, len)) + { + out << "Problems with Send Data!"; + out << std::endl; + pqioutput(PQL_ALERT, pqiarchivezone, out.str()); + + pqipkt_delete(ptr); + delete pqi; + + return 0; + } + + out << " Success!" << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqiarchivezone, out.str()); + + pqipkt_delete(ptr); + delete pqi; + + return 1; +} + +/* Reads a single packet from the input stream + * gets the timestamp as well. + * + */ + +int pqiarchive::readPkt(PQItem **item_out, long *ts_out) +{ + { + std::ostringstream out; + out << "pqiarchive::readPkt()"; + pqioutput(PQL_DEBUG_ALL, pqiarchivezone, out.str()); + } + + if ((!(bio->isactive())) || (!(bio->moretoread()))) + { + return 0; + } + + // header + struct pqiarchive_header hdr; + + // enough space to read any packet. + int maxlen = pqipkt_maxsize(); + void *block = malloc(maxlen); + + // initial read size: basic packet. + int blen = pqipkt_basesize(); + + int tmplen; + + /* read in the header */ + if (sizeof(hdr) != bio->readdata(&hdr, sizeof(hdr))) + { + /* error */ + pqioutput(PQL_WARNING, pqiarchivezone, + "pqiarchive::readPkt() bad read(1)"); + + free(block); + return 0; + } + + /* we have the header */ + + // read the basic block (minimum packet size) + if (blen != (tmplen = bio->readdata(block, blen))) + { + pqioutput(PQL_WARNING, pqiarchivezone, + "pqiarchive::readPkt() bad read(2)"); + + free(block); + return 0; + } + + // workout how much more to read. + int extralen = pqipkt_rawlen(block) - blen; + if (extralen > 0) + { + void *extradata = (void *) (((char *) block) + blen); + if (extralen != (tmplen = bio->readdata(extradata, extralen))) + { + + std::ostringstream out; + out << "pqiarchive::readPkt() "; + out << "Error Completing Read (read "; + out << tmplen << "/" << extralen << ")" << std::endl; + pqioutput(PQL_ALERT, pqiarchivezone, out.str()); + + free(block); + return 0; + } + } + + // create packet, based on header. + std::cerr << "Read Data Block -> Incoming Pkt("; + std::cerr << blen + extralen << ")" << std::endl; + int readbytes = extralen + blen; + + PQItem *item = NULL; + if (pqipkt_check(block, readbytes)) + { + item = pqipkt_create(block); + } + + free(block); + if (item == NULL) + { + pqioutput(PQL_ALERT, pqiarchivezone, + "pqiarchive::readPkt() Failed to create Item from archive!"); + return 0; + } + + /* get the PersonSign out of the header */ + certsign sig; + memcpy(sig.data, hdr.personSig, CERTSIGNLEN); + item -> p = sslr -> findcertsign(sig); + /* if we can't identify the person it is from, + * then we need to discard it!..... (happens + * when they've been removed from our friend list.... + */ + if (item->p==NULL) + { + std::ostringstream out; + out << "pqiarchive::readPkt() Couldn't translate certsign"; + out << " into cert for pkt:" << std::endl; + item->print(out); + out << "Discarding!"; + pqioutput(PQL_ALERT, pqiarchivezone, out.str()); + + delete item; + item = NULL; + return 0; + } + else + { + /* copy cid ... to ensure outgoing + * msgs work properly + */ + item->cid = item->p->cid; + } + + *item_out = item; + *ts_out = hdr.ts; + + /* cid/sid will be wrong */ + return 1; +} + + + diff --git a/libretroshare/src/pqi/pqiarchive.h b/libretroshare/src/pqi/pqiarchive.h new file mode 100644 index 000000000..81a455011 --- /dev/null +++ b/libretroshare/src/pqi/pqiarchive.h @@ -0,0 +1,87 @@ +/* + * "$Id: pqiarchive.h,v 1.3 2007-02-18 21:46:49 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + +#ifndef MRK_PQI_ARCHIVE_STREAMER_HEADER +#define MRK_PQI_ARCHIVE_STREAMER_HEADER + +// Only dependent on the base stuff. +#include "pqi/pqi_base.h" + +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) +#include "pqi/xpgpcert.h" +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ +#include "pqi/sslcert.h" +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + +#include + +/******************************************************************* + * pqiarchive provides an archive stream. + * This stores PQItem + Person Reference + Timestamp, + * + * and allows Objects to be replayed or restored, + * independently of the rest of the pqi system. + * + */ + +class pqiarchive: PQInterface +{ +public: + pqiarchive(BinInterface *bio_in, int bio_flagsin, sslroot *); +virtual ~pqiarchive(); + +// PQInterface +virtual int SendItem(PQItem *); +virtual PQItem *GetItem(); + +virtual int tick(); +virtual int status(); + +virtual void setRealTime(bool r) { realTime = r; } + private: +int writePkt(PQItem *item); +int readPkt(PQItem **item_out, long *ts); + + // Binary Interface for IO, initialisated at startup. + BinInterface *bio; + unsigned int bio_flags; // only BIN_NO_CLOSE at the moment. + + // Temp Storage for transient data..... + PQItem *nextPkt; + long nextPktTS; /* timestamp associated with nextPkt */ + long firstPktTS; /* timestamp associated with first read Pkt */ + long initTS; /* clock timestamp at first read */ + sslroot *sslr; + + bool realTime; +}; + + +#endif //MRK_PQI_ARCHIVE_STREAMER_HEADER diff --git a/libretroshare/src/pqi/pqibin.cc b/libretroshare/src/pqi/pqibin.cc new file mode 100644 index 000000000..dd9e7ce60 --- /dev/null +++ b/libretroshare/src/pqi/pqibin.cc @@ -0,0 +1,165 @@ +/* + * "$Id: pqibin.cc,v 1.4 2007-02-18 21:46:49 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "pqi/pqibin.h" + +BinFileInterface::BinFileInterface(char *fname, int flags) + :bin_flags(flags), buf(NULL) +{ + /* if read + write - open r+ */ + if ((bin_flags & BIN_FLAGS_READABLE) && + (bin_flags & BIN_FLAGS_WRITEABLE)) + { + buf = fopen(fname, "r+"); + /* if the file don't exist */ + if (!buf) + { + buf = fopen(fname, "w+"); + } + + } + else if (bin_flags & BIN_FLAGS_READABLE) + { + buf = fopen(fname, "r"); + } + else if (bin_flags & BIN_FLAGS_WRITEABLE) + { + // This is enough to remove old file in Linux... + // but not in windows.... (what to do) + buf = fopen(fname, "w"); + fflush(buf); /* this might help windows! */ + } + else + { + /* not read or write! */ + } + + if (buf) + { + /* no problem */ + + /* go to the end */ + fseek(buf, 0L, SEEK_END); + /* get size */ + size = ftell(buf); + /* back to the start */ + fseek(buf, 0L, SEEK_SET); + } + else + { + size = 0; + } + +} + + +BinFileInterface::~BinFileInterface() +{ + if (buf) + { + fclose(buf); + } +} + +int BinFileInterface::senddata(void *data, int len) +{ + if (!buf) + return -1; + + if (1 != fwrite(data, len, 1, buf)) + { + return -1; + } + return len; +} + +int BinFileInterface::readdata(void *data, int len) +{ + if (!buf) + return -1; + + if (1 != fread(data, len, 1, buf)) + { + return -1; + } + return len; +} + + +BinMemInterface::BinMemInterface(int defsize, int flags) + :bin_flags(flags), buf(NULL), size(defsize), + recvsize(0), readloc(0) + { + buf = malloc(defsize); + } + +BinMemInterface::~BinMemInterface() + { + if (buf) + free(buf); + return; + } + + /* some fns to mess with the memory */ +int BinMemInterface::fseek(int loc) + { + if (loc <= recvsize) + { + readloc = loc; + return 1; + } + return 0; + } + + +int BinMemInterface::senddata(void *data, int len) + { + if(recvsize + len > size) + { + /* resize? */ + return -1; + } + memcpy((char *) buf + recvsize, data, len); + recvsize += len; + return len; + } + + +int BinMemInterface::readdata(void *data, int len) + { + if(readloc + len > recvsize) + { + /* no more stuff? */ + return -1; + } + memcpy(data, (char *) buf + readloc, len); + readloc += len; + return len; + } + + diff --git a/libretroshare/src/pqi/pqibin.h b/libretroshare/src/pqi/pqibin.h new file mode 100644 index 000000000..5096bf49f --- /dev/null +++ b/libretroshare/src/pqi/pqibin.h @@ -0,0 +1,108 @@ +/* + * "$Id: pqibin.h,v 1.2 2007-02-18 21:46:49 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + +#ifndef PQI_BIN_INTERFACE_HEADER +#define PQI_BIN_INTERFACE_HEADER + +#include "pqi/pqi_base.h" + +class BinFileInterface: public BinInterface +{ +public: + BinFileInterface(char *fname, int flags); +virtual ~BinFileInterface(); + +virtual int tick() { return 1; } + +virtual int senddata(void *data, int len); +virtual int readdata(void *data, int len); +virtual int netstatus() { return 1;} +virtual int isactive() { return (buf != NULL);} +virtual bool moretoread() + { + if ((buf) && (bin_flags | BIN_FLAGS_READABLE)) + { + if ((size - ftell(buf)) > 0) + { + return true; + } + } + return false; + } + + +virtual bool cansend() { return (bin_flags | BIN_FLAGS_WRITEABLE); } + +private: + int bin_flags; + FILE *buf; + int size; +}; + + +class BinMemInterface: public BinInterface +{ +public: + BinMemInterface(int defsize, int flags); +virtual ~BinMemInterface(); + +int fseek(int loc); +int memsize() { return recvsize; } +void *memptr() { return buf; } + +virtual int tick() { return 1; } + +virtual int senddata(void *data, int len); +virtual int readdata(void *data, int len); +virtual int netstatus() { return 1; } +virtual int isactive() { return 1; } +virtual bool moretoread() + { + if ((buf) && (bin_flags | BIN_FLAGS_READABLE )) + { + if (readloc < recvsize) + { + return true; + } + } + return false; + } + +virtual bool cansend() { return (bin_flags | BIN_FLAGS_WRITEABLE); } + + private: + int bin_flags; + void *buf; + int size; + int recvsize; + int readloc; +}; + + + +#endif // PQI_BINARY_INTERFACES_HEADER + diff --git a/libretroshare/src/pqi/pqichannel.cc b/libretroshare/src/pqi/pqichannel.cc new file mode 100644 index 000000000..4ccd4f430 --- /dev/null +++ b/libretroshare/src/pqi/pqichannel.cc @@ -0,0 +1,610 @@ +/* + * "$Id: pqichannel.cc,v 1.4 2007-02-18 21:46:49 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "pqi/pqichannel.h" + +static const int pqicizone = 449; +#include "pqi/pqidebug.h" +#include + +const int PQChan_MsgType = 0x5601; +const int PQChan_NameType = 0x5602; +const int PQChan_HashType = 0x5604; +const int PQChan_TitleType = 0x5608; +const int PQChan_FileType = 0x5610; +const int PQChan_SizeType = 0x5620; +const int PQChan_ListType = 0x5640; + + +PQTunnel *createChannelItems(void *d, int n) +{ + pqioutput(PQL_DEBUG_BASIC, pqicizone, + "createChannelItems()"); + + return new PQChanItem(); +} + +PQChanItem::PQChanItem() + :PQTunnel(PQI_TUNNEL_CHANNEL_ITEM_TYPE), + certDER(NULL), certType(0), certLen(0), msg(""), + signature(NULL), signType(0), signLen(0) +{ + pqioutput(PQL_DEBUG_BASIC, pqicizone, + "PQChanItem::PQChanItem()"); + + return; +} + + +PQChanItem::~PQChanItem() +{ + pqioutput(PQL_DEBUG_BASIC, pqicizone, + "PQChanItem::~PQChanItem()"); + + clear(); + + return; +} + +PQChanItem *PQChanItem::clone() +{ + pqioutput(PQL_DEBUG_BASIC, pqicizone, + "PQChanItem::clone()"); + + PQChanItem *di = new PQChanItem(); + di -> copy(this); + return di; +} + +void PQChanItem::copy(const PQChanItem *di) +{ + pqioutput(PQL_DEBUG_BASIC, pqicizone, + "PQChanItem::copy()"); + + PQTunnel::copy(di); + + clear(); + + certType = di -> certType; + certLen = di -> certLen; + + // allocate memory and copy. + if (NULL == (certDER = (unsigned char *) malloc(certLen))) + { + pqioutput(PQL_DEBUG_BASIC, pqicizone, + "PQChanItem::in() Not enough Memory!"); + return; // cant be us. + } + + memcpy(certDER, di -> certDER, certLen); + + msg = di -> msg; + + files = di -> files; + + // only the signature to go!. + signType = di -> signType; + signLen = di -> signLen; + + // allocate memory and copy. + if (NULL == (signature = (unsigned char *) malloc(signLen))) + { + pqioutput(PQL_DEBUG_BASIC, pqicizone, + "PQChanItem::copy() Not enough Memory!"); + return; // cant be us. + } + + memcpy(signature, di -> signature, signLen); +} + + // Overloaded from PQTunnel. +const int PQChanItem::getSize() const +{ + // 8 bytes for cert + certLen; + // 8 bytes for msg + msgLen; + // 12 bytes for files + sum(file -> getSize()) + // 8 bytes for sign + signLen; + + int files_size = 0; + FileList::const_iterator it; + for(it = files.begin(); it != files.end(); it++) + { + files_size += it -> getSize(); + } + + return 8 + certLen + 8 + msg.length() + + 12 + files_size + 8 + signLen; +} + +int PQChanItem::out(void *data, const int size) const +{ + { + std::ostringstream out; + out << "PQChanItem::out() Data: " << data; + out << " Size: " << size << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqicizone, out.str()); + } + + if (size < PQChanItem::getSize()) + { + pqioutput(PQL_DEBUG_BASIC, pqicizone, + "PQChanItem::out() Packet Too Small!"); + return -1; + } + + // out is easy cos the getSize should be correct. + char *dta = (char *) data; + + // first we put down the certificate; + ((int *) dta)[0] = certType; + ((int *) dta)[1] = certLen; + dta += 8; // 4 bytes per int. + memcpy(dta, certDER, certLen); + dta += certLen; + + // now the message. + ((int *) dta)[0] = PQChan_MsgType; + ((int *) dta)[1] = msg.length(); + dta += 8; // 4 bytes per int. + memcpy(dta, msg.c_str(), msg.length()); + dta += msg.length(); + + // now list counter. + ((int *) dta)[0] = PQChan_ListType; + ((int *) dta)[1] = files.size(); + + // calc the length. + int files_size = 0; + FileList::const_iterator it; + for(it = files.begin(); it != files.end(); it++) + { + files_size += it -> getSize(); + } + + ((int *) dta)[2] = files_size; + dta += 12; // 4 bytes per int. + + // for each item of the list we need to put the data out. + for(it = files.begin(); it != files.end(); it++) + { + int fsize = it -> getSize(); + it -> out(dta, fsize); + dta += fsize; + } + + // finally the signature. + ((int *) dta)[0] = signType; + ((int *) dta)[1] = signLen; + dta += 8; // 4 bytes per int. + memcpy(dta, signature, signLen); + + return PQChanItem::getSize(); +} + + +void PQChanItem::clear() +{ + // first reset all our dataspaces. + if (certDER != NULL) + { + free(certDER); + certDER = NULL; + } + certLen = 0; + msg.clear(); + files.clear(); + if (signature != NULL) + { + free(signature); + signature = NULL; + } + signLen = 0; +} + + +int PQChanItem::in(const void *data, const int size) +{ + { + std::ostringstream out; + out << "PQChanItem::in() Data: " << data; + out << " Size: " << size << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqicizone, out.str()); + } + + clear(); + + int i; + int basesize = PQChanItem::getSize(); + if (size < basesize) + { + pqioutput(PQL_ALERT, pqicizone, + "PQChanItem::in() Not enough space for Class (Base)!"); + return -1; // cant be us. + } + + // now get certLen. + char *loc = ((char *) data); + certType = ((int *) loc)[0]; + certLen = ((int *) loc)[1]; + loc += 8; + // check size again. + if (size < (basesize = PQChanItem::getSize())) + { + pqioutput(PQL_ALERT, pqicizone, + "PQChanItem::in() Not enough space for Class (Cert)!"); + return -1; // cant be us. + } + + // allocate memory and copy. + if (NULL == (certDER = (unsigned char *) malloc(certLen))) + { + pqioutput(PQL_ALERT, pqicizone, + "PQChanItem::in() Not enough Memory!"); + return -1; // cant be us. + } + + memcpy(certDER, loc, certLen); + + loc += certLen; + + // now get msgSize. + if (((int *) loc)[0] != PQChan_MsgType) + { + pqioutput(PQL_ALERT, pqicizone, + "PQChanItem::in() Bad Msg Data Type!"); + return -1; // cant be us. + } + + int msize = ((int *) loc)[1]; + loc += 8; + + if (size < basesize + msize) + { + pqioutput(PQL_ALERT, pqicizone, + "PQChanItem::in() Not enough space for Class (Msg)!"); + return -1; // cant be us. + } + for(i = 0; i < msize; i++) + { + msg += loc[i]; + } + loc += msize; + + // now the files.... + // get total size... and check. + // now list counter. + + // now get msgSize. + if (((int *) loc)[0] != PQChan_ListType) + { + pqioutput(PQL_ALERT, pqicizone, + "PQChanItem::in() Bad List Data Type!"); + return -1; // cant be us. + } + + int fcount = ((int *) loc)[1]; + int fsize = ((int *) loc)[2]; + loc += 12; + + { + std::ostringstream out; + out << "PQChanItem::in() Size before Files: " << PQChanItem::getSize(); + out << " FileCount: " << fcount; + out << " FileSize: " << fsize; + pqioutput(PQL_DEBUG_BASIC, pqicizone, out.str()); + } + + // check the size again. + if (size < PQChanItem::getSize() + fsize) + { + pqioutput(PQL_ALERT, pqicizone, + "PQChanItem::in() Not enough space for Class (Files)!"); + return -1; // cant be us. + } + + // Loop through the the files. + int remain_fsize = fsize; + for(i = 0; i < fcount; i++) + { + FileItem file; + // loc, and the space left. + if (0 >= file.in(loc, remain_fsize)) + { + std::ostringstream out; + out << "PQChanItem::in() Not enough space for Class (File2)!"; + out << std::endl; + out << "\tWhen loading File #" << i+1 << " of " << fcount; + out << "\tCurrent Loc: " << loc << " Remaining: " << remain_fsize; + + pqioutput(PQL_ALERT, pqicizone, out.str()); + return -1; // cant be us. + } + + { + std::ostringstream out; + out << "PQChanItem::in() Loaded File #" << i+1; + out << " Loc: " << loc << " size: " << file.getSize(); + pqioutput(PQL_DEBUG_BASIC, pqicizone, out.str()); + } + + loc += file.getSize(); + remain_fsize -= file.getSize(); + + files.push_back(file); + } + + if (remain_fsize != 0) + { + std::ostringstream out; + out << "PQChanItem::in() Warning files size incorrect:"; + out << std::endl; + out << "Indicated Size: " << fsize << " Indicated Count:"; + out << fcount << std::endl; + out << "Real Size: " << fsize - remain_fsize; + pqioutput(PQL_ALERT, pqicizone, out.str()); + } + + // only the signature to go!. + signType = ((int *) loc)[0]; + signLen = ((int *) loc)[1]; + loc += 8; + // check size again. + if (size != PQChanItem::getSize()) + { + std::ostringstream out; + out << "PQChanItem::in() Size of Packet Incorrect!"; + out << std::endl; + out << "getSize(): " << PQChanItem::getSize(); + out << "data size: " << size; + + pqioutput(PQL_ALERT, pqicizone, out.str()); + + return -1; // cant be us. + } + + // allocate memory and copy. + if (NULL == (signature = (unsigned char *) malloc(signLen))) + { + pqioutput(PQL_ALERT, pqicizone, + "PQChanItem::in() Not enough Memory!"); + return -1; // cant be us. + } + + memcpy(signature, loc, signLen); + + loc += signLen; + + return PQChanItem::getSize(); +} + + + + + + +std::ostream &PQChanItem::print(std::ostream &out) +{ + out << "-------- PQChanItem" << std::endl; + PQItem::print(out); + + out << "Cert Type/Len: " << certType << "/"; + out << certLen << std::endl; + out << "Msg: " << msg << std::endl; + FileList::iterator it; + for(it = files.begin(); it != files.end(); it++) + { + it -> print(out); + } + out << "Sign Type/Len: " << signType << "/"; + out << signLen << std::endl; + + return out << "--------" << std::endl; +} + + +std::ostream &PQChanItem::FileItem::print(std::ostream &out) +{ + out << "-- PQChanItem::FileItem" << std::endl; + out << "Name: " << name << std::endl; + out << "Hash: " << hash << std::endl; + out << "Size: " << size << std::endl; + return out << "--" << std::endl; +} + + + // Overloaded from PQTunnel. +const int PQChanItem::FileItem::getSize() const +{ + // 8 bytes + // 8 bytes file + size; + // 8 bytes message + size; + // 8 bytes size; + + return 8 + 8 + name.length() + 8 + hash.length() + 8; +} + +int PQChanItem::FileItem::out(void *data, const int size) const +{ + { + std::ostringstream out; + out << "PQChanItem::FileItem::out() Data: " << data; + out << " Size: " << size << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqicizone, out.str()); + } + + if (size < PQChanItem::FileItem::getSize()) + { + pqioutput(PQL_DEBUG_BASIC, pqicizone, + "PQChanItem::FileItem::out() Packet Too Small!"); + return -1; + } + + // out is easy cos the getSize should be correct. + char *dta = (char *) data; + + // first we put down the total + ((int *) dta)[0] = PQChan_FileType; + ((int *) dta)[1] = PQChanItem::FileItem::getSize(); + dta += 8; // 4 bytes per int. + + ((int *) dta)[0] = PQChan_NameType; + ((int *) dta)[1] = name.length(); + dta += 8; // 4 bytes per int. + memcpy(dta, name.c_str(), name.length()); + dta += name.length(); + + ((int *) dta)[0] = PQChan_HashType; + ((int *) dta)[1] = hash.length(); + dta += 8; // 4 bytes per int. + memcpy(dta, hash.c_str(), hash.length()); + dta += hash.length(); + + ((int *) dta)[0] = PQChan_SizeType; + ((int *) dta)[1] = this -> size; + dta += 8; // 4 bytes per int. + + return PQChanItem::FileItem::getSize(); +} + + +void PQChanItem::FileItem::clear() +{ + // first reset all our dataspaces. + name.clear(); + hash.clear(); +} + + +int PQChanItem::FileItem::in(const void *data, const int size) +{ + { + std::ostringstream out; + out << "PQChanItem::FileItem::in() Data: " << data; + out << " Size: " << size << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqicizone, out.str()); + } + + clear(); + int i; + + int basesize = PQChanItem::FileItem::getSize(); + if (size < basesize) + { + pqioutput(PQL_ALERT, pqicizone, + "PQChanItem::FileItem::in() No space for Class (Base)!"); + return -1; // cant be us. + } + + + char *loc = ((char *) data); + if (((int *) loc)[0] != PQChan_FileType) + { + pqioutput(PQL_ALERT, pqicizone, + "PQChanItem::FileItem::in() Bad File Data Type!"); + return -1; // cant be us. + } + + int real_size = ((int *) loc)[1]; + if (size < real_size) + { + pqioutput(PQL_ALERT, pqicizone, + "PQChanItem::FileItem::in() No space for Class (TotalSize)!"); + return -1; // cant be us. + } + loc += 8; // 4 bytes per int. + + // now get name; + if (((int *) loc)[0] != PQChan_NameType) + { + pqioutput(PQL_ALERT, pqicizone, + "PQChanItem::FileItem::in() Bad Name Data Type!"); + return -1; // cant be us. + } + + int msize = ((int *) loc)[1]; + loc += 8; + + if (real_size < basesize + msize) + { + pqioutput(PQL_ALERT, pqicizone, + "PQChanItem::FileItem::in() No space for Class (Name)!"); + return -1; // cant be us. + } + for(i = 0; i < msize; i++) + { + name += loc[i]; + } + loc += msize; + + // now get hash; + if (((int *) loc)[0] != PQChan_HashType) + { + pqioutput(PQL_ALERT, pqicizone, + "PQChanItem::FileItem::in() Bad Hash Data Type!"); + return -1; // cant be us. + } + + int hsize = ((int *) loc)[1]; + loc += 8; + + if (real_size < basesize + msize + hsize) + { + pqioutput(PQL_ALERT, pqicizone, + "PQChanItem::FileItem::in() No space for Class (Hash)!"); + return -1; // cant be us. + } + for(i = 0; i < hsize; i++) + { + hash += loc[i]; + } + loc += hsize; + + // now get size. + if (((int *) loc)[0] != PQChan_SizeType) + { + pqioutput(PQL_ALERT, pqicizone, + "PQChanItem::FileItem::in() Bad Size Data Type!"); + return -1; // cant be us. + } + + this -> size = ((int *) loc)[1]; + loc += 8; + + // finally verify that the sizes are correct. + if (real_size != PQChanItem::FileItem::getSize()) + { + pqioutput(PQL_ALERT, pqicizone, + "PQChanItem::FileItem::in() Size Mismatch!"); + return -1; // cant be us. + } + + return PQChanItem::FileItem::getSize(); +} + + + diff --git a/libretroshare/src/pqi/pqichannel.h b/libretroshare/src/pqi/pqichannel.h new file mode 100644 index 000000000..a44bd9ddb --- /dev/null +++ b/libretroshare/src/pqi/pqichannel.h @@ -0,0 +1,111 @@ +/* + * "$Id: pqichannel.h,v 1.3 2007-02-18 21:46:49 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + +#ifndef MRK_PQI_CHANNELITEM_H +#define MRK_PQI_CHANNELITEM_H + +#include "pqi/pqitunnel.h" + +#define PQI_TUNNEL_CHANNEL_ITEM_TYPE 162 + +PQTunnel *createChannelItems(void *d, int n); + +class PQChanItem: public PQTunnel +{ + protected: + //PQChanItem(int st); + public: + PQChanItem(); + ~PQChanItem(); +virtual PQChanItem *clone(); +void copy(const PQChanItem *di); +void clear(); +virtual std::ostream &print(std::ostream &out); + + // Overloaded from PQTunnel. +virtual const int getSize() const; +virtual int out(void *data, const int size) const; +virtual int in(const void *data, const int size); + + + // So what data do we need. + // data load. + // + // 1) a Message. + // 2) a list of filenames/hashs/sizes. + // + // So you can different types + // of channels. + // + // 1) Clear Text Signed. + // -> name + // -> public key. + // -> data load + // -> signature. (of all) + // + // 2) Encrypted. + // -> name + // -> public key + // -> encrypted data load. + // -> signature (of all) + // + + class FileItem + { + public: + std::string name; + std::string hash; + long size; + + void clear(); + std::ostream &print(std::ostream &out); + + const int getSize() const; + int out(void *data, const int size) const; + int in(const void *data, const int size); + }; + + typedef std::list FileList; + + // Certificate/Key (containing Name) + unsigned char *certDER; + int certType; + int certLen; + + std::string msg; + std::string title; + FileList files; + + unsigned char *signature; + int signType; + int signLen; + + bool signValid; // not transmitted. +}; + + +#endif // MRK_PQI_CHANNELITEM_H diff --git a/libretroshare/src/pqi/pqidebug.cc b/libretroshare/src/pqi/pqidebug.cc new file mode 100644 index 000000000..36fcc8a0b --- /dev/null +++ b/libretroshare/src/pqi/pqidebug.cc @@ -0,0 +1,216 @@ +/* + * "$Id: pqidebug.cc,v 1.6 2007-02-18 21:46:49 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "pqi/pqidebug.h" + +#include +#include + +const int PQI_DEBUG_STDERR = 1; /* stuff goes to stderr */ +const int PQI_DEBUG_LOGFILE = 2; /* stuff goes to logfile */ +const int PQI_DEBUG_LOGCRASH = 3; /* minimal logfile stored after crashes */ +const int PQI_DEBUG_LOGC_MAX = 1000; /* max length of carshfile log */ +const int PQI_DEBUG_LOGC_MIN_SAVE = 100; /* max length of carshfile log */ + +static std::map zoneLevel; +static int defaultLevel = PQL_WARNING; +static FILE *ofd = stderr; + +static int debugMode = PQI_DEBUG_STDERR; +static int lineCount = 0; +static std::string crashfile; +static int debugTS = 0; + +int setDebugCrashMode(const char *cfile) +{ + crashfile = cfile; + /* if the file exists - then we crashed, save it */ + FILE *tmpin = fopen(crashfile.c_str(), "r"); + if (tmpin) + { + /* see how long it is */ + fseek(tmpin, 0, SEEK_END); + if (ftell(tmpin) > PQI_DEBUG_LOGC_MIN_SAVE) + { + std::string crashfile_save = crashfile + "-save"; + fprintf(stderr, "Detected Old Crash File: %s\n", crashfile.c_str()); + fprintf(stderr, "Copying to: %s\n", crashfile_save.c_str()); + + /* go back to the start */ + fseek(tmpin, 0, SEEK_SET); + + FILE *tmpout = fopen(crashfile_save.c_str(), "w"); + int da_size = 10240; + char dataarray[da_size]; /* 10k */ + unsigned int da_read = 0; + + if (!tmpout) + { + fprintf(stderr, "Failed to open CrashSave\n"); + fclose(tmpin); + return -1; + } + while(0 != (da_read = fread(dataarray, 1, da_size, tmpin))) + { + if (da_read != fwrite(dataarray, 1, da_read, tmpout)) + { + fprintf(stderr, "Failed writing to CrashSave\n"); + fclose(tmpout); + fclose(tmpin); + return -1; + } + } + fclose(tmpout); + fclose(tmpin); + } + else + { + fprintf(stderr, "Negligable Old CrashLog, ignoring\n"); + fclose(tmpin); + } + } + + if (0 < setDebugFile(crashfile.c_str())) + { + fprintf(stderr, "Switching To CrashLog Mode!\n"); + debugMode = PQI_DEBUG_LOGCRASH; + lineCount = 0; + debugTS = time(NULL); + } + return 1; +} + + +/* this is called when we exit normally */ +int clearDebugCrashLog() +{ + /* check we are in crashLog Mode */ + if (debugMode != PQI_DEBUG_LOGCRASH) + { + fprintf(stderr, "Not in CrashLog Mode - nothing to clear!\n"); + return 1; + } + + fprintf(stderr, "clearDebugCrashLog() Cleaning up\n"); + /* shutdown crashLog Mode */ + fclose(ofd); + ofd = stderr; + debugMode = PQI_DEBUG_STDERR; + + /* just open the file, and then close */ + FILE *tmpin = fopen(crashfile.c_str(), "w"); + fclose(tmpin); + + return 1; +} + + + +int setDebugFile(const char *fname) +{ + if (NULL != (ofd = fopen(fname, "w"))) + { + fprintf(stderr, "Logging redirected to %s\n", fname); + debugMode = PQI_DEBUG_LOGFILE; + return 1; + } + else + { + ofd = stderr; + debugMode = PQI_DEBUG_STDERR; + fprintf(stderr, "Logging redirect to %s FAILED\n", fname); + return -1; + } +} + + +int setOutputLevel(int lvl) +{ + return defaultLevel = lvl; +} + +int setZoneLevel(int lvl, int zone) +{ + zoneLevel[zone] = lvl; + return zone; +} + + +int getZoneLevel(int zone) +{ + std::map::iterator it = zoneLevel.find(zone); + if (it == zoneLevel.end()) + { + return defaultLevel; + } + return it -> second; +} + +int pqioutput(unsigned int lvl, int zone, std::string msg) +{ + if ((signed) lvl <= getZoneLevel(zone)) + { + time_t t = time(NULL); + + if (debugMode == PQI_DEBUG_LOGCRASH) + { + if (lineCount > PQI_DEBUG_LOGC_MAX) + { + /* restarting logging */ + fprintf(stderr, "Rolling over the CrashLog\n"); + fclose(ofd); + ofd = NULL; + if (0 < setDebugFile(crashfile.c_str())) + { + fprintf(ofd, "Debug CrashLog:"); + fprintf(ofd, " retroShare uptime %ld secs\n", + t-debugTS); + + debugMode = PQI_DEBUG_LOGCRASH; + lineCount = 0; + } + else + { + fprintf(stderr, "Rollover Failed!\n"); + } + } + } + + std::string timestr = ctime(&t); + std::string timestr2 = timestr.substr(0,timestr.length()-1); + /* remove the endl */ + fprintf(ofd, "(%s Z: %d, lvl:%d): %s \n", + timestr2.c_str(), zone, lvl, msg.c_str()); + fflush(ofd); + lineCount++; + } + return 1; +} + + + diff --git a/libretroshare/src/pqi/pqidebug.h b/libretroshare/src/pqi/pqidebug.h new file mode 100644 index 000000000..7826f68fb --- /dev/null +++ b/libretroshare/src/pqi/pqidebug.h @@ -0,0 +1,49 @@ +/* + * "$Id: pqidebug.h,v 1.4 2007-02-18 21:46:49 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + +#ifndef PQI_LOG_DEBUG_H +#define PQI_LOG_DEBUG_H + +#define PQL_NONE -1 +#define PQL_ALERT 1 +#define PQL_ERROR 3 +#define PQL_WARNING 5 +#define PQL_DEBUG_ALERT 6 +#define PQL_DEBUG_BASIC 8 +#define PQL_DEBUG_ALL 10 + +#include + +int setDebugCrashMode(const char *cfile); +int clearDebugCrashLog(); + +int setDebugFile(const char *fname); +int setOutputLevel(int lvl); +int setZoneLevel(int lvl, int zone); +int pqioutput(unsigned int lvl, int zone, std::string msg); + +#endif diff --git a/libretroshare/src/pqi/pqihandler.cc b/libretroshare/src/pqi/pqihandler.cc new file mode 100644 index 000000000..266b38104 --- /dev/null +++ b/libretroshare/src/pqi/pqihandler.cc @@ -0,0 +1,763 @@ +/* + * "$Id: pqihandler.cc,v 1.12 2007-03-31 09:41:32 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "pqi/pqihandler.h" + +#include +#include "pqi/pqidebug.h" +const int pqihandlerzone = 34283; + + +pqihandler::pqihandler(SecurityPolicy *Global) +{ + // The global security.... + // if something is disabled here... + // cannot be enabled by module. + globsec = Global; + + { + std::ostringstream out; + out << "New pqihandler()" << std::endl; + out << "Security Policy: " << secpolicy_print(globsec); + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqihandlerzone, out.str()); + } + + // setup minimal total+individual rates. + rateIndiv_out = 0.01; + rateIndiv_in = 0.01; + rateMax_out = 0.01; + rateMax_in = 0.01; + return; +} + +int pqihandler::tick() +{ + // tick all interfaces... + std::map::iterator it; + int moreToTick = 0; + for(it = mods.begin(); it != mods.end(); it++) + { + if (0 < ((it -> second) -> pqi) -> tick()) + { + moreToTick = 1; + } + } + // get the items, and queue them correctly + if (0 < GetItems()) + { + moreToTick = 1; + } + + UpdateRates(); + return moreToTick; +} + + +int pqihandler::status() +{ + std::map::iterator it; + + { // for output + std::ostringstream out; + out << "pqihandler::status() Active Modules:" << std::endl; + + // display all interfaces... + for(it = mods.begin(); it != mods.end(); it++) + { + out << "\tModule [" << it -> first << "] Pointer <"; + out << (void *) ((it -> second) -> pqi) << ">" << std::endl; + } + + pqioutput(PQL_DEBUG_BASIC, pqihandlerzone, out.str()); + + } // end of output. + + + // status all interfaces... + for(it = mods.begin(); it != mods.end(); it++) + { + ((it -> second) -> pqi) -> status(); + } + return 1; +} + + + +int pqihandler::AddSearchModule(SearchModule *mod, int chanid) +{ + // if chan id set, then use.... + // otherwise find empty channel. + + int realchanid = -1; + std::map::iterator it; + + + if ((chanid > 0) && (mods.find(chanid) == mods.end())) + { + // okay id. + realchanid = chanid; + + } + else + { + // find empty chan. + for(int i = 1; (i < 1000) && (realchanid == -1); i++) + { + if (mods.find(i) == mods.end()) + { + realchanid = i; + } + } + if (realchanid > 0) + { + std::ostringstream out; + out << "Allocated Chan Id: " << realchanid << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqihandlerzone, out.str()); + } + else + { + std::ostringstream out; + out << "Unable to Allocate Channel!" << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqihandlerzone, out.str()); + + return -1; + } + } + + // check security. + if (mod -> sp == NULL) + { + // create policy. + mod -> sp = secpolicy_create(); + } + + // limit to what global security allows. + secpolicy_limit(globsec, mod -> sp); + + // store. + mods[realchanid] = mod; + mod -> smi = realchanid; + + // experimental ... pushcid. + Person *p = (mod -> pqi) -> getContact(); + if (p != NULL) + { + p -> cidpush(realchanid); + } + + return realchanid; +} + +int pqihandler::RemoveSearchModule(SearchModule *mod) +{ + std::map::iterator it; + for(it = mods.begin(); it != mods.end(); it++) + { + if (mod == it -> second) + { + mods.erase(it); + return 1; + } + } + return -1; +} + +// dummy output check +int pqihandler::checkOutgoingPQItem(PQItem *item, int global) +{ + pqioutput(PQL_WARNING, pqihandlerzone, + "pqihandler::checkOutgoingPQItem() NULL fn"); + return 1; +} + + + +// generalised output +int pqihandler::HandlePQItem(PQItem *item, int allowglobal) +{ + std::map::iterator it; + pqioutput(PQL_DEBUG_BASIC, pqihandlerzone, + "pqihandler::HandlePQItem()"); + + + if ((!allowglobal) && (!checkOutgoingPQItem(item, allowglobal))) + { + std::ostringstream out; + out << "pqihandler::HandlePQItem() checkOutgoingPQItem"; + out << " Failed on item: " << std::endl; + item -> print(out); + + pqioutput(PQL_DEBUG_BASIC, pqihandlerzone, out.str()); + delete item; + return -1; + } + + // need to get channel id. (and remove from stack) + int chan = item -> cidpop(); + if (chan > 0) + { + pqioutput(PQL_DEBUG_BASIC, pqihandlerzone, + "pqihandler::HandlePQItem() Sending to One Channel"); + + + // find module. + if ((it = mods.find(chan)) == mods.end()) + { + std::ostringstream out; + out << "pqihandler::HandlePQItem() Invalid chan!"; + pqioutput(PQL_DEBUG_BASIC, pqihandlerzone, out.str()); + + delete item; + return -1; + } + + // check security... is output allowed. + if(0 < secpolicy_check((it -> second) -> sp, 0, PQI_OUTGOING)) + { + std::ostringstream out; + out << "pqihandler::HandlePQItem() sending to chan:"; + out << it -> first << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqihandlerzone, out.str()); + + // if yes send on item. + ((it -> second) -> pqi) -> SendItem(item); + return 1; + } + else + { + std::ostringstream out; + out << "pqihandler::HandlePQItem()"; + out << " Sec not approved"; + pqioutput(PQL_DEBUG_BASIC, pqihandlerzone, out.str()); + + delete item; + return -1; + } + } + else + { + if (allowglobal <= 0) + { + std::ostringstream out; + out << "pqihandler::HandleSearchItem()"; + out << " invalid routing for non-global searchitem"; + pqioutput(PQL_DEBUG_BASIC, pqihandlerzone, out.str()); + + return -1; + } + + pqioutput(PQL_DEBUG_BASIC, pqihandlerzone, + "pqihandler::HandlePQItem() Sending to All Channels"); + + // loop through all channels. + // for each one. + + // find module + // if yes send. + for(it = mods.begin(); it != mods.end(); it++) + { + + // check security... is output allowed. + if(0 < secpolicy_check((it -> second) -> sp, 0, PQI_OUTGOING)) + { + std::ostringstream out; + out << "pqihandler::HandlePQItem()"; + out << "Sending to chan:" << it -> first; + pqioutput(PQL_DEBUG_BASIC, pqihandlerzone, out.str()); + + // if yes send on item. + ((it -> second) -> pqi) -> SendItem(item -> clone()); + } + else + { + std::ostringstream out; + out << "pqihandler::HandlePQItem()"; + out << " List Send - Not in this channel!"; + pqioutput(PQL_DEBUG_BASIC, pqihandlerzone, out.str()); + + } + } + + // now we can clean up! + delete item; + return 1; + } + + // if successfully sent to at least one. + return 1; +} + + + +// 4 very similar outputs..... +int pqihandler::Search(SearchItem *ns) +{ + return HandlePQItem(ns, 1); +} + +/* This is called when we only want it to go to 1 person.... */ +int pqihandler::SearchSpecific(SearchItem *ns) +{ + return HandlePQItem(ns, 0); +} + +int pqihandler::CancelSearch(SearchItem *ns) +{ + return HandlePQItem(ns, 1); +} + +int pqihandler::SendFileItem(PQFileItem *ns) +{ + return HandlePQItem(ns, 0); +} + +int pqihandler::SendSearchResult(PQFileItem *ns) +{ + return HandlePQItem(ns, 0); +} + +int pqihandler::SendMsg(ChatItem *ns) +{ + /* switch from 1 -> 0 for specific directed Msg */ + return HandlePQItem(ns, 0); +} + +int pqihandler::SendGlobalMsg(ChatItem *ns) +{ + return HandlePQItem(ns, 1); +} + +int pqihandler::SendOtherPQItem(PQItem *ns) +{ + pqioutput(PQL_DEBUG_BASIC, pqihandlerzone, + "pqihandler::SendOtherPQItem()"); + return HandlePQItem(ns, 1); +} + +// inputs. This is a very basic +// system that is completely biased and slow... +// someone please fix. + +int pqihandler::GetItems() +{ + std::map::iterator it; + + PQItem *item; + int count = 0; + + // loop through modules.... + for(it = mods.begin(); it != mods.end(); it++) + { + SearchModule *mod = (it -> second); + + // check security... is output allowed. + if(0 < secpolicy_check((it -> second) -> sp, + PQI_ITEM_TYPE_ITEM, PQI_INCOMING)) + { + // if yes... attempt to read. + while((item = (mod -> pqi) -> GetItem()) != NULL) + { + std::ostringstream out; + out << "pqihandler::GetItems() Incoming Item "; + out << " from: " << mod -> pqi << std::endl; + item -> print(out); + + pqioutput(PQL_DEBUG_BASIC, + pqihandlerzone, out.str()); + + // got one!.... + // update routing. + item -> cidpush(mod -> smi); + SortnStoreItem(item); + count++; + } + } + else + { + // not allowed to recieve from here.... + while((item = (mod -> pqi) -> GetItem()) != NULL) + { + std::ostringstream out; + out << "pqihandler::GetItems() Incoming Item "; + out << " from: " << mod -> pqi << std::endl; + item -> print(out); + out << std::endl; + out << "Item Not Allowed (Sec Pol). deleting!"; + out << std::endl; + + pqioutput(PQL_DEBUG_BASIC, + pqihandlerzone, out.str()); + + delete item; + } + } + } + return count; +} + + + + +void pqihandler::SortnStoreItem(PQItem *item) +{ + // some template comparors for sorting incoming. + const static PQItem_MatchType match_fileitem(PQI_ITEM_TYPE_FILEITEM, + 0); + const static PQItem_MatchType match_result(PQI_ITEM_TYPE_FILEITEM, + PQI_FI_SUBTYPE_GENERAL); + + const static PQItem_MatchType match_endsrch(PQI_ITEM_TYPE_SEARCHITEM, + PQI_SI_SUBTYPE_CANCEL); + const static PQItem_MatchType match_reqsrch(PQI_ITEM_TYPE_SEARCHITEM, + PQI_SI_SUBTYPE_SEARCH); + + const static PQItem_MatchType match_info(PQI_ITEM_TYPE_INFOITEM, 0); + const static PQItem_MatchType match_chat(PQI_ITEM_TYPE_CHATITEM, 0); + + if (match_fileitem(item)) + { + if (match_result(item)) + { + pqioutput(PQL_DEBUG_BASIC, pqihandlerzone, + "SortnStore -> Result"); + + in_result.push_back(item); + } + else + { + pqioutput(PQL_DEBUG_BASIC, pqihandlerzone, + "SortnStore -> FileItem"); + in_file.push_back(item); + } + } + else if (match_endsrch(item)) + { + pqioutput(PQL_DEBUG_BASIC, pqihandlerzone, + "SortnStore -> Cancel Search"); + + in_endsrch.push_back(item); + } + else if (match_reqsrch(item)) + { + pqioutput(PQL_DEBUG_BASIC, pqihandlerzone, + "SortnStore -> Search Request"); + in_reqsrch.push_back(item); + } + else if (match_chat(item)) + { + pqioutput(PQL_DEBUG_BASIC, pqihandlerzone, + "SortnStore -> Chat"); + in_chat.push_back(item); + } + else if (match_info(item)) + { + pqioutput(PQL_DEBUG_BASIC, pqihandlerzone, + "SortnStore -> Info"); + in_info.push_back(item); + } + else + { + pqioutput(PQL_DEBUG_BASIC, pqihandlerzone, + "SortnStore -> Other"); + in_other.push_back(item); + } + return; +} + + +// much like the input stuff. +PQFileItem *pqihandler::GetSearchResult() +{ + if (in_result.size() != 0) + { + PQFileItem *fi = (PQFileItem *) in_result.front(); + in_result.pop_front(); + return fi; + } + return NULL; +} + +SearchItem *pqihandler::RequestedSearch() +{ + if (in_reqsrch.size() != 0) + { + SearchItem *si = (SearchItem *) in_reqsrch.front(); + in_reqsrch.pop_front(); + return si; + } + return NULL; +} + +SearchItem * pqihandler::CancelledSearch() +{ + if (in_endsrch.size() != 0) + { + SearchItem *si = (SearchItem *) in_endsrch.front(); + in_endsrch.pop_front(); + return si; + } + return NULL; +} + +PQFileItem *pqihandler::GetFileItem() +{ + if (in_file.size() != 0) + { + PQFileItem *fi = (PQFileItem *) in_file.front(); + in_file.pop_front(); + return fi; + } + return NULL; +} + +// Chat Interface +ChatItem *pqihandler::GetMsg() +{ + if (in_chat.size() != 0) + { + ChatItem *ci = (ChatItem *) in_chat.front(); + in_chat.pop_front(); + return ci; + } + return NULL; +} + +PQItem *pqihandler::GetOtherPQItem() +{ + if (in_other.size() != 0) + { + PQItem *pqi = in_other.front(); + in_other.pop_front(); + return pqi; + } + return NULL; +} + +PQItem *pqihandler::SelectOtherPQItem(bool (*tst)(PQItem *)) +{ + std::list::iterator it; + it = find_if(in_other.begin(), in_other.end(), *tst); + if (it != in_other.end()) + { + PQItem *pqi = (*it); + in_other.erase(it); + return pqi; + } + return NULL; +} + +static const float MIN_RATE = 0.01; // 10 B/s + +// internal fn to send updates +int pqihandler::UpdateRates() +{ + std::map::iterator it; + int num_sm = mods.size(); + + float avail_in = getMaxRate(true); + float avail_out = getMaxRate(false); + + float avg_rate_in = avail_in/num_sm; + float avg_rate_out = avail_out/num_sm; + + float indiv_in = getMaxIndivRate(true); + float indiv_out = getMaxIndivRate(false); + + float used_bw_in = 0; + float used_bw_out = 0; + + float extra_bw_in = 0; + float extra_bw_out = 0; + + int maxxed_in = 0; + int maxxed_out = 0; + + // loop through modules.... + for(it = mods.begin(); it != mods.end(); it++) + { + SearchModule *mod = (it -> second); + float crate_in = mod -> pqi -> getRate(true); + float crate_out = mod -> pqi -> getRate(false); + + used_bw_in += crate_in; + used_bw_out += crate_out; + + if (crate_in > avg_rate_in) + { + if (mod -> pqi -> getMaxRate(true) == indiv_in) + { + maxxed_in++; + } + extra_bw_in += crate_in - avg_rate_in; + } + if (crate_out > avg_rate_out) + { + if (mod -> pqi -> getMaxRate(false) == indiv_out) + { + maxxed_out++; + } + extra_bw_out += crate_out - avg_rate_out; + } +// std::cerr << "\tSM(" << mod -> smi << ")"; +// std::cerr << "In A: " << mod -> pqi -> getMaxRate(true); +// std::cerr << " C: " << crate_in; +// std::cerr << " && Out A: " << mod -> pqi -> getMaxRate(false); +// std::cerr << " C: " << crate_out << std::endl; + } +// std::cerr << "Totals (In) Used B/W " << used_bw_in; +// std::cerr << " Excess B/W " << extra_bw_in; +// std::cerr << " Available B/W " << avail_in << std::endl; +// std::cerr << "Totals (Out) Used B/W " << used_bw_out; +// std::cerr << " Excess B/W " << extra_bw_out; +// std::cerr << " Available B/W " << avail_out << std::endl; + + if (used_bw_in > avail_in) + { + //std::cerr << "Decreasing Incoming B/W!" << std::endl; + + // drop all above the avg down! + float fchg = (used_bw_in - avail_in) / (float) extra_bw_in; + for(it = mods.begin(); it != mods.end(); it++) + { + SearchModule *mod = (it -> second); + float crate_in = mod -> pqi -> getRate(true); + float new_max = avg_rate_in; + if (crate_in > avg_rate_in) + { + new_max = avg_rate_in + (1 - fchg) * + (crate_in - avg_rate_in); + } + if (new_max > indiv_in) + { + new_max = indiv_in; + } + mod -> pqi -> setMaxRate(true, new_max); + } + } + // if not maxxed already and using less than 95% + else if ((maxxed_in != num_sm) && (used_bw_in < 0.95 * avail_in)) + { + //std::cerr << "Increasing Incoming B/W!" << std::endl; + + // increase. + float fchg = (avail_in - used_bw_in) / avail_in; + for(it = mods.begin(); it != mods.end(); it++) + { + SearchModule *mod = (it -> second); + float crate_in = mod -> pqi -> getRate(true); + float max_in = mod -> pqi -> getMaxRate(true); + + if (max_in == indiv_in) + { + // do nothing... + } + else + { + float new_max = max_in; + if (max_in < avg_rate_in) + { + new_max = avg_rate_in * (1 + fchg); + } + else if (crate_in > 0.5 * max_in) + { + new_max = max_in * (1 + fchg); + } + if (new_max > indiv_in) + { + new_max = indiv_in; + } + mod -> pqi -> setMaxRate(true, new_max); + } + } + + } + + + if (used_bw_out > avail_out) + { + //std::cerr << "Decreasing Outgoing B/W!" << std::endl; + // drop all above the avg down! + float fchg = (used_bw_out - avail_out) / (float) extra_bw_out; + for(it = mods.begin(); it != mods.end(); it++) + { + SearchModule *mod = (it -> second); + float crate_out = mod -> pqi -> getRate(false); + float new_max = avg_rate_out; + if (crate_out > avg_rate_out) + { + new_max = avg_rate_out + (1 - fchg) * + (crate_out - avg_rate_out); + } + if (new_max > indiv_out) + { + new_max = indiv_out; + } + mod -> pqi -> setMaxRate(false, new_max); + } + } + // if not maxxed already and using less than 95% + else if ((maxxed_out != num_sm) && (used_bw_out < 0.95 * avail_out)) + { + //std::cerr << "Increasing Outgoing B/W!" << std::endl; + // increase. + float fchg = (avail_out - used_bw_out) / avail_out; + for(it = mods.begin(); it != mods.end(); it++) + { + SearchModule *mod = (it -> second); + float crate_out = mod -> pqi -> getRate(false); + float max_out = mod -> pqi -> getMaxRate(false); + + if (max_out == indiv_out) + { + // do nothing... + } + else + { + float new_max = max_out; + if (max_out < avg_rate_out) + { + new_max = avg_rate_out * (1 + fchg); + } + else if (crate_out > 0.5 * max_out) + { + new_max = max_out * (1 + fchg); + } + if (new_max > indiv_out) + { + new_max = indiv_out; + } + mod -> pqi -> setMaxRate(false, new_max); + } + } + + } + return 1; +} + + diff --git a/libretroshare/src/pqi/pqihandler.h b/libretroshare/src/pqi/pqihandler.h new file mode 100644 index 000000000..68df37b53 --- /dev/null +++ b/libretroshare/src/pqi/pqihandler.h @@ -0,0 +1,169 @@ +/* + * "$Id: pqihandler.h,v 1.10 2007-03-31 09:41:32 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + +#ifndef MRK_PQI_HANDLER_HEADER +#define MRK_PQI_HANDLER_HEADER + +#include "pqi/pqi.h" +#include "pqi/pqisecurity.h" + +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + +#include "pqi/xpgpcert.h" + +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + +#include "pqi/sslcert.h" + +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + +#include +#include + +class SearchModule +{ + public: + int smi; // id. + PQInterface *pqi; + SecurityPolicy *sp; +}; + +// Presents a P3 Face to the world! +// and funnels data through to a PQInterface. +// +class pqihandler: public P3Interface +{ + public: + pqihandler(SecurityPolicy *Global); +int AddSearchModule(SearchModule *mod, int chanid = -1); +int RemoveSearchModule(SearchModule *mod); + +// P3Interface. +// 4 very similar outputs..... +virtual int Search(SearchItem *ns); +virtual int SearchSpecific(SearchItem *ns); /* search one person only */ +virtual int CancelSearch(SearchItem *ns); /* no longer used? */ +virtual int SendSearchResult(PQFileItem *); + +// inputs. +virtual PQFileItem * GetSearchResult(); +virtual SearchItem * RequestedSearch(); +virtual SearchItem * CancelledSearch(); + +// file i/o +virtual int SendFileItem(PQFileItem *ns); +virtual PQFileItem * GetFileItem(); + +// Chat Interface +virtual int SendMsg(ChatItem *item); +virtual int SendGlobalMsg(ChatItem *ns); /* needed until chat complete */ + +virtual ChatItem *GetMsg(); + +// Rest of P3Interface +virtual int tick(); +virtual int status(); + +// Control Interface +virtual int SendOtherPQItem(PQItem *); +virtual PQItem *GetOtherPQItem(); +virtual PQItem *SelectOtherPQItem(bool (*tst)(PQItem *)); + + // rate control. +void setMaxIndivRate(bool in, float val); +float getMaxIndivRate(bool in); +void setMaxRate(bool in, float val); +float getMaxRate(bool in); + + protected: + /* check to be overloaded by those that can + * generates warnings otherwise + */ +virtual int checkOutgoingPQItem(PQItem *item, int global); + +int HandlePQItem(PQItem *ns, int allowglobal); + +int GetItems(); +void SortnStoreItem(PQItem *item); + + std::map mods; + SecurityPolicy *globsec; + + // Temporary storage... + std::list in_result, in_endsrch, in_reqsrch, in_reqfile, + in_file, in_chat, in_info, in_host, in_other; + + private: + + // rate control. +int UpdateRates(); + + float rateIndiv_in; + float rateIndiv_out; + float rateMax_in; + float rateMax_out; + +}; + +inline void pqihandler::setMaxIndivRate(bool in, float val) +{ + if (in) + rateIndiv_in = val; + else + rateIndiv_out = val; + return; +} + +inline float pqihandler::getMaxIndivRate(bool in) +{ + if (in) + return rateIndiv_in; + else + return rateIndiv_out; +} + +inline void pqihandler::setMaxRate(bool in, float val) +{ + if (in) + rateMax_in = val; + else + rateMax_out = val; + return; +} + +inline float pqihandler::getMaxRate(bool in) +{ + if (in) + return rateMax_in; + else + return rateMax_out; +} + +#endif // MRK_PQI_HANDLER_HEADER diff --git a/libretroshare/src/pqi/pqiindic.h b/libretroshare/src/pqi/pqiindic.h new file mode 100644 index 000000000..2207d7538 --- /dev/null +++ b/libretroshare/src/pqi/pqiindic.h @@ -0,0 +1,65 @@ +/* + * "$Id: pqiindic.h,v 1.3 2007-02-18 21:46:49 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + +#ifndef MRK_PQI_INDICATOR_HEADER +#define MRK_PQI_INDICATOR_HEADER + +#include + +// This will indicate to num different sources +// when the event has occured. + +class Indicator +{ + public: + Indicator(int n = 0) + :num(n), changeFlags(n) {IndicateChanged();} +void IndicateChanged() + { + for(int i = 0; i < num; i++) + changeFlags[i]=true; + } + +bool Changed(int idx) + { + /* catch overflow */ + if (idx > num - 1) + return false; + + bool ans = changeFlags[idx]; + changeFlags[idx] = false; + return ans; + } + + private: + int num; + std::vector changeFlags; +}; + + + +#endif diff --git a/libretroshare/src/pqi/pqiloopback.cc b/libretroshare/src/pqi/pqiloopback.cc new file mode 100644 index 000000000..0057d15b0 --- /dev/null +++ b/libretroshare/src/pqi/pqiloopback.cc @@ -0,0 +1,117 @@ +/* + * "$Id: pqiloopback.cc,v 1.8 2007-02-19 20:08:30 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "pqi/pqi.h" +#include "pqi/pqiloopback.h" + +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + +#include "pqi/xpgpcert.h" + +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + +#include "pqi/sslcert.h" + +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + +// Test Interface (LoopBack) + + +pqiloopback::pqiloopback() +{ + //std::cerr << "pqiloopback construction()" << std::endl; + // rates are irrelevant..... no B/W consumed. + setMaxRate(true, 0); + setMaxRate(false, 0); + setRate(true, 0); + setRate(false, 0); + + return; +} + +pqiloopback::~pqiloopback() +{ + return; +} + +int pqiloopback::SendItem(PQItem *i) +{ + i -> p = getContact(); + i -> flags |= PQI_ITEM_FLAG_LOCAL; + objs.push_back(i); + return 1; +} + +PQItem * pqiloopback::GetItem() +{ + if (objs.size() > 0) + { + PQItem *pqi = objs.front(); + objs.pop_front(); + // breaks the module, through ssl dependance. + // but necessary for running system.. + //pqi -> p = getSSLRoot() -> getOwnCert(); + return pqi; + } + return NULL; +} + +int pqiloopback::GetFile(PQFileItem *item, std::ostream &in) +{ + return 1; +} + +int pqiloopback::SendFile(PQFileItem *, std::istream &out) +{ + return 1; +} + +Person *pqiloopback::getContact() +{ + sslroot *root = getSSLRoot(); + cert *c = root -> getOwnCert(); + return c; +} + + + +// // PQI interface. +int pqiloopback::tick() +{ + return 0; +} + +int pqiloopback::status() +{ + return 0; +} + + diff --git a/libretroshare/src/pqi/pqiloopback.h b/libretroshare/src/pqi/pqiloopback.h new file mode 100644 index 000000000..ee91f6336 --- /dev/null +++ b/libretroshare/src/pqi/pqiloopback.h @@ -0,0 +1,67 @@ +/* + * "$Id: pqiloopback.h,v 1.5 2007-02-19 20:08:30 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + +#ifndef MRK_PQI_LOOPBACK_HEADER +#define MRK_PQI_LOOPBACK_HEADER + + +// The standard data types and the search interface. +#include "pqi/pqi.h" + +#include +#include +#include + + +// Test Interface (LoopBack) +// public interface .... includes the whole p3interface. +class pqiloopback: public PQInterface +{ +public: + pqiloopback(); +virtual ~pqiloopback(); + +// search Interface. +virtual int SendItem(PQItem *item); +virtual PQItem *GetItem(); + +virtual int GetFile(PQFileItem *item, std::ostream &in); +virtual int SendFile(PQFileItem *item, std::istream &out); + +// PQI interface. +virtual int tick(); +virtual int status(); + +virtual Person *getContact(); + + private: + std::list objs; +}; + + + +#endif //MRK_PQI_LOOPBACK_HEADER diff --git a/libretroshare/src/pqi/pqimon.cc b/libretroshare/src/pqi/pqimon.cc new file mode 100644 index 000000000..a6fb5bdc8 --- /dev/null +++ b/libretroshare/src/pqi/pqimon.cc @@ -0,0 +1,124 @@ +/* + * "$Id: pqimon.cc,v 1.2 2007-02-18 21:46:49 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + +#include "pqi/xpgpcert.h" + +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + +#include "pqi/sslcert.h" + +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + +#include "pqi/pqimon.h" + + +pqimonitor::pqimonitor() { return; } +pqimonitor::~pqimonitor() { return; } + + +int pqimonitor::tick() +{ + + /* grab the sslroot - and check the state of the peers */ + sslroot *sslr = getSSLRoot(); + std::list &certlist = sslr->getCertList(); + std::list::iterator it; + std::list::iterator pit; + std::list::iterator cit; + + //std::cerr << "pqimonitor::tick() plist:" << plist.size() << " clist:" << certlist.size() << std::endl; + + bool ok = true; + if (plist.size() != certlist.size()) + { + ok = false; + } + + pit = plist.begin(); + for(it = certlist.begin(); (ok) && (it != certlist.end()); it++, pit++) + { + certsign sign; + if (!sslr->getcertsign(*it, sign)) + { + ok = false; + break; + } + + std::string id = convert_to_str(sign); + + if (id != pit->id) + { + ok = false; + break; + } + } + + if (!ok) + { + //std::cerr << "pqimonitor::tick() Updating plist" << std::endl; + /* copy the list */ + plist.clear(); + for(it = certlist.begin(); it != certlist.end(); it++) + { + /* list */ + certsign sign; + if (!sslr->getcertsign(*it, sign)) + { + std::cerr << "Major Error in pqimonitor!"; + std::cerr << std::endl; + exit(1); + } + + pqipeer peer; + peer.id = convert_to_str(sign); + peer.name = (*it)->Name(); + if ((*it)->Connected()) + { + peer.state = PQI_PEER_STATE_ONLINE; + } + else + { + peer.state = PQI_PEER_STATE_OFFLINE; + } + plist.push_back(peer); + } + + /* now notify clients */ + for(cit = clients.begin(); cit != clients.end(); cit++) + { + //std::cerr << "pqimonitor::tick() Calling Client" << std::endl; + (*cit)->monUpdate(plist); + } + } + return 0; /* don't make more work for anyone */ +} + + + diff --git a/libretroshare/src/pqi/pqimon.h b/libretroshare/src/pqi/pqimon.h new file mode 100644 index 000000000..6f380d904 --- /dev/null +++ b/libretroshare/src/pqi/pqimon.h @@ -0,0 +1,72 @@ +/* + * "$Id: pqibin.h,v 1.2 2007-02-18 21:46:49 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + +#ifndef PQI_MONITOR_HEADER +#define PQI_MONITOR_HEADER + +/**** Rough sketch of a Monitor class + * expect it to change significantly + * + */ + + +const uint32_t PQI_PEER_STATE_OFFLINE = 0; +const uint32_t PQI_PEER_STATE_ONLINE = 1; + +class pqipeer +{ + public: +std::string id; +std::string name; +int state; +}; + +class pqimonclient +{ + public: + + pqimonclient() { return; } +virtual ~pqimonclient() { return; } + +virtual void monUpdate(const std::list &plist) = 0; +}; + + +class pqimonitor +{ +public: + pqimonitor(); + ~pqimonitor(); +int tick(); +int addClient(pqimonclient *cli) { clients.push_back(cli); return 1; } + +private: + std::list clients; + std::list plist; +}; + + + +#endif diff --git a/libretroshare/src/pqi/pqinetwork.cc b/libretroshare/src/pqi/pqinetwork.cc new file mode 100644 index 000000000..a4344e61a --- /dev/null +++ b/libretroshare/src/pqi/pqinetwork.cc @@ -0,0 +1,852 @@ +/* + * "$Id: pqinetwork.cc,v 1.18 2007-04-15 18:45:18 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "pqi/pqinetwork.h" + +#include +#include + +#include "pqi/pqidebug.h" +#include +#include +static const int pqinetzone = 96184; + +#ifdef WINDOWS_SYS /* Windows - define errno */ + +int errno; + +#else /* Windows - define errno */ + +#include + +#endif + + + +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS + +std::ostream &showSocketError(std::ostream &out) +{ + int err = errno; + out << "\tSocket Error(" << err << ") : "; + out << socket_errorType(err) << std::endl; + return out; +} + +std::string socket_errorType(int err) +{ + if (err == EBADF) + { + return std::string("EBADF"); + } + else if (err == EINVAL) + { + return std::string("EINVAL"); + } + else if (err == EFAULT) + { + return std::string("EFAULT"); + } + else if (err == ENOTSOCK) + { + return std::string("ENOTSOCK"); + } + else if (err == EISCONN) + { + return std::string("EISCONN"); + } + else if (err == ECONNREFUSED) + { + return std::string("ECONNREFUSED"); + } + else if (err == ETIMEDOUT) + { + return std::string("ETIMEDOUT"); + } + else if (err == ENETUNREACH) + { + return std::string("ENETUNREACH"); + } + else if (err == EADDRINUSE) + { + return std::string("EADDRINUSE"); + } + else if (err == EINPROGRESS) + { + return std::string("EINPROGRESS"); + } + else if (err == EALREADY) + { + return std::string("EALREADY"); + } + else if (err == EAGAIN) + { + return std::string("EAGAIN"); + } + else if (err == EISCONN) + { + return std::string("EISCONN"); + } + else if (err == ENOTCONN) + { + return std::string("ENOTCONN"); + } + + return std::string("UNKNOWN ERROR CODE"); +} + +#include +#include + +std::list getLocalInterfaces() +{ + std::list addrs; + + int sock = 0; + struct ifreq ifreq; + + struct if_nameindex *iflist = if_nameindex(); + struct if_nameindex *ifptr = iflist; + + //need a socket for ioctl() + if( (sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) + { + pqioutput(PQL_ALERT, pqinetzone, + "Cannot Determine Local Addresses!"); + exit(1); + } + + // loop through the interfaces. + for(; *(char *)ifptr != 0; ifptr++) + { + //copy in the interface name to look up address of + strncpy(ifreq.ifr_name, ifptr->if_name, IF_NAMESIZE); + + if(ioctl(sock, SIOCGIFADDR, &ifreq) != 0) + { + std::ostringstream out; + out << "Cannot Determine Address for Iface: "; + out << ifptr -> if_name << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqinetzone, out.str()); + } + else + { + struct sockaddr_in *aptr = + (struct sockaddr_in *) &ifreq.ifr_addr; + const char *astr=inet_ntoa(aptr -> sin_addr); + + std::ostringstream out; + out << "Iface: "; + out << ifptr -> if_name << std::endl; + out << " Address: " << astr; + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqinetzone, out.str()); + + addrs.push_back(astr); + } + } + // free socket -> or else run out of fds. + close(sock); + + if_freenameindex(iflist); + return addrs; +} + +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#else + +std::ostream &showSocketError(std::ostream &out) +{ + int err = WSAGetLastError(); + out << "\tSocket Error(" << err << ") : "; + out << socket_errorType(err) << std::endl; + return out; +} + + +std::string socket_errorType(int err) +{ + if (err == WSAEBADF) + { + return std::string("WSABADF"); + } + + + else if (err == WSAEINTR) + { + return std::string("WSAEINTR"); + } + else if (err == WSAEACCES) + { + return std::string("WSAEACCES"); + } + else if (err == WSAEFAULT) + { + return std::string("WSAEFAULT"); + } + else if (err == WSAEINVAL) + { + return std::string("WSAEINVAL"); + } + else if (err == WSAEMFILE) + { + return std::string("WSAEMFILE"); + } + else if (err == WSAEWOULDBLOCK) + { + return std::string("WSAEWOULDBLOCK"); + } + else if (err == WSAEINPROGRESS) + { + return std::string("WSAEINPROGRESS"); + } + else if (err == WSAEALREADY) + { + return std::string("WSAEALREADY"); + } + else if (err == WSAENOTSOCK) + { + return std::string("WSAENOTSOCK"); + } + else if (err == WSAEDESTADDRREQ) + { + return std::string("WSAEDESTADDRREQ"); + } + else if (err == WSAEMSGSIZE) + { + return std::string("WSAEMSGSIZE"); + } + else if (err == WSAEPROTOTYPE) + { + return std::string("WSAEPROTOTYPE"); + } + else if (err == WSAENOPROTOOPT) + { + return std::string("WSAENOPROTOOPT"); + } + else if (err == WSAENOTSOCK) + { + return std::string("WSAENOTSOCK"); + } + else if (err == WSAEISCONN) + { + return std::string("WSAISCONN"); + } + else if (err == WSAECONNREFUSED) + { + return std::string("WSACONNREFUSED"); + } + else if (err == WSAECONNRESET) + { + return std::string("WSACONNRESET"); + } + else if (err == WSAETIMEDOUT) + { + return std::string("WSATIMEDOUT"); + } + else if (err == WSAENETUNREACH) + { + return std::string("WSANETUNREACH"); + } + else if (err == WSAEADDRINUSE) + { + return std::string("WSAADDRINUSE"); + } + else if (err == WSAEAFNOSUPPORT) + { + return std::string("WSAEAFNOSUPPORT (normally UDP related!)"); + } + + return std::string("----WINDOWS OPERATING SYSTEM FAILURE----"); +} + +#include +//#include + +// A function to determine the interfaces on your computer.... +// No idea of how to do this in windows.... +// see if it compiles. +std::list getLocalInterfaces() +{ + std::list addrs; + + + /* USE MIB IPADDR Interface */ + PMIB_IPADDRTABLE iptable = NULL; + DWORD dwSize = 0; + + if (GetIpAddrTable(iptable, &dwSize, 0) != + ERROR_INSUFFICIENT_BUFFER) + { + pqioutput(PQL_ALERT, pqinetzone, + "Cannot Find Windoze Interfaces!"); + exit(0); + } + + iptable = (MIB_IPADDRTABLE *) malloc(dwSize); + GetIpAddrTable(iptable, &dwSize, 0); + + struct in_addr addr; + + for(unsigned int i = 0; i < iptable -> dwNumEntries; i++) + { + std::ostringstream out; + + out << "Iface(" << iptable->table[i].dwIndex << ") "; + addr.s_addr = iptable->table[i].dwAddr; + out << " => " << inet_ntoa(addr); + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqinetzone, out.str()); + + addrs.push_back(inet_ntoa(addr)); + } + + return addrs; +} + +// implement the improved unix inet address fn. +// using old one. +int inet_aton(const char *name, struct in_addr *addr) +{ + return (((*addr).s_addr = inet_addr(name)) != INADDR_NONE); +} + + +// This returns in Net Byte Order. +// NB: Linux man page claims it is in Host Byte order, but +// this is blatantly wrong!..... (for Debian anyway) +// Making this consistent with the Actual behavior (rather than documented). +in_addr_t inet_netof(struct in_addr addr) +{ + return pqi_inet_netof(addr); +} + +// This returns in Host Byte Order. (as the man page says) +// Again, to be consistent with Linux. +in_addr_t inet_network(char *inet_name) +{ + struct in_addr addr; + if (inet_aton(inet_name, &addr)) + { +// std::cerr << "inet_network(" << inet_name << ") : "; +// std::cerr << inet_ntoa(addr) << std::endl; + return ntohl(inet_netof(addr)); + } + return 0xffffffff; + //return -1; +} + + +#endif +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ + +#include + + +// This returns in Net Byte Order. +// NB: Linux man page claims it is in Host Byte order, but +// this is blatantly wrong!..... (for Debian anyway) +// Making this consistent with the Actual behavior (rather than documented). +in_addr_t pqi_inet_netof(struct in_addr addr) +{ + // decide if A class address. + unsigned long haddr = ntohl(addr.s_addr); + unsigned long abit = haddr & 0xff000000UL; + unsigned long bbit = haddr & 0xffff0000UL; + unsigned long cbit = haddr & 0xffffff00UL; + + std::cerr << "inet_netof(" << inet_ntoa(addr) << ") "; + if (!((haddr >> 31) | 0x0UL)) // MSB = 0 + { + std::cerr << " Type A " << std::endl; + std::cerr << "\tShifted(31): " << (haddr >> 31); + std::cerr << " Xord(0x0UL): " << + !((haddr >> 31) | 0x0UL) << std::endl; + + return htonl(abit); + //return abit; + } + else if (!((haddr >> 30) ^ 0x2UL)) // 2MSBs = 10 + { + std::cerr << " Type B " << std::endl; + std::cerr << "\tShifted(30): " << (haddr >> 30); + std::cerr << " Xord(0x2UL): " << + !((haddr >> 30) | 0x2UL) << std::endl; + + return htonl(bbit); + //return bbit; + } + else if (!((haddr >> 29) ^ 0x6UL)) // 3MSBs = 110 + { + std::cerr << " Type C " << std::endl; + std::cerr << "\tShifted(29): " << (haddr >> 29); + std::cerr << " Xord(0x6UL): " << + !((haddr >> 29) | 0x6UL) << std::endl; + + return htonl(cbit); + //return cbit; + } + else if (!((haddr >> 28) ^ 0xeUL)) // 4MSBs = 1110 + { + std::cerr << " Type Multicast " << std::endl; + std::cerr << "\tShifted(28): " << (haddr >> 28); + std::cerr << " Xord(0xeUL): " << + !((haddr >> 29) | 0xeUL) << std::endl; + + return addr.s_addr; // return full address. + //return haddr; + } + else if (!((haddr >> 27) ^ 0x1eUL)) // 5MSBs = 11110 + { + std::cerr << " Type Reserved " << std::endl; + std::cerr << "\tShifted(27): " << (haddr >> 27); + std::cerr << " Xord(0x1eUL): " << + !((haddr >> 27) | 0x1eUL) << std::endl; + + return addr.s_addr; // return full address. + //return haddr; + } + return htonl(abit); + //return abit; +} + + +int inaddr_cmp(struct sockaddr_in addr1, struct sockaddr_in addr2 ) +{ + std::ostringstream out; + out << "inaddr_cmp(" << inet_ntoa(addr1.sin_addr); + out << "-" << addr1.sin_addr.s_addr; + out << "," << inet_ntoa(addr2.sin_addr); + out << "-" << addr2.sin_addr.s_addr << ")" << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqinetzone, out.str()); + + + if (addr1.sin_addr.s_addr == addr2.sin_addr.s_addr) + { + return 0; + } + if (addr1.sin_addr.s_addr < addr2.sin_addr.s_addr) + return -1; + return 1; +} + +int inaddr_cmp(struct sockaddr_in addr1, unsigned long addr2) +{ + struct in_addr inaddr_tmp; + inaddr_tmp.s_addr = addr2; + std::ostringstream out; + out << "inaddr_cmp2(" << inet_ntoa(addr1.sin_addr); + out << " vs " << inet_ntoa(inaddr_tmp); + out << " /or/ "; + out << std::hex << std::setw(10) << addr1.sin_addr.s_addr; + out << " vs " << std::setw(10) << addr2 << ")" << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqinetzone, out.str()); + + if (addr1.sin_addr.s_addr == addr2) + { + return 0; + } + if (addr1.sin_addr.s_addr < addr2) + return -1; + return 1; +} + +bool isLoopbackNet(struct in_addr *addr) +{ + if (0 == strcmp(inet_ntoa(*addr), "127.0.0.1")) + { + return true; + } + return false; +} + +// returns all possible addrs. +// all processing is done in network byte order. +bool isPrivateNet(struct in_addr *addr) +{ + bool ret = false; + std::ostringstream out; + + in_addr_t taddr = inet_netof(*addr); + + out << "isPrivateNet(" << inet_ntoa(*addr) << ") ? "; + out << std::endl; + + struct in_addr addr2; + + addr2.s_addr = taddr; + out << "Checking (" << inet_ntoa(addr2) << ") Against: " << std::endl; + // shouldn't need to rotate these...h -> n (in network already. + // check text output.... + addr2.s_addr = htonl(inet_network("10.0.0.0")); + out << "\t(" << inet_ntoa(addr2) << ")" << std::endl; + addr2.s_addr = htonl(inet_network("172.16.0.0")); + out << "\t(" << inet_ntoa(addr2) << ")" << std::endl; + addr2.s_addr = htonl(inet_network("192.168.0.0")); + out << "\t(" << inet_ntoa(addr2) << ")" << std::endl; + addr2.s_addr = htonl(inet_network("169.254.0.0")); + out << "\t(" << inet_ntoa(addr2) << ")" << std::endl; + + if ((taddr == htonl(inet_network("10.0.0.0"))) || + (taddr == htonl(inet_network("172.16.0.0"))) || + (taddr == htonl(inet_network("192.168.0.0"))) || + (taddr == htonl(inet_network("169.254.0.0")))) + { + out << " True" << std::endl; + ret = true; + } + else + { + out << " False" << std::endl; + ret = false; + } + pqioutput(PQL_DEBUG_BASIC, pqinetzone, out.str()); + return ret; +} + +bool isExternalNet(struct in_addr *addr) +{ + if (!isValidNet(addr)) + { + return false; + } + if (isLoopbackNet(addr)) + { + return false; + } + if (isPrivateNet(addr)) + { + return false; + } + return true; +} + + +struct in_addr getPreferredInterface() // returns best addr. +{ + + std::list addrs = getLocalInterfaces(); + std::list::iterator it; + struct in_addr addr_zero = {0}, addr_loop = {0}, addr_priv = {0}, addr_ext = {0}, addr = {0}; + + bool found_zero = false; + bool found_loopback = false; + bool found_priv = false; + bool found_ext = false; + + // find the first of each of these. + // if ext - take first. + // if no ext -> first priv + // if no priv -> first loopback. + + for(it = addrs.begin(); it != addrs.end(); it++) + { + inet_aton((*it).c_str(), &addr); + // for windows silliness (returning 0.0.0.0 as valid addr!). + if (addr.s_addr == 0) + { + if (!found_zero) + { + found_zero = true; + addr_zero = addr; + } + } + else if (isLoopbackNet(&addr)) + { + if (!found_loopback) + { + found_loopback = true; + addr_loop = addr; + } + } + else if (isPrivateNet(&addr)) + { + if (!found_priv) + { + found_priv = true; + addr_priv = addr; + } + } + else + { + if (!found_ext) + { + found_ext = true; + addr_ext = addr; + return addr_ext; + } + } + } + + if (found_priv) + return addr_priv; + + // next bit can happen under windows, + // a general address is still + // preferable to a loopback device. + if (found_zero) + return addr_zero; + + if (found_loopback) + return addr_loop; + + // shound be 255.255.255.255 (error). + addr.s_addr = 0xffffffff; + return addr; +} + +bool sameNet(struct in_addr *addr, struct in_addr *addr2) +{ + return (inet_netof(*addr) == inet_netof(*addr2)); +} + + +bool isValidNet(struct in_addr *addr) +{ + // invalid address. + if((*addr).s_addr == INADDR_NONE) + return false; + if((*addr).s_addr == 0) + return false; + // should do more tests. + return true; +} + +bool isSameSubnet(struct in_addr *addr1, struct in_addr *addr2) +{ + /* + * check that the (addr1 & 255.255.255.0) == (addr2 & 255.255.255.0) + */ + + unsigned long a1 = ntohl(addr1->s_addr); + unsigned long a2 = ntohl(addr2->s_addr); + + return ((a1 & 0xffffff00) == (a2 & 0xffffff00)); +} + +/* This just might be portable!!! will see!!! + * Unfortunately this is usable on winXP+, determined by: (_WIN32_WINNT >= 0x0501) + * but not older platforms.... which must use gethostbyname. + * + * include it for now..... + */ + +bool LookupDNSAddr(std::string name, struct sockaddr_in &addr) +{ + +#if 0 + char service[100]; + struct addrinfo hints_st; + struct addrinfo *hints = &hints_st; + struct addrinfo *res; + + hints -> ai_flags = 0; // (cygwin don;t like these) AI_ADDRCONFIG | AI_NUMERICSERV; + hints -> ai_family = AF_INET; + hints -> ai_socktype = 0; + hints -> ai_protocol = 0; + hints -> ai_addrlen = 0; + hints -> ai_addr = NULL; + hints -> ai_canonname = NULL; + hints -> ai_next = NULL; + + /* get the port number */ + sprintf(service, "%d", ntohs(addr.sin_port)); + + /* set it to IPV4 */ + std::cerr << "LookupDNSAddr() name: " << name << " service: " << service << std::endl; + + int err = 0; + if (0 != (err = getaddrinfo(name.c_str(), service, hints, &res))) + { + std::cerr << "LookupDNSAddr() getaddrinfo failed!" << std::endl; + std::cerr << "Error: " << gai_strerror(err) << std::endl; + return false; + } + + if ((res) && (res->ai_family == AF_INET)) + { + std::cerr << "LookupDNSAddr() getaddrinfo found address" << std::endl; + addr = *((struct sockaddr_in *) res->ai_addr); + std::cerr << "addr: " << inet_ntoa(addr.sin_addr) << std::endl; + std::cerr << "port: " << ntohs(addr.sin_port) << std::endl; + freeaddrinfo(res); + return true; + } + + std::cerr << "getaddrinfo failed - no address" << std::endl; + +#endif + std::cerr << "getaddrinfo disabled" << std::endl; + return false; +} + +/************************************************************* + * Socket Library Wrapper Functions + * to get over the crapness of the windows. + * + */ + +int unix_close(int fd) +{ + int ret; +/******************* WINDOWS SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS // ie UNIX + ret = close(fd); +#else + std::cerr << "unix_close()" << std::endl; + ret = closesocket(fd); + /* translate error */ +#endif +/******************* WINDOWS SPECIFIC PART ******************/ + return ret; +} + +int unix_socket(int domain, int type, int protocol) +{ + int osock = socket(PF_INET, SOCK_STREAM, 0); + +/******************* WINDOWS SPECIFIC PART ******************/ +#ifdef WINDOWS_SYS // WINDOWS + std::cerr << "unix_socket()" << std::endl; + if ((unsigned) osock == INVALID_SOCKET) + { + // Invalidate socket Unix style. + osock = -1; + errno = WinToUnixError(WSAGetLastError()); + } +#endif +/******************* WINDOWS SPECIFIC PART ******************/ + return osock; +} + + +int unix_fcntl_nonblock(int fd) +{ + int ret; + +/******************* WINDOWS SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS // ie UNIX + ret = fcntl(fd, F_SETFL, O_NONBLOCK); + std::cerr << "unix_fcntl_nonblock():" << ret << " errno:" << errno << std::endl; +#else + unsigned long int on = 1; + ret = ioctlsocket(fd, FIONBIO, &on); + std::cerr << "unix_fcntl_nonblock()" << std::endl; + if (ret != 0) + { + /* store unix-style error + */ + ret = -1; + errno = WinToUnixError(WSAGetLastError()); + } +#endif +/******************* WINDOWS SPECIFIC PART ******************/ + return ret; +} + + +int unix_connect(int fd, const struct sockaddr *serv_addr, socklen_t addrlen) +{ + int ret = connect(fd, serv_addr, addrlen); + +/******************* WINDOWS SPECIFIC PART ******************/ +#ifdef WINDOWS_SYS // WINDOWS + std::cerr << "unix_connect()" << std::endl; + if (ret != 0) + { + errno = WinToUnixError(WSAGetLastError()); + ret = -1; + } +#endif +/******************* WINDOWS SPECIFIC PART ******************/ + return ret; +} + + +int unix_getsockopt_error(int sockfd, int *err) +{ + int ret; + *err = 1; +/******************* WINDOWS SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS // ie UNIX + socklen_t optlen = 4; + ret=getsockopt(sockfd, SOL_SOCKET, SO_ERROR, err, &optlen); +#else // WINDOWS_SYS + int optlen = 4; + ret=getsockopt(sockfd, SOL_SOCKET, SO_ERROR, (char *) err, &optlen); + /* translate */ + std::cerr << "unix_getsockopt_error() returned: " << (int) err << std::endl; + if (*err != 0) + { + *err = WinToUnixError(*err); + } +#endif +/******************* WINDOWS SPECIFIC PART ******************/ + return ret; +} + +/******************* WINDOWS SPECIFIC PART ******************/ +#ifdef WINDOWS_SYS // ie WINDOWS. + +int WinToUnixError(int error) +{ + std::cerr << "WinToUnixError(" << error << ")" << std::endl; + switch(error) + { + case WSAEINPROGRESS: + return EINPROGRESS; + break; + case WSAEWOULDBLOCK: + return EINPROGRESS; + break; + case WSAENETUNREACH: + return ENETUNREACH; + break; + case WSAETIMEDOUT: + return ETIMEDOUT; + break; + case WSAEHOSTDOWN: + return EHOSTDOWN; + break; + case WSAECONNREFUSED: + return ECONNREFUSED; + break; + case WSAECONNRESET: + return ECONNRESET; + break; + default: + std::cerr << "WinToUnixError(" << error << ") Code Unknown!"; + std::cerr << std::endl; + break; + } + return ECONNREFUSED; /* sensible default? */ +} + +#endif +/******************* WINDOWS SPECIFIC PART ******************/ diff --git a/libretroshare/src/pqi/pqinetwork.h b/libretroshare/src/pqi/pqinetwork.h new file mode 100644 index 000000000..5c565dd2d --- /dev/null +++ b/libretroshare/src/pqi/pqinetwork.h @@ -0,0 +1,140 @@ +/* + * "$Id: pqinetwork.h,v 1.15 2007-04-15 18:45:18 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + +#ifndef MRK_PQI_NETWORKING_HEADER +#define MRK_PQI_NETWORKING_HEADER + +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS + +#include +#include +#include +#include + +#include + +//socket blocking/options. +#include + +#else + +/* This defines the platform to be WinXP or later... + * and is needed for getaddrinfo.... (not used anymore) + * +#define _WIN32_WINNT 0x0501 + */ + + + +#include +#include +typedef int socklen_t; +typedef unsigned long in_addr_t; + +// Some Network functions that are missing from windows. + +in_addr_t inet_netof(struct in_addr addr); +in_addr_t inet_network(char *inet_name); +int inet_aton(const char *name, struct in_addr *addr); + +extern int errno; /* Define extern errno, to duplicate unix behaviour */ + +/* define the Unix Error Codes that we use... + * NB. we should make the same, but not necessary + */ +#define EAGAIN 11 +#define EWOULDBLOCK EAGAIN + +#define EUSERS 87 +#define ENOTSOCK 88 + +#define EOPNOTSUPP 95 + +#define EADDRINUSE 98 +#define EADDRNOTAVAIL 99 +#define ENETDOWN 100 +#define ENETUNREACH 101 + +#define ECONNRESET 104 + +#define ETIMEDOUT 110 +#define ECONNREFUSED 111 +#define EHOSTDOWN 112 +#define EHOSTUNREACH 113 +#define EALREADY 114 +#define EINPROGRESS 115 + +#endif +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ + +#include +#include +#include + +// Same def - different functions... + +std::ostream &showSocketError(std::ostream &out); + +std::string socket_errorType(int err); +int inaddr_cmp(struct sockaddr_in addr1, struct sockaddr_in addr1 ); +int inaddr_cmp(struct sockaddr_in addr1, unsigned long); + +std::list getLocalInterfaces(); // returns all possible addrs. +bool isExternalNet(struct in_addr *addr); // if Valid & is not Private or Loopback. +bool isPrivateNet(struct in_addr *addr); // if inside 10.0.0.0 or + // other then firewalled. +bool isLoopbackNet(struct in_addr *addr); +bool sameNet(struct in_addr *addr, struct in_addr *addr2); +bool isValidNet(struct in_addr *addr); + + // checks (addr1 & 255.255.255.0) == (addr2 & 255.255.255.0) +bool isSameSubnet(struct in_addr *addr1, struct in_addr *addr2); + + +struct in_addr getPreferredInterface(); // returns best addr. + +in_addr_t pqi_inet_netof(struct in_addr addr); // our implementation. + +bool LookupDNSAddr(std::string name, struct sockaddr_in &addr); + +/* universal socket interface */ + +int unix_close(int sockfd); +int unix_socket(int domain, int type, int protocol); +int unix_fcntl_nonblock(int sockfd); +int unix_connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen); +int unix_getsockopt_error(int sockfd, int *err); + +#ifdef WINDOWS_SYS // WINDOWS +/******************* WINDOWS SPECIFIC PART ******************/ +int WinToUnixError(int error); +#endif + + +#endif + diff --git a/libretroshare/src/pqi/pqipacket.cc b/libretroshare/src/pqi/pqipacket.cc new file mode 100644 index 000000000..011592577 --- /dev/null +++ b/libretroshare/src/pqi/pqipacket.cc @@ -0,0 +1,1783 @@ +/* + * "$Id: pqipacket.cc,v 1.11 2007-03-21 18:45:41 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "pqi/pqipacket.h" + +// get +#include "pqi/pqi.h" + +// discItem functions... +//#include "discItem.h" + +#include "pqi/pqitunnel.h" + + +#include "pqi/pqidebug.h" +#include +const int pqipktzone = 38422; + + +void pqipkt_print(pqipkt *pkt); + +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS // ie UNIX + + // NOTHING +#else +// typedefs to generate the types... +// this must be checked!!! + +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; + +#endif +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ + + +// internal functions. +// PQI Functions. +void pqipkt_setPQITag(pqipkt *pkt); +void pqipkt_setPQIType(void *pkt, int type); +int pqipkt_getPQIType(void *pkt); +void pqipkt_setPQISubType(void *pkt, int subtype); +int pqipkt_getPQISubType(void *pkt); +void pqipkt_setPQILen(void *pkt, int len); +int pqipkt_getPQILen(void *pkt); +void pqipkt_setPQIsid(void *pkt, int sid); +int pqipkt_getPQIsid(void *pkt); +void pqipkt_setPQIFlags(void *pkt, int flags); +int pqipkt_getPQIFlags(void *pkt); + +// SI Functions. +pqipkt *pqipkt_makesipkt(SearchItem *si); +SearchItem *pqipkt_makesiobj(pqipkt *pkt); +void pqipkt_setSIdatatype(void *pkt, int datatype); +int pqipkt_getSIdatatype(void *pkt); +void pqipkt_setSIdata(void *pkt, const char *in); +std::string pqipkt_getSIdata(void *pkt); + +// FI Functions. +pqipkt *pqipkt_makefipkt(PQFileItem *fi); +PQFileItem *pqipkt_makefiobj(pqipkt *pkt); +void pqipkt_setFIhash(void *pkt, const char *in); +std::string pqipkt_getFIhash(void *pkt); +void pqipkt_setFIname(void *pkt, const char *in); +std::string pqipkt_getFIname(void *pkt); +void pqipkt_setFIext(void *pkt, const char *in); +std::string pqipkt_getFIext(void *pkt); +void pqipkt_setFIlen(void *pkt, int len); +int pqipkt_getFIlen(void *pkt); + +void pqipkt_setFIoffset(void *pkt, int offset); +int pqipkt_getFIoffset(void *pkt); +void pqipkt_setFIchunksize(void *pkt, int size); +int pqipkt_getFIchunksize(void *pkt); + +void pqipkt_setFIreqtype(void *pkt, int in); +int pqipkt_getFIreqtype(void *pkt); +void pqipkt_setFIexttype(void *pkt, int in); +int pqipkt_getFIexttype(void *pkt); +void pqipkt_setFIpath(void *pkt, const char *in); +std::string pqipkt_getFIpath(void *pkt); + +// (S)MI Functions. +pqipkt *pqipkt_makecipkt(ChatItem *ci); +ChatItem *pqipkt_makeciobj(pqipkt *pkt); +void pqipkt_setMIuint32(void *pkt, int offset, unsigned long val); +unsigned long pqipkt_getMIuint32(void *pkt, int offset); + +void pqipkt_setMIstring(void *pkt, int offset, std::string name); +std::string pqipkt_setMIstring(void *pkt, int offset, int len); + +// FD Functions. +pqipkt *pqipkt_makefdpkt(PQFileData *fd); +PQFileData *pqipkt_makefdobj(pqipkt *pkt); + +void pqipkt_setFDlen(void *pkt, int len); +int pqipkt_getFDlen(void *pkt); +void pqipkt_setFDflags(void *pkt, int flags); +int pqipkt_getFDflags(void *pkt); +void pqipkt_setFDdata(void *pkt, void *data, int datalen); +void pqipkt_getFDdata(void *pkt, void *data, int datalen); + +static std::map types_fn; +static std::map types_fninit; + + +int registerTunnelType(int subtype, PQTunnel *(*fn)(void *d, int n)) +{ + // check it don't exist already. + std::map::iterator it; + it = types_fn.find(subtype); + if (it != types_fn.end()) + return -1; + + types_fn[subtype] = fn; + return 1; +} + +PQTunnel *createTunnelType(int subtype, void *d, int n) +{ + // check it don't exist already. + std::map::iterator it; + it = types_fn.find(subtype); + if (it != types_fn.end()) + { + std::ostringstream out; + out << "Created Tunnel Class:" << std::endl; + + PQTunnel *pkt = (it -> second)(d, n); + // build the packet. + pkt -> in(d, n); + + pkt -> print(out); + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqipktzone, out.str()); + return pkt; + } + + { + std::ostringstream out; + for(it = types_fn.begin(); it != types_fn.end(); it++) + { + out << "TYPE_FN IDX: " << it -> first << std::endl; + } + pqioutput(PQL_DEBUG_BASIC, pqipktzone, out.str()); + } + + + pqioutput(PQL_DEBUG_BASIC, pqipktzone, + "createTunnelType() returning Null"); + return NULL; +} + + +int registerTunnelInitType(int subtype, PQTunnelInit *(*fn)(void *d, int n)) +{ + // check it don't exist already. + std::map::iterator it; + it = types_fninit.find(subtype); + if (it != types_fninit.end()) + return -1; + + types_fninit[subtype] = fn; + return 1; +} + +PQTunnelInit *createTunnelInitType(int subtype, void *d, int n) +{ + // check it don't exist already. + std::map::iterator it; + it = types_fninit.find(subtype); + if (it != types_fninit.end()) + { + std::ostringstream out; + out << "Created Init Tunnel Class:" << std::endl; + + PQTunnelInit *pkt = (it -> second)(d, n); + // build the packet. + pkt -> in(d, n); + + pkt -> print(out); + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqipktzone, out.str()); + return pkt; + } + + { + std::ostringstream out; + for(it = types_fninit.begin(); it != types_fninit.end(); it++) + { + out << "TYPE_FN IDX: " << it -> first << std::endl; + } + pqioutput(PQL_DEBUG_BASIC, pqipktzone, out.str()); + } + + + pqioutput(PQL_DEBUG_BASIC, pqipktzone, + "createTunnelInitType() returning Null"); + return NULL; +} + + +// Tunnel Functions. +pqipkt *pqipkt_maketunnelpkt(PQTunnel *item); +PQTunnel *pqipkt_maketunnelobj(pqipkt *pkt); + +// Init Tunnel +pqipkt *pqipkt_maketunnelinitpkt(PQTunnelInit *item); +PQTunnelInit *pqipkt_maketunnelinitobj(pqipkt *pkt); + +void pqipkt_setTunnellen(void *pkt, int len); +int pqipkt_getTunnellen(void *pkt); +void *pqipkt_getTunneldata(void *pkt); + + + +int pqipkt_basesize() +{ + //fixme("pqipkt_basesize()", 5); + return 276; +} + + int pqipkt_maxsize() +{ + //fixme("pqipkt_maxsize()", 5); + return 16 * 1024; +} + + +// determine properties. (possible from incomplete pkt). +int pqipkt_rawlen(pqipkt *pkt) +{ + return pqipkt_getPQILen(pkt); +} + +bool pqipkt_check(pqipkt *pkt, int size) +{ + std::ostringstream out; + out << "pqipkt_check() RawLen: " << pqipkt_rawlen(pkt); + out << " is ?=? to size: " << size; + pqioutput(PQL_DEBUG_BASIC, pqipktzone, out.str()); + + return (pqipkt_rawlen(pkt) <= size); +} + + +PQItem *pqipkt_create(pqipkt *pkt) +{ + PQItem *pqi = NULL; + + { + std::ostringstream out; + out << "pqipkt_create() Making PQItem Based on Type:"; + out << pqipkt_getPQIType(pkt); + pqioutput(PQL_DEBUG_BASIC, pqipktzone, out.str()); + } + + //pqipkt_print(pkt); + + switch(pqipkt_getPQIType(pkt)) + { + case PQI_ITEM_TYPE_SEARCHITEM: + pqi = pqipkt_makesiobj(pkt); + break; + + case PQI_ITEM_TYPE_FILEITEM: + pqi = pqipkt_makefiobj(pkt); + break; + + + case PQI_ITEM_TYPE_CHATITEM: + pqi = pqipkt_makeciobj(pkt); + break; + + case PQI_ITEM_TYPE_TUNNELITEM: + pqi = pqipkt_maketunnelobj(pkt); + break; + + case PQI_ITEM_TYPE_TUNNELINITITEM: + pqi = pqipkt_maketunnelinitobj(pkt); + break; + + + //case PQI_ITEM_TYPE_AUTODISCITEM: + // pqi = pqipkt_makeadobj(pkt); + // break; + + case PQI_ITEM_TYPE_INFOITEM: // fall through as none + case PQI_ITEM_TYPE_COMMANDITEM: // of these should happen. + default: + { + std::ostringstream out; + out << "pqipkt_create() UNKNOWN TYPE :"; + out << pqipkt_getPQIType(pkt); + pqioutput(PQL_DEBUG_BASIC, pqipktzone, out.str()); + } + return NULL; + break; + } + if (pqi != NULL) + { + //pqi -> print(std::cerr); + } + else + { + pqioutput(PQL_ALERT, pqipktzone, + "pqipkt_create() Bad Packet"); + } + return pqi; +} + + +// Outgoing Pkts.... (These are raw packets....(a chunk of data)) +pqipkt *pqipkt_makepkt(PQItem *pqi) +{ + pqipkt *pkt = NULL; + { + std::ostringstream out; + out << "pqipkt_makepkt() Making pqipkt Based on Type:"; + out << pqi -> type << std::endl; + pqi -> print(out); + pqioutput(PQL_DEBUG_BASIC, pqipktzone, out.str()); + } + + switch(pqi -> type) + { + case PQI_ITEM_TYPE_SEARCHITEM: + pkt = pqipkt_makesipkt((SearchItem *) pqi); + break; + + case PQI_ITEM_TYPE_FILEITEM: + pkt = pqipkt_makefipkt((PQFileItem *) pqi); + break; + + case PQI_ITEM_TYPE_CHATITEM: + pkt = pqipkt_makecipkt((ChatItem *) pqi); + break; + + case PQI_ITEM_TYPE_TUNNELITEM: + pkt = pqipkt_maketunnelpkt((PQTunnel *) pqi); + break; + + case PQI_ITEM_TYPE_TUNNELINITITEM: + pkt = pqipkt_maketunnelinitpkt((PQTunnelInit *) pqi); + break; + + //case PQI_ITEM_TYPE_AUTODISCITEM: + // pkt = pqipkt_makeadpkt((DiscItem *) pqi); + // return pkt; + // break; + + case PQI_ITEM_TYPE_INFOITEM: // fall through as none + case PQI_ITEM_TYPE_COMMANDITEM: // of these should happen. + default: + { + std::ostringstream out; + out << "pqipkt_makepkt() UNKNOWN TYPE :"; + out << pqi->type << "/" << pqi->subtype; + pqioutput(PQL_ALERT, pqipktzone, out.str()); + } + return NULL; + break; + } + + if (pkt != NULL) + { + //pqipkt_print(pkt); + } + else + { + std::ostringstream out; + out << "pqipkt_makepkt() NULL pkt"; + pqioutput(PQL_DEBUG_BASIC, pqipktzone, out.str()); + } + return pkt; +} + +// delete the raw packet (allocated using above). +void pqipkt_delete(pqipkt *pkt) +{ + free(pkt); + return; +} + + +// delete the raw packet (allocated using above). +void pqipkt_print(pqipkt *pkt) +{ + int len = pqipkt_getPQILen(pkt); + std::ostringstream out; + + out << "pqipkt_print(pkt): Type("; + out << pqipkt_getPQIType(pkt) << "/"; + out << pqipkt_getPQISubType(pkt) << ") - len:"; + out << len << std::endl; + for(int i = 0; i < len; i++) + { + if ((i > 0) && (i % 20 == 0)) + out << std::endl; + + out << std::hex; + int val = (int) ((unsigned char *) pkt)[i]; + if (val < 16) + out << "0" << val << " "; + else + out << val << " "; + + } + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqipktzone, out.str()); + + return; +} + + + + + + + + + + +/************ PQI PACKET DESCRIPTION ****************** + * + * VERY BASIC at the moment. + * + * 4 bytes -> PQI Tag + Version. + * 2 bytes -> PKT_TYPE + * 2 bytes -> PKT_SUBTYPE + * 4 bytes -> PKT_LEN + * 4 bytes -> PKT_SID + * 4 bytes -> PKT_FLAGS + * + * Total (20) bytes. + **************************************************/ + + +void pqipkt_setPQITag(pqipkt *pkt) +{ + char *str = (char *) pkt; + strncpy(str, "PQ11", 4); + return; +} + +void pqipkt_setPQIType(void *pkt, int type) +{ + uint16_t *ptype = (uint16_t *) &(((char *) pkt)[4]); + ptype[0] = htons(type); + return; +} + + +int pqipkt_getPQIType(void *pkt) +{ + uint16_t *ptype = (uint16_t *) &(((char *) pkt)[4]); + return ntohs(ptype[0]); +} + +void pqipkt_setPQISubType(void *pkt, int subtype) +{ + uint16_t *ptype = (uint16_t *) &(((char *) pkt)[6]); + ptype[0] = htons(subtype); + return; +} + +int pqipkt_getPQISubType(void *pkt) +{ + uint16_t *ptype = (uint16_t *) &(((char *) pkt)[6]); + return ntohs(ptype[0]); +} + +void pqipkt_setPQILen(void *pkt, int len) +{ + uint32_t *ptype = (uint32_t *) &(((char *) pkt)[8]); + ptype[0] = htonl(len); + return; +} + +int pqipkt_getPQILen(void *pkt) +{ + uint32_t *ptype = (uint32_t *) &(((char *) pkt)[8]); + return ntohl(ptype[0]); +} + + +void pqipkt_setPQIsid(void *pkt, int sid) +{ + uint32_t *loc = (uint32_t *) &(((char *) pkt)[12]); + loc[0] = htonl(sid); + return; +} + + +int pqipkt_getPQIsid(void *pkt) +{ + uint32_t *loc = (uint32_t *) &(((char *) pkt)[12]); + return ntohl(loc[0]); +} + + +void pqipkt_setPQIFlags(void *pkt, int flags) +{ + uint32_t *loc = (uint32_t *) &(((char *) pkt)[16]); + loc[0] = htonl(flags); + return; +} + +int pqipkt_getPQIFlags(void *pkt) +{ + uint32_t *loc = (uint32_t *) &(((char *) pkt)[16]); + return ntohl(loc[0]); +} + + +// end of the PQI data fields. + + +/************ SI PACKET DESCRIPTION ****************** + * + * PQI + + * + * 2 bytes -> SI_DATATYPE + * 256 bytes -> DATA + * + * Total (20 + 2 + 256 = 278) bytes. + **************************************************/ + +// Outgoing Pkts.... (These are raw packets....(a chunk of data)) +pqipkt *pqipkt_makesipkt(SearchItem *si) +{ + pqioutput(PQL_DEBUG_BASIC, pqipktzone, + "pqipkt_makesipkt"); + + pqipkt *pkt = (pqipkt *) malloc(278); + pqipkt_setPQITag(pkt); + pqipkt_setPQIType(pkt, PQI_ITEM_TYPE_SEARCHITEM); + pqipkt_setPQISubType(pkt, si -> subtype); + pqipkt_setPQILen(pkt, 278); + pqipkt_setPQIFlags(pkt, si -> flags); + pqipkt_setPQIsid(pkt, si -> sid); + + pqipkt_setSIdatatype(pkt, si -> datatype); + pqipkt_setSIdata(pkt, (si -> data).c_str()); + + return pkt; +} + +SearchItem *pqipkt_makesiobj(pqipkt *pkt) +{ + pqioutput(PQL_DEBUG_BASIC, pqipktzone, + "pqipkt_makesiobj"); + + // only one type... + SearchItem *si = new SearchItem(); + //pqipkt_getPQITag(pkt); + si -> type = PQI_ITEM_TYPE_SEARCHITEM; + si -> subtype = pqipkt_getPQISubType(pkt); + si -> flags = pqipkt_getPQIFlags(pkt); + si -> sid = pqipkt_getPQIsid(pkt); + + si -> datatype = pqipkt_getSIdatatype(pkt); + si -> data = pqipkt_getSIdata(pkt); + return si; +} + +void pqipkt_setSIdatatype(void *pkt, int datatype) +{ + uint16_t *ptype = (uint16_t *) &(((char *) pkt)[20]); + ptype[0] = htons(datatype); + return; +} + +int pqipkt_getSIdatatype(void *pkt) +{ + uint16_t *ptype = (uint16_t *) &(((char *) pkt)[20]); + return ntohs(ptype[0]); +} + +void pqipkt_setSIdata(void *pkt, const char *in) +{ + char *str = &(((char *) pkt)[22]); + strncpy(str, in, 256); +} + + +std::string pqipkt_getSIdata(void *pkt) +{ + char *str = &(((char *) pkt)[22]); + str[255] = '\0'; + return std::string(str); +} + + +/************ FI PACKET DESCRIPTION ****************** + * + * PQI + + * 256 bytes -> hash; + * 256 bytes -> name; + * 16 bytes -> ext; + * 4 bytes -> len; + * 4 bytes -> offset; // data req + * 4 bytes -> chunk; // data req + * 4 bytes -> reqtype; (now needed) + * 4 bytes -> exttype; + * 512 bytes -> path; + * + * Total (20 + 512 + 512 + 16 + 4*5 = 1080) bytes. + **************************************************/ + + +pqipkt *pqipkt_makefipkt(PQFileItem *fi) +{ + pqioutput(PQL_DEBUG_BASIC, pqipktzone, + "pqipkt_makefipkt"); + + if (fi -> subtype == PQI_FI_SUBTYPE_DATA) + { + return pqipkt_makefdpkt( (PQFileData *) fi); + } + + int len = 1080; + pqipkt *pkt = (pqipkt *) malloc(len); + pqipkt_setPQITag(pkt); + pqipkt_setPQIType(pkt, PQI_ITEM_TYPE_FILEITEM); + pqipkt_setPQISubType(pkt, fi -> subtype); + pqipkt_setPQILen(pkt, len); + pqipkt_setPQIFlags(pkt, fi -> flags); + pqipkt_setPQIsid(pkt, fi -> sid); + + pqipkt_setFIhash(pkt, (fi -> hash).c_str()); + pqipkt_setFIname(pkt, (fi -> name).c_str()); + + pqipkt_setFIext(pkt, (fi -> ext).c_str()); + pqipkt_setFIlen(pkt, fi -> size); + + pqipkt_setFIoffset(pkt, fi -> fileoffset); + pqipkt_setFIchunksize(pkt, fi -> chunksize); + + pqipkt_setFIreqtype(pkt, fi -> reqtype); + pqipkt_setFIexttype(pkt, fi -> exttype); + pqipkt_setFIpath(pkt, (fi -> path).c_str()); + + return pkt; +} + +PQFileItem *pqipkt_makefiobj(pqipkt *pkt) +{ + pqioutput(PQL_DEBUG_BASIC, pqipktzone, + "pqipkt_makefiobj"); + + if (pqipkt_getPQISubType(pkt) == PQI_FI_SUBTYPE_DATA) + { + return pqipkt_makefdobj(pkt); + } + + // only one type... + PQFileItem *fi = new PQFileItem(); + //pqipkt_getPQITag(pkt); + fi -> type = PQI_ITEM_TYPE_FILEITEM; + fi -> subtype = pqipkt_getPQISubType(pkt); + fi -> flags = pqipkt_getPQIFlags(pkt); + fi -> sid = pqipkt_getPQIsid(pkt); + + fi -> hash = pqipkt_getFIhash(pkt); + fi -> name = pqipkt_getFIname(pkt); + fi -> ext = pqipkt_getFIext(pkt); + fi -> size = pqipkt_getFIlen(pkt); + + fi -> fileoffset = pqipkt_getFIoffset(pkt); + fi -> chunksize = pqipkt_getFIchunksize(pkt); + + fi -> reqtype = pqipkt_getFIreqtype(pkt); + fi -> exttype = pqipkt_getFIexttype(pkt); + + fi -> path = pqipkt_getFIpath(pkt); + + return fi; +} + +void pqipkt_setFIhash(void *pkt, const char *in) +{ + char *str = &(((char *) pkt)[20]); + strncpy(str, in, 256); +} + +std::string pqipkt_getFIhash(void *pkt) +{ + char *str = &(((char *) pkt)[20]); + str[255] = '\0'; + return std::string(str); +} + +void pqipkt_setFIname(void *pkt, const char *in) +{ + char *str = &(((char *) pkt)[276]); + strncpy(str, in, 256); +} + +std::string pqipkt_getFIname(void *pkt) +{ + char *str = &(((char *) pkt)[276]); + str[255] = '\0'; + return std::string(str); +} + +void pqipkt_setFIext(void *pkt, const char *in) +{ + char *str = &(((char *) pkt)[532]); + strncpy(str, in, 16); +} + +std::string pqipkt_getFIext(void *pkt) +{ + char *str = &(((char *) pkt)[532]); + str[15] = '\0'; + return std::string(str); +} + +void pqipkt_setFIlen(void *pkt, int len) +{ + uint32_t *loc = (uint32_t *) &(((char *) pkt)[548]); + loc[0] = htonl(len); + return; +} + +int pqipkt_getFIlen(void *pkt) +{ + uint32_t *loc = (uint32_t *) &(((char *) pkt)[548]); + return ntohl(loc[0]); +} + + +void pqipkt_setFIoffset(void *pkt, int offset) +{ + uint32_t *loc = (uint32_t *) &(((char *) pkt)[552]); + loc[0] = htonl(offset); + return; +} + +int pqipkt_getFIoffset(void *pkt) +{ + uint32_t *loc = (uint32_t *) &(((char *) pkt)[552]); + return ntohl(loc[0]); +} + + +void pqipkt_setFIchunksize(void *pkt, int size) +{ + uint32_t *loc = (uint32_t *) &(((char *) pkt)[556]); + loc[0] = htonl(size); + return; +} + +int pqipkt_getFIchunksize(void *pkt) +{ + uint32_t *loc = (uint32_t *) &(((char *) pkt)[556]); + return ntohl(loc[0]); +} + + +void pqipkt_setFIreqtype(void *pkt, int len) +{ + uint32_t *loc = (uint32_t *) &(((char *) pkt)[560]); + loc[0] = htonl(len); + return; +} + +int pqipkt_getFIreqtype(void *pkt) +{ + uint32_t *loc = (uint32_t *) &(((char *) pkt)[560]); + return ntohl(loc[0]); +} + +void pqipkt_setFIexttype(void *pkt, int len) +{ + uint32_t *loc = (uint32_t *) &(((char *) pkt)[564]); + loc[0] = htonl(len); + return; +} + +int pqipkt_getFIexttype(void *pkt) +{ + uint32_t *loc = (uint32_t *) &(((char *) pkt)[564]); + return ntohl(loc[0]); +} + + +void pqipkt_setFIpath(void *pkt, const char *in) +{ + char *str = &(((char *) pkt)[568]); + strncpy(str, in, 512); +} + +std::string pqipkt_getFIpath(void *pkt) +{ + char *str = &(((char *) pkt)[568]); + str[511] = '\0'; + return std::string(str); +} + + +/************ SMI(Chat) PACKET DESCRIPTION ****************** + * OLD FORMATS>>>> + * + * PQI + + * 256 bytes -> msg; + * + * Total (20 + 256 = 276) bytes. + **************************************************/ +/************ MI PACKET DESCRIPTION ****************** + * + * SMI + + * 4 bytes -> datalen; + * 4 bytes -> flags; // if attachment + * 4 bytes -> size; // if attachment + * 256 bytes -> hash; + * 256 bytes -> name; + * 256 bytes -> channel name; + * n bytes -> msg. + * + * Total (276 + 4 + 4 + 4 + 768 + n) bytes. + * = 1056 + n + **************************************************/ + + +/************ SMI(Chat) PACKET DESCRIPTION ****************** + * + * PQI + + * 4 bytes -> msgsize + * n bytes -> msg; + * + * Total (20 + 4 + n = 24 + n) bytes. + **************************************************/ +/************ MI PACKET DESCRIPTION ****************** + * + * SMI + + * 4 bytes -> flags; + * 4 bytes -> sendTime; + * 4 bytes -> titleSize; + * n bytes -> title + * 4 bytes -> headerSize; + * m bytes -> header; + * 4 bytes -> noFiles; + * (per file) + * 4 bytes -> size; + * 4 bytes -> hashsize + * o bytes -> hash + * 4 bytes -> namesize + * p bytes -> name; + * + * Total (SMI + 4 + 4 + 4 + n + 4 + m + 4 + files) bytes. + **************************************************/ + +pqipkt *pqipkt_makecipkt(ChatItem *ci) +{ + pqioutput(PQL_DEBUG_BASIC, pqipktzone, + "pqipkt_makecipkt"); + + MsgItem *mi; + pqipkt *pkt; + int len; + int offset = 0; + + int baselen = 20 + 4 + ci->msg.size(); + + if ((mi = dynamic_cast(ci)) != NULL) + { + int extralen = 5 * 4; + extralen += mi->title.size(); + extralen += mi->header.size(); + + /* plus files */ + std::list::iterator it; + for(it = mi->files.begin(); it != mi->files.end(); it++) + { + extralen += 12; + extralen += it -> name.size(); + extralen += it -> hash.size(); + } + + len = baselen + extralen; + if (len > pqipkt_maxsize()) + { + /* cannot make packet! */ + return NULL; + } + if (len < pqipkt_basesize()) + { + len = pqipkt_basesize(); + } + + pkt = malloc(len); + + // fill it the base. + pqipkt_setPQITag(pkt); + pqipkt_setPQIType(pkt, PQI_ITEM_TYPE_CHATITEM); + pqipkt_setPQISubType(pkt, mi -> subtype); + pqipkt_setPQILen(pkt, len); + pqipkt_setPQIFlags(pkt, mi -> flags); + pqipkt_setPQIsid(pkt, mi -> sid); // id irrelevant. + + offset = 20; + // Msg + pqipkt_setMIuint32(pkt, offset, mi -> msg.size()); + offset += 4; + pqipkt_setMIstring(pkt, offset, mi -> msg); + offset += mi->msg.size(); + + // Actual Msg part.... + pqipkt_setMIuint32(pkt, offset, mi -> msgflags); + offset += 4; + pqipkt_setMIuint32(pkt, offset, mi -> sendTime); + offset += 4; + // Title + pqipkt_setMIuint32(pkt, offset, mi -> title.size()); + offset += 4; + pqipkt_setMIstring(pkt, offset, mi -> title); + offset += mi->title.size(); + // Header + pqipkt_setMIuint32(pkt, offset, mi -> header.size()); + offset += 4; + pqipkt_setMIstring(pkt, offset, mi -> header); + offset += mi->header.size(); + // nofiles. + pqipkt_setMIuint32(pkt, offset, mi -> files.size()); + offset += 4; + // Now pack those files.. + for(it = mi->files.begin(); it != mi->files.end(); it++) + { + // size. + pqipkt_setMIuint32(pkt, offset, it -> size); + offset += 4; + // hash + pqipkt_setMIuint32(pkt, offset, it -> hash.size()); + offset += 4; + pqipkt_setMIstring(pkt, offset, it -> hash); + offset += it->hash.size(); + // name + pqipkt_setMIuint32(pkt, offset, it -> name.size()); + offset += 4; + pqipkt_setMIstring(pkt, offset, it -> name); + offset += it->name.size(); + } + + if (offset != len) + { + /* error! */ + } + + return pkt; + } + // only chatitem. + len = baselen; + if (len < pqipkt_basesize()) + { + len = pqipkt_basesize(); + } + + pkt = malloc(len); + + pqipkt_setPQITag(pkt); + pqipkt_setPQIType(pkt, PQI_ITEM_TYPE_CHATITEM); + pqipkt_setPQISubType(pkt, ci -> subtype); + pqipkt_setPQILen(pkt, len); + pqipkt_setPQIFlags(pkt, ci -> flags); + pqipkt_setPQIsid(pkt, ci -> sid); // id irrelevant. + + // fill in the msg. + offset = 20; + // Msg + pqipkt_setMIuint32(pkt, offset, ci -> msg.size()); + offset += 4; + pqipkt_setMIstring(pkt, offset, ci -> msg); + offset += ci->msg.size(); + + return pkt; +} + + +ChatItem *pqipkt_makeciobj(pqipkt *pkt) +{ + pqioutput(PQL_DEBUG_BASIC, pqipktzone, + "pqipkt_makeciobj"); + + int len = pqipkt_getPQILen(pkt); + int offset = 0; + int namelen = 0; + int i; + + // switch based on the subtype; + if (pqipkt_getPQISubType(pkt) == PQI_MI_SUBTYPE_CHAT) + { + // only short pkt! + ChatItem *ci = new ChatItem(); + //pqipkt_getPQITag(pkt); + ci -> type = PQI_ITEM_TYPE_CHATITEM; + ci -> subtype = pqipkt_getPQISubType(pkt); + ci -> flags = pqipkt_getPQIFlags(pkt); + ci -> sid = pqipkt_getPQIsid(pkt); + + offset = 20; + namelen = pqipkt_getMIuint32(pkt, offset); + offset += 4; + + if (offset + namelen > len) + { + /* error */ + pqioutput(PQL_ALERT, pqipktzone, "pqipkt_makeciobj ALERT size error CI(1)"); + delete ci; + return NULL; + } + + ci -> msg = pqipkt_setMIstring(pkt, offset, namelen); + return ci; + } + + // else message + + MsgItem *mi = new MsgItem(); + //pqipkt_getPQITag(pkt); + mi -> type = PQI_ITEM_TYPE_CHATITEM; + mi -> subtype = pqipkt_getPQISubType(pkt); + mi -> flags = pqipkt_getPQIFlags(pkt); + mi -> sid = pqipkt_getPQIsid(pkt); + + bool pktOkay = true; + + offset = 20; + if (offset + 4 > len) pktOkay = false; + if (pktOkay) + { + namelen = pqipkt_getMIuint32(pkt, offset); + offset += 4; + } + + if (offset + namelen > len) pktOkay = false; + if (pktOkay) + { + mi -> msg = pqipkt_setMIstring(pkt, offset, namelen); + offset += namelen; + } + + /* now check the sizes */ + if (offset + 12 > len) pktOkay = false; + if (pktOkay) + { + // Actual Msg part.... + mi -> msgflags = pqipkt_getMIuint32(pkt, offset); + offset += 4; + mi -> sendTime = pqipkt_getMIuint32(pkt, offset); + offset += 4; + + // Title + namelen = pqipkt_getMIuint32(pkt, offset); + offset += 4; + } + + if (offset + namelen > len) pktOkay = false; + if (pktOkay) + { + mi -> title = pqipkt_setMIstring(pkt, offset, namelen); + offset += namelen; + } + + // Header + if (offset + 4 > len) pktOkay = false; + if (pktOkay) + { + namelen = pqipkt_getMIuint32(pkt, offset); + offset += 4; + } + + if (offset + namelen > len) pktOkay = false; + if (pktOkay) + { + mi -> header = pqipkt_setMIstring(pkt, offset, namelen); + offset += namelen; + } + + // nofiles. + if (offset + 4 > len) pktOkay = false; + int nofiles = 0; + if (pktOkay) + { + nofiles = pqipkt_getMIuint32(pkt, offset); + offset += 4; + } + + for(i = 0; i < nofiles; i++) + { + MsgFileItem mfi; + + if (offset + 8 > len) pktOkay = false; + if (pktOkay) + { + mfi.size = pqipkt_getMIuint32(pkt, offset); + offset += 4; + + // Hash + namelen = pqipkt_getMIuint32(pkt, offset); + offset += 4; + } + + if (offset + namelen > len) pktOkay = false; + if (pktOkay) + { + mfi.hash = pqipkt_setMIstring(pkt, offset, namelen); + offset += namelen; + } + + if (offset + 4 > len) pktOkay = false; + if (pktOkay) + { + // Name + namelen = pqipkt_getMIuint32(pkt, offset); + offset += 4; + } + + if (offset + namelen > len) pktOkay = false; + if (pktOkay) + { + mfi.name = pqipkt_setMIstring(pkt, offset, namelen); + offset += namelen; + + mi -> files.push_back(mfi); + } + } + if (pktOkay) + { + return mi; + } + else + { + /* error */ + pqioutput(PQL_ALERT, pqipktzone, "pqipkt_makeciobj ALERT size error MI(1)"); + + delete mi; + return NULL; + } +} + +void pqipkt_setMIuint32(void *pkt, int offset, unsigned long val) +{ + /* stick the value at the offset! */ + char *buf = (char *) pkt + offset; + *((unsigned long *) buf) = htonl(val); +} + +void pqipkt_setMIstring(void *pkt, int offset, std::string name) +{ + /* stick the value at the offset! */ + char *str = &(((char *) pkt)[offset]); + for(unsigned int i = 0; i < name.size(); i++) + { + str[i] = name[i]; + } +} + +unsigned long pqipkt_getMIuint32(void *pkt, int offset) +{ + /* stick the value at the offset! */ + char *buf = (char *) pkt + offset; + unsigned long val = ntohl(*((unsigned long *) buf)); + return val; +} + +std::string pqipkt_setMIstring(void *pkt, int offset, int len) +{ + /* stick the value at the offset! */ + char *str = &(((char *) pkt)[offset]); + std::string val; + for(int i = 0; i < len; i++) + { + val += str[i]; + } + return val; +} + +/************ FD PACKET DESCRIPTION ****************** + * + * PQI + + * (basic FI) + * 256 bytes -> hash; + * 256 bytes -> name; + * 16 bytes -> ext; + * 4 bytes -> len; + * 4 bytes -> offset; // data req + * 4 bytes -> chunk; // data req + * 4 bytes -> reqtype; (now needed) + * 4 bytes -> exttype; + * SubTotal (20 + 512 + 16 + 4*5 = 568) bytes. + * + * + * 4 bytes -> datalen; + * 4 bytes -> flags; + * n bytes -> data. + * + * Total (568 + 4 + 4 + n) bytes. + **************************************************/ + +pqipkt *pqipkt_makefdpkt(PQFileData *fd) +{ + pqioutput(PQL_DEBUG_BASIC, pqipktzone, + "pqipkt_makefdpkt"); + + pqipkt *pkt; + int len; + //is a MsgItem mi. + //calc length of the message. + len = 568 + 4 + 4 + fd -> datalen; + // but len also has a minimum length of 276 bytes.... + if (len < 276) + { + len = 276; + } + + pkt = malloc(len); + + // fill it in. + pqipkt_setPQITag(pkt); + pqipkt_setPQIType(pkt, PQI_ITEM_TYPE_FILEITEM); + pqipkt_setPQISubType(pkt, fd -> subtype); + pqipkt_setPQILen(pkt, len); + pqipkt_setPQIFlags(pkt, fd -> flags); + pqipkt_setPQIsid(pkt, fd -> sid); + + // Fi fields + pqipkt_setFIhash(pkt, (fd -> hash).c_str()); + pqipkt_setFIname(pkt, (fd -> name).c_str()); + pqipkt_setFIext(pkt, (fd -> ext).c_str()); + pqipkt_setFIlen(pkt, fd -> size); + pqipkt_setFIoffset(pkt, fd -> fileoffset); + pqipkt_setFIchunksize(pkt, fd -> chunksize); + pqipkt_setFIreqtype(pkt, fd -> reqtype); + pqipkt_setFIexttype(pkt, fd -> exttype); + + pqipkt_setFDlen(pkt, fd -> datalen); + pqipkt_setFDflags(pkt, fd -> fileflags); + pqipkt_setFDdata(pkt, (fd -> data), fd -> datalen); + + return pkt; +} + + +PQFileData *pqipkt_makefdobj(pqipkt *pkt) +{ + pqioutput(PQL_DEBUG_BASIC, pqipktzone, + "pqipkt_makefdobj"); + + PQFileData *fd = new PQFileData(); + //pqipkt_getPQITag(pkt); + fd -> type = PQI_ITEM_TYPE_FILEITEM; + fd -> subtype = pqipkt_getPQISubType(pkt); + fd -> flags = pqipkt_getPQIFlags(pkt); + fd -> sid = pqipkt_getPQIsid(pkt); + + // FI Stuff. + fd -> hash = pqipkt_getFIhash(pkt); + fd -> name = pqipkt_getFIname(pkt); + fd -> ext = pqipkt_getFIext(pkt); + fd -> size = pqipkt_getFIlen(pkt); + + fd -> fileoffset = pqipkt_getFIoffset(pkt); + fd -> chunksize = pqipkt_getFIchunksize(pkt); + + fd -> reqtype = pqipkt_getFIreqtype(pkt); + fd -> exttype = pqipkt_getFIexttype(pkt); + + // then the fd stuff. + fd -> datalen = pqipkt_getFDlen(pkt); + fd -> fileflags = pqipkt_getFDflags(pkt); + fd -> data = malloc(fd -> datalen); + pqipkt_getFDdata(pkt, fd -> data, fd -> datalen); + + return fd; +} + + +void pqipkt_setFDlen(void *pkt, int len) +{ + uint32_t *loc = (uint32_t *) &(((char *) pkt)[568]); + loc[0] = htonl(len); + return; +} + +int pqipkt_getFDlen(void *pkt) +{ + uint32_t *loc = (uint32_t *) &(((char *) pkt)[568]); + return ntohl(loc[0]); +} + + + +void pqipkt_setFDflags(void *pkt, int flags) +{ + uint32_t *loc = (uint32_t *) &(((char *) pkt)[572]); + loc[0] = htonl(flags); + return; +} + + +int pqipkt_getFDflags(void *pkt) +{ + uint32_t *loc = (uint32_t *) &(((char *) pkt)[572]); + return ntohl(loc[0]); +} + + +void pqipkt_setFDdata(void *pkt, void *data, int datalen) +{ + char *str = &(((char *) pkt)[576]); + memcpy(str, data, datalen); + if (datalen != pqipkt_getFDlen(pkt)) + { + pqioutput(PQL_ALERT, pqipktzone, + "pqipkt_setFDdata() len != mi.len"); + } +} + + +void pqipkt_getFDdata(void *pkt, void *data, int datalen) +{ + char *str = &(((char *) pkt)[576]); + memcpy(data, str, datalen); // copy to data. +} + + +// Tunnel Functions. +pqipkt *pqipkt_maketunnelpkt(PQTunnel *item) +{ + pqioutput(PQL_DEBUG_BASIC, pqipktzone, + "pqipkt_maketunnelpkt"); + + pqipkt *pkt; + int len; + len = 20 + 4 + item -> getSize(); + // but len also has a minimum length of 276 bytes.... + if (len < 276) + { + len = 276; + } + + { + std::ostringstream out; + out << "pqipkt_maketunnelpkt len:" << len; + pqioutput(PQL_DEBUG_BASIC, pqipktzone, out.str()); + } + + pkt = malloc(len); + for(int i = 0; i < len; i++) + { + ((char *)pkt)[0] = 0; + } + + // fill it in. + pqipkt_setPQITag(pkt); + pqipkt_setPQIType(pkt, PQI_ITEM_TYPE_TUNNELITEM); + pqipkt_setPQISubType(pkt, item -> subtype); + pqipkt_setPQILen(pkt, len); + pqipkt_setPQIFlags(pkt, item -> flags); + pqipkt_setPQIsid(pkt, item -> sid); + + { + std::ostringstream out; + out << "pqipkt_maketunnelpkt datalen:" << item -> getSize(); + pqioutput(PQL_DEBUG_BASIC, pqipktzone, out.str()); + } + + pqipkt_setTunnellen(pkt, item -> getSize()); + if (item -> getSize() == + item -> out(pqipkt_getTunneldata(pkt), item -> getSize())) + { + return pkt; + } + // else + free(pkt); + return NULL; +} + + +PQTunnel *pqipkt_maketunnelobj(pqipkt *pkt) +{ + pqioutput(PQL_DEBUG_BASIC, pqipktzone, + "pqipkt_maketunnelobj"); + + // Check the Tunnel Length... + int len = pqipkt_getPQILen(pkt); + if (len < (int) 24 + pqipkt_getTunnellen(pkt)) + { + std::ostringstream out; + out << "Invalid Tunnel Length - Discarding Incoming Packet"; + out << "Len: " << len << " < 24 + "; + out << pqipkt_getTunnellen(pkt); + pqioutput(PQL_DEBUG_BASIC, pqipktzone, out.str()); + + return NULL; + } + + pqioutput(PQL_DEBUG_BASIC, pqipktzone, + "creating a Tunnel Obj"); + + PQTunnel *nitem = createTunnelType(pqipkt_getPQISubType(pkt), + pqipkt_getTunneldata(pkt), pqipkt_getTunnellen(pkt)); + { + std::ostringstream out; + out << "Pkt Tunnel Incoming: st: "; + out << pqipkt_getPQISubType(pkt) << "DataLen: " << + out << pqipkt_getTunnellen(pkt) << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqipktzone, out.str()); + } + + + if (!nitem) + { + pqioutput(PQL_DEBUG_BASIC, pqipktzone, + "pqipkt_maketunnelobj returning Null"); + return NULL; + } + + nitem -> type = PQI_ITEM_TYPE_TUNNELITEM; + nitem -> subtype = pqipkt_getPQISubType(pkt); + nitem -> flags = pqipkt_getPQIFlags(pkt); + nitem -> sid = pqipkt_getPQIsid(pkt); + + nitem -> in(pqipkt_getTunneldata(pkt), pqipkt_getTunnellen(pkt)); + return nitem; +} + + + +void pqipkt_setTunnellen(void *pkt, int len) +{ + int *loc = (int *) &(((char *) pkt)[20]); + (*loc) = len; +} + +int pqipkt_getTunnellen(void *pkt) +{ + int *loc = (int *) &(((char *) pkt)[20]); + return (*loc); +} + +void *pqipkt_getTunneldata(void *pkt) +{ + void *loc = (void *) &(((char *) pkt)[24]); + return loc; +} + + +// Tunnel Functions. +pqipkt *pqipkt_maketunnelinitpkt(PQTunnelInit *item) +{ + pqioutput(PQL_DEBUG_BASIC, pqipktzone, + "pqipkt_maketunnelinitpkt"); + + pqipkt *pkt; + int len; + len = 20 + 4 + item -> getSize(); + // but len also has a minimum length of 276 bytes.... + if (len < 276) + { + len = 276; + } + + { + std::ostringstream out; + out << "pqipkt_maketunnelinitpkt len:" << len; + pqioutput(PQL_DEBUG_BASIC, pqipktzone, out.str()); + } + + pkt = malloc(len); + for(int i = 0; i < len; i++) + { + ((char *)pkt)[0] = 0; + } + + // fill it in. + pqipkt_setPQITag(pkt); + pqipkt_setPQIType(pkt, PQI_ITEM_TYPE_TUNNELINITITEM); + pqipkt_setPQISubType(pkt, item -> subtype); + pqipkt_setPQILen(pkt, len); + pqipkt_setPQIFlags(pkt, item -> flags); + pqipkt_setPQIsid(pkt, item -> sid); + + { + std::ostringstream out; + out << "pqipkt_maketunnelinitpkt datalen:" << item -> getSize(); + pqioutput(PQL_DEBUG_BASIC, pqipktzone, out.str()); + } + + pqipkt_setTunnellen(pkt, item -> getSize()); + if (item -> getSize() == + item -> out(pqipkt_getTunneldata(pkt), item -> getSize())) + { + return pkt; + } + // else + free(pkt); + return NULL; +} + + +PQTunnelInit *pqipkt_maketunnelinitobj(pqipkt *pkt) +{ + pqioutput(PQL_DEBUG_BASIC, pqipktzone, + "pqipkt_maketunnelinitobj"); + + // Check the Tunnel Length... + int len = pqipkt_getPQILen(pkt); + if (len < (int) 24 + pqipkt_getTunnellen(pkt)) + { + std::ostringstream out; + + out << "Invalid Tunnel Length - Discarding Incoming Packet" << std::endl; + out << "Len: " << len << " < 24 + "; + out << pqipkt_getTunnellen(pkt); + pqioutput(PQL_DEBUG_BASIC, pqipktzone, out.str()); + + return NULL; + } + + pqioutput(PQL_DEBUG_BASIC, pqipktzone, + "creating a Tunnel Init Obj"); + + PQTunnelInit *nitem = createTunnelInitType(pqipkt_getPQISubType(pkt), + pqipkt_getTunneldata(pkt), pqipkt_getTunnellen(pkt)); + { + std::ostringstream out; + out << "Pkt Init Tunnel Incoming: st: "; + out << pqipkt_getPQISubType(pkt) << "DataLen: " << + out << pqipkt_getTunnellen(pkt) << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqipktzone, out.str()); + } + + + if (!nitem) + { + pqioutput(PQL_DEBUG_BASIC, pqipktzone, + "pqipkt_maketunnelinitobj returning Null"); + return NULL; + } + + nitem -> type = PQI_ITEM_TYPE_TUNNELINITITEM; + nitem -> subtype = pqipkt_getPQISubType(pkt); + nitem -> flags = pqipkt_getPQIFlags(pkt); + nitem -> sid = pqipkt_getPQIsid(pkt); + + nitem -> in(pqipkt_getTunneldata(pkt), pqipkt_getTunnellen(pkt)); + return nitem; +} + + +// ANOTHER TYPE DISCOVERY PACKETS... +// THIS HAS NOW BECOME A TUNNEL TYPE. +// +//void pqipkt_setADladdr(void *pkt, sockaddr_in addr); +//sockaddr_in pqipkt_getADladdr(void *pkt); +//void pqipkt_setADsaddr(void *pkt, sockaddr_in addr); +//sockaddr_in pqipkt_getADsaddr(void *pkt); +// +//int pqipkt_getADrecvTF(void *pkt); +//void pqipkt_setADrecvTF(void *pkt, int tf); +//int pqipkt_getADconnTF(void *pkt); +//void pqipkt_setADconnTF(void *pkt, int tf); +// +//void pqipkt_setADcertLen(void *pkt, int len); +//int pqipkt_getADcertLen(void *pkt); +//void pqipkt_getADcertDER(void *pkt, unsigned char *pktder, int len); +//void pqipkt_setADcertDER(void *pkt, unsigned char *pktder, int len); +// +// +//pqipkt *pqipkt_makeadpkt(DiscItem *ad) +//{ +// pqipkt *pkt; +// int len; +// +// if (ad -> subtype == AUTODISC_RDI_SUBTYPE_PING) +// { +// //len = 20 + 16 + 16 (addrs) + 4 + 4 (ints) +// len = 20 + 16 + 16 + 4 + 4; +// if (len < 276) +// len = 276; +// pkt = malloc(len); +// pqipkt_setPQITag(pkt); +// pqipkt_setPQIType(pkt, PQI_ITEM_TYPE_AUTODISCITEM); +// pqipkt_setPQISubType(pkt, ad -> subtype); +// pqipkt_setPQILen(pkt, len); +// pqipkt_setPQIFlags(pkt, ad -> flags); +// pqipkt_setPQIsid(pkt, ad -> sid); +// +// pqipkt_setADladdr(pkt, ad -> laddr); +// pqipkt_setADsaddr(pkt, ad -> saddr); +// pqipkt_setADrecvTF(pkt, ad -> receive_tf); +// pqipkt_setADconnTF(pkt, ad -> connect_tf); +// } +// else // RPLY +// { +// DiscReplyItem *dri = (DiscReplyItem *) ad; +// +// //len = 20 + 16 + 16 (addrs) + 4 + 4 (ints) + data; +// len = 20 + 16 + 16 + 4 + 4 + 4 + dri -> certLen; +// if (len < 276) +// len = 276; +// pkt = malloc(len); +// pqipkt_setPQITag(pkt); +// pqipkt_setPQIType(pkt, PQI_ITEM_TYPE_AUTODISCITEM); +// pqipkt_setPQISubType(pkt, ad -> subtype); +// pqipkt_setPQILen(pkt, len); +// pqipkt_setPQIFlags(pkt, ad -> flags); +// pqipkt_setPQIsid(pkt, ad -> sid); +// +// // connect details. +// pqipkt_setADladdr(pkt, dri -> laddr); +// pqipkt_setADsaddr(pkt, dri -> saddr); +// pqipkt_setADrecvTF(pkt, dri -> receive_tf); +// pqipkt_setADconnTF(pkt, dri -> connect_tf); +// +// // + certificate. +// pqipkt_setADcertLen(pkt, dri -> certLen); +// pqipkt_setADcertDER(pkt, dri -> certDER, dri -> certLen); +// +// } +// return pkt; +//} +// +// +//DiscItem *pqipkt_makeadobj(pqipkt *pkt) +//{ +// DiscItem *di; +// if (pqipkt_getPQISubType(pkt) == AUTODISC_RDI_SUBTYPE_PING) +// { +// DiscItem *fa = di = new DiscItem(); +// fa -> type = PQI_ITEM_TYPE_AUTODISCITEM; +// fa -> subtype = pqipkt_getPQISubType(pkt); +// fa -> flags = pqipkt_getPQIFlags(pkt); +// fa -> sid = pqipkt_getPQIsid(pkt); +// +// fa -> laddr = pqipkt_getADladdr(pkt); +// fa -> saddr = pqipkt_getADsaddr(pkt); +// fa -> receive_tf = pqipkt_getADrecvTF(pkt); +// fa -> connect_tf = pqipkt_getADconnTF(pkt); +// } +// else +// { +// DiscReplyItem *fa = new DiscReplyItem(); +// fa -> type = PQI_ITEM_TYPE_AUTODISCITEM; +// fa -> subtype = pqipkt_getPQISubType(pkt); +// fa -> flags = pqipkt_getPQIFlags(pkt); +// fa -> sid = pqipkt_getPQIsid(pkt); +// +// fa -> laddr = pqipkt_getADladdr(pkt); +// fa -> saddr = pqipkt_getADsaddr(pkt); +// fa -> receive_tf = pqipkt_getADrecvTF(pkt); +// fa -> connect_tf = pqipkt_getADconnTF(pkt); +// fa -> certLen = pqipkt_getADcertLen(pkt); +// fa -> certDER = (unsigned char *) malloc(fa -> certLen); +// pqipkt_getADcertDER(pkt, fa -> certDER, fa -> certLen); +// +// di = fa; +// } +// +// return di; +//} +// +// +//void pqipkt_setADladdr(void *pkt, struct sockaddr_in addr) +//{ +// struct sockaddr_in *loc = (struct sockaddr_in *) +// &(((char *) pkt)[20]); +// (*loc) = addr; +//} +// +//struct sockaddr_in pqipkt_getADladdr(void *pkt) +//{ +// struct sockaddr_in *loc = (struct sockaddr_in *) +// &(((char *) pkt)[20]); +// return (*loc); +//} +// +// +//void pqipkt_setADsaddr(void *pkt, struct sockaddr_in addr) +//{ +// struct sockaddr_in *loc = (struct sockaddr_in *) +// &(((char *) pkt)[36]); +// (*loc) = addr; +//} +// +//struct sockaddr_in pqipkt_getADsaddr(void *pkt) +//{ +// struct sockaddr_in *loc = (struct sockaddr_in *) +// &(((char *) pkt)[36]); +// return (*loc); +//} +// +// +//int pqipkt_getADrecvTF(void *pkt) +//{ +// uint32_t *loc = (uint32_t *) &(((char *) pkt)[52]); +// return ntohl(loc[0]); +//} +// +//void pqipkt_setADrecvTF(void *pkt, int tf) +//{ +// uint32_t *loc = (uint32_t *) &(((char *) pkt)[52]); +// loc[0] = htonl(tf); +// return; +//} +// +//int pqipkt_getADconnTF(void *pkt) +//{ +// uint32_t *loc = (uint32_t *) &(((char *) pkt)[56]); +// return ntohl(loc[0]); +//} +// +//void pqipkt_setADconnTF(void *pkt, int tf) +//{ +// uint32_t *loc = (uint32_t *) &(((char *) pkt)[56]); +// loc[0] = htonl(tf); +// return; +//} +// +//int pqipkt_getADcertLen(void *pkt) +//{ +// uint32_t *loc = (uint32_t *) &(((char *) pkt)[60]); +// return ntohl(loc[0]); +//} +// +//void pqipkt_setADcertLen(void *pkt, int len) +//{ +// uint32_t *loc = (uint32_t *) &(((char *) pkt)[60]); +// loc[0] = htonl(len); +// return; +//} +// +//void pqipkt_getADcertDER(void *pkt, unsigned char *pktder, int len) +//{ +// unsigned char *str = &(((unsigned char *) pkt)[64]); +// memcpy(pktder, str, len); +// if (len != pqipkt_getADcertLen(pkt)) +// { +// std::cerr << "pqipkt_getADcertDER() len != ad.len" << std::endl; +// } +//} +// +// +//void pqipkt_setADcertDER(void *pkt, unsigned char *pktder, int len) +//{ +// unsigned char *str = &(((unsigned char *) pkt)[64]); +// memcpy(str, pktder, len); +// if (len != pqipkt_getADcertLen(pkt)) +// { +// std::cerr << "pqipkt_setADcertDER() len != ad.len" << std::endl; +// } +//} +// +// +// diff --git a/libretroshare/src/pqi/pqipacket.h b/libretroshare/src/pqi/pqipacket.h new file mode 100644 index 000000000..195555003 --- /dev/null +++ b/libretroshare/src/pqi/pqipacket.h @@ -0,0 +1,79 @@ +/* + * "$Id: pqipacket.h,v 1.6 2007-02-18 21:46:49 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + +#ifndef MRK_PQI_PACKET_HEADER +#define MRK_PQI_PACKET_HEADER + + +/* This is a set of functions for packaging + * the search queries/replies/data into packets + * + * Currently it makes very simple 1kb packets. + * + */ + +// The standard data types and the search interface. +#include "pqi/pqi.h" + +// defs for streams. +#include + +typedef void pqipkt; + +// Handle Incoming Pkts...... + +// constants +int pqipkt_basesize(); +int pqipkt_maxsize(); + +// determine properties. (possible from incomplete pkt). +int pqipkt_rawlen(pqipkt *); +bool pqipkt_check(pqipkt *pkt, int size); + +PQItem *pqipkt_create(pqipkt *block); + +// Outgoing Pkts.... (These are raw packets....(a chunk of data)) +pqipkt *pqipkt_makepkt(PQItem *pqi); + +// delete the raw packet (allocated using above). +void pqipkt_delete(pqipkt *); + +// print packet. +// +void pqipkt_print(pqipkt *pkt); + +// Type Extension methods for PQTunnel. +class PQTunnel; +class PQTunnelInit; + +int registerTunnelType(int subtype, PQTunnel *(*fn)(void *d, int n)); +PQTunnel *createTunnelType(int subtype, void *d, int n); + +int registerTunnelInitType(int subtype, PQTunnelInit *(*fn)(void *d, int n)); +PQTunnelInit *createTunnelInitType(int subtype, void *d, int n); + +#endif //MRK_PQI_PACKET_HEADER diff --git a/libretroshare/src/pqi/pqiperson.cc b/libretroshare/src/pqi/pqiperson.cc new file mode 100644 index 000000000..81ed9a720 --- /dev/null +++ b/libretroshare/src/pqi/pqiperson.cc @@ -0,0 +1,552 @@ +/* + * "$Id: pqiperson.cc,v 1.9 2007-02-18 21:46:49 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "pqi/pqi.h" + +#include + +#include "pqi/pqiperson.h" + +const int pqipersonzone = 82371; +#include "pqi/pqidebug.h" +#include + + +pqiperson::pqiperson(cert *c) + :sslcert(c), active(false), activepqi(NULL), + inConnectAttempt(false), waittimes(0) +{ + sroot = getSSLRoot(); + + // check certificate + +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + sroot -> validateCertificateXPGP(sslcert); +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + sroot -> validateCertificate(sslcert); +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + + if (!(sslcert -> Valid())) + { + std::cerr << "pqiperson::Warning Certificate Not Approved!"; + std::cerr << " pqiperson will not initialise...." << std::endl; + } + + return; +} + +pqiperson::~pqiperson() +{ + // clean up the children. + std::list::iterator it = kids.begin(); + for(it = kids.begin(); it != kids.end(); ) + { + pqiconnect *pc = (*it); + it = kids.erase(it); + delete pc; + } +} + + + // The PQInterface interface. +int pqiperson::SendItem(PQItem *i) +{ + std::ostringstream out; + out << "pqiperson::SendItem()"; + if (active) + { + out << " Active: Sending On"; + return activepqi -> SendItem(i); + } + else + { + out << " Not Active: Used to put in ToGo Store"; + out << std::endl; + out << " Now deleting..."; + // no longer storing in togo... + //togo.push_back(i); + delete i; + } + pqioutput(PQL_DEBUG_BASIC, pqipersonzone, out.str()); + return 0; // queued. +} + +PQItem *pqiperson::GetItem() +{ + if (active) + return activepqi -> GetItem(); + // else not possible. + return NULL; +} + +int pqiperson::status() +{ + if (active) + return activepqi -> status(); + return -1; +} + +cert * pqiperson::getContact() +{ + return sslcert; +} + + // tick...... +int pqiperson::tick() +{ + int activeTick = 0; + + { + std::ostringstream out; + out << "pqiperson::tick() Cert: " << sslcert -> Name() << " "; + if (active) + out << "***Active***"; + else + out << ">>InActive<<"; + + out << std::endl; + out << "Activepqi: " << activepqi << " inConnectAttempt: "; + + if (inConnectAttempt) + out << "In Connection Attempt"; + else + out << " Not Connecting "; + out << std::endl; + + + // tick the children. + std::list::iterator it; + for(it = kids.begin(); it != kids.end(); it++) + { + if (0 < (*it) -> tick()) + { + activeTick = 1; + } + out << "\tTicking Child: " << (*it) << std::endl; + } + + pqioutput(PQL_DEBUG_ALL, pqipersonzone, out.str()); + } // end of pqioutput. + + // use cert settings to control everything. + if (!active) + { + if ((sslcert -> WillConnect()) && (!inConnectAttempt)) + { + if (sslcert -> nc_timestamp < time(NULL)) + { + // calc the time til next connect. + sslcert -> nc_timestamp = time(NULL) + + connectWait(); + connectattempt(NULL); + } + } + if (sslcert -> Listening()) + { + if (!(sslcert -> WillListen())) + { + stoplistening(); + } + } + else + { + if (sslcert -> WillListen()) + { + listen(); + } + } + } + // if active and togo!. + else if (togo.size() > 0) + { + while(togo.size() > 0) + { + PQItem *item = togo.front(); + togo.pop_front(); + + std::ostringstream out; + out << "pqiperson::tick() Sending on Stored Item"; + out << " to activepqi @ " << (void *) activepqi; + out << std::endl; + item -> print(out); + out << std::endl; + + pqioutput(PQL_DEBUG_BASIC, pqipersonzone, out.str()); + + activepqi -> SendItem(item); + } + activeTick = 1; + } + return activeTick; +} + +// callback function for the child - notify of a change. +// This is only used for out-of-band info.... +// otherwise could get dangerous loops. +int pqiperson::notifyEvent(NetInterface *ni, int newState) +{ + { + std::ostringstream out; + out << "pqiperson::notifyEvent() Cert: " << sslcert -> Name(); + out << std::endl; + out << "Message: " << newState << " from: " << ni << std::endl; + + pqioutput(PQL_DEBUG_BASIC, pqipersonzone, out.str()); + } + + /* find the pqi, */ + pqiconnect *pqi = NULL; + std::list::iterator it; + + /* start again */ + int i = 0; + for(it = kids.begin(); it != kids.end(); it++) + { + std::ostringstream out; + out << "pqiperson::connectattempt() Kid# "; + out << i << " of " << kids.size(); + out << std::endl; + out << " pqiconn: " << (*it); + out << " ni: " << (*it)->ni; + out << " in_ni: " << ni; + pqioutput(PQL_DEBUG_BASIC, pqipersonzone, out.str()); + i++; + + if ((*it)->thisNetInterface(ni)) + { + pqi = (*it); + } + } + + if (!pqi) + { + pqioutput(PQL_WARNING, pqipersonzone, "Unknown notfyEvent Source!"); + return -1; + } + + + switch(newState) + { + case CONNECT_RECEIVED: + case CONNECT_SUCCESS: + if ((active) && (activepqi != pqi)) // already connected - trouble + { + pqioutput(PQL_WARNING, pqipersonzone, + "CONNECT_SUCCESS+active->trouble: shutdown EXISTING->switch to new one!"); + + //pqi -> stoplistening(); + + // This is the RESET that's killing the connections..... + activepqi -> reset(); + // this causes a recursive call back into this fn. + // which cleans up state. + // we only do this if its not going to mess with new conn. + } + + /* now install a new one. */ + { + + pqioutput(PQL_WARNING, pqipersonzone, + "CONNECT_SUCCESS->marking so!"); + // mark as active. + active = true; + activepqi = pqi; + sslcert -> Connected(true); + sroot -> IndicateCertsChanged(); + + connectSuccess(); + + inConnectAttempt = false; + // dont stop listening. + //stoplistening(); + return 1; + } + break; + case CONNECT_UNREACHABLE: + case CONNECT_FIREWALLED: + case CONNECT_FAILED: + if (active) + { + if (activepqi == pqi) + { + pqioutput(PQL_WARNING, pqipersonzone, + "CONNECT_FAILED->marking so!"); + active = false; + activepqi = NULL; + sslcert -> Connected(false); + sroot -> IndicateCertsChanged(); + return 1; + } + else + { + pqioutput(PQL_WARNING, pqipersonzone, + "CONNECT_FAIL+not activepqi->strange!"); + // something strange! + return -1; + } + } + else + { + pqioutput(PQL_WARNING, pqipersonzone, + "CONNECT_FAILED+NOT active -> try connect again"); + + connectattempt(pqi); + return 1; + } + break; + default: + break; + } + return -1; +} + +/***************** Not PQInterface Fns ***********************/ + +int pqiperson::reset() +{ + { + std::ostringstream out; + out << "pqiperson::reset() Cert: " << sslcert -> Name(); + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqipersonzone, out.str()); + } + + std::list::iterator it; + for(it = kids.begin(); it != kids.end(); it++) + { + (*it) -> reset(); + } + + activepqi = NULL; + active = false; + sslcert -> Listening(false); + sslcert -> Connected(false); + sroot -> IndicateCertsChanged(); + + // check auto setting at reset. + if (!sslcert -> Manual()) + autoconnect(true); + + return 1; +} + +int pqiperson::autoconnect(bool b) +{ + { + std::ostringstream out; + out << "pqiperson::autoconnect() Cert: " << sslcert -> Name(); + out << " - " << (int) b << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqipersonzone, out.str()); + } + + sslcert -> Manual(!b); + + sslcert -> WillConnect(b); + sslcert -> WillListen(b); + sroot -> IndicateCertsChanged(); + + return 1; +} + + +int pqiperson::addChildInterface(pqiconnect *pqi) +{ + { + std::ostringstream out; + out << "pqiperson::addChildInterface() : " << pqi; + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqipersonzone, out.str()); + } + + kids.push_back(pqi); + return 1; +} + +/***************** PRIVATE FUNCTIONS ***********************/ +// functions to iterate over the connects and change state. + + +int pqiperson::listen() +{ + { + std::ostringstream out; + out << "pqiperson::listen() Cert: " << sslcert -> Name(); + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqipersonzone, out.str()); + } + + if (!active) + { + std::list::iterator it; + for(it = kids.begin(); it != kids.end(); it++) + { + // set them all listening. + (*it) -> listen(); + } + sslcert -> Listening(true); + sroot -> IndicateCertsChanged(); + } + return 1; +} + + +int pqiperson::stoplistening() +{ + { + std::ostringstream out; + out << "pqiperson::stoplistening() Cert: " << sslcert -> Name(); + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqipersonzone, out.str()); + } + + std::list::iterator it; + for(it = kids.begin(); it != kids.end(); it++) + { + // set them all listening. + (*it) -> stoplistening(); + } + sslcert -> Listening(false); + sroot -> IndicateCertsChanged(); + + return 1; +} + +int pqiperson::connectattempt(pqiconnect *last) +{ + { + std::ostringstream out; + out << "pqiperson::connectattempt() Cert: " << sslcert -> Name(); + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqipersonzone, out.str()); + } + + std::list::iterator it = kids.begin(); + int i = 0; + if (last != NULL) + { + // find the current connection. + for(; (it != kids.end()) && ((*it) != last); it++, i++); + + if (it != kids.end()) + { + std::ostringstream out; + out << "pqiperson::connectattempt() Last Cert#: "; + out << i << " of " << kids.size(); + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqipersonzone, out.str()); + + + it++; + i++; + } + } + // now at the first one to try. + { + std::ostringstream out; + out << "pqiperson::connectattempt() Cert: " << sslcert -> Name(); + out << " Starting Attempts at Interface " << i << " of " << kids.size(); + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqipersonzone, out.str()); + } + + // try to connect on the next one. + for(; (it != kids.end()) && (0 > (*it)->connectattempt()); it++, i++); + + if (it == kids.end()) + { + std::ostringstream out; + out << "pqiperson::connectattempt() Cert: " << sslcert -> Name(); + out << " Failed on All Interfaces"; + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqipersonzone, out.str()); + } + else + { + std::ostringstream out; + out << "pqiperson::connectattempt() Cert: " << sslcert -> Name(); + out << " attempt on pqiconnect #" << i << " suceeded"; + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqipersonzone, out.str()); + } + + // flag if we started a new connectionAttempt. + inConnectAttempt = (it != kids.end()); + + return 1; +} + + +// returns (in secs) the time til next connect attempt +// this is based on the +// +#define SEC_PER_LOG_UNIT 600 /* ten minutes? */ +#define MAX_WAITTIMES 10 /* ten minutes? */ + +int pqiperson::connectWait() +{ + int log_weight = (1 << waittimes); + // max wait of 2^10 = 1024 * X min (over a month) + // 10240 min = 1 day + waittimes++; + if (waittimes > MAX_WAITTIMES) + waittimes = MAX_WAITTIMES; + // make it linear instead!. + return waittimes * SEC_PER_LOG_UNIT; + //return log_weight * SEC_PER_LOG_UNIT; +} + +// called to reduce the waittimes, next time. +int pqiperson::connectSuccess() +{ + return waittimes = 0; +} + + +float pqiperson::getRate(bool in) +{ + // get the rate from the active one. + if ((!active) || (activepqi == NULL)) + return 0; + return activepqi -> getRate(in); +} + +void pqiperson::setMaxRate(bool in, float val) +{ + // set to all of them. (and us) + PQInterface::setMaxRate(in, val); + // clean up the children. + std::list::iterator it = kids.begin(); + for(it = kids.begin(); it != kids.end(); it++) + { + (*it) -> setMaxRate(in, val); + } +} + diff --git a/libretroshare/src/pqi/pqiperson.h b/libretroshare/src/pqi/pqiperson.h new file mode 100644 index 000000000..b82ed4d8d --- /dev/null +++ b/libretroshare/src/pqi/pqiperson.h @@ -0,0 +1,162 @@ +/* + * "$Id: pqiperson.h,v 1.7 2007-02-18 21:46:49 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + +#ifndef MRK_PQI_PERSON_HEADER +#define MRK_PQI_PERSON_HEADER + + +#include "pqi/pqi.h" + +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + +#include "pqi/xpgpcert.h" + +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + +#include "pqi/sslcert.h" + +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + +#include + +class pqiperson; +class sslroot; + +static const int CONNECT_RECEIVED = 1; +static const int CONNECT_SUCCESS = 2; +static const int CONNECT_UNREACHABLE = 3; +static const int CONNECT_FIREWALLED = 4; +static const int CONNECT_FAILED = 5; + +#include "pqi/pqistreamer.h" + +class pqiconnect: public pqistreamer, public NetInterface +{ +public: + pqiconnect(NetBinInterface *ni_in) + :pqistreamer(ni_in, 0), // pqistreamer will cleanup NetInterface. + NetInterface(NULL, NULL), // No need for callback. + ni(ni_in) + { + if (!ni_in) + { + std::cerr << "pqiconnect::pqiconnect() NetInterface == NULL, FATAL!"; + std::cerr << std::endl; + exit(1); + } + return; + } + +virtual ~pqiconnect() { return; } + + // presents a virtual NetInterface -> passes to ni. +virtual int connectattempt() { return ni -> connectattempt(); } +virtual int listen() { return ni -> listen(); } +virtual int stoplistening() { return ni -> stoplistening(); } +virtual int reset() { return ni -> reset(); } +virtual int disconnect() { return ni -> reset(); } + + // get the contact from the net side! +virtual Person *getContact() +{ + if (ni) + { + return ni->getContact(); + } + else + { + return PQInterface::getContact(); + } +} + + // to check if our interface. +virtual bool thisNetInterface(NetInterface *ni_in) { return (ni_in == ni); } +//protected: + NetBinInterface *ni; +protected: +}; + + + +class pqiperson: public PQInterface +{ +public: + pqiperson(cert *c); +virtual ~pqiperson(); // must clean up children. + + // control of the connection. +int reset(); +int autoconnect(bool); + + // add in connection method. +int addChildInterface(pqiconnect *pqi); + + // The PQInterface interface. +virtual int SendItem(PQItem *); +virtual PQItem *GetItem(); + +virtual int status(); +virtual int tick(); +virtual cert * getContact(); + +// overloaded callback function for the child - notify of a change. +int notifyEvent(NetInterface *ni, int event); + +// PQInterface for rate control overloaded.... +virtual float getRate(bool in); +virtual void setMaxRate(bool in, float val); + + private: + + // outgoing PQItems can be queued (nothing else). + std::list togo; + std::list kids; + cert *sslcert; + bool active; + pqiconnect *activepqi; + bool inConnectAttempt; + int waittimes; + + sslroot *sroot; + +private: /* Helper functions */ + +int connectWait(); +int connectSuccess(); +int listen(); +int stoplistening(); +int connectattempt(pqiconnect *last); + +}; + + + +#endif + diff --git a/libretroshare/src/pqi/pqipersongrp.cc b/libretroshare/src/pqi/pqipersongrp.cc new file mode 100644 index 000000000..638c6811d --- /dev/null +++ b/libretroshare/src/pqi/pqipersongrp.cc @@ -0,0 +1,480 @@ +/* + * "$Id: pqipersongrp.cc,v 1.14 2007-02-19 20:08:30 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "pqi/pqipersongrp.h" + +/* +#include "pqi/pqiproxy.h" +#include "pqi/pqitunnelproxy.h" + */ + + +#include "pqi/p3disc.h" +#include "pqi/p3channel.h" + +#include "pqi/pqissl.h" +#include "pqi/pqissllistener.h" + +/* + * #include "pqi/pqiudpproxy.h" + * #include "pqi/pqissludp.h" + */ + +#ifdef PQI_USE_PROXY + #include "pqi/pqiudpproxy.h" + #include "pqi/pqissludp.h" +#endif + +//#include "pqi/pqitunneltst.h" + +#include "pqi/pqidebug.h" +#include + +const int pqipersongrpzone = 354; + +// get the Tunnel and TunnelInit packets from the queue. +bool isTunnelItem(PQItem *item) +{ + if (item -> type == PQI_ITEM_TYPE_TUNNELITEM) + return true; + return false; +} + +bool isTunnelInitItem(PQItem *item) +{ + if (item -> type == PQI_ITEM_TYPE_TUNNELINITITEM) + return true; + return false; +} + +// handle the tunnel services. +int pqipersongrp::tickTunnelServer() +{ + PQItem *pqi = NULL; + int i = 0; + { + std::ostringstream out; + out << "pqipersongrp::tickTunnelServer()"; + pqioutput(PQL_DEBUG_ALL, pqipersongrpzone, out.str()); + } + + PQTunnelServer::tick(); + + while(NULL != (pqi = SelectOtherPQItem(isTunnelInitItem))) + { + ++i; + pqioutput(PQL_DEBUG_BASIC, pqipersongrpzone, + "pqipersongrp::tickTunnelServer() Incoming TunnelInitItem"); + incoming(pqi); + } + while(NULL != (pqi = SelectOtherPQItem(isTunnelItem))) + { + ++i; + pqioutput(PQL_DEBUG_BASIC, pqipersongrpzone, + "pqipersongrp::tickTunnelServer() Incoming TunnelItem"); + incoming(pqi); + } + + while(NULL != (pqi = outgoing())) + { + ++i; + pqioutput(PQL_DEBUG_BASIC, pqipersongrpzone, + "pqipersongrp::tickTunnelServer() OutGoing PQItem"); + + SendOtherPQItem(pqi); + } + if (0 < i) + { + return 1; + } + return 0; +} + + + // inits +pqipersongrp::pqipersongrp(SecurityPolicy *glob, sslroot *sr, unsigned long flags) + :pqihandler(glob), sslr(sr), p3d(NULL), +#ifdef PQI_USE_PROXY + p3p(NULL), +#endif + initFlags(flags) +{ + // add a p3proxy & p3disc. + p3d = new p3disc(sr); +#ifdef PQI_USE_PROXY + p3p = new p3udpproxy(p3d); +#endif +#ifdef PQI_USE_CHANNELS + p3c = new p3channel(sr); +#endif + + if (!(sr -> active())) + { + pqioutput(PQL_ALERT, pqipersongrpzone, "sslroot not active... exiting!"); + exit(1); + } + + // make listen + Person *us = sr -> getOwnCert(); + if (us != NULL) + { + if (flags & PQIPERSON_NO_SSLLISTENER) + { + pqil = NULL; + } + else + { + pqil = new pqissllistener(us -> localaddr); + } +#ifdef PQI_USE_PROXY + pqiudpl = new pqiudplistener((p3udpproxy *) p3p, + us -> localaddr); +#endif + } + else + { + pqioutput(PQL_ALERT, pqipersongrpzone, "No Us! what are we!"); + exit(1); + } + + + // now we run through any certificates + // already made... and reactivate them. + std::list::iterator it; + std::list &clist = sr -> getCertList(); + for(it = clist.begin(); it != clist.end(); it++) + { + cert *c = (*it); + + c -> InUse(false); + c -> Listening(false); + c -> Connected(false); + + // make new + if (c -> Accepted()) + { + cert_accept(c); + } + } + + + // finally lets + + + // add in a tunneltest. + // register the packet creations. + //addService(new PQTStst()); + //registerTunnelType(PQI_TUNNEL_TST_TYPE, createPQTStst); + + addService(p3d); + registerTunnelType(PQI_TUNNEL_DISC_ITEM_TYPE, createDiscItems); + +#ifdef PQI_USE_PROXY + addService(p3p); + registerTunnelType(PQI_TUNNEL_PROXY_TYPE, createPQTunnelProxy); + registerTunnelInitType(PQI_TUNNEL_PROXY_TYPE, createPQTunnelProxyInit); +#endif + +#ifdef PQI_USE_CHANNELS + addService(p3c); + registerTunnelType(PQI_TUNNEL_CHANNEL_ITEM_TYPE, createChannelItems); +#endif + + return; +} + +int pqipersongrp::tick() +{ + /* could limit the ticking of listener / tunnels to 1/sec... + * but not to important. + */ + + if (pqil) + { + pqil -> tick(); + } +#ifdef PQI_USE_PROXY + pqiudpl->tick(); +#endif + tickTunnelServer(); + + return pqihandler::tick(); +} + + +int pqipersongrp::status() +{ + if (pqil) + { + pqil -> status(); + } +#ifdef PQI_USE_PROXY + //pqiudpl->status(); +#endif + return pqihandler::status(); +} + + // control the connections. + +int pqipersongrp::cert_accept(cert *a) +{ + if (a -> InUse()) + { + pqioutput(PQL_DEBUG_BASIC, pqipersongrpzone, + "pqipersongrp::cert_accept() Cert in Use!"); + + return -1; + } + + pqiperson *pqip = new pqiperson(a); + pqissl *pqis = new pqissl(a, pqil, pqip); + pqiconnect *pqisc = new pqiconnect(pqis); + + pqip -> addChildInterface(pqisc); + +#ifdef PQI_USE_PROXY + pqiudpproxy *pqipxy = new pqiudpproxy(a, (p3udpproxy *) p3p, NULL); + pqissludp *pqius = new pqissludp(a, pqip, pqipxy); + pqiconnect *pqiusc = new pqiconnect(pqius); + + // add a ssl + proxy interface. + // Add Proxy First. + pqip -> addChildInterface(pqiusc); +#endif + + a -> InUse(true); + a -> Accepted(true); + + + // setup no behaviour. (no remote address) + + // attach to pqihandler + SearchModule *sm = new SearchModule(); + sm -> smi = 2; + sm -> pqi = pqip; + sm -> sp = secpolicy_create(); + + // reset it to start it working. + pqis -> reset(); + + + return AddSearchModule(sm); +} + +int pqipersongrp::cert_deny(cert *a) +{ + std::map::iterator it; + SearchModule *mod; + bool found = false; + + // if used find search module.... + if (a -> InUse()) + { + // find module. + for(it = mods.begin(); (!found) && (it != mods.end());it++) + { + mod = it -> second; + if (a == (cert *) ((pqiperson *) + (mod -> pqi)) -> getContact()) + { + found = true; + } + } + if (found) + { + RemoveSearchModule(mod); + secpolicy_delete(mod -> sp); + pqiperson *p = (pqiperson *) mod -> pqi; + p -> reset(); + delete p; + a -> InUse(false); + } + } + a -> Accepted(false); + return 1; +} + +int pqipersongrp::cert_auto(cert *a, bool b) +{ + std::map::iterator it; + if (b) + { + cert_accept(a); + // find module. + for(it = mods.begin(); it != mods.end();it++) + { + SearchModule *mod = it -> second; + pqiperson *p = (pqiperson *) mod -> pqi; + if (a == (cert *) p -> getContact()) + { + p -> autoconnect(b); + return 1; + } + } + } + else + { + a -> Manual(true); + cert_deny(a); + } + return 1; +} + + +int pqipersongrp::restart_listener() +{ + // stop it, + // change the address. + // restart. + cert *own = sslr -> getOwnCert(); + if (pqil) + { + pqil -> resetlisten(); + pqil -> setListenAddr(own -> localaddr); + pqil -> setuplisten(); + } +#ifdef PQI_USE_PROXY + pqiudpl -> resetlisten(); + pqiudpl -> setListenAddr(own -> localaddr); + pqiudpl -> setuplisten(); +#endif + return 1; +} + + +static const std::string pqih_ftr("PQIH_FTR"); + +int pqipersongrp::save_config() +{ + char line[512]; + sprintf(line, "%f %f %f %f", getMaxRate(true), getMaxRate(false), + getMaxIndivRate(true), getMaxIndivRate(false)); + sslr -> setSetting(pqih_ftr, std::string(line)); + return 1; +} + + + +int pqipersongrp::load_config() +{ + std::string line = sslr -> getSetting(pqih_ftr); + float mri, mro, miri, miro; + + if (4 == sscanf(line.c_str(), "%f %f %f %f", &mri, &mro, &miri, &miro)) + { + setMaxRate(true, mri); + setMaxRate(false, mro); + setMaxIndivRate(true, miri); + setMaxIndivRate(false, miro); + } + else + { + pqioutput(PQL_DEBUG_BASIC, pqipersongrpzone, + "pqipersongrp::load_config() Loading Default Rates!"); + + setMaxRate(true, 50.0); + setMaxRate(false,50.0); + setMaxIndivRate(true, 50.0); + setMaxIndivRate(false, 50.0); + } + + return 1; +} + + + /* Overloaded PQItem Check */ +int pqipersongrp::checkOutgoingPQItem(PQItem *item, int global) +{ + /* check cid vs Person */ + if ((global) && (item->cid.route[0] == 0)) + { + /* allowed through as for all! */ + pqioutput(PQL_DEBUG_BASIC, pqipersongrpzone, + "pqipersongrp::checkOutgoingPQItem() Allowing global"); + return 1; + } + if ((!global) && (item->cid.route[0] == 0)) + { + /* not allowed for all! */ + std::ostringstream out; + out << "Bad CID on non-global traffic" << std::endl; + item -> print(out); + pqioutput(PQL_ALERT, pqipersongrpzone,out.str()); + return 0; + } + + if (item -> p == NULL) + { + pqioutput(PQL_ALERT, pqipersongrpzone, + "pqipersongrp::checkOutgoingPQItem() ERROR: NULL Person"); + + std::ostringstream out; + item -> print(out); + pqioutput(PQL_ALERT, pqipersongrpzone,out.str()); + + return 0; + } + + cert *c = (cert *) item -> p; + if (0 != pqicid_cmp(&(c -> cid), &(item -> cid))) + { + std::ostringstream out; + out << "pqipersongrp::checkOutgoingPQItem() c->cid != item->cid"; + out << std::endl; + out << "c -> CID [" << c->cid.route[0]; + for(int i = 0; i < 10; i++) + { + out << ":" << c->cid.route[i]; + } + out << "]" << std::endl; + + out << "item -> CID [" << item->cid.route[0]; + for(int i = 0; i < 10; i++) + { + out << ":" << item->cid.route[i]; + } + out << "]" << std::endl; + + item -> print(out); + + pqioutput(PQL_ALERT, pqipersongrpzone,out.str()); + pqicid_copy(&(c->cid), &(item->cid)); + } + + /* check the top one */ + + return 1; +} + + + + + + + + diff --git a/libretroshare/src/pqi/pqipersongrp.h b/libretroshare/src/pqi/pqipersongrp.h new file mode 100644 index 000000000..6ef39475e --- /dev/null +++ b/libretroshare/src/pqi/pqipersongrp.h @@ -0,0 +1,117 @@ +/* + * "$Id: pqipersongrp.h,v 1.13 2007-02-18 21:46:49 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + +#ifndef MRK_PQI_PERSON_HANDLER_HEADER +#define MRK_PQI_PERSON_HANDLER_HEADER + +#include "pqi/pqihandler.h" +#include "pqi/pqiperson.h" +#include "pqi/pqitunnel.h" + + +// So this is a specific implementation +// +// it is designed to have one pqilistensocket + a series of pqisockets +// +// as an added bonus, we are going to +// make this a pqitunnelserver, to which services can be attached. + +#ifdef PQI_USE_PROXY + class p3proxy; + class pqiudplistener; +#endif + + +const unsigned long PQIPERSON_NO_SSLLISTENER = 0x0001; + +const unsigned long PQIPERSON_ALL_BW_LIMITED = 0x0010; + +class p3disc; +class p3channel; + +class pqissllistener; + +class pqipersongrp: public pqihandler, public PQTunnelServer +{ + public: + pqipersongrp(SecurityPolicy *, sslroot *sr, unsigned long flags); + + // control the connections. +int cert_accept(cert *a); +int cert_deny(cert *a); +int cert_auto(cert *a, bool b); + +int restart_listener(); + +int save_config(); +int load_config(); + + // tick interfaces. +virtual int tick(); +virtual int status(); + + // + SearchInterface which should automatically handle stuff + + // acess to services. + p3disc *getP3Disc() { return p3d; } + +#ifdef PQI_USE_PROXY + p3proxy *getP3Proxy() { return p3p; } +#endif + +#ifdef PQI_USE_CHANNELS + p3channel *getP3Channel() { return p3c; } +#endif + + protected: + /* Overloaded PQItem Check + * checks item->cid vs Person + */ +virtual int checkOutgoingPQItem(PQItem *item, int global); + + private: + + // The tunnelserver operation. + int tickTunnelServer(); + + + pqissllistener *pqil; + + sslroot *sslr; + + p3disc *p3d; +#ifdef PQI_USE_PROXY + p3proxy *p3p; + pqiudplistener *pqiudpl; +#endif +#ifdef PQI_USE_CHANNELS + p3channel *p3c; +#endif + unsigned long initFlags; +}; + +#endif // MRK_PQI_PERSON_HANDLER_HEADER diff --git a/libretroshare/src/pqi/pqiproxy.cc b/libretroshare/src/pqi/pqiproxy.cc new file mode 100644 index 000000000..25a63e160 --- /dev/null +++ b/libretroshare/src/pqi/pqiproxy.cc @@ -0,0 +1,2337 @@ +/* + * "$Id: pqiproxy.cc,v 1.10 2007-02-18 21:46:49 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "pqi/pqiproxy.h" + +#include "pqi/pqipacket.h" +#include "pqi/pqitunnelproxy.h" + +#include "pqi/p3disc.h" + +#include +#include "pqi/pqidebug.h" + +const int pqiproxyzone = 1728; + + +static const unsigned long P3PROXY_CONNECT_TIMEOUT = 30; + +// PQTunnelService Overloading. +int p3proxy::receive(PQTunnel *in) +{ + { + std::ostringstream out; + out << "p3proxy::receive()"; + out << " Received PQTunnel Packet!" << std::endl; + in -> print(out); + pqioutput(PQL_DEBUG_ALL, pqiproxyzone, out.str()); + } + + PQTunnelProxy *pqtp = dynamic_cast(in); + if (pqtp == NULL) + { + delete in; + pqioutput(PQL_WARNING, pqiproxyzone, + "PQTunnel is Not a PQTunnelProxy Pkt...Deleting"); + return -1; + } + + + cert *from = (cert *) pqtp -> p; + + pqioutput(PQL_DEBUG_ALL,pqiproxyzone, "Finding Src"); + cert *src = findcert(pqtp -> src); + pqioutput(PQL_DEBUG_ALL,pqiproxyzone, "Finding Dest"); + cert *dest = findcert(pqtp -> dest); + + if (from != NULL) + { + std::ostringstream out; + out << "ProxyTunnel Pkt from: " << from -> Name() << std::endl; + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, out.str()); + } + + if (src != NULL) + { + std::ostringstream out; + out << "ProxyTunnel Pkt Src: " << src -> Name() << std::endl; + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, out.str()); + } + + if (dest != NULL) + { + std::ostringstream out; + out << "ProxyTunnel Pkt dest: " << dest -> Name() << std::endl; + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, out.str()); + } + + // if either is unknown... + if ((dest == NULL) || (src == NULL)) + { + // ignore/discard packet. + pqioutput(PQL_WARNING, pqiproxyzone, + "Unknown Source/Destination"); + delete pqtp; + return -1; + } + + // if they are in the wrong order. + // 1) dest == real source (we are proxy) + // 2) own = src (we are dest) + cert *own = sroot -> getOwnCert(); + if ((dest == (cert *) pqtp -> p) || (src == own)) + { + // swap them. + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, + "Swapping Dest/Src Order"); + cert *tmp = dest; + dest = src; + src = tmp; + } + + // check if we are a proxy + if (dest != own) + { + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, + "Packet Not Meant for us...."); + // forward onto the correct location. + // all we need to do is correct the cid, + // and filter.... + + if (isConnection(src, dest)) + { + std::ostringstream out; + out << "Proxy Packet Connection (" << src -> Name(); + out << " -> " << dest -> Name() << ") is Okay - Packet received" << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + + return receiveAsProxy(pqtp, src, dest); + } + + // delete packet... + { + pqioutput(PQL_WARNING, pqiproxyzone, + "No Connection/Packet Filtered -> deleting"); + delete pqtp; + return -1; + } + } + + // we are the destination. + + // search for it. + std::map::iterator it; + std::map::iterator pit; + + // first ensure that we have a connection. + if (connectionmap.end() == (it = connectionmap.find(src))) + { + pqioutput(PQL_WARNING, pqiproxyzone, + "Packet Reject Not Connected"); + // not connected.. reject. + delete pqtp; + return -1; + } + else + { + std::ostringstream out; + out << "Proxy Packet Over Connection (" << it->first->Name(); + out << " -> " << it -> second -> Name() << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + } + + if (proxymap.end() == (pit = proxymap.find(src))) + { + pqioutput(PQL_WARNING, pqiproxyzone, + "Packet Reject Not in ProxyMap"); + // no proxy. reject. + delete pqtp; + return -1; + } + else + { + std::ostringstream out; + out << "Proxy Found in ProxyMap"; + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + } + + if (it -> second != from) + { + std::ostringstream out; + out << "Packet Reject Mismatch Proxy : "; + out << it -> second -> Name() << " != "; + out << from -> Name(); + pqioutput(PQL_WARNING, pqiproxyzone, out.str()); + + // mismatch reject. + delete pqtp; + return -1; + } + + // done! + { + std::ostringstream out; + out << "Proxy Packet PASSES OK (" << src->Name(); + out << " -> " << from -> Name(); + out << " -> " << dest -> Name() << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + } + + return receiveAsDestination(pqtp, src, from, dest, pit -> second); +} + + +int p3proxy::receiveAsProxy(PQTunnelProxy *pqtp, cert *src, cert *dest) +{ + { + std::ostringstream out; + out << "p3proxy::receiveAsProxy()"; + out << " Received PQTunnel Packet!" << std::endl; + pqtp -> print(out); + pqioutput(PQL_DEBUG_ALL, pqiproxyzone, out.str()); + } + + if (isConnection(src, dest)) + { + std::ostringstream out; + out << "Proxy Packet Connection (" << src -> Name(); + out << " -> " << dest -> Name() << ") is Okay" << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + + if ((filter(pqtp))) + { + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, + "Packet Okay to Proxy, Sending Out"); + pqtp -> cid = dest -> cid; + // stick into the out queue. + outPkts.push_back(pqtp); + return 1; + } + else + { + pqioutput(PQL_WARNING, pqiproxyzone, + "Packet Fails Filter Test!"); + } + } + + // delete packet... + { + pqioutput(PQL_WARNING, pqiproxyzone, + "No Connection/Packet Filtered -> deleting"); + delete pqtp; + return -1; + } +} + + +int p3proxy::receiveAsDestination(PQTunnelProxy *pqtp, cert *src, cert *from, cert *dest, pqiproxy *pqip) +{ + { + std::ostringstream out; + out << "p3proxy::receiveAsDestination(" << src->Name(); + out << " -> " << from -> Name(); + out << " -> " << dest -> Name() << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + } + + // push_back to correct queue. + std::map >::iterator qit; + if (inqueue.end() == (qit = inqueue.find(pqip))) + { + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, + "p3proxy::receiveAsDestination() Packet Pushed Onto New Queue"); + // make a new list. + std::list nlist; + nlist.push_back(pqtp); + inqueue[pqip] = nlist; + return 1; + } + + // add to existing queue. + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, + "p3proxy::receiveAsDestination() Packet Pushed Onto Existing Queue"); + + (qit->second).push_back(pqtp); + return 1; +} + + +int p3proxy::receiveAsError(PQTunnelProxy* pqtp, cert *src, cert *from, cert *dest) +{ + { + std::ostringstream out; + out << "p3proxy::receiveAsError()"; + out << " Received Bad PQTunnel Packet!" << std::endl; + pqtp -> print(out); + pqioutput(PQL_ALERT, pqiproxyzone, out.str()); + delete pqtp; + } + return 1; +} + + +PQTunnel *p3proxy::send() +{ + pqioutput(PQL_DEBUG_ALL, pqiproxyzone, + "p3proxy::send()"); + + if (outPkts.size() < 1) + return NULL; + + PQTunnel *in = outPkts.front(); + outPkts.pop_front(); + + std::ostringstream out; + out << "Sending (1/" << outPkts.size() + 1 << "): " << std::endl; + in -> print(out); + pqioutput(PQL_DEBUG_ALL,pqiproxyzone,out.str()); + + return in; +} + +// decide if we let data through. +bool p3proxy::filter(PQTunnelProxy *in) +{ + pqioutput(PQL_WARNING,pqiproxyzone, + "p3proxy::filter() Not Implemented!"); + return true; +} + +int p3proxy::receive(PQTunnelInit *in) +{ + { + std::ostringstream out; + out << "p3proxy::receive()" << std::endl; + if (in == NULL) + { + out << "NULL Pkt!" << std::endl; + } + else + { + in -> print(out); + } + pqioutput(PQL_DEBUG_ALL,pqiproxyzone, out.str()); + } + + if (in == NULL) + return 1; + + // make sure it is a ProxyInit.... + PQTunnelProxyInit *pinit = NULL; + if (NULL == (pinit = dynamic_cast(in))) + { + // wrong type. + pqioutput(PQL_WARNING,pqiproxyzone, + "Not PQTunnelProxyInit Pkt Deleting"); + delete in; + return -1; + } + + cert *from = (cert *) pinit -> p; + + pqioutput(PQL_DEBUG_ALL,pqiproxyzone, "Finding Proxy"); + cert *proxy = findcert(pinit -> proxy); + pqioutput(PQL_DEBUG_ALL,pqiproxyzone, "Finding Src"); + cert *src = findcert(pinit -> src); + pqioutput(PQL_DEBUG_ALL,pqiproxyzone, "Finding Dest"); + cert *dest = findcert(pinit -> dest); + + if (from != NULL) + { + std::ostringstream out; + out << "ProxyInit Pkt from: " << from -> Name() << std::endl; + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, out.str()); + } + + if (src != NULL) + { + std::ostringstream out; + out << "ProxyInit Pkt Src: " << src -> Name() << std::endl; + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, out.str()); + } + + + if (proxy != NULL) + { + std::ostringstream out; + out << "ProxyInit Pkt proxy: " << proxy -> Name() << std::endl; + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, out.str()); + } + + + if (dest != NULL) + { + std::ostringstream out; + out << "ProxyInit Pkt dest: " << dest -> Name() << std::endl; + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, out.str()); + } + + if ((from == NULL) || (src == NULL) || + (proxy == NULL) || (dest == NULL)) + { + if (!from) + { + pqioutput(PQL_WARNING,pqiproxyzone, + "Sorry: from (IntRef) == NULL"); + } + + if (!src) + { + pqioutput(PQL_WARNING,pqiproxyzone, + "Sorry: src (SrcRef) == NULL"); + } + + if (!proxy) + { + pqioutput(PQL_WARNING,pqiproxyzone, + "Sorry: proxy (ProxyRef) == NULL"); + } + + if (!dest) + { + pqioutput(PQL_WARNING,pqiproxyzone, + "Sorry: dest (DestRef) == NULL"); + } + + pqioutput(PQL_WARNING,pqiproxyzone, + "deleting as: who are these people!"); + delete in; + return -1; + } + + // At this point we need to decide if we + // are the dest or the proxy. + cert *own = sroot -> getOwnCert(); + + // at this point we need to flip it around. + // if 1) we are end then: + if (src == own) + { + // we need to rotate dest/src, as we + // expect to be the destination, not source. + // so we flip them + src = dest; + dest = own; + } + // 2) if we are proxy... and it came from the destination. + else if (dest == from) + { + dest = src; + src = from; + } + + if (dest != own) + { + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, + "We are not the destination - so we should be proxy!"); + // this is meant for another..... + // we are the proxy. + if (proxy != own) + { + pqioutput(PQL_WARNING,pqiproxyzone, + "But we are not the specified Proxy! ERROR!"); + // error! + delete pinit; + return -1; + } + + // record connection possibility. + // pass on the packet if possible. + // if not return an endConnect. + + // check if we are connected to dest. + if (!dest -> Connected()) + { + pqioutput(PQL_WARNING,pqiproxyzone, + "We Are Not Connected to Destination: rtn End"); + // Return an end Connection, as we cannot connect!. + // just send back the same packet with mode changed. + pinit -> PQTunnelInit::mode = PQTunnelInit::End; + addOutInitPkt(pinit); + return 1; + } + + // we can pass it on. + // register as a potential connection. + PQTunnelProxyInit *pdup = pinit->clone(); + + // pass on the packet. + pinit -> cid = dest -> cid; + addOutInitPkt(pinit); + + // must pass before registration... + registerProxyConnection(src, proxy, dest, pdup); + + delete pdup; + + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, + "Proxy Pass-Through Not Completed"); + return 1; + } + + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, + "We are the End destination of the Proxy Pkt"); + + if (from != proxy) + { + // error this packet is not from + // the expected proxy.... kill. + pqioutput(PQL_WARNING,pqiproxyzone, + "But the Pkt Not from Proxy ERROR"); + delete pinit; + return -1; + } + + // if meant for us + // switch on the type. + // These Functions consume the packet, + switch(pinit -> PQTunnelInit::mode) + { + case PQTunnelInit::Request: + respondConnect(src, from, pinit); + break; + + case PQTunnelInit::Connect: + completeConnect(src, from, pinit); + break; + + case PQTunnelInit::End: + endConnect(src, from, pinit); + break; + default: + + pqioutput(PQL_WARNING,pqiproxyzone, + "Unknown Mode => defaulting to endConnect"); + endConnect(src, from, pinit); + break; + } + //delete pinit; + return 1; +} + +// Handling the Ones We can proxy. +int p3proxy::registerProxyConnection(cert *src, cert *proxy, + cert *dest, PQTunnelProxyInit *pinit) +{ + { + std::ostringstream out; + out << "p3proxy::registerProxyConnection() Checking Name() << ",P:" << proxy -> Name() << ">"; + out << ",D:" << dest -> Name() << ">"; + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, out.str()); + } + + cert *own = sroot -> getOwnCert(); + if (proxy != own) + { + // error..... + return -1; + } + + // get the reference. + std::map, int>::iterator cit1, cit2; + + std::pair ccdir(dest, src), ccrev(src, dest); + + cit1 = proxyconnect.find(ccdir); + cit2 = proxyconnect.find(ccrev); + + if (proxyconnect.end() != cit1) + { + std::ostringstream out; + out << "p3proxy::registerProxyConnection() Prev State(d,s):"; + out << cit1 -> second; + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, out.str()); + } + else + { + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, + "p3proxy::registerProxyConnection() No Prev (d,s) Pair"); + } + + if (proxyconnect.end() != cit2) + { + std::ostringstream out; + out << "p3proxy::registerProxyConnection() Prev State(s,d):"; + out << cit2 -> second; + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, out.str()); + } + else + { + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, + "p3proxy::registerProxyConnection() No Prev (s,d) Pair"); + } + + switch(pinit -> PQTunnelInit::mode) + { + case PQTunnelInit::Request: + // insert or override... the same. + proxyconnect[ccdir] = 1; + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, + "p3proxy::registerProxyConnection() Setting State -> 1"); + break; + + case PQTunnelInit::Connect: + if (cit1 != proxyconnect.end()) + { + if (cit1 -> second == 1) + { + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, + "p3proxy::registerProxyConnection() Switch 1 -> 2"); + + // advance + cit1 -> second = 2; + if (cit2 != proxyconnect.end()) + { + if (cit2 -> second == 2) + { + // complete! + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, + "p3proxy::registerProxyConnection() Connect Complete"); + /* call the function tp handle other goodies */ + connectionCompletedAsProxy(cit1->first.first, cit2->first.first); + + } + else + { + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, + "p3proxy::registerProxyConnection() Rev Connect todo"); + } + } + else + { + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, + "p3proxy::registerProxyConnection() No Rev Conn"); + } + } + else + { + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, + "p3proxy::registerProxyConnection() Cannot Ad -> 2"); + } + } + else + { + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, + "p3proxy::registerProxyConnection() Unknown Connect!"); + + } + break; + + case PQTunnelInit::End: + default: + // remove all the items. + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, + "p3proxy::registerProxyConnection() End: Cleaning up"); + if (cit1 != proxyconnect.end()) + { + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, + "p3proxy::registerProxyConnection() End: Removing Cit1"); + proxyconnect.erase(cit1); + } + if (proxyconnect.end() != (cit2 = proxyconnect.find(ccrev))) + { + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, + "p3proxy::registerProxyConnection() End: Removing Cit2"); + proxyconnect.erase(cit2); + } + break; + } + + return 1; + +} + +int p3proxy::isConnection(cert *src, cert *dest) +{ + if ((src == NULL) || (dest == NULL)) + { + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, + "p3proxy::isConnection() ERROR: NULL dest/src"); + return -1; + } + + { + std::ostringstream out; + out << "p3proxy::isConnection() Checking <"; + out << dest -> Name() << "," << src -> Name() << ">"; + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, out.str()); + } + + // get the reference. + std::map, int>::iterator cit1, cit2; + + std::pair ccdir(dest, src), ccrev(src, dest); + + cit1 = proxyconnect.find(ccdir); + cit2 = proxyconnect.find(ccrev); + if (proxyconnect.end() != cit1) + { + std::ostringstream out; + out << "p3proxy::isConnection() State(d,s):" << cit1 -> second; + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, out.str()); + } + else + { + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, + "p3proxy::isConnection() Unknown (d,s) Pair"); + } + + if (proxyconnect.end() != cit2) + { + std::ostringstream out; + out << "p3proxy::isConnection() State(s,d):" << cit2 -> second; + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, out.str()); + } + else + { + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, + "p3proxy::isConnection() Unknown (s,d) Pair"); + } + + + if ((proxyconnect.end() == cit1) || (proxyconnect.end() == cit2)) + { + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, + "p3proxy::isConnection() Unable to find pc pairs: return -1"); + // connection not established! + return -1; + } + + if ((cit1 -> second == 2) && (cit2 -> second == 2)) + { + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, + "p3proxy::isConnection() Connection Okay!"); + // connection complete. + return 1; + } + + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, + "p3proxy::isConnection() Incomplete Connection State!"); + return -1; +} + + + +int p3proxy::respondConnect(cert *other, cert *proxy, PQTunnelProxyInit *in) +{ + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, + "p3proxy::respondConnect()"); + // a couple of cases + // 1) random init from some other person + // wanting to create a proxyconnection. + // -check listening queue. + // 2) return init from someone. + // -check init queue. + + std::list::iterator lit; + std::map::iterator it, iit, rit, cit; + + iit = initmap.find(other); + rit = replymap.find(other); + cit = connectionmap.find(other); + lit = std::find(listenqueue.begin(), listenqueue.end(), other); + + if ((cit != connectionmap.end()) || (rit != replymap.end())) + { + // error, shouldn't receive this packet + // if in these maps. + // + // close connection / and return endConnect. + + in -> PQTunnelInit::mode = PQTunnelInit::End; + addOutInitPkt(in); + + // clean up. + if (iit != initmap.end()) + initmap.erase(iit); + if (rit != replymap.end()) + replymap.erase(rit); + if (cit != connectionmap.end()) + connectionmap.erase(cit); + + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, + "p3proxy::respondConnect() Bad State: in connect or reply state"); + + return -1; + } + + // if not in initmap, and we are listening for it. + // send out own init. + if ((iit == initmap.end()) && (lit != listenqueue.end())) + { + // have found a listen item. (with no current attempt) + // send reply + + PQTunnelProxyInit *pi = createProxyInit(other, proxy); + + { + std::ostringstream out; + out << "Generated Proxy Init:" << std::endl; + pi -> print(out); + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + } + + addOutInitPkt(pi); + + // addtotheInit list... as we are now in that state! + // should save the packet with the challenges. + initmap[other] = proxy; + passivemap[other] = true; + } + else + { + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, + "p3proxy::respondConnect() No Need to Send InitPkt!"); + } + + + // Find it again..... + if (initmap.end() == (it = initmap.find(other))) + { + // Not here... failed. + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, + "Error Not in InitMap/ListenQueue - Returning End."); + + in -> PQTunnelInit::mode = PQTunnelInit::End; + addOutInitPkt(in); + return -1; + } + else + { + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, + "Found It in InitMap!"); + } + + if (it -> second != proxy) + { + // Init for the wrong one, what should happen. + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, + "Error Init For the wrong one! - Returning End"); + in -> PQTunnelInit::mode = PQTunnelInit::End; + addOutInitPkt(in); + return -1; + } + else + { + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, + "Proxy Matches!"); + } + + + + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, + "Sending PQTunnelProxyInitConnect unfinished!"); + + in -> PQTunnelInit::mode = PQTunnelInit::Connect; + addOutInitPkt(in); + + // remove from initmap. + initmap.erase(it); + // add to replymap. + replymap[other] = proxy; + + return 1; +} + + +int p3proxy::completeConnect(cert *other, cert *proxy, PQTunnelProxyInit *in) +{ + { + std::ostringstream out; + out << "p3proxy::completeConnect()"; + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + } + + std::map::iterator iit, rit, cit; + + // check maps. + iit = initmap.find(other); + rit = replymap.find(other); + cit = connectionmap.find(other); + + // if not in the replymap ... error.... + if (replymap.end() == rit) + { + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, + "Not expecting Reply Pkt - Sending End"); + // Send Error. + + in -> PQTunnelInit::mode = PQTunnelInit::End; + addOutInitPkt(in); + + return -1; + } + + if (proxy != rit -> second) + { + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, + "Expect Reply from different Proxy - Sending End"); + // Send Error. + + in -> PQTunnelInit::mode = PQTunnelInit::End; + addOutInitPkt(in); + + return -1; + } + + // if in any other maps... error. + if ((iit != initmap.end()) || (cit != connectionmap.end())) + { + std::ostringstream out; + + out << "Found Target in other list! - Sending End"; + out << std::endl; + + if (iit != initmap.end()) + { + out << "Target in InitMap!" << std::endl; + initmap.erase(iit); + } + if (rit != replymap.end()) + { + out << "Target in ReplyMap (expected)!" << std::endl; + replymap.erase(rit); + } + if (cit != connectionmap.end()) + { + connectionmap.erase(cit); + out << "Target in ConnectionMap!" << std::endl; + } + + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone,out.str()); + + in -> PQTunnelInit::mode = PQTunnelInit::End; + addOutInitPkt(in); + + return -1; + } + + // remove cos the attempt has either failed or succeeded. + replymap.erase(rit); + + std::map::iterator pit; + if(proxymap.end() == (pit = proxymap.find(other))) + { + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, + "Couldn't Find PqiProxy"); + // Error. + return -1; + } + + // At this point we should check the correctness + // of the response to the challenge... + + // if okay, save -> and we are connected. + connectionmap[other] = proxy; + + // tell the pqiproxy that it can send. + + /* call the virtual fn */ + connectionCompletedAsPeer(proxy, other); + /* notify the pqiproxy */ + (pit -> second) -> connected(passivemap[other]); + + + { + std::ostringstream out; + out << "Proxy Connection Complete!" << std::endl; + out << "Destination: " << other -> Name() << std::endl; + out << "Proxy: " << proxy -> Name() << std::endl; + + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone,out.str()); + } + + // at this point we can remove it from the listenqueue. + std::list::iterator lit; + if (listenqueue.end() != (lit = std::find(listenqueue.begin(), + listenqueue.end(), other))) + { + listenqueue.erase(lit); + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, + "Removing Cert from listenqueue"); + } + + + // and from the connectqueue. + if (connectqueue.end() != (lit = std::find(connectqueue.begin(), + connectqueue.end(), other))) + { + connectqueue.erase(lit); + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, + "Removing Cert from connectqueue"); + } + + // also clear lastproxymap + std::map::iterator lpit; + lpit = lastproxymap.find(other); + if (lpit != lastproxymap.end()) + { + lastproxymap.erase(lpit); + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, + "Cleared Last Proxy Map"); + } + + std::map::iterator ctit; + ctit = connecttimemap.find(other); + if (ctit != connecttimemap.end()) + { + connecttimemap.erase(ctit); + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, + "Cleared Connect Time Map"); + } + // clean up if we make here. + delete in; + return 1; +} + +int p3proxy::endConnect(cert *other, cert *proxy, PQTunnelProxyInit *in) +{ + { + std::ostringstream out; + out << "p3proxy::endConnect()"; + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + } + + // if we get this..... delete all references + // but only ones that exactly match both the other and the proxy. + + + // This can be sent at any point, + // we need to check all the queues. + std::map::iterator it; + if ((connectionmap.end() != (it = connectionmap.find(other))) + && (it -> second == proxy)) + { + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, + "End Matches an Active Connection: Ending"); + connectionmap.erase(it); + // if here - we must tell it to disconnect. + std::map::iterator it2; + if (proxymap.end() != (it2 = proxymap.find(other))) + { + (it2 -> second) -> disconnected(); + } + } + + // clean up initmap. + if ((initmap.end() != (it = initmap.find(other))) + && (it -> second == proxy)) + { + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, + "End Matches an InitMap item: Erasing"); + initmap.erase(it); + } + + // clean up replymap. + if ((replymap.end() != (it = replymap.find(other))) + && (it -> second == proxy)) + { + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, + "End Matches an ReplyMap item: Erasing"); + replymap.erase(it); + } + + // clean up the packet. + delete in; + return 1; +} + + +PQTunnelInit *p3proxy::sendInit() +{ + { + std::ostringstream out; + out << "p3proxy::sendInit(" << outInitPkts.size() << ")"; + pqioutput(PQL_DEBUG_ALL, pqiproxyzone, out.str()); + } + if (outInitPkts.size() < 1) + return NULL; + + PQTunnelInit *in = outInitPkts.front(); + outInitPkts.pop_front(); + { + std::ostringstream out; + out << "p3proxy::sendInit Sending:"; + in -> print(out); + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + } + return in; +} + +/* to end a proxy connection + * this sends the packet, and can be called at any time + * as it doesn't check any queues.... + * + * This is used in a ::reset() of an active connection, + * but could be used at any point the connection needs to be ended. + */ + +int p3proxy::sendEndProxyConnectionPkt(cert *other, cert *proxy) +{ + PQTunnelProxyInit *pi = createProxyInit(other, proxy); + if (!pi) + { + std::ostringstream out; + out << "p3proxy::endProxyConnection()"; + out << " Cannot create Init(END) pkt"; + pqioutput(PQL_ALERT, pqiproxyzone, out.str()); + return -1; + } + + pi -> PQTunnelInit::mode = PQTunnelInit::End; + + { + std::ostringstream out; + out << "Ending Proxy Connection(us -> "; + out << proxy->Name() << " -> "; + out << other->Name() << std::endl; + + out << "Generated ProxyInit(END):" << std::endl; + pi -> print(out); + pqioutput(PQL_ALERT, pqiproxyzone, out.str()); + } + + addOutInitPkt(pi); + return 1; +} + + // interface to pqiproxy. +int p3proxy::attach(pqiproxy *p, cert *c) +{ + { + std::ostringstream out; + out << "p3proxy::attach()"; + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + } + proxymap[c] = p; + return 1; +} + +int p3proxy::detach(pqiproxy *p, cert *c) +{ + { + std::ostringstream out; + out << "p3proxy::detach()"; + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + } + // remove this proxy from all references. + // and send a disconnect to any current connections. + std::map::iterator it; + if (proxymap.end() == (it = proxymap.find(c))) + { + return -1; + } + + // remove from init/reply/connect queues. + reset(p,c); + + // stoplistening. + stoplistening(p,c); + + // remove from connect queue. + stopconnecting(p,c); + + proxymap.erase(it); + return 1; +} + +int p3proxy::connectattempt(pqiproxy *p, cert *c) +{ + { + std::ostringstream out; + out << "p3proxy::connectattempt(pqiproxy *p,c)"; + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + } + std::list::iterator it; + if (connectqueue.end() == (it = + std::find(connectqueue.begin(), connectqueue.end(), c))) + { + std::ostringstream out; + out << "p3proxy::connectattempt() added " << c -> Name(); + out << " to the connection queue"; + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + + connectqueue.push_back(c); + connecttimemap[c] = time(NULL); + } + + // also clear lastproxymap + std::map::iterator lpit; + lpit = lastproxymap.find(c); + if (lpit != lastproxymap.end()) + { + lastproxymap.erase(lpit); + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, + "p3proxy::connectattempt(p,c) Cleared Last Proxy Map"); + } + + return 1; +} + +int p3proxy::listen(pqiproxy *p, cert *c) +{ + { + std::ostringstream out; + out << "p3proxy::listen()"; + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + } + std::map::iterator it; + if (proxymap.end() == (it = proxymap.find(c))) + { + std::ostringstream out; + out << "p3proxy::listen() Error cert: " << c->Name() << " not in ProxyMap"; + pqioutput(PQL_ALERT, pqiproxyzone, out.str()); + return -1; + } + if (it -> second != p) + { + std::ostringstream out; + out << "p3proxy::listen() Error for cert: " << c->Name() << " PqiProxy don't match"; + pqioutput(PQL_ALERT, pqiproxyzone, out.str()); + return -1; + } + + /* check it's not there already. */ + std::list::iterator lit; + lit = std::find(listenqueue.begin(), listenqueue.end(), c); + if (lit == listenqueue.end()) + { + listenqueue.push_back(c); + } + else + { + std::ostringstream out; + out << "p3proxy::listen() Error cert: " << c->Name() << " already in listenqueue"; + pqioutput(PQL_ALERT, pqiproxyzone, out.str()); + } + + return 1; +} + +int p3proxy::stoplistening(pqiproxy *p, cert *c) +{ + std::list::iterator it; + it = std::find(listenqueue.begin(), listenqueue.end(), c); + if (it == listenqueue.end()) + { + std::ostringstream out; + out << "p3proxy::stoplistening() pqiproxy not found"; + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + return -1; + } + + // remove from the listen queue, + listenqueue.erase(it); + { + std::ostringstream out; + out << "p3proxy::stoplistening() pqiproxy removed from queue"; + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + } + return 1; +} + + +int p3proxy::stopconnecting(pqiproxy *p, cert *c) +{ + std::list::iterator it; + it = std::find(connectqueue.begin(), connectqueue.end(), c); + if (it == connectqueue.end()) + { + std::ostringstream out; + out << "p3proxy::stopconnecting() pqiproxy not found"; + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + return -1; + } + + // remove from the listen queue, + connectqueue.erase(it); + + { + std::ostringstream out; + out << "p3proxy::stopconnecting() pqiproxy removed from queue"; + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + } + + // also clear lastproxymap + std::map::iterator lpit; + lpit = lastproxymap.find(c); + if (lpit != lastproxymap.end()) + { + lastproxymap.erase(lpit); + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, + "p3proxy::connectattempt(p,c) Cleared Last Proxy Map"); + } + + // and the connecttime map. + std::map::iterator tit; + tit = connecttimemap.find(c); + if (tit != connecttimemap.end()) + { + connecttimemap.erase(tit); + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, + "p3proxy::connectattempt(p,c) Cleared Connect Time Map"); + } + return 1; +} + + +int p3proxy::reset(pqiproxy *p, cert *c) +{ + { + std::ostringstream out; + out << "p3proxy::reset()"; + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + } + + + std::map::iterator pit; + std::map::iterator iit, rit, cit; + + // remove from all except the connect/listen queues. + // clean init/passive map + iit = initmap.find(c); + if (iit != initmap.end()) + { + initmap.erase(iit); + } + + pit = passivemap.find(c); + if (pit != passivemap.end()) + { + passivemap.erase(pit); + } + + // replymap? + rit = replymap.find(c); + if (rit != replymap.end()) + { + replymap.erase(rit); + } + + // connectionmap? + cit = connectionmap.find(c); + if (cit != connectionmap.end()) + { + // if it found in here... send a disconnect packet!. + sendEndProxyConnectionPkt(cit->first, cit->second); + + // remove the connection. + connectionmap.erase(cit); + } + + /* also clear the lastproxymap */ + iit = lastproxymap.find(c); + if (iit != lastproxymap.end()) + { + lastproxymap.erase(iit); + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, + "p3proxy::reset() Cleared Last Proxy Map"); + } + + // finally, remove any packets from the incoming queue. + std::map >::iterator qit; + if (inqueue.end() == (qit = inqueue.find(p))) + { + std::ostringstream out; + out << "p3proxy::reset() no inQueue"; + pqioutput(PQL_DEBUG_ALL, pqiproxyzone, out.str()); + } + else + { + while((qit -> second).size() > 0) + { + // add to existing queue. + PQTunnelProxy *pqtp = (qit -> second).front(); + (qit -> second).pop_front(); + delete pqtp; + } + } + + /* if the certificate is active and listening, put back into the listening queue */ + if ((c->Accepted()) && (c->WillListen()) && (c->Listening())) + { + std::ostringstream out; + out << "p3proxy::reset() Putting " << c -> Name() << " back onto Listening Queue"; + pqioutput(PQL_WARNING, pqiproxyzone, out.str()); + + listen(p,c); + } + else + { + std::ostringstream out; + out << "p3proxy::reset() " << c -> Name() << " Left off Listening Queue"; + pqioutput(PQL_WARNING, pqiproxyzone, out.str()); + } + + return 1; +} + + +int p3proxy::outgoingpkt(pqiproxy *p, cert *c, void *d, int size) +{ + { + std::ostringstream out; + out << "p3proxy::outgoingpkt() For: " << c -> Name(); + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + } + // find the correct address. + // -> check the connectionmap. + std::map::iterator it; + if (connectionmap.end() == (it = connectionmap.find(c))) + { + std::ostringstream out; + out << "p3proxy::outgoingpkt() Failed to Find Connection"; + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + return -1; + } + + // create pqitunnel packet + PQTunnelProxy *pqtp = createProxyPkt(c, it -> second, 000101010, (const char *) d, size); + if (pqtp == NULL) + { + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, + "Failed to Create PQTunnelProxy"); + } + + { + std::ostringstream out; + out << "p3proxy::outgoingpkt() Sending off Via: "; + out << it -> second -> Name(); + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + } + + // send it off. + outPkts.push_back(pqtp); + + // how much that we've packaged up! + return size; +} + + +int p3proxy::incomingpkt(pqiproxy *p, void *d, int maxsize) +{ + { + std::ostringstream out; + out << "p3proxy::incomingpkt()"; + pqioutput(PQL_DEBUG_ALL, pqiproxyzone, out.str()); + } + // check the incoming queue. + std::map >::iterator qit; + if (inqueue.end() == (qit = inqueue.find(p))) + { + std::ostringstream out; + out << "p3proxy::incomingpkt() Missing Queue"; + pqioutput(PQL_DEBUG_ALL, pqiproxyzone, out.str()); + return -1; + } + + if ((qit -> second).size() < 1) + { + std::ostringstream out; + out << "p3proxy::incomingpkt() Empty Queue"; + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + return -1; + } + + + // add to existing queue. + PQTunnelProxy *pqtp = (qit -> second).front(); + if (maxsize < pqtp -> size) + { + // not enough space. + + std::ostringstream out; + out << "p3proxy::incomingpkt() Not Enough Space"; + out << "to Decode to pqiproxy"; + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + return -1; + } + + (qit -> second).pop_front(); + + int size = pqtp -> size; + // copy out the tunneled stuff. + memcpy(d, pqtp -> data, size); + + std::ostringstream out; + out << "p3proxy::incomingpkt() Decoding to pqiproxy. ("; + out << size << " bytes) From Packet:" << std::endl; + out << "Ptr: " << (void *) pqtp << " DataPtr: "; + out << (void *) pqtp -> data << std::endl; + pqtp -> print(out); + + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + + // decode into pqiproxy space. + // Need to Remove Tunnel Headers. + + // XXX Should Check Signature Here. + + delete pqtp; + return size; +} + +int p3proxy::connectattempt() +{ + { + std::ostringstream out; + out << "p3proxy::connectattempt()"; + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + } + // get the list of potential connections. + std::list::iterator it; + + std::list::iterator itc; + std::list plist; + std::map::iterator lpit; + + unsigned long ct = time(NULL); + + // find the certificates, that are active. + for(it = connectqueue.begin(); it != connectqueue.end();) + { + // If not currently querying, + if ((initmap.end() == initmap.find(*it)) && + (replymap.end() == replymap.find(*it))) + { + /* find last proxy - if there is one */ + lpit = lastproxymap.find(*it); + cert *lastproxy = NULL; + if (lpit != lastproxymap.end()) + { + lastproxy = lpit->second; + } + + if (0 < nextconnectattempt(*it, lastproxy)) + { + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, + "Successful Proxy Connect Attempt"); + it++; + } + else + { + /* clear the lastproxymap - either way (so it restarts) */ + lpit = lastproxymap.find(*it); + if (lpit != lastproxymap.end()) + { + lastproxymap.erase(lpit); + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, + "Cleared Last Proxy Map"); + } + else + { + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, + "Nothing in Last Proxy Map"); + } + + // check the connecttime map + std::map::iterator tit; + tit = connecttimemap.find(*it); + if ((tit == connecttimemap.end()) || + (tit->second + P3PROXY_CONNECT_TIMEOUT < ct)) + { + // remove from lists... + + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, + "Failed Proxy Connect Attempt"); + // notify the pqiproxy that it didn't connect. + std::map::iterator pit; + if (proxymap.end() != (pit = proxymap.find(*it))) + { + // notify. + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, + "Notify pqiproxy of failure"); + pit -> second -> disconnected(); + } + else + { + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, + "ERROR - Unknown pqiproxy"); + } + // delete connect attempt. + it = connectqueue.erase(it); + + // delete the connecttimemap. + connecttimemap.erase(tit); + } + else + { + it++; + } + + } + + } + else + { + it++; + } + } + return 1; +} + +int p3proxy::nextconnectattempt(cert *other, cert *lastproxy) +{ + { + std::ostringstream out; + out << "p3proxy::nextconnectattempt() for " << other -> Name(); + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + } + // get the list of potential connections. + + // check that it is in the connect queue. + if (connectqueue.end() == + std::find(connectqueue.begin(), connectqueue.end(), other)) + { + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, + "Missing from ConnectQueue, Cannot Connect"); + return -1; + } + + std::list::iterator it; + std::list plist = p3d -> potentialproxy(other); + + if (plist.size() == 0) + { + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, + "No Potential Proxies - Failed Connection Attempt"); + return -1; + } + else + { + for(it = plist.begin(); it != plist.end(); it++) + { + std::ostringstream out; + out << "Potential Proxy: " << (*it) -> Name(); + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + } + } + + bool next = false; + it = plist.begin(); + + /* start at start */ + if (lastproxy == NULL) + { + next = true; + } + + for(; (it != plist.end()) && (!next); it++) + { + if ((*it) == lastproxy) + { + next = true; + } + } + + if (it == plist.end()) + { + std::ostringstream out; + out << "Run out of Potential Proxies! :" << plist.size() << " in total!"; + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + return -1; + } + + + { + std::ostringstream out; + out << "Connection Attempt to: " << (*it) -> Name(); + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + } + + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, + "p3proxy::nextconnectattempt() Don't Build Correct Packets Yet!"); + + // it points to the next proxy. + // send a proxy init. + PQTunnelProxyInit *pi = createProxyInit(other, (*it)); + + { + std::ostringstream out; + out << "Generated Proxy Init:" << std::endl; + pi -> print(out); + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + } + + addOutInitPkt(pi); + + // should save the packet with the challenges. + initmap[other] = *it; + /* save the last proxy, so we can continue next time */ + lastproxymap[other] = *it; + passivemap[other] = false; + return 1; +} + +int p3proxy::addOutInitPkt(PQTunnelInit *pkt) +{ + { + std::ostringstream out; + out << "AddOutInitPkt(" << (void *) pkt << ")" << std::endl; + pkt -> print(out); + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + } + outInitPkts.push_back(pkt); + return 1; +} + + + +int p3proxy::tick() +{ + { + std::ostringstream out; + out << "p3proxy::tick()"; + pqioutput(PQL_DEBUG_ALL, pqiproxyzone, out.str()); + } + // check for incoming. + processincoming(); + + // handle any new connections. + connectattempt(); + + status(); + return 1; +} + +int p3proxy::status() +{ + std::ostringstream out; + out << "p3proxy::status()"; + out << std::endl; + + /* show all the details + * in all of these container classes + */ + + if (proxymap.size() > 0) + { + out << std::endl; + out << "p3proxy::status() proxymap entries:"; + out << std::endl; + } + std::map::iterator cpit; + for(cpit = proxymap.begin(); cpit != proxymap.end(); ++cpit) + { + out << "\t" << cpit->first->Name(); + out << std::endl; + } + + if (listenqueue.size() > 0) + { + out << std::endl; + out << "p3proxy::status() listenqueue entries:"; + out << std::endl; + } + std::list::iterator it; + for(it = listenqueue.begin(); it != listenqueue.end(); ++it) + { + out << "\t" << (*it)->Name(); + out << std::endl; + } + + if (connectqueue.size() > 0) + { + out << std::endl; + out << "p3proxy::status() connectqueue entries:"; + out << std::endl; + } + for(it = connectqueue.begin(); it != connectqueue.end(); ++it) + { + out << "\t" << (*it)->Name(); + out << std::endl; + } + if (connecttimemap.size() > 0) + { + out << std::endl; + out << "p3proxy::status() connecttimemap entries:"; + out << std::endl; + } + std::map::iterator ctit; + int ct = time(NULL); + for(ctit = connecttimemap.begin(); ctit != connecttimemap.end(); ++ctit) + { + out << "\t" << ctit->first->Name() << " : " << ct - ctit->second << " sec ago"; + out << std::endl; + } + + std::map::iterator ccit; + if (lastproxymap.size() > 0) + { + out << std::endl; + out << "p3proxy::status() lastproxymap entries:"; + out << std::endl; + } + for(ccit = lastproxymap.begin(); + ccit != lastproxymap.end(); ++ccit) + { + out << "us -> " << ccit->second->Name(); + out << " -> " << ccit->first->Name(); + out << std::endl; + } + + if (initmap.size() > 0) + { + out << std::endl; + out << "p3proxy::status() initmap entries:"; + out << std::endl; + } + for(ccit = initmap.begin(); ccit != initmap.end(); ++ccit) + { + out << "us -> " << ccit->second->Name(); + out << " -> " << ccit->first->Name(); + out << std::endl; + } + + if (replymap.size() > 0) + { + out << std::endl; + out << "p3proxy::status() replymap entries:"; + out << std::endl; + } + for(ccit = replymap.begin(); ccit != replymap.end(); ++ccit) + { + out << "us -> " << ccit->second->Name(); + out << " -> " << ccit->first->Name(); + out << std::endl; + } + + if (connectionmap.size() > 0) + { + out << std::endl; + out << "p3proxy::status() connectionmap entries:"; + out << std::endl; + } + for(ccit = connectionmap.begin(); + ccit != connectionmap.end(); ++ccit) + { + out << "us -> " << ccit->second->Name(); + out << " -> " << ccit->first->Name(); + out << std::endl; + } + + if (passivemap.size() > 0) + { + out << std::endl; + out << "p3proxy::status() passivemap entries:"; + out << std::endl; + } + std::map::iterator pmit; + for(pmit = passivemap.begin(); pmit != passivemap.end(); ++pmit) + { + out << pmit->first->Name(); + out << " -> " << (void *) ccit->second; + out << std::endl; + } + + if (proxyconnect.size() > 0) + { + out << std::endl; + out << "p3proxy::status() proxyconnect entries:"; + out << std::endl; + } + std::map, int>::iterator pit; + for(pit = proxyconnect.begin(); pit != proxyconnect.end(); ++pit) + { + out << "pair< " << pit->first.first->Name(); + out << ", " << pit->first.second->Name(); + out << "> -> " << pit->second; + out << std::endl; + } + + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + + return 1; +} + + +int p3proxy::processincoming() +{ + { + std::ostringstream out; + out << "p3proxy::processincoming()"; + pqioutput(PQL_DEBUG_ALL, pqiproxyzone, out.str()); + } + // read packets. + // run the through the filters. + // + // catch any control packets. + // send notification. + // + // pack packets in correct queue. + return 1; +} + +int p3proxy::sendProxyInit(cert *c) +{ + { + std::ostringstream out; + out << "p3proxy::sendProxyInit()"; + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + } + // create a proxyInit packet. + // send it off. + return 1; +} + +/************************ PQI PROXY *************************/ + +pqipeerproxy::pqipeerproxy(cert *c, p3proxy *l, PQInterface *parent) + :pqiproxy(c, l), NetBinInterface(parent, c), active(false) +{ + { + std::ostringstream out; + out << "pqipeerproxy::pqipeerproxy()"; + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + } + + // register a potential proxy connection. + p3p -> attach(this, c); + + // create a temp pkt. + maxpktlen = pqipkt_maxsize(); + pkt = (void *) malloc(maxpktlen); + pktlen = pktn = 0; + + return; +} + +pqipeerproxy::~pqipeerproxy() +{ + { + std::ostringstream out; + out << "pqipeerproxy::~pqipeerproxy()"; + pqioutput(PQL_ALERT, pqiproxyzone, out.str()); + } + // remove references to us. + p3p -> detach(this, sslcert); + if (pkt) + free(pkt); + return; +} + + // pqiconnect Interface. +int pqipeerproxy::connectattempt() +{ + { + std::ostringstream out; + out << "pqipeerproxy::connectattempt()"; + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + } + + p3p -> connectattempt(this, sslcert); + + return 1; +} + +int pqipeerproxy::connected(bool cMode) +{ + { + std::ostringstream out; + out << "pqipeerproxy::connected()"; + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + } + active = true; + connect_mode = cMode; + if (parent()) + { + parent() -> notifyEvent(this, CONNECT_SUCCESS); + } + return 1; +} + + +int pqipeerproxy::listen() +{ + { + std::ostringstream out; + out << "pqipeerproxy::listen()"; + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + } + return p3p -> listen(this, sslcert); +} + +int pqipeerproxy::stoplistening() +{ + { + std::ostringstream out; + out << "pqipeerproxy::stoplistening()"; + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + } + return p3p -> stoplistening(this, sslcert); +} + +int pqipeerproxy::reset() +{ + { + std::ostringstream out; + out << "pqipeerproxy::reset()"; + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + } + p3p -> reset(this, sslcert); + /* also flag as inactive */ + active = false; + return 1; +} + +int pqipeerproxy::disconnected() +{ + { + std::ostringstream out; + out << "pqipeerproxy::disconnected()"; + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + } + active = false; + if (parent()) + { + parent() -> notifyEvent(this, CONNECT_FAILED); + } + return 1; +} + +// called when?? +int pqipeerproxy::disconnect() +{ + { + std::ostringstream out; + out << "pqipeerproxy::disconnect()"; + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + } + disconnected(); + return 1; +} + + + + // Overloaded from PQInterface +int pqipeerproxy::status() +{ + { + std::ostringstream out; + out << "pqipeerproxy::status()"; + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + } + return 1; +} + +int pqipeerproxy::tick() +{ + { + std::ostringstream out; + out << "pqipeerproxy::tick()"; + pqioutput(PQL_DEBUG_ALL, pqiproxyzone, out.str()); + } + //pqistreamer::tick(); + //more to do??? + + return 1; +} + +cert * pqipeerproxy::getContact() +{ + { + std::ostringstream out; + out << "pqipeerproxy::getContact()"; + pqioutput(PQL_DEBUG_ALL, pqiproxyzone, out.str()); + } + return sslcert; +} + + +// overloaded from pqistreamer..... +int pqipeerproxy::senddata(void *d, int n) +{ + { + std::ostringstream out; + out << "pqipeerproxy::senddata(" << d << "," << n << ")"; + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + } + return p3p -> outgoingpkt(this, sslcert, d, n); +} + +int pqipeerproxy::readdata(void* d, int n) +{ + { + std::ostringstream out; + out << "pqipeerproxy::readdata(" << d << "," << n << ")"; + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + } + + if (pktlen == 0) + { + if (!moretoread()) + { + std::ostringstream out; + out << "pqipeerproxy::readdata -> Nothing There"; + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + + return 0; + } + } + + std::ostringstream out; + out << "pqipeerproxy::readdata -> Data Used (" << pktn << "/"; + out << pktlen << ")" << std::endl; + + int size = pktlen - pktn; + if (size > n) + size = n; + + char *start = (char *) pkt; + start += pktn; + + memcpy(d, start, size); + + out << "pqipeerproxy::readdata -> Allowing "; + out << size << " bytes out" << std::endl; + + pktn += size; + if (pktn == pktlen) + { + // flag empty packet. + pktn = pktlen = 0; + out << "pqipeerproxy::readdata -> Finished the Packet!"; + } + + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + + return size; +} + +int pqipeerproxy::netstatus() +{ + { + std::ostringstream out; + out << "pqipeerproxy::netstatus() => Always True"; + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + } + return 1; +} + +int pqipeerproxy::isactive() +{ + { + std::ostringstream out; + out << "pqipeerproxy::isactive() => "; + + if (active) out << "True"; + else out << "False"; + + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + } + return active; +} + +bool pqipeerproxy::moretoread() +{ + { + std::ostringstream out; + out << "pqipeerproxy::moretoread()"; + pqioutput(PQL_DEBUG_ALL, pqiproxyzone, out.str()); + } + // if haven't finished the current packet, + // return true. + if ((pkt != NULL) && (pktlen != 0) && (pktn < pktlen)) + { + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, + "More to Read"); + return true; + } + + // else packet is empty. + int size = 0; + if (0 < (size = p3p -> incomingpkt(this, pkt, maxpktlen))) + { + // we've got some more. + std::stringstream out; + out << "pqipeerproxy::moretoread()"; + out << "Got Another Packet (" << size << " bytes)"; + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + + pktlen = size; + pktn = 0; + return true; + } + + pqioutput(PQL_DEBUG_ALL, pqiproxyzone, + "Nothing to Read"); + return false; +} + +bool pqipeerproxy::cansend() +{ + // cansend.... hard to catch + // if the data's being cached on the way... + // most likely to be locally. + + { + std::ostringstream out; + out << "pqipeerproxy::cansend Always returns 1"; + pqioutput(PQL_DEBUG_ALL, pqiproxyzone, out.str()); + } + + return 1; +} + + + // The interface to p3proxy. +int pqipeerproxy::notifyEvent(int type) +{ + { + std::ostringstream out; + out << "pqipeerproxy::notifyEvent(" << type << ")"; + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + } + + switch(type) + { + case CONNECT_RECEIVED: + case CONNECT_SUCCESS: + active = true; + break; + + case CONNECT_FAILED: + default: + active = false; + break; + } + + // notify the parent. + if (parent()) + { + parent() -> notifyEvent(this, type); + } + return 1; +} + + +/********************** CERT SIGNS *************************/ + +cert *p3proxy::findcert(certsign &cs) +{ + pqioutput(PQL_DEBUG_BASIC,pqiproxyzone, + "p3proxy::findcert()"); + + cert *c = sroot -> findcertsign(cs); + return c; +} + +PQTunnelProxyInit *p3proxy::createProxyInit(cert *dest, cert *proxy) +{ + PQTunnelProxyInit *pi = new PQTunnelProxyInit(); + + { + std::ostringstream out; + out << "p3proxy::createProxyInit()" << std::endl; + out << "Dest: " << dest -> Name() << std::endl; + out << "Proxy: " << proxy -> Name() << std::endl; + out << "Src: " << (sroot -> getOwnCert()) -> Name(); + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + } + + + // Fill In certificates + if ((!sroot -> getcertsign(dest, pi -> dest)) || + (!sroot -> getcertsign(proxy, pi -> proxy)) || + (!sroot -> getcertsign(sroot -> getOwnCert(), pi -> src))) + { + delete pi; + return NULL; + } + + // fill in the challenge. + // with randoms; + int i; + for(i = 0; i < PQI_PROXY_CHALLENGE_SIZE; i++) + { + pi -> challenge[i] = (unsigned char) + (256.0*rand()/(RAND_MAX+1.0)); + } + + // ProxyInit Details. + cert *o = sroot -> getOwnCert(); + pi -> cid = proxy -> cid; // destination. + pi -> p = o; // from us. + + // Sign it..... XXX to do. + + + return pi; +} + + +PQTunnelProxy *p3proxy::createProxyPkt(cert *dest, cert *proxy, long nextseq, + const char *data, int size) +{ + PQTunnelProxy *pi = new PQTunnelProxy(); + cert *o = sroot -> getOwnCert(); + + { + std::ostringstream out; + out << "p3proxy::createProxyPkt()" << std::endl; + out << "Dest: " << dest -> Name() << std::endl; + out << "Proxy: " << proxy -> Name() << std::endl; + out << "Src: " << o -> Name() << std::endl; + out << "Seq: " << nextseq << std::endl; + out << "Data: " << (void *) data << std::endl; + out << "Size: " << size << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + } + + // Fill in Details.... + // PQItem + if ((!sroot -> getcertsign(dest, pi -> dest)) || + (!sroot -> getcertsign(o, pi -> src))) + { + std::ostringstream out; + out << "p3proxy::createProxyPkt()"; + out << " Error: Failed to Get Signatures..."; + pqioutput(PQL_DEBUG_BASIC, pqiproxyzone, out.str()); + + delete pi; + return NULL; + } + + // initialise packets. + pi -> sid = 0; // doesn't matter. + pi -> cid = proxy -> cid; // destination. + pi -> p = o; // from us; + pi -> seq = nextseq; + + // ProxyInit Details. + pi -> data = malloc(size); + memcpy(pi -> data, data, size); + pi -> size = size; + + // Sign Packet. + + return pi; +} + diff --git a/libretroshare/src/pqi/pqiproxy.h b/libretroshare/src/pqi/pqiproxy.h new file mode 100644 index 000000000..4df4827d0 --- /dev/null +++ b/libretroshare/src/pqi/pqiproxy.h @@ -0,0 +1,376 @@ +/* + * "$Id: pqiproxy.h,v 1.7 2007-02-18 21:46:49 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + +#ifndef MRK_PQI_PROXY_HEADER +#define MRK_PQI_PROXY_HEADER + + +#include + + +#include +#include +#include + +#include "pqi/pqi.h" + +#include "pqi/pqiperson.h" +#include "pqi/pqitunnel.h" +#include "pqi/pqitunnelproxy.h" + +class cert; + +class pqiproxy; +class pqifilter; + +class p3disc; + +// PQItem derived classes. +class PQTunnelInit; +class PQTunnelProxyInit; + +class PQTunnel; +class PQTunnelProxy; + +/* + * #ifdef PQI_USE_XPGP + * #include "xpgpcert.h" + */ + +class p3proxy : public PQTunnelService +{ + public: + + p3proxy(p3disc *p) + :PQTunnelService(PQI_TUNNEL_PROXY_TYPE), p3d(p) + { + sroot = getSSLRoot(); + return; + } + +virtual ~p3proxy() { return; } + + // PQTunnelService Overloading. +virtual int receive(PQTunnel *); +virtual PQTunnel * send(); + +virtual int receive(PQTunnelInit *); +virtual PQTunnelInit * sendInit(); + + // interface to pqiproxy. +int attach(pqiproxy *p, cert *c); +int detach(pqiproxy *p, cert *c); + +int listen(pqiproxy *p, cert *c); +int stoplistening(pqiproxy *p, cert *c); +int stopconnecting(pqiproxy *p, cert *c); + +int reset(pqiproxy *p, cert *c); + +int outgoingpkt(pqiproxy *p, cert *, void *d, int size); +int incomingpkt(pqiproxy *p, void *d, int maxsize); + +// overloaded from many sources. +virtual int tick(); + +int status(); + +int connectattempt(pqiproxy*, cert*); +int connectattempt(); +int nextconnectattempt(cert *, cert *); + + protected: + + // Fn to translate the sig to a cert. +bool filter(PQTunnelProxy *in); + +cert *findcert(certsign &cs); + +PQTunnelProxyInit *createProxyInit(cert *dest, cert *proxy); +PQTunnelProxy *createProxyPkt(cert *dest, cert *proxy, long nextseq, + const char *data, int size); + + // Register Connections for which we are the Proxy. + // (only channels registered this way can send proxy packets) +int registerProxyConnection(cert *src, cert *proxy, + cert *dest, PQTunnelProxyInit *pinit); + // indicates if a proxy connection has been established. +int isConnection(cert *src, cert *dest); + + // Init Proxy Connections. +int respondConnect(cert *o, cert *p, PQTunnelProxyInit *in); +int completeConnect(cert *o, cert *p, PQTunnelProxyInit *in); +int endConnect(cert *o, cert *p, PQTunnelProxyInit *in); + + // process incoming. +virtual int processincoming(); + + // Overload to provide alternative behaviour. + // These fns are called from receive(PQTunnel *); +virtual int connectionCompletedAsProxy(cert *n1, cert *n2) { return 1; } +virtual int connectionCompletedAsPeer(cert *proxy, cert *peer) { return 1; } + + + // Overload to provide alternative behaviour. + // These fns are called from receive(PQTunnel *); +virtual int receiveAsProxy(PQTunnelProxy* pqtp, cert *src, cert *dest); +virtual int receiveAsDestination(PQTunnelProxy* pqtp, + cert *src, cert *from, cert *dest, pqiproxy *pqip); + +virtual int receiveAsError(PQTunnelProxy* pqtp, cert *src, cert *from, cert *dest); + + // Proxy Control functions. +int sendProxyInit(cert *c); + + // Fn to send +int sendEndProxyConnectionPkt(cert *other, cert *proxy); + + bool active; + + // the registered proxies. + // All of these maps are + // indexed by the destination, not the proxy. + // which is the second cert is some cases. + + std::map proxymap; + std::list listenqueue; // the ones to listen for. + std::list connectqueue; // the ones to attempt to connect. + std::map initmap; // ones we sent init, wait for init. + std::map replymap; // ones that need a auth reply. + std::map connectionmap; + std::map lastproxymap; + std::map connecttimemap; // timeout map. + std::map passivemap; // who inited connection. + + // double direction map. + //std::map outmap; + std::map > inqueue; + + // filters. (remove bad packets/cache data). + std::list filters; + + // Map of the connections we are proxy for. + std::map, int> proxyconnect; + + p3disc *p3d; // needed to find proxies. + sslroot *sroot; // for certificate references. + + // input fn for details. +int addOutInitPkt(PQTunnelInit *pkt); + + std::list outPkts; + std::list outInitPkts; + +}; + + + +// pqiconnect, derives from pqistreamer/PQInterface. +// +// this class needs to provide. +// 1) read/write data. +// 2) connect functions. + +// base interface for pqiproxy.... +class pqiproxy +{ +public: + pqiproxy(cert *c, p3proxy *l) + :sslcert(c), p3p(l) { return; } +virtual ~pqiproxy() { return; } + + // The interface to p3proxy. +virtual int notifyEvent(int type) = 0; + + // notification from p3proxy. +virtual int connected(bool active) = 0; +virtual int disconnected() = 0; + + protected: + cert *sslcert; + p3proxy *p3p; +}; + + + +/* use a common peer as a proxy, to pass messages + * between proxied peers. + */ + +class pqipeerproxy: public pqiproxy, public NetBinInterface +{ +public: + pqipeerproxy(cert *c, p3proxy *l, PQInterface *parent); +virtual ~pqipeerproxy(); + + // Net Interface. +virtual int connectattempt(); +virtual int listen(); +virtual int stoplistening(); +virtual int reset(); +virtual int disconnect(); + + // Overloaded from PQInterface +virtual int status(); +virtual int tick(); +virtual cert * getContact(); + + // Bin Interface. +virtual int senddata(void*, int); +virtual int readdata(void*, int); +virtual int netstatus(); +virtual int isactive(); +virtual bool moretoread(); +virtual bool cansend(); + + // The interface to p3proxy. +virtual int notifyEvent(int type); + + // notification from p3proxy. +virtual int connected(bool active); +virtual int disconnected(); + +protected: + + /* data */ + //p3proxy *p3p; + + bool active; + int connect_mode; + + void *pkt; + int maxpktlen; + int pktlen; + int pktn; + +}; + + +/* Documenting the virtual (proxy) pqi interface. + * + * This is used to create proxy interface + * for people behind firewalls. + * + * There are two options for such an + * interface. + * 1) Encrypted Tunneling - This has the + * the advantage/disadvantage that it + * allows multiple layers of proxying, + * and very private. + * + * 2) Open Proxying - This lets people + * see the data, and allows restriction to one + * layer. This option allow the proxier, + * to collect the files passing through. + * (benefit for allowing proxying). + * + * As this option will less impact on the + * persons bandwidth, and give them some + * benefit, it'll be implemented first. + * + * The data will be saved in a cache, + * with a first in, first out policy, + * + * maybe show a window of cached files, + * and allow the user to save any from + * a list. + * + * So to do this we need + * i) a cache system. + * ii) extra message types to indicate + * proxied files, and searches etc. + * iii) a proxy server, to handle proxy messages. + * + * actually, this class will need to + * + * a proxy interface in someway or another. + * + * + * P1 PROXY P2 + * requests a + * proxy interface. + * ---------> + * end attempt <----- IF Not + * Available. + * + * else ---------------> Check for proxy/person auth + * end attempt <------ cancel ------- If Not Auth. + * + * else, if allowed. + * build proxy server. + * Build proxy <------ setup ---------- send okay + * server connection. + * + * pqissl. + * -> proxy interface. + * Send() + * return proxymsg locally + * pulled by proxy server. + * + * ps -> send proxy msg + * to correct pqissl. + * ----------> popped out to + * the proxy server. + * if file cache. + * redirect ------> recieved by pqissl. + * pulled by proxy server. + * + * proxy server + * + * all proxied information is + * going to be signed/or encrypted. + * + * very simple - that is the only + * necessary change. + * + * proxy msg. + * --------------------- + * type : init + * end + * msg (signed) + * tunnelled (includes init of ssl.) + * dest cert signature: + * + * encryption/signature mode. + * + * signature len: + * signature: + * + * data len: + * data + * + * + * + * + * + * is this the right place to add it? + * or is pqistreamer the answer. + * + */ + +#endif + diff --git a/libretroshare/src/pqi/pqisecurity.cc b/libretroshare/src/pqi/pqisecurity.cc new file mode 100644 index 000000000..fadc96424 --- /dev/null +++ b/libretroshare/src/pqi/pqisecurity.cc @@ -0,0 +1,69 @@ +/* + * "$Id: pqisecurity.cc,v 1.3 2007-02-18 21:46:49 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "pqi/pqisecurity.h" + + +// Can keep the structure hidden.... +// but won't at the moment. + +// functions for checking what is allowed... +// currently these are all dummies. + + +std::string secpolicy_print(SecurityPolicy *) +{ + return std::string("secpolicy_print() Implement Me Please!"); +} + +SecurityPolicy * secpolicy_create() +{ + return (SecurityPolicy *) malloc(sizeof(SecurityPolicy)); +} + +int secpolicy_delete(SecurityPolicy *p) +{ + free(p); + return 1; +} + + +int secpolicy_limit(SecurityPolicy *limiter, + SecurityPolicy *alter) +{ + return 1; +} + +int secpolicy_check(SecurityPolicy *, int type_transaction, + int direction) +{ + return 1; +} + + + diff --git a/libretroshare/src/pqi/pqisecurity.h b/libretroshare/src/pqi/pqisecurity.h new file mode 100644 index 000000000..71cac4ef6 --- /dev/null +++ b/libretroshare/src/pqi/pqisecurity.h @@ -0,0 +1,56 @@ +/* + * "$Id: pqisecurity.h,v 1.3 2007-02-18 21:46:49 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + +#ifndef MRK_PQI_SECURITY_HEADER +#define MRK_PQI_SECURITY_HEADER + +#include "pqi/pqi.h" +#include "pqi/pqipacket.h" + +#define PQI_INCOMING 2 +#define PQI_OUTGOING 5 + +//structure. +typedef struct sec_policy +{ + int searchable; // flags indicate how searchable we are.. +} SecurityPolicy; + +// functions for checking what is allowed... +// + +std::string secpolicy_print(SecurityPolicy *); +SecurityPolicy * secpolicy_create(); +int secpolicy_delete(SecurityPolicy *); +int secpolicy_limit(SecurityPolicy *limiter, + SecurityPolicy *alter); +int secpolicy_check(SecurityPolicy *, int type_transaction, + int direction); + + +#endif + diff --git a/libretroshare/src/pqi/pqissl.cc b/libretroshare/src/pqi/pqissl.cc new file mode 100644 index 000000000..5dc667359 --- /dev/null +++ b/libretroshare/src/pqi/pqissl.cc @@ -0,0 +1,2417 @@ +/* + * "$Id: pqissl.cc,v 1.28 2007-03-17 19:32:59 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "pqi/pqissl.h" +#include "pqi/pqinetwork.h" + +#include +#include + +#include "pqi/pqidebug.h" +#include + +#include "pqi/pqissllistener.h" + +const int pqisslzone = 37714; + +/********* +#define WAITING_NOT 0 +#define WAITING_LOCAL_ADDR 1 +#define WAITING_REMOTE_ADDR 2 +#define WAITING_SOCK_CONNECT 3 +#define WAITING_SSL_CONNECTION 4 +#define WAITING_SSL_AUTHORISE 5 +#define WAITING_FAIL_INTERFACE 6 + + +#define PQISSL_PASSIVE 0x00 +#define PQISSL_ACTIVE 0x01 + +const int PQISSL_LOCAL_FLAG = 0x01; +const int PQISSL_REMOTE_FLAG = 0x02; +const int PQISSL_UDP_FLAG = 0x02; +***********/ + +static const int PQISSL_MAX_READ_ZERO_COUNT = 20; +static const int PQISSL_SSL_CONNECT_TIMEOUT = 30; + +/********** PQI SSL STUFF ****************************************** + * + * A little note on the notifyEvent(FAILED).... + * + * this is called from + * (1) reset if needed! + * (2) Determine_Remote_Address (when all options have failed). + * + * reset() is only called when a TCP/SSL connection has been + * established, and there is an error. If there is a failed TCP + * connection, then an alternative address can be attempted. + * + * reset() is called from + * (1) destruction. + * (2) disconnect() + * (3) bad waiting state. + * + * // TCP/or SSL connection already established.... + * (5) pqissl::SSL_Connection_Complete() <- okay -> cos we made a TCP connection already. + * (6) pqissl::accept() <- okay cos something went wrong. + * (7) moretoread()/cansend() <- okay cos + * + */ + +pqissl::pqissl(cert *c, pqissllistener *l, PQInterface *parent) + :NetBinInterface(parent, c), + waiting(WAITING_NOT), active(false), certvalid(false), + sslmode(PQISSL_ACTIVE), ssl_connection(NULL), sockfd(-1), + sslcert(c), sslccr(NULL), pqil(l), // no init for remote_addr. + readpkt(NULL), pktlen(0), + attempt_ts(0), + net_attempt(0), net_failure(0), net_unreachable(0), + sameLAN(false), n_read_zero(0) + +{ + sslccr = getSSLRoot(); + + // check certificate +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + sslccr -> validateCertificateXPGP(sslcert); +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + sslccr -> validateCertificate(sslcert); +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + + if (!(sslcert -> Valid())) + { + pqioutput(PQL_ALERT, pqisslzone, + "pqissl::Warning Certificate Not Approved!"); + + pqioutput(PQL_ALERT, pqisslzone, + "\t pqissl will not initialise...."); + + } + + return; +} + + pqissl::~pqissl() +{ + pqioutput(PQL_ALERT, pqisslzone, + "pqissl::~pqissl -> destroying pqissl"); + stoplistening(); /* remove from pqissllistener only */ + reset(); + return; +} + + +/********** Implementation of NetInterface *************************/ + +int pqissl::connectattempt() +{ + // reset failures + net_failure = 0; + return ConnectAttempt(); +} + +// tells pqilistener to listen for us. +int pqissl::listen() +{ + if (pqil) + { + return pqil -> addlistenaddr(sslcert, this); + } + return 0; +} + +int pqissl::stoplistening() +{ + if (pqil) + { + pqil -> removeListenPort(sslcert); + } + return 1; +} + +int pqissl::disconnect() +{ + return reset(); +} + +// put back on the listening queue. +int pqissl::reset() +{ + std::ostringstream out; + + /* a reset shouldn't cause us to stop listening + * only reasons for stoplistening() are; + * + * (1) destruction. + * (2) connection. + * (3) WillListen state change + * + */ + + out << "pqissl::reset():" << sslcert -> Name() << std::endl; + + out << "pqissl::reset() State Before Reset:" << std::endl; + out << "\tActive: " << (int) active << std::endl; + out << "\tsockfd: " << sockfd << std::endl; + out << "\twaiting: " << waiting << std::endl; + out << "\tssl_con: " << ssl_connection << std::endl; + out << std::endl; + + bool neededReset = false; + + if (ssl_connection != NULL) + { + out << "pqissl::reset() Shutting down SSL Connection"; + out << std::endl; + SSL_shutdown(ssl_connection); + + neededReset = true; + } + + if (sockfd > 0) + { + out << "pqissl::reset() Shutting down (active) socket"; + out << std::endl; + net_internal_close(sockfd); + sockfd = -1; + neededReset = true; + } + active = false; + sockfd = -1; + waiting = WAITING_NOT; + ssl_connection = NULL; + sameLAN = false; + n_read_zero = 0; + + if (neededReset) + { + out << "pqissl::reset() Reset Required!" << std::endl; + out << "pqissl::reset() Will Attempt notifyEvent(FAILED)"; + out << std::endl; + } + + out << "pqissl::reset() Complete!" << std::endl; + pqioutput(PQL_ALERT, pqisslzone, out.str()); + + // notify people of problem! + // but only if we really shut something down. + if (neededReset) + { + // clean up the streamer + if (parent()) + { + parent() -> notifyEvent(this, NET_CONNECT_FAILED); + } + } + return 1; +} + + +/********** End of Implementation of NetInterface ******************/ +/********** Implementation of BinInterface ************************** + * Only status() + tick() are here ... as they are really related + * to the NetInterface, and not the BinInterface, + * + */ + +/* returns ... + * -1 if inactive. + * 0 if connecting. + * 1 if connected. + */ + +int pqissl::status() +{ + int alg; + + std::ostringstream out; + out << "pqissl::status()"; + if (active) + { + out << " active: " << std::endl; + // print out connection. + out << "Connected TO : "; + sslccr -> printCertificate(sslcert, out); + + // print out cipher. + out << "\t\tSSL Cipher:" << SSL_get_cipher(ssl_connection); + out << " (" << SSL_get_cipher_bits(ssl_connection, &alg); + out << ":" << alg << ") "; + out << "Vers:" << SSL_get_cipher_version(ssl_connection); + out << std::endl; + out << std::endl; + + } + else + { + out << " Waiting for connection!" << std::endl; + } + + out << "pqissl::cert status : " << sslcert -> Status() << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqisslzone, out.str()); + + if (active) + { + return 1; + } + else if (waiting > 0) + { + return 0; + } + return -1; +} + + // tick...... +int pqissl::tick() +{ + //pqistreamer::tick(); + + // continue existing connection attempt. + if (!active) + { + // if we are waiting.. continue the connection (only) + if (waiting > 0) + { + std::ostringstream out; + out << "pqissl::tick() "; + out << "Continuing Connection Attempt!"; + pqioutput(PQL_DEBUG_BASIC, pqisslzone, out.str()); + + ConnectAttempt(); + return 1; + } + } + return 1; +} + +/********** End of Implementation of BinInterface ******************/ +/********** Internals of SSL Connection ****************************/ + + +int pqissl::ConnectAttempt() +{ + switch(waiting) + { + case WAITING_NOT: + + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissl::ConnectAttempt() STATE = Not Waiting, starting connection"); + + sslmode = PQISSL_ACTIVE; /* we're starting this one */ + return Request_Proxy_Connection(); + + break; + case WAITING_PROXY_CONNECT: + + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissl::ConnectAttempt() STATE = Proxy Wait."); + + return Check_Proxy_Connection(); + + break; + case WAITING_LOCAL_ADDR: + + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissl::ConnectAttempt() STATE = Waiting Local Addr"); + + return Determine_Local_Address(); + + case WAITING_REMOTE_ADDR: + + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissl::ConnectAttempt() STATE = Waiting Remote Addr"); + + return Determine_Remote_Address(); + + case WAITING_SOCK_CONNECT: + + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissl::ConnectAttempt() STATE = Waiting Sock Connect"); + + return Initiate_SSL_Connection(); + break; + + case WAITING_SSL_CONNECTION: + + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissl::ConnectAttempt() STATE = Waiting SSL Connection"); + + return Authorise_SSL_Connection(); + break; + + case WAITING_SSL_AUTHORISE: + + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissl::ConnectAttempt() STATE = Waiting SSL Authorise"); + + return Authorise_SSL_Connection(); + break; + case WAITING_FAIL_INTERFACE: + + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissl::ConnectAttempt() Failed - Retrying"); + + return Reattempt_Connection(); + break; + + + default: + pqioutput(PQL_ALERT, pqisslzone, + "pqissl::ConnectAttempt() STATE = Unknown - Reset"); + + reset(); + break; + } + pqioutput(PQL_ALERT, pqisslzone, "pqissl::ConnectAttempt() Unknown"); + + return -1; +} + +/****************************** REQUEST LOCAL ADDR ************************** + * Start Transaction. + * + * Specifics: + * TCP / UDP + * TCP - null interface. + * UDP - Proxy Connection and Exchange of Stunned addresses. + * + * X509 / XPGP - Same. + * + */ +int pqissl::Request_Proxy_Connection() +{ + waiting = WAITING_REMOTE_ADDR; + return Determine_Remote_Address(); +} + +int pqissl::Check_Proxy_Connection() +{ + waiting = WAITING_REMOTE_ADDR; + return Determine_Remote_Address(); +} + +int pqissl::Request_Local_Address() +{ + waiting = WAITING_REMOTE_ADDR; + return Determine_Remote_Address(); +} + +int pqissl::Determine_Local_Address() +{ + waiting = WAITING_REMOTE_ADDR; + return Determine_Remote_Address(); + return -1; +} + +/****************************** DETERMINE ADDR ****************************** + * Determine the Remote Address. + * + * Specifics: + * TCP / UDP + * TCP - check for which interface to use. + * UDP - start proxy request.... + * + * X509 / XPGP - Same. + * + */ + +int pqissl::Determine_Remote_Address() +{ + struct sockaddr_in addr; + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissl::Determine_Remote_Address() Finding Interface"); + if (0 < connectInterface(addr)) + { + remote_addr = addr; + remote_addr.sin_family = AF_INET; + // jump unneccessary state. + waiting = WAITING_REMOTE_ADDR; + return Initiate_Connection(); + } + // cannot connect!. + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissl::Request_Remote_Address() No Avail Interfaces"); + + // This is one of only place that notifies of failure... + if (parent()) + { + parent() -> notifyEvent(this, NET_CONNECT_UNREACHABLE); + } + //waiting = WAITING_NOT; + return -1; +} + + +/****************************** FAILED ATTEMPT ****************************** + * Determine the Remote Address. + * + * Specifics: + * TCP / UDP + * TCP - check for which interface to use. + * UDP - check for request proxies.... + * + * X509 / XPGP - Same. + * + */ + +int pqissl::Reattempt_Connection() +{ + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissl::ConnectAttempt() Failed - Retrying"); + // flag last attempt as a failure. + net_failure |= net_attempt; + waiting = WAITING_NOT; + + return Request_Proxy_Connection(); /* start of the chain */ +} + +/****************************** MAKE CONNECTION ***************************** + * Open Socket and Initiate Connection. + * + * Specifics: + * TCP / UDP + * TCP - socket()/connect() + * UDP - tou_socket()/tou_connect() + * + * X509 / XPGP - Same. + * + */ + +int pqissl::Initiate_Connection() +{ + int err; + struct sockaddr_in addr = remote_addr; + + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissl::Initiate_Connection() Attempting Outgoing Connection...."); + + if (waiting != WAITING_REMOTE_ADDR) + { + pqioutput(PQL_WARNING, pqisslzone, + "pqissl::Initiate_Connection() Already Attempt in Progress!"); + return -1; + } + + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissl::Initiate_Connection() Opening Socket"); + + // open socket connection to addr. + int osock = unix_socket(PF_INET, SOCK_STREAM, 0); + + { + std::ostringstream out; + out << "pqissl::Initiate_Connection() osock = " << osock; + pqioutput(PQL_DEBUG_BASIC, pqisslzone, out.str()); + } + + if (osock < 0) + { + std::ostringstream out; + out << "pqissl::Initiate_Connection()"; + out << "Failed to open socket!" << std::endl; + out << "Socket Error:" << socket_errorType(errno) << std::endl; + pqioutput(PQL_WARNING, pqisslzone, out.str()); + + net_internal_close(osock); + waiting = WAITING_FAIL_INTERFACE; + return -1; + } + + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissl::Initiate_Connection() Making Non-Blocking"); + + err = unix_fcntl_nonblock(osock); + if (err < 0) + { + std::ostringstream out; + out << "pqissl::Initiate_Connection()"; + out << "Error: Cannot make socket NON-Blocking: "; + out << err << std::endl; + pqioutput(PQL_WARNING, pqisslzone, out.str()); + + waiting = WAITING_FAIL_INTERFACE; + net_internal_close(osock); + return -1; + } + + + { + std::ostringstream out; + out << "pqissl::Initiate_Connection() "; + out << "Connecting To: " << inet_ntoa(addr.sin_addr) << ":"; + out << ntohs(addr.sin_port) << std::endl; + pqioutput(PQL_WARNING, pqisslzone, out.str()); + } + + if (addr.sin_addr.s_addr == 0) + { + std::ostringstream out; + out << "pqissl::Initiate_Connection() "; + out << "Invalid (0.0.0.0) Remote Address,"; + out << " Aborting Connect."; + out << std::endl; + pqioutput(PQL_WARNING, pqisslzone, out.str()); + waiting = WAITING_FAIL_INTERFACE; + net_internal_close(osock); + return -1; + } + + { + std::ostringstream out; + out << "Connecting to "; + out << sslcert -> Name() << " via "; + out << inet_ntoa(addr.sin_addr); + out << ":" << ntohs(addr.sin_port); + pqioutput(PQL_DEBUG_BASIC, pqisslzone, out.str()); + } + + if (0 != (err = unix_connect(osock, (struct sockaddr *) &addr, sizeof(addr)))) + { + std::ostringstream out; + out << "pqissl::Initiate_Connection() connect returns:"; + out << err << " -> errno: " << errno << " error: "; + out << socket_errorType(errno) << std::endl; + + if (errno == EINPROGRESS) + { + // set state to waiting..... + waiting = WAITING_SOCK_CONNECT; + sockfd = osock; + + out << " EINPROGRESS Waiting for Socket Connection"; + pqioutput(PQL_WARNING, pqisslzone, out.str()); + + return 0; + } + else if ((errno == ENETUNREACH) || (errno == ETIMEDOUT)) + { + out << "ENETUNREACHABLE: cert" << sslcert -> Name(); + pqioutput(PQL_WARNING, pqisslzone, out.str()); + + // Then send unreachable message. + net_internal_close(osock); + osock=-1; + //reset(); + + waiting = WAITING_FAIL_INTERFACE; + // removing unreachables... + //net_unreachable |= net_attempt; + + return -1; + } + + /* IF we get here ---- we Failed for some other reason. + * Should abandon this interface + * Known reasons to get here: EINVAL (bad address) + */ + + out << "Error: Connection Failed: " << errno; + out << " - " << socket_errorType(errno) << std::endl; + + net_internal_close(osock); + osock=-1; + waiting = WAITING_FAIL_INTERFACE; + + pqioutput(PQL_WARNING, pqisslzone, out.str()); + // extra output for the moment. + std::cerr << out.str(); + + return -1; + } + else + { + pqioutput(PQL_WARNING, pqisslzone, + "pqissl::Init_Connection() connect returned 0"); + } + + waiting = WAITING_SOCK_CONNECT; + sockfd = osock; + + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissl::Initiate_Connection() Waiting for Socket Connect"); + + return 1; +} + + +/****************************** CHECK SOCKET ***************************** + * Check the Socket. + * + * select() and getsockopt(). + * + * Specifics: + * TCP / UDP + * TCP - select()/getsockopt() + * UDP - tou_error() + * + * X509 / XPGP - Same. + * + */ + +int pqissl::Basic_Connection_Complete() +{ + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissl::Basic_Connection_Complete()..."); + + if (waiting != WAITING_SOCK_CONNECT) + { + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissl::Basic_Connection_Complete() Wrong Mode"); + return -1; + } + // use select on the opened socket. + // Interestingly - This code might be portable.... + + fd_set ReadFDs, WriteFDs, ExceptFDs; + FD_ZERO(&ReadFDs); + FD_ZERO(&WriteFDs); + FD_ZERO(&ExceptFDs); + + FD_SET(sockfd, &ReadFDs); + FD_SET(sockfd, &WriteFDs); + FD_SET(sockfd, &ExceptFDs); + + struct timeval timeout; + timeout.tv_sec = 0; + timeout.tv_usec = 0; + + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissl::Basic_Connection_Complete() Selecting ...."); + + int sr = 0; + if (0 > (sr = select(sockfd + 1, + &ReadFDs, &WriteFDs, &ExceptFDs, &timeout))) + { + // select error. + pqioutput(PQL_WARNING, pqisslzone, + "pqissl::Basic_Connection_Complete() Select ERROR(1)"); + + net_internal_close(sockfd); + sockfd=-1; + //reset(); + waiting = WAITING_FAIL_INTERFACE; + return -1; + } + + { + std::ostringstream out; + out << "pqissl::Basic_Connection_Complete() Select "; + out << " returned " << sr; + pqioutput(PQL_DEBUG_BASIC, pqisslzone, out.str()); + } + + + if (FD_ISSET(sockfd, &ExceptFDs)) + { + // error - reset socket. + // this is a definite bad socket!. + + pqioutput(PQL_WARNING, pqisslzone, + "pqissl::Basic_Connection_Complete() Select ERROR(2)"); + + net_internal_close(sockfd); + sockfd=-1; + //reset(); + waiting = WAITING_FAIL_INTERFACE; + return -1; + } + + if (FD_ISSET(sockfd, &WriteFDs)) + { + pqioutput(PQL_WARNING, pqisslzone, + "pqissl::Basic_Connection_Complete() Can Write!"); + } + else + { + // not ready return -1; + pqioutput(PQL_WARNING, pqisslzone, + "pqissl::Basic_Connection_Complete() Not Yet Ready!"); + return 0; + } + + if (FD_ISSET(sockfd, &ReadFDs)) + { + pqioutput(PQL_WARNING, pqisslzone, + "pqissl::Basic_Connection_Complete() Can Read!"); + } + else + { + // not ready return -1; + pqioutput(PQL_WARNING, pqisslzone, + "pqissl::Basic_Connection_Complete() Cannot Read!"); + } + + int err = 1; + if (0==unix_getsockopt_error(sockfd, &err)) + { + if (err == 0) + { + + { + std::ostringstream out; + out << "pqissl::Basic_Connection_Complete()"; + out << "TCP Connection Complete: cert: "; + out << sslcert -> Name(); + out << " on osock: " << sockfd; + pqioutput(PQL_WARNING, pqisslzone, out.str()); + } + return 1; + } + else if (err == EINPROGRESS) + { + + std::ostringstream out; + out << "pqissl::Basic_Connection_Complete()"; + out << "EINPROGRESS: cert" << sslcert -> Name(); + pqioutput(PQL_WARNING, pqisslzone, out.str()); + + return 0; + } + else if ((err == ENETUNREACH) || (err == ETIMEDOUT)) + { + std::ostringstream out; + out << "pqissl::Basic_Connection_Complete()"; + out << "ENETUNREACH/ETIMEDOUT: cert"; + out << sslcert -> Name(); + pqioutput(PQL_WARNING, pqisslzone, out.str()); + + // Then send unreachable message. + net_internal_close(sockfd); + sockfd=-1; + //reset(); + + waiting = WAITING_FAIL_INTERFACE; + // removing unreachables... + //net_unreachable |= net_attempt; + + return -1; + } + else if ((err == EHOSTUNREACH) || (err == EHOSTDOWN)) + { + std::ostringstream out; + out << "pqissl::Basic_Connection_Complete()"; + out << "EHOSTUNREACH/EHOSTDOWN: cert"; + out << sslcert -> Name(); + pqioutput(PQL_WARNING, pqisslzone, out.str()); + + // Then send unreachable message. + net_internal_close(sockfd); + sockfd=-1; + //reset(); + waiting = WAITING_FAIL_INTERFACE; + + return -1; + } + else if ((err == ECONNREFUSED)) + { + std::ostringstream out; + out << "pqissl::Basic_Connection_Complete()"; + out << "ECONNREFUSED: cert"; + out << sslcert -> Name(); + pqioutput(PQL_WARNING, pqisslzone, out.str()); + + // Then send unreachable message. + net_internal_close(sockfd); + sockfd=-1; + //reset(); + waiting = WAITING_FAIL_INTERFACE; + + return -1; + } + + std::ostringstream out; + out << "Error: Connection Failed UNKNOWN ERROR: " << err; + out << " - " << socket_errorType(err); + pqioutput(PQL_WARNING, pqisslzone, out.str()); + + net_internal_close(sockfd); + sockfd=-1; + //reset(); // which will send Connect Failed, + return -1; + } + + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissl::Basic_Connection_Complete() BAD GETSOCKOPT!"); + waiting = WAITING_FAIL_INTERFACE; + + return -1; +} + + +int pqissl::Initiate_SSL_Connection() +{ + int err; + + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissl::Initiate_SSL_Connection() Checking Basic Connection"); + + if (0 >= (err = Basic_Connection_Complete())) + { + return err; + } + + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissl::Initiate_SSL_Connection() Basic Connection Okay"); + + // setup timeout value. + ssl_connect_timeout = time(NULL) + PQISSL_SSL_CONNECT_TIMEOUT; + + // Perform SSL magic. + // library already inited by sslroot(). + SSL *ssl = SSL_new(sslccr -> getCTX()); + if (ssl == NULL) + { + pqioutput(PQL_ALERT, pqisslzone, + "pqissl::Initiate_SSL_Connection() SSL_new failed!"); + + exit(1); + return -1; + } + + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissl::Initiate_SSL_Connection() SSL Connection Okay"); + + ssl_connection = ssl; + + net_internal_SSL_set_fd(ssl, sockfd); + if (err < 1) + { + std::ostringstream out; + out << "pqissl::Initiate_SSL_Connection() SSL_set_fd failed!"; + out << std::endl; + printSSLError(ssl, err, SSL_get_error(ssl, err), + ERR_get_error(), out); + + pqioutput(PQL_ALERT, pqisslzone, out.str()); + } + + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissl::Initiate_SSL_Connection() Waiting for SSL Connection"); + + waiting = WAITING_SSL_CONNECTION; + return 1; +} + +int pqissl::SSL_Connection_Complete() +{ + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissl::SSL_Connection_Complete()??? ... Checking"); + + if (waiting == WAITING_SSL_AUTHORISE) + { + pqioutput(PQL_ALERT, pqisslzone, + "pqissl::SSL_Connection_Complete() Waiting = W_SSL_AUTH"); + + return 1; + } + if (waiting != WAITING_SSL_CONNECTION) + { + pqioutput(PQL_ALERT, pqisslzone, + "pqissl::SSL_Connection_Complete() Still Waiting.."); + + return -1; + } + + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissl::SSL_Connection_Complete() Attempting SSL_connect"); + + /* if we are passive - then accept! */ + int err; + + if (sslmode) + { + pqioutput(PQL_DEBUG_BASIC, pqisslzone, "--------> Active Connect!"); + err = SSL_connect(ssl_connection); + } + else + { + pqioutput(PQL_DEBUG_BASIC, pqisslzone, "--------> Passive Accept!"); + err = SSL_accept(ssl_connection); + } + + if (err != 1) + { + int serr = SSL_get_error(ssl_connection, err); + if ((serr == SSL_ERROR_WANT_READ) + || (serr == SSL_ERROR_WANT_WRITE)) + { + pqioutput(PQL_WARNING, pqisslzone, + "Waiting for SSL handshake!"); + + waiting = WAITING_SSL_CONNECTION; + return 0; + } + + + std::ostringstream out; + out << "pqissl::SSL_Connection_Complete()" << std::endl; + out << "Issues with SSL Connect(" << err << ")!" << std::endl; + printSSLError(ssl_connection, err, serr, + ERR_get_error(), out); + + pqioutput(PQL_WARNING, pqisslzone, + out.str()); + + // attempt real error. + Extract_Failed_SSL_Certificate(); + + reset(); + waiting = WAITING_FAIL_INTERFACE; + + return -1; + } + // if we get here... success v quickly. + + pqioutput(PQL_WARNING, pqisslzone, + "\tAttempted Connect... Success!"); + + waiting = WAITING_SSL_AUTHORISE; + return 1; +} + +int pqissl::Extract_Failed_SSL_Certificate() +{ + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissl::Extract_Failed_SSL_Certificate()"); + + // Get the Peer Certificate.... +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + XPGP *peercert = SSL_get_peer_pgp_certificate(ssl_connection); +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + X509 *peercert = SSL_get_peer_certificate(ssl_connection); +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + + if (peercert == NULL) + { + pqioutput(PQL_WARNING, pqisslzone, + "pqissl::Extract_Failed_SSL_Certificate() Peer Didnt Give Cert"); + return -1; + } + + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissl::Extract_Failed_SSL_Certificate() Have Peer Cert - Registering"); + + // save certificate... (and ip locations) + // false for outgoing.... + // we actually connected to remote_addr, + // which could be + // (pqissl's case) sslcert->serveraddr or sslcert->localaddr. +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + sslccr -> registerCertificateXPGP(peercert, remote_addr, false); +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + sslccr -> registerCertificate(peercert, remote_addr, false); +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + + return 1; +} + + + + +int pqissl::Authorise_SSL_Connection() +{ + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissl::Authorise_SSL_Connection()"); + ssl_connect_timeout = time(NULL) + PQISSL_SSL_CONNECT_TIMEOUT; + + if (time(NULL) > ssl_connect_timeout) + { + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissl::Authorise_SSL_Connection() Connectoin Timed Out!"); + /* as sockfd is valid, this should close it all up */ + reset(); + } + + int err; + if (0 >= (err = SSL_Connection_Complete())) + { + return err; + } + + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissl::Authorise_SSL_Connection() SSL_Connection_Complete"); + + // reset switch. + waiting = WAITING_NOT; + + // Get the Peer Certificate.... +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + XPGP *peercert = SSL_get_peer_pgp_certificate(ssl_connection); +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + X509 *peercert = SSL_get_peer_certificate(ssl_connection); +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + + if (peercert == NULL) + { + pqioutput(PQL_WARNING, pqisslzone, + "pqissl::Authorise_SSL_Connection() Peer Didnt Give Cert"); + + + //SSL_shutdown(ssl_connection); + //net_internal_close(sockfd); + //waiting = WAITING_FAIL_INTERFACE; + // + // Failed completely + reset(); + return -1; + } + + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissl::Authorise_SSL_Connection() Have Peer Cert"); + + // save certificate... (and ip locations) + // false for outgoing.... + // we actually connected to remote_addr, + // which could be + // (pqissl's case) sslcert->serveraddr or sslcert->localaddr. +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + //cert *npc = sslccr -> registerCertificateXPGP(peercert, sslcert -> serveraddr, false); + cert *npc = sslccr -> registerCertificateXPGP(peercert, remote_addr, false); +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + //cert *npc = sslccr -> registerCertificate(peercert, sslcert -> serveraddr, false); + cert *npc = sslccr -> registerCertificate(peercert, remote_addr, false); +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + + // check it's the right one. + if ((npc != NULL) && (!(npc -> Connected())) && + (sslccr -> compareCerts(sslcert, npc) == 0)) + { + // then okay... + + // timestamp. + npc -> lc_timestamp = time(NULL); + // pass to accept... + // and notify that we're likely to succeed. + + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissl::Authorise_SSL_Connection() Accepting Conn"); + + accept(ssl_connection, sockfd, remote_addr); + return 1; + } + + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissl::Authorise_SSL_Connection() Something Wrong ... Shutdown "); + + // else shutdown ssl connection. + // + // failed completely... + //SSL_shutdown(ssl_connection); + //net_internal_close(sockfd); + //sockfd = -1; + //waiting = WAITING_FAIL_INTERFACE; + reset(); + return 0; +} + +int pqissl::accept(SSL *ssl, int fd, struct sockaddr_in foreign_addr) // initiate incoming connection. +{ + if (waiting != WAITING_NOT) + { + pqioutput(PQL_WARNING, pqisslzone, + "pqissl::accept() - Two connections in progress - Shut 1 down!"); + + // outgoing connection in progress. + // shut this baby down. + // + // Thought I should shut down one in progress, and continue existing one! + // But the existing one might be broke.... take second. + // all we need is to never stop listening. + + switch(waiting) + { + case WAITING_LOCAL_ADDR: + + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissl::accept() STATE = Waiting Local Addr - Nothing to close"); + + case WAITING_REMOTE_ADDR: + + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissl::accept() STATE = Waiting Remote Addr - Nothing to close"); + + case WAITING_SOCK_CONNECT: + + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissl::accept() STATE = Waiting Sock Connect - close the socket"); + + break; + + case WAITING_SSL_CONNECTION: + + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissl::accept() STATE = Waiting SSL Connection - close sockfd + ssl_conn"); + + break; + + case WAITING_SSL_AUTHORISE: + + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissl::accept() STATE = Waiting SSL Authorise - close sockfd + ssl_conn"); + + break; + + case WAITING_FAIL_INTERFACE: + + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissl::accept() STATE = Failed, ignore?"); + + break; + + + default: + pqioutput(PQL_ALERT, pqisslzone, + "pqissl::accept() STATE = Unknown - ignore?"); + + reset(); + break; + } + + //waiting = WAITING_FAIL_INTERFACE; + //return -1; + } + + /* shutdown existing - in all cases use the new one */ + if ((ssl_connection) && (ssl_connection != ssl)) + { + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissl::accept() closing Previous/Existing ssl_connection"); + SSL_shutdown(ssl_connection); + } + + if ((sockfd > -1) && (sockfd != fd)) + { + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissl::accept() closing Previous/Existing sockfd"); + net_internal_close(sockfd); + } + + + // save ssl + sock. + + ssl_connection = ssl; + sockfd = fd; + + /* if we connected - then just writing the same over, + * but if from ssllistener then we need to save the address. + */ + remote_addr = foreign_addr; + + /* check whether it is on the same LAN */ + cert *own = sslccr -> getOwnCert(); + struct sockaddr_in own_laddr = own -> localaddr; + + sameLAN = isSameSubnet(&(remote_addr.sin_addr), &(own_laddr.sin_addr)); + + { + std::ostringstream out; + out << "pqissl::accept() checking for same LAN"; + out << std::endl; + out << "\t localaddr: " << inet_ntoa(remote_addr.sin_addr); + out << std::endl; + out << "\tremoteaddr: " << inet_ntoa(own_laddr.sin_addr); + out << std::endl; + if (sameLAN) + { + out << "\tSAME LAN - no bandwidth restrictions!"; + } + else + { + out << "\tDifferent LANs - bandwidth restrictions!"; + } + out << std::endl; + + pqioutput(PQL_WARNING, pqisslzone, out.str()); + } + + // establish the ssl details. + // cipher name. + int alg; + int err; + + { + std::ostringstream out; + out << "SSL Cipher:" << SSL_get_cipher(ssl) << std::endl; + out << "SSL Cipher Bits:" << SSL_get_cipher_bits(ssl, &alg); + out << " - " << alg << std::endl; + out << "SSL Cipher Version:" << SSL_get_cipher_version(ssl) << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqisslzone, out.str()); + } + + // make non-blocking / or check..... + if ((err = net_internal_fcntl_nonblock(sockfd)) < 0) + { + pqioutput(PQL_ALERT, pqisslzone, "Error: Cannot make socket NON-Blocking: "); + + active = false; + waiting = WAITING_FAIL_INTERFACE; + // failed completely. + reset(); + return -1; + } + else + { + pqioutput(PQL_ALERT, pqisslzone, "pqissl::accept() Socket Made Non-Blocking!"); + } + + // remove form listening set. + // no - we want to continue listening - incase this socket is crap, and they try again. + //stoplistening(); + + active = true; + waiting = WAITING_NOT; + + // Notify the pqiperson.... (Both Connect/Receive) + if (parent()) + { + parent() -> notifyEvent(this, NET_CONNECT_SUCCESS); + } + return 1; +} + +/********** Implementation of BinInterface ************************** + * All the rest of the BinInterface. + * + */ + +int pqissl::senddata(void *data, int len) +{ + int tmppktlen = SSL_write(ssl_connection, data, len); + if (len != tmppktlen) + { + std::ostringstream out; + out << "pqissl::senddata()"; + out << " Full Packet Not Sent!" << std::endl; + out << " -> Expected len(" << len << ") actually sent("; + out << tmppktlen << ")" << std::endl; + + int err = SSL_get_error(ssl_connection, tmppktlen); + // incomplete operations - to repeat.... + // handled by the pqistreamer... + if (err == SSL_ERROR_SYSCALL) + { + out << "SSL_write() SSL_ERROR_SYSCALL"; + out << std::endl; + out << "Socket Closed Abruptly.... Resetting PQIssl"; + out << std::endl; + pqioutput(PQL_ALERT, pqisslzone, out.str()); + reset(); + return -1; + } + else if (err == SSL_ERROR_WANT_WRITE) + { + out << "SSL_write() SSL_ERROR_WANT_WRITE"; + out << std::endl; + pqioutput(PQL_ALERT, pqisslzone, out.str()); + return -1; + } + else if (err == SSL_ERROR_WANT_READ) + { + out << "SSL_write() SSL_ERROR_WANT_READ"; + out << std::endl; + pqioutput(PQL_ALERT, pqisslzone, out.str()); + return -1; + } + else + { + out << "SSL_write() UNKNOWN ERROR: " << err; + out << std::endl; + printSSLError(ssl_connection, tmppktlen, err, ERR_get_error(), out); + out << std::endl; + out << "\tResetting!"; + out << std::endl; + pqioutput(PQL_ALERT, pqisslzone, out.str()); + + reset(); + return -1; + } + } + return tmppktlen; +} + +int pqissl::readdata(void *data, int len) +{ + int tmppktlen = SSL_read(ssl_connection, data, len); + if (len != tmppktlen) + { + std::ostringstream out; + out << "pqissl::readdata()"; + out << " Full Packet Not read!" << std::endl; + out << " -> Expected len(" << len << ") actually read("; + out << tmppktlen << ")" << std::endl; + pqioutput(PQL_WARNING, pqisslzone, out.str()); + } + // need to catch errors..... + if (tmppktlen <= 0) // probably needs a reset. + { + std::ostringstream out; + out << "pqissl::readdata()"; + out << " No Data Read ... Probably a Bad Connection" << std::endl; + int error = SSL_get_error(ssl_connection, tmppktlen); + unsigned long err2 = ERR_get_error(); + + printSSLError(ssl_connection, tmppktlen, error, err2, out); + + if ((error == SSL_ERROR_ZERO_RETURN) && (err2 == 0)) + { + /* this code will be called when + * (1) moretoread -> returns true. + + * (2) SSL_read fails. + * + * There are two ways this can happen: + * (1) there is a little data on the socket, but not enough + * for a full SSL record, so there legimitately is no error, and the moretoread() + * was correct, but the read fails. + * + * (2) the socket has been closed correctly. this leads to moretoread() -> true, + * and ZERO error.... we catch this case by counting how many times + * it occurs in a row (cos the other one will not). + */ + + ++n_read_zero; + out << "SSL_ERROR_ZERO_RETURN -- "; + out << std::endl; + out << " Has socket closed been properly closed? nReadZero: " << n_read_zero; + out << std::endl; + + if (PQISSL_MAX_READ_ZERO_COUNT < n_read_zero) + { + out << "Count passed Limit, shutting down!"; + reset(); + } + + pqioutput(PQL_ALERT, pqisslzone, out.str()); + return 0; + } + + /* the only real error we expect */ + if (error == SSL_ERROR_SYSCALL) + { + out << "SSL_read() SSL_ERROR_SYSCALL"; + out << std::endl; + out << "Socket Closed Abruptly.... Resetting PQIssl"; + out << std::endl; + pqioutput(PQL_ALERT, pqisslzone, out.str()); + reset(); + return -1; + } + else if (error == SSL_ERROR_WANT_WRITE) + { + out << "SSL_read() SSL_ERROR_WANT_WRITE"; + out << std::endl; + pqioutput(PQL_ALERT, pqisslzone, out.str()); + return -1; + } + else if (error == SSL_ERROR_WANT_READ) + { + out << "SSL_read() SSL_ERROR_WANT_READ"; + out << std::endl; + pqioutput(PQL_ALERT, pqisslzone, out.str()); + return -1; + } + else + { + out << "SSL_read() UNKNOWN ERROR: " << error; + out << std::endl; + out << "\tResetting!"; + pqioutput(PQL_ALERT, pqisslzone, out.str()); + reset(); + return -1; + } + + pqioutput(PQL_ALERT, pqisslzone, out.str()); + //exit(1); + } + n_read_zero = 0; + return tmppktlen; +} + + +// dummy function currently. +int pqissl::netstatus() +{ + return 1; +} + +int pqissl::isactive() +{ + return active; +} + +bool pqissl::bandwidthLimited() +{ + return (!sameLAN); +} + +bool pqissl::moretoread() +{ + { + std::ostringstream out; + out << "pqissl::moretoread()"; + out << " polling socket (" << sockfd << ")"; + pqioutput(PQL_DEBUG_ALL, pqisslzone, out.str()); + } + + fd_set ReadFDs, WriteFDs, ExceptFDs; + FD_ZERO(&ReadFDs); + FD_ZERO(&WriteFDs); + FD_ZERO(&ExceptFDs); + + FD_SET(sockfd, &ReadFDs); + FD_SET(sockfd, &WriteFDs); + FD_SET(sockfd, &ExceptFDs); + + struct timeval timeout; + timeout.tv_sec = 0; + timeout.tv_usec = 0; + + if (select(sockfd + 1, &ReadFDs, &WriteFDs, &ExceptFDs, &timeout) < 0) + { + pqioutput(PQL_ALERT, pqisslzone, + "pqissl::moretoread() Select ERROR!"); + return 0; + } + + if (FD_ISSET(sockfd, &ExceptFDs)) + { + // error - reset socket. + pqioutput(PQL_ALERT, pqisslzone, + "pqissl::moretoread() Select Exception ERROR!"); + + // this is a definite bad socket!. + // reset. + reset(); + return 0; + } + + if (FD_ISSET(sockfd, &WriteFDs)) + { + // write can work. + pqioutput(PQL_DEBUG_ALL, pqisslzone, + "pqissl::moretoread() Can Write!"); + } + else + { + // write can work. + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissl::moretoread() Can *NOT* Write!"); + } + + if (FD_ISSET(sockfd, &ReadFDs)) + { + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissl::moretoread() Data to Read!"); + return 1; + } + else + { + pqioutput(PQL_DEBUG_ALL, pqisslzone, + "pqissl::moretoread() No Data to Read!"); + return 0; + } + +} + +bool pqissl::cansend() +{ + pqioutput(PQL_DEBUG_ALL, pqisslzone, + "pqissl::cansend() polling socket!"); + + // Interestingly - This code might be portable.... + + fd_set ReadFDs, WriteFDs, ExceptFDs; + FD_ZERO(&ReadFDs); + FD_ZERO(&WriteFDs); + FD_ZERO(&ExceptFDs); + + FD_SET(sockfd, &ReadFDs); + FD_SET(sockfd, &WriteFDs); + FD_SET(sockfd, &ExceptFDs); + + struct timeval timeout; + timeout.tv_sec = 0; + timeout.tv_usec = 0; + + if (select(sockfd + 1, &ReadFDs, &WriteFDs, &ExceptFDs, &timeout) < 0) + { + // select error. + pqioutput(PQL_ALERT, pqisslzone, + "pqissl::cansend() Select Error!"); + + return 0; + } + + if (FD_ISSET(sockfd, &ExceptFDs)) + { + // error - reset socket. + pqioutput(PQL_ALERT, pqisslzone, + "pqissl::cansend() Select Exception!"); + + // this is a definite bad socket!. + // reset. + reset(); + return 0; + } + + if (FD_ISSET(sockfd, &WriteFDs)) + { + // write can work. + pqioutput(PQL_DEBUG_ALL, pqisslzone, + "pqissl::cansend() Can Write!"); + return 1; + } + else + { + // write can work. + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissl::cansend() Can *NOT* Write!"); + + return 0; + } + +} + + +/********** End of Implementation of BinInterface ******************/ + + + + + + + +/******************* PQI NET SSL INTERFACE CHOOSER ************************ + * PQI NET SSL + * + * This is the part that selects which network address the + * SSL connection will attempt to connect to. + * + */ + + +/********************* CHOOSE TARGET ********************/ +int pqissl::connectInterface(struct sockaddr_in &addr) +{ + // choose the interface to connect via. + // either local addr. (if same localnet) + // or server addr. (if not firewalled). + + // says local, local is valid, and matches a local address. + // sounds like a lot of work, but only happens max 1 per hour / ssl. + + // attempt to connect to localaddr. + // don't worry about the local flag -> try anyway. (set it afterwards) + // local server dns + //net_attempt; 0x01 0x02 0x04 + //net_failure; 0x01 0x02 0x04 + //net_unreachable; + + { + std::ostringstream out; + out << "pqissl::connectInterface() for: " << sslcert->Name(); + pqioutput(PQL_WARNING, pqisslzone, out.str()); + } + + if ((net_unreachable & PQISSL_LOCAL_FLAG) || + (net_failure & PQISSL_LOCAL_FLAG) || + !isValidNet(&(sslcert->localaddr.sin_addr))) + { + pqioutput(PQL_WARNING, pqisslzone, + "pqissl::connectInterface() Not Local"); + // not local... + net_failure |= PQISSL_LOCAL_FLAG; + sslcert -> Local(false); + } + else + { + pqioutput(PQL_WARNING, pqisslzone, + "pqissl::connectInterface() Using Local Address: "); + + + std::list addrs = getLocalInterfaces(); + std::list::iterator it; + for(it = addrs.begin(); it != addrs.end(); it++) + { + struct in_addr local; + inet_aton(it -> c_str(), &local); + if (sameNet(&local, &(sslcert -> localaddr.sin_addr))) + { + net_attempt = PQISSL_LOCAL_FLAG; + addr = sslcert -> localaddr; + return 1; + } + } + } + + // if we get here the local failed.... + if ((net_unreachable & PQISSL_REMOTE_FLAG) || + (net_failure & PQISSL_REMOTE_FLAG) || + !isValidNet(&(sslcert->serveraddr.sin_addr))) + { + std::ostringstream out; + out << "pqissl::connectInterface()"; + out << " Failure to Connect via SSL (u:"; + out << net_unreachable << ", f:"; + out << net_failure << ")"; + + pqioutput(PQL_WARNING, pqisslzone, out.str()); + + // fails server test. + net_failure |= PQISSL_REMOTE_FLAG; + // fall through... + } + else if ((sslcert->Firewalled()) && (!sslcert->Forwarded())) + { + // setup remote address + pqioutput(PQL_WARNING, pqisslzone, + "pqissl::connectInterface() Server Firewalled - set u"); + pqioutput(PQL_WARNING, pqisslzone, + "pqissl::connectInterface() Destination Unreachable"); + net_failure |= PQISSL_REMOTE_FLAG; + + + // shouldn't flag as unreachable - as if flags change, + // we want to connect! -> only failure.... + //net_unreachable |= PQISSL_REMOTE_FLAG; + + // dont' fall through... (name resolution wont help). + //return -1; + } + else + { + // setup remote address + pqioutput(PQL_WARNING, pqisslzone, + "pqissl::connectInterface() Using Server Address: "); + + net_attempt = PQISSL_REMOTE_FLAG; + addr = sslcert -> serveraddr; + return 1; + } + + /* Finally we attempt the dns name lookup thingy */ + pqioutput(PQL_WARNING, pqisslzone, + "pqissl::connectInterface() Attempting DNS Address lookup: "); + + + /* The initial attempt should have cached the dns request locally. + * This is made at ... + */ + if ((net_unreachable & PQISSL_DNS_FLAG) || + (net_failure & PQISSL_DNS_FLAG)) + { + + /* failed already */ + pqioutput(PQL_WARNING, pqisslzone, + "pqissl::connectInterface() DNS Address Failed Already"); + + } + else /* go for it! */ + { + /* we also set it to the server addr, as it's + * the best guess + */ + + if (sslcert->hasDHT()) + { + sslcert->serveraddr = sslcert->dhtaddr; + std::ostringstream out; + out << "pqissl::connectInterface() DHT:"; + out << " " << inet_ntoa(sslcert->serveraddr.sin_addr) << std::endl; + + net_attempt = PQISSL_DNS_FLAG; + addr = sslcert -> serveraddr; + + pqioutput(PQL_WARNING, pqisslzone, out.str()); + return 1; + } + +#if (0) /* DNS name resolution */ + if (sslcert->dynDNSaddr.length () > 0) + { + if (LookupDNSAddr(sslcert->dynDNSaddr, sslcert->serveraddr)) + { + /* success, load DNS */ + net_attempt = PQISSL_DNS_FLAG; + addr = sslcert -> serveraddr; + + std::ostringstream out; + out << "pqissl::connectInterface() DNS:" << sslcert->dynDNSaddr; + out << " " << inet_ntoa(sslcert->serveraddr.sin_addr) << std::endl; + + pqioutput(PQL_WARNING, pqisslzone, out.str()); + return 1; + } + } +#endif + + /* otherwise we failed */ + } + + pqioutput(PQL_WARNING, pqisslzone, + "pqissl::connectInterface() DNS Address Failed"); + /* the end of the road */ + net_failure |= PQISSL_DNS_FLAG; + waiting = WAITING_NOT; + return -1; +} + + +/************************ PQI NET SSL LISTENER **************************** + * PQI NET SSL LISTENER + * + * to be worked out + */ + + + +#if 0 /* NO LISTENER */ + +pqissllistener::pqissllistener(struct sockaddr_in addr) + :laddr(addr), active(false) +{ + sslccr = getSSLRoot(); + if (!(sslccr -> active())) + { + pqioutput(PQL_ALERT, pqisslzone, + "SSL-CTX-CERT-ROOT not initialised!"); + + exit(1); + } + + setuplisten(); + return; +} + +int pqissllistener::tick() +{ + status(); + // check listen port. + acceptconnection(); + return continueaccepts(); +} + +int pqissllistener::status() +{ + // print certificates we are listening for. + std::map::iterator it; + + std::ostringstream out; + out << "pqissllistener::status(): "; + out << " Listening (" << ntohs(laddr.sin_port) << ") for Certs:" << std::endl; + for(it = listenaddr.begin(); it != listenaddr.end(); it++) + { + sslccr -> printCertificate(it -> first, out); + } + pqioutput(PQL_DEBUG_ALL, pqisslzone, out.str()); + + return 1; +} + +int pqissllistener::addlistenaddr(cert *c, pqissl *acc) +{ + std::map::iterator it; + + std::ostringstream out; + + out << "Adding to Cert Listening Addresses:" << std::endl; + sslccr -> printCertificate(c, out); + out << "Current Certs:" << std::endl; + for(it = listenaddr.begin(); it != listenaddr.end(); it++) + { + sslccr -> printCertificate(it -> first, out); + if (sslccr -> compareCerts(c, it -> first) == 0) + { + out << "pqissllistener::addlistenaddr()"; + out << "Already listening for Certificate!"; + out << std::endl; + + pqioutput(PQL_DEBUG_ALERT, pqisslzone, out.str()); + return -1; + + } + } + + pqioutput(PQL_DEBUG_BASIC, pqisslzone, out.str()); + + // not there can accept it! + listenaddr[c] = acc; + return 1; +} + + + + +int pqissllistener::setuplisten() +{ + int err; + if (active) + return -1; + + lsock = socket(PF_INET, SOCK_STREAM, 0); +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS // ie UNIX + if (lsock < 0) + { + pqioutput(PQL_ALERT, pqisslzone, + "pqissllistener::setuplisten() Cannot Open Socket!"); + + return -1; + } + + err = fcntl(lsock, F_SETFL, O_NONBLOCK); + if (err < 0) + { + std::ostringstream out; + out << "Error: Cannot make socket NON-Blocking: "; + out << err << std::endl; + pqioutput(PQL_ERROR, pqisslzone, out.str()); + + return -1; + } + +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#else //WINDOWS_SYS + if ((unsigned) lsock == INVALID_SOCKET) + { + std::ostringstream out; + out << "pqissllistener::setuplisten()"; + out << " Cannot Open Socket!" << std::endl; + out << "Socket Error:"; + out << socket_errorType(WSAGetLastError()) << std::endl; + pqioutput(PQL_ALERT, pqisslzone, out.str()); + + return -1; + } + + // Make nonblocking. + unsigned long int on = 1; + if (0 != (err = ioctlsocket(lsock, FIONBIO, &on))) + { + std::ostringstream out; + out << "pqissllistener::setuplisten()"; + out << "Error: Cannot make socket NON-Blocking: "; + out << err << std::endl; + out << "Socket Error:"; + out << socket_errorType(WSAGetLastError()) << std::endl; + pqioutput(PQL_ALERT, pqisslzone, out.str()); + + return -1; + } +#endif +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ + + // setup listening address. + + // fill in fconstant bits. + + laddr.sin_family = AF_INET; + + { + std::ostringstream out; + out << "pqissllistener::setuplisten()"; + out << "\tAddress Family: " << (int) laddr.sin_family; + out << std::endl; + out << "\tSetup Address: " << inet_ntoa(laddr.sin_addr); + out << std::endl; + out << "\tSetup Port: " << ntohs(laddr.sin_port); + + pqioutput(PQL_DEBUG_BASIC, pqisslzone, out.str()); + } + + if (0 != (err = bind(lsock, (struct sockaddr *) &laddr, sizeof(laddr)))) + { + std::ostringstream out; + out << "pqissllistener::setuplisten()"; + out << " Cannot Bind to Local Address!" << std::endl; + showSocketError(out); + pqioutput(PQL_ALERT, pqisslzone, out.str()); + + exit(1); + return -1; + } + else + { + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissllistener::setuplisten() Bound to Address."); + } + + if (0 != (err = listen(lsock, 100))) + { + std::ostringstream out; + out << "pqissllistener::setuplisten()"; + out << "Error: Cannot Listen to Socket: "; + out << err << std::endl; + showSocketError(out); + pqioutput(PQL_ALERT, pqisslzone, out.str()); + + exit(1); + return -1; + } + else + { + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissllistener::setuplisten() Listening to Socket"); + } + active = true; + return 1; +} + +int pqissllistener::setListenAddr(struct sockaddr_in addr) +{ + laddr = addr; + return 1; +} + +int pqissllistener::resetlisten() +{ + if (active) + { + // close ports etc. +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS // ie UNIX + shutdown(lsock, SHUT_RDWR); + close(lsock); +#else //WINDOWS_SYS + closesocket(lsock); +#endif +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ + + active = false; + return 1; + } + + return 0; +} + + +int pqissllistener::acceptconnection() +{ + if (!active) + return 0; + // check port for any socets... + pqioutput(PQL_DEBUG_ALL, pqisslzone, "pqissllistener::accepting()"); + + // These are local but temp variables... + // can't be arsed making them all the time. + addrlen = sizeof(raddr); + int fd = accept(lsock, (struct sockaddr *) &raddr, &addrlen); + int err = 0; + +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS // ie UNIX + if (fd < 0) + { + pqioutput(PQL_DEBUG_ALL, pqisslzone, + "pqissllistener::acceptconnnection() Nothing to Accept!"); + return 0; + } + + err = fcntl(fd, F_SETFL, O_NONBLOCK); + if (err < 0) + { + std::ostringstream out; + out << "pqissllistener::acceptconnection()"; + out << "Error: Cannot make socket NON-Blocking: "; + out << err << std::endl; + pqioutput(PQL_ERROR, pqisslzone, out.str()); + + close(fd); + return -1; + } + +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#else //WINDOWS_SYS + if ((unsigned) fd == INVALID_SOCKET) + { + pqioutput(PQL_DEBUG_ALL, pqisslzone, + "pqissllistener::acceptconnnection() Nothing to Accept!"); + return 0; + } + + // Make nonblocking. + unsigned long int on = 1; + if (0 != (err = ioctlsocket(fd, FIONBIO, &on))) + { + std::ostringstream out; + out << "pqissllistener::acceptconnection()"; + out << "Error: Cannot make socket NON-Blocking: "; + out << err << std::endl; + out << "Socket Error:"; + out << socket_errorType(WSAGetLastError()) << std::endl; + pqioutput(PQL_ALERT, pqisslzone, out.str()); + + closesocket(fd); + return 0; + } +#endif +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ + + { + std::ostringstream out; + out << "Accepted Connection from "; + out << inet_ntoa(raddr.sin_addr) << ":" << ntohs(raddr.sin_port); + pqioutput(PQL_DEBUG_BASIC, pqisslzone, out.str()); + } + + // Negotiate certificates. SSL stylee. + // Allow negotiations for secure transaction. + + SSL *ssl = SSL_new(sslccr -> getCTX()); + SSL_set_fd(ssl, fd); + + return continueSSL(ssl, true); // continue and save if incomplete. +} + +int pqissllistener::continueSSL(SSL *ssl, bool addin) +{ + // attempt the accept again. + int fd = SSL_get_fd(ssl); + int err = SSL_accept(ssl); + if (err <= 0) + { + int ssl_err = SSL_get_error(ssl, err); + int err_err = ERR_get_error(); + + { + std::ostringstream out; + out << "pqissllistener::continueSSL() "; + out << "Issues with SSL Accept(" << err << ")!" << std::endl; + printSSLError(ssl, err, ssl_err, err_err, out); + pqioutput(PQL_DEBUG_BASIC, pqisslzone, out.str()); + } + + if ((ssl_err == SSL_ERROR_WANT_READ) || + (ssl_err == SSL_ERROR_WANT_WRITE)) + { + std::ostringstream out; + out << "pqissllistener::continueSSL() "; + out << " Connection Not Complete!"; + out << std::endl; + + if (addin) + { + out << "pqissllistener::continueSSL() "; + out << "Adding SSL to incoming!"; + + // add to incomingqueue. + incoming_ssl.push_back(ssl); + } + + pqioutput(PQL_DEBUG_BASIC, pqisslzone, out.str()); + + // zero means still continuing.... + return 0; + } + + /* we have failed -> get certificate if possible */ + Extract_Failed_SSL_Certificate(ssl, &raddr); + + // other wise delete ssl connection. + // kill connection.... + // so it will be removed from cache. + SSL_shutdown(ssl); + + // close socket??? +/************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS // ie UNIX + shutdown(fd, SHUT_RDWR); + close(fd); +#else //WINDOWS_SYS + closesocket(fd); +#endif +/************************** WINDOWS/UNIX SPECIFIC PART ******************/ + // free connection. + SSL_free(ssl); + + std::ostringstream out; + out << "Read Error on the SSL Socket"; + out << std::endl; + out << "Shutting it down!" << std::endl; + pqioutput(PQL_WARNING, pqisslzone, out.str()); + + // failure -1, pending 0, sucess 1. + return -1; + } + + + // if it succeeds + + // Get the Peer Certificate.... +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + XPGP *peercert = SSL_get_peer_pgp_certificate(ssl); +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + X509 *peercert = SSL_get_peer_certificate(ssl); +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + + if (peercert == NULL) + { + pqioutput(PQL_WARNING, pqisslzone, + "pqissl::connectattempt() Peer Did Not Provide Cert!"); + + // delete ssl connection. + SSL_shutdown(ssl); + + // close socket??? +/************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS // ie UNIX + shutdown(fd, SHUT_RDWR); + close(fd); +#else //WINDOWS_SYS + closesocket(fd); +#endif +/************************** WINDOWS/UNIX SPECIFIC PART ******************/ + // free connection. + SSL_free(ssl); + + std::ostringstream out; + out << "Shutting it down!" << std::endl; + pqioutput(PQL_WARNING, pqisslzone, out.str()); + + // failure -1, pending 0, sucess 1. + return -1; + } + + + // save certificate... (and ip locations) +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + cert *npc = sslccr -> registerCertificateXPGP(peercert, raddr, true); +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + cert *npc = sslccr -> registerCertificate(peercert, raddr, true); +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + + bool found = false; + std::map::iterator it; + + if ((npc == NULL) || (npc -> Connected())) + { + // bad - shutdown. + } + else + { + std::ostringstream out; + + out << "pqissllistener::continueSSL()" << std::endl; + out << "checking: " << npc -> Name() << std::endl; + // check if cert is in our list..... + for(it = listenaddr.begin();(found!=true) && (it!=listenaddr.end());) + { + out << "\tagainst: " << it->first->Name() << std::endl; + if (sslccr -> compareCerts(it -> first, npc) == 0) + { + out << "\t\tMatch!"; + found = true; + } + else + { + it++; + } + } + + pqioutput(PQL_DEBUG_BASIC, pqisslzone, out.str()); + } + + if (found == false) + { + // kill connection.... + // so it will be removed from cache. + SSL_shutdown(ssl); + + // close socket??? +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS // ie UNIX + shutdown(fd, SHUT_RDWR); + close(fd); +#else //WINDOWS_SYS + closesocket(fd); +#endif +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ + + // free connection. + SSL_free(ssl); + + std::ostringstream out; + out << "No Matching Certificate/Already Connected"; + out << " for Connection:" << inet_ntoa(raddr.sin_addr); + out << std::endl; + out << "Shutting it down!" << std::endl; + pqioutput(PQL_WARNING, pqisslzone, out.str()); + return -1; + } + + pqissl *pqis = it -> second; + + // remove from the list of certificates. + listenaddr.erase(it); + + // timestamp + // done in sslroot... npc -> lr_timestamp = time(NULL); + + // hand off ssl conection. + pqis -> accept(ssl, fd); + return 1; +} + + +int pqissllistener::Extract_Failed_SSL_Certificate(SSL *ssl, struct sockaddr_in *inaddr) +{ + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissllistener::Extract_Failed_SSL_Certificate()"); + + // Get the Peer Certificate.... +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + XPGP *peercert = SSL_get_peer_pgp_certificate(ssl); +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + X509 *peercert = SSL_get_peer_certificate(ssl); +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + + if (peercert == NULL) + { + pqioutput(PQL_WARNING, pqisslzone, + "pqissllistener::Extract_Failed_SSL_Certificate() Peer Didnt Give Cert"); + return -1; + } + + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissllistener::Extract_Failed_SSL_Certificate() Have Peer Cert - Registering"); + + // save certificate... (and ip locations) + // false for outgoing.... +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + cert *npc = sslccr -> registerCertificateXPGP(peercert, *inaddr, true); +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + cert *npc = sslccr -> registerCertificate(peercert, *inaddr, true); +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + + return 1; +} + + +int pqissllistener::continueSocket(int fd, bool addin) +{ + // this does nothing, as sockets + // cannot (haven't) blocked yet! + return 0; +} + + +int pqissllistener::continueaccepts() +{ + + // for each of the incoming sockets.... call continue. + std::list::iterator it; + std::list::iterator its; + + for(it = incoming_skts.begin(); it != incoming_skts.end();) + { + if (continueSocket(*it, false)) + { + it = incoming_skts.erase(it); + } + else + { + it++; + } + } + + for(its = incoming_ssl.begin(); its != incoming_ssl.end();) + { + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissllistener::continueaccepts() Continuing SSL"); + if (0 != continueSSL(*its, false)) + { + pqioutput(PQL_DEBUG_ALERT, pqisslzone, + "pqissllistener::continueaccepts() SSL Complete/Dead!"); + + its = incoming_ssl.erase(its); + } + else + { + its++; + } + } + return 1; +} + + + + +int pqissllistener::removeListenPort(cert *c) +{ + // check where the connection is coming from. + // if in list of acceptable addresses, + // + // check if in list. + std::map::iterator it; + for(it = listenaddr.begin();it!=listenaddr.end();it++) + { + if (sslccr -> compareCerts(it -> first, c) == 0) + { + listenaddr.erase(it); + + pqioutput(PQL_DEBUG_BASIC, pqisslzone, + "pqissllisten::removeListenPort() Success!"); + return 1; + } + } + + pqioutput(PQL_WARNING, pqisslzone, + "pqissllistener::removeListenPort() Failed to Find a Match"); + + return -1; +} + +#endif /* NO LISTENER */ diff --git a/libretroshare/src/pqi/pqissl.h b/libretroshare/src/pqi/pqissl.h new file mode 100644 index 000000000..63bc9f28d --- /dev/null +++ b/libretroshare/src/pqi/pqissl.h @@ -0,0 +1,262 @@ +/* + * "$Id: pqissl.h,v 1.18 2007-03-11 14:54:22 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + +#ifndef MRK_PQI_SSL_HEADER +#define MRK_PQI_SSL_HEADER + +#include + +// operating system specific network header. +#include "pqi/pqinetwork.h" + +#include +#include + +#include "pqi/pqi_base.h" + +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) +#include "pqi/xpgpcert.h" +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ +#include "pqi/sslcert.h" +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + + +#define WAITING_NOT 0 +#define WAITING_PROXY_CONNECT 1 +#define WAITING_LOCAL_ADDR 2 +#define WAITING_REMOTE_ADDR 3 +#define WAITING_SOCK_CONNECT 4 +#define WAITING_SSL_CONNECTION 5 +#define WAITING_SSL_AUTHORISE 6 +#define WAITING_FAIL_INTERFACE 7 + + +#define PQISSL_PASSIVE 0x00 +#define PQISSL_ACTIVE 0x01 + +const int PQISSL_LOCAL_FLAG = 0x01; +const int PQISSL_REMOTE_FLAG = 0x02; +const int PQISSL_DNS_FLAG = 0x04; + +/* not sure about the value? */ +const int PQISSL_UDP_FLAG = 0x02; + + +/***************************** pqi Net SSL Interface ********************************* + * This provides the base SSL interface class, + * and handles most of the required functionality. + * + * there are a series of small fn's that can be overloaded + * to provide alternative behaviour.... + * + * Classes expected to inherit from this are: + * + * pqissllistener -> pqissllistener (tcp only) + * -> pqixpgplistener (tcp only) + * + * pqissl -> pqissltcp + * -> pqissludp + * -> pqixpgptcp + * -> pqixpgpudp + * + */ + +class pqissl; +class cert; + +class pqissllistener; + +#if 0 /* REMOVING pqissllistener */ + +class pqissllistener +{ + public: + + pqissllistener(struct sockaddr_in addr); + +int addlistenaddr(cert *c, pqissl *acc); +int removeListenPort(cert *c); + +int setListenAddr(struct sockaddr_in addr); +int setuplisten(); +int resetlisten(); + +int acceptconnection(); +int continueaccepts(); +int continueSSL(SSL *ssl, bool); +int continueSocket(int fd, bool); + +//int connectCertExchange(cert *); +// + + +int tick(); +int status(); + + private: + + // fn to get cert, anyway +int Extract_Failed_SSL_Certificate(SSL *ssl, struct sockaddr_in *inaddr); + + struct sockaddr_in raddr; + struct sockaddr_in laddr; + socklen_t addrlen; + + bool active; + int lsock; + cert *localcert; + std::map listenaddr; + std::list incoming_ssl; + std::list incoming_skts; + + sslroot *sslccr; +}; + + +#endif /* removing pqisllistener */ + +class pqissl: public NetBinInterface +{ +public: + pqissl(cert *c, pqissllistener *l, PQInterface *parent); +virtual ~pqissl(); + + // NetInterface +virtual int connectattempt(); +virtual int listen(); +virtual int stoplistening(); +virtual int reset(); +virtual int disconnect(); + + // BinInterface +virtual int tick(); +virtual int status(); + +virtual int senddata(void*, int); +virtual int readdata(void*, int); +virtual int netstatus(); +virtual int isactive(); +virtual bool moretoread(); +virtual bool cansend(); +virtual bool bandwidthLimited(); + +protected: + // A little bit of information to describe + // the SSL state, this is needed + // to allow full Non-Blocking Connect behaviour. + // This fn loops through the following fns. + // to complete an SSL. + +int ConnectAttempt(); +int waiting; + + // These first five fns are overloaded for udp/etc connections. +virtual int Reattempt_Connection(); +virtual int Request_Proxy_Connection(); +virtual int Check_Proxy_Connection(); +virtual int Request_Local_Address(); +virtual int Determine_Local_Address(); +virtual int Determine_Remote_Address(); + +virtual int Initiate_Connection(); +virtual int Basic_Connection_Complete(); + + // These should be identical for all cases, + // differences are achieved via the net_internal_* fns. +int Initiate_SSL_Connection(); +int SSL_Connection_Complete(); +int Authorise_SSL_Connection(); + +int Extract_Failed_SSL_Certificate(); // try to get cert anyway. + +public: + +/* Completion of the SSL connection, + * this is public, so it can be called by + * the listener (should make friends??) + */ + +int accept(SSL *ssl, int fd, struct sockaddr_in foreign_addr); + +protected: + + //protected internal fns that are overloaded for udp case. +virtual int net_internal_close(int fd) { return unix_close(fd); } +virtual int net_internal_SSL_set_fd(SSL *ssl, int fd) { return SSL_set_fd(ssl, fd); } +virtual int net_internal_fcntl_nonblock(int fd) { return unix_fcntl_nonblock(fd);} + + + /* data */ + bool active; + bool certvalid; + + // addition for udp (tcp version == ACTIVE). + int sslmode; + + SSL *ssl_connection; + int sockfd; + + cert *sslcert; + sslroot *sslccr; + + pqissllistener *pqil; + + struct sockaddr_in remote_addr; + + + void *readpkt; + int pktlen; + + int attempt_ts; + + // Some flags to indicate + // the status of the various interfaces + // (local), (server) + unsigned int net_attempt; + unsigned int net_failure; + unsigned int net_unreachable; + + bool sameLAN; /* flag use to allow high-speed transfers */ + + int n_read_zero; /* a counter to determine if the connection is really dead */ + + int ssl_connect_timeout; /* timeout to ensure that we don't get stuck (can happen on udp!) */ + +private: + + // ssl only fns. +int connectInterface(sockaddr_in&); + +}; + + + + +#endif // MRK_PQI_SSL_HEADER diff --git a/libretroshare/src/pqi/pqissllistener.cc b/libretroshare/src/pqi/pqissllistener.cc new file mode 100644 index 000000000..d75aa65fb --- /dev/null +++ b/libretroshare/src/pqi/pqissllistener.cc @@ -0,0 +1,678 @@ +/* + * "$Id: pqissllistener.cc,v 1.3 2007-02-18 21:46:49 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "pqi/pqissl.h" +#include "pqi/pqissllistener.h" +#include "pqi/pqinetwork.h" + +#include +#include + +#include "pqi/pqidebug.h" +#include + +const int pqissllistenzone = 49787; + + +/************************ PQI SSL LISTEN BASE **************************** + * + * This provides all of the basic connection stuff, + * and calls completeConnection afterwards... + * + */ + + +pqissllistenbase::pqissllistenbase(struct sockaddr_in addr) + :laddr(addr), active(false) +{ + sslccr = getSSLRoot(); + if (!(sslccr -> active())) + { + pqioutput(PQL_ALERT, pqissllistenzone, + "SSL-CTX-CERT-ROOT not initialised!"); + + exit(1); + } + + setuplisten(); + return; +} + +pqissllistenbase::~pqissllistenbase() +{ + return; +} + +int pqissllistenbase::tick() +{ + status(); + // check listen port. + acceptconnection(); + return continueaccepts(); +} + +int pqissllistenbase::status() +{ + std::ostringstream out; + out << "pqissllistenbase::status(): "; + out << " Listening on port: " << ntohs(laddr.sin_port) << std::endl; + pqioutput(PQL_DEBUG_ALL, pqissllistenzone, out.str()); + return 1; +} + + + +int pqissllistenbase::setuplisten() +{ + int err; + if (active) + return -1; + + lsock = socket(PF_INET, SOCK_STREAM, 0); +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS // ie UNIX + if (lsock < 0) + { + pqioutput(PQL_ALERT, pqissllistenzone, + "pqissllistenbase::setuplisten() Cannot Open Socket!"); + + return -1; + } + + err = fcntl(lsock, F_SETFL, O_NONBLOCK); + if (err < 0) + { + std::ostringstream out; + out << "Error: Cannot make socket NON-Blocking: "; + out << err << std::endl; + pqioutput(PQL_ERROR, pqissllistenzone, out.str()); + + return -1; + } + +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#else //WINDOWS_SYS + if ((unsigned) lsock == INVALID_SOCKET) + { + std::ostringstream out; + out << "pqissllistenbase::setuplisten()"; + out << " Cannot Open Socket!" << std::endl; + out << "Socket Error:"; + out << socket_errorType(WSAGetLastError()) << std::endl; + pqioutput(PQL_ALERT, pqissllistenzone, out.str()); + + return -1; + } + + // Make nonblocking. + unsigned long int on = 1; + if (0 != (err = ioctlsocket(lsock, FIONBIO, &on))) + { + std::ostringstream out; + out << "pqissllistenbase::setuplisten()"; + out << "Error: Cannot make socket NON-Blocking: "; + out << err << std::endl; + out << "Socket Error:"; + out << socket_errorType(WSAGetLastError()) << std::endl; + pqioutput(PQL_ALERT, pqissllistenzone, out.str()); + + return -1; + } +#endif +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ + + // setup listening address. + + // fill in fconstant bits. + + laddr.sin_family = AF_INET; + + { + std::ostringstream out; + out << "pqissllistenbase::setuplisten()"; + out << "\tAddress Family: " << (int) laddr.sin_family; + out << std::endl; + out << "\tSetup Address: " << inet_ntoa(laddr.sin_addr); + out << std::endl; + out << "\tSetup Port: " << ntohs(laddr.sin_port); + + pqioutput(PQL_DEBUG_BASIC, pqissllistenzone, out.str()); + } + + if (0 != (err = bind(lsock, (struct sockaddr *) &laddr, sizeof(laddr)))) + { + std::ostringstream out; + out << "pqissllistenbase::setuplisten()"; + out << " Cannot Bind to Local Address!" << std::endl; + showSocketError(out); + pqioutput(PQL_ALERT, pqissllistenzone, out.str()); + + exit(1); + return -1; + } + else + { + pqioutput(PQL_DEBUG_BASIC, pqissllistenzone, + "pqissllistenbase::setuplisten() Bound to Address."); + } + + if (0 != (err = listen(lsock, 100))) + { + std::ostringstream out; + out << "pqissllistenbase::setuplisten()"; + out << "Error: Cannot Listen to Socket: "; + out << err << std::endl; + showSocketError(out); + pqioutput(PQL_ALERT, pqissllistenzone, out.str()); + + exit(1); + return -1; + } + else + { + pqioutput(PQL_DEBUG_BASIC, pqissllistenzone, + "pqissllistenbase::setuplisten() Listening to Socket"); + } + active = true; + return 1; +} + +int pqissllistenbase::setListenAddr(struct sockaddr_in addr) +{ + laddr = addr; + return 1; +} + +int pqissllistenbase::resetlisten() +{ + if (active) + { + // close ports etc. +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS // ie UNIX + shutdown(lsock, SHUT_RDWR); + close(lsock); +#else //WINDOWS_SYS + closesocket(lsock); +#endif +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ + + active = false; + return 1; + } + + return 0; +} + + +int pqissllistenbase::acceptconnection() +{ + if (!active) + return 0; + // check port for any socets... + pqioutput(PQL_DEBUG_ALL, pqissllistenzone, "pqissllistenbase::accepting()"); + + // These are local but temp variables... + // can't be arsed making them all the time. + struct sockaddr_in remote_addr; + socklen_t addrlen = sizeof(remote_addr); + int fd = accept(lsock, (struct sockaddr *) &remote_addr, &addrlen); + int err = 0; + +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS // ie UNIX + if (fd < 0) + { + pqioutput(PQL_DEBUG_ALL, pqissllistenzone, + "pqissllistenbase::acceptconnnection() Nothing to Accept!"); + return 0; + } + + err = fcntl(fd, F_SETFL, O_NONBLOCK); + if (err < 0) + { + std::ostringstream out; + out << "pqissllistenbase::acceptconnection()"; + out << "Error: Cannot make socket NON-Blocking: "; + out << err << std::endl; + pqioutput(PQL_ERROR, pqissllistenzone, out.str()); + + close(fd); + return -1; + } + +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#else //WINDOWS_SYS + if ((unsigned) fd == INVALID_SOCKET) + { + pqioutput(PQL_DEBUG_ALL, pqissllistenzone, + "pqissllistenbase::acceptconnnection() Nothing to Accept!"); + return 0; + } + + // Make nonblocking. + unsigned long int on = 1; + if (0 != (err = ioctlsocket(fd, FIONBIO, &on))) + { + std::ostringstream out; + out << "pqissllistenbase::acceptconnection()"; + out << "Error: Cannot make socket NON-Blocking: "; + out << err << std::endl; + out << "Socket Error:"; + out << socket_errorType(WSAGetLastError()) << std::endl; + pqioutput(PQL_ALERT, pqissllistenzone, out.str()); + + closesocket(fd); + return 0; + } +#endif +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ + + { + std::ostringstream out; + out << "Accepted Connection from "; + out << inet_ntoa(remote_addr.sin_addr) << ":" << ntohs(remote_addr.sin_port); + pqioutput(PQL_DEBUG_BASIC, pqissllistenzone, out.str()); + } + + // Negotiate certificates. SSL stylee. + // Allow negotiations for secure transaction. + + SSL *ssl = SSL_new(sslccr -> getCTX()); + SSL_set_fd(ssl, fd); + + return continueSSL(ssl, remote_addr, true); // continue and save if incomplete. +} + +int pqissllistenbase::continueSSL(SSL *ssl, struct sockaddr_in remote_addr, bool addin) +{ + // attempt the accept again. + int fd = SSL_get_fd(ssl); + int err = SSL_accept(ssl); + if (err <= 0) + { + int ssl_err = SSL_get_error(ssl, err); + int err_err = ERR_get_error(); + + { + std::ostringstream out; + out << "pqissllistenbase::continueSSL() "; + out << "Issues with SSL Accept(" << err << ")!" << std::endl; + printSSLError(ssl, err, ssl_err, err_err, out); + pqioutput(PQL_DEBUG_BASIC, pqissllistenzone, out.str()); + } + + if ((ssl_err == SSL_ERROR_WANT_READ) || + (ssl_err == SSL_ERROR_WANT_WRITE)) + { + std::ostringstream out; + out << "pqissllistenbase::continueSSL() "; + out << " Connection Not Complete!"; + out << std::endl; + + if (addin) + { + out << "pqissllistenbase::continueSSL() "; + out << "Adding SSL to incoming!"; + + // add to incomingqueue. + incoming_ssl[ssl] = remote_addr; + } + + pqioutput(PQL_DEBUG_BASIC, pqissllistenzone, out.str()); + + // zero means still continuing.... + return 0; + } + + /* we have failed -> get certificate if possible */ + Extract_Failed_SSL_Certificate(ssl, &remote_addr); + + // other wise delete ssl connection. + // kill connection.... + // so it will be removed from cache. + SSL_shutdown(ssl); + + // close socket??? +/************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS // ie UNIX + shutdown(fd, SHUT_RDWR); + close(fd); +#else //WINDOWS_SYS + closesocket(fd); +#endif +/************************** WINDOWS/UNIX SPECIFIC PART ******************/ + // free connection. + SSL_free(ssl); + + std::ostringstream out; + out << "Read Error on the SSL Socket"; + out << std::endl; + out << "Shutting it down!" << std::endl; + pqioutput(PQL_WARNING, pqissllistenzone, out.str()); + + // failure -1, pending 0, sucess 1. + return -1; + } + + // if it succeeds + if (0 < completeConnection(fd, ssl, remote_addr)) + { + return 1; + } + + /* else we shut it down! */ + pqioutput(PQL_WARNING, pqissllistenzone, + "pqissllistenbase::completeConnection() Failed!"); + + // delete ssl connection. + SSL_shutdown(ssl); + + // close socket??? +/************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS // ie UNIX + shutdown(fd, SHUT_RDWR); + close(fd); +#else //WINDOWS_SYS + closesocket(fd); +#endif +/************************** WINDOWS/UNIX SPECIFIC PART ******************/ + // free connection. + SSL_free(ssl); + + std::ostringstream out; + out << "Shutting it down!" << std::endl; + pqioutput(PQL_WARNING, pqissllistenzone, out.str()); + + // failure -1, pending 0, sucess 1. + return -1; +} + + +int pqissllistenbase::Extract_Failed_SSL_Certificate(SSL *ssl, struct sockaddr_in *inaddr) +{ + pqioutput(PQL_DEBUG_BASIC, pqissllistenzone, + "pqissllistenbase::Extract_Failed_SSL_Certificate()"); + + // Get the Peer Certificate.... +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + XPGP *peercert = SSL_get_peer_pgp_certificate(ssl); +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + X509 *peercert = SSL_get_peer_certificate(ssl); +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + + if (peercert == NULL) + { + pqioutput(PQL_WARNING, pqissllistenzone, + "pqissllistenbase::Extract_Failed_SSL_Certificate() Peer Didnt Give Cert"); + return -1; + } + + pqioutput(PQL_DEBUG_BASIC, pqissllistenzone, + "pqissllistenbase::Extract_Failed_SSL_Certificate() Have Peer Cert - Registering"); + + // save certificate... (and ip locations) + // false for outgoing.... +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + sslccr -> registerCertificateXPGP(peercert, *inaddr, true); +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + sslccr -> registerCertificate(peercert, *inaddr, true); +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + + return 1; +} + + +int pqissllistenbase::continueaccepts() +{ + + // for each of the incoming sockets.... call continue. + std::map::iterator it, itd; + + for(it = incoming_ssl.begin(); it != incoming_ssl.end();) + { + pqioutput(PQL_DEBUG_BASIC, pqissllistenzone, + "pqissllistenbase::continueaccepts() Continuing SSL"); + if (0 != continueSSL(it->first, it->second, false)) + { + pqioutput(PQL_DEBUG_ALERT, pqissllistenzone, + "pqissllistenbase::continueaccepts() SSL Complete/Dead!"); + + /* save and increment -> so we can delete */ + itd = it++; + incoming_ssl.erase(itd); + } + else + { + it++; + } + } + return 1; +} + + +/************************ PQI SSL LISTENER **************************** + * + * This is the standard pqissl listener interface.... + * + * this class only allows connections from + * specific certificates, which are pre specified. + * + */ + +pqissllistener::pqissllistener(struct sockaddr_in addr) + :pqissllistenbase(addr) +{ + return; +} + +pqissllistener::~pqissllistener() +{ + return; +} + +int pqissllistener::addlistenaddr(cert *c, pqissl *acc) +{ + std::map::iterator it; + + std::ostringstream out; + + out << "Adding to Cert Listening Addresses:" << std::endl; + sslccr -> printCertificate(c, out); + out << "Current Certs:" << std::endl; + for(it = listenaddr.begin(); it != listenaddr.end(); it++) + { + sslccr -> printCertificate(it -> first, out); + if (sslccr -> compareCerts(c, it -> first) == 0) + { + out << "pqissllistener::addlistenaddr()"; + out << "Already listening for Certificate!"; + out << std::endl; + + pqioutput(PQL_DEBUG_ALERT, pqissllistenzone, out.str()); + return -1; + + } + } + + pqioutput(PQL_DEBUG_BASIC, pqissllistenzone, out.str()); + + // not there can accept it! + listenaddr[c] = acc; + return 1; +} + +int pqissllistener::removeListenPort(cert *c) +{ + // check where the connection is coming from. + // if in list of acceptable addresses, + // + // check if in list. + std::map::iterator it; + for(it = listenaddr.begin();it!=listenaddr.end();it++) + { + if (sslccr -> compareCerts(it -> first, c) == 0) + { + listenaddr.erase(it); + + pqioutput(PQL_DEBUG_BASIC, pqissllistenzone, + "pqissllisten::removeListenPort() Success!"); + return 1; + } + } + + pqioutput(PQL_WARNING, pqissllistenzone, + "pqissllistener::removeListenPort() Failed to Find a Match"); + + return -1; +} + + +int pqissllistener::status() +{ + pqissllistenbase::status(); + // print certificates we are listening for. + std::map::iterator it; + + std::ostringstream out; + out << "pqissllistener::status(): "; + out << " Listening (" << ntohs(laddr.sin_port) << ") for Certs:" << std::endl; + for(it = listenaddr.begin(); it != listenaddr.end(); it++) + { + sslccr -> printCertificate(it -> first, out); + } + pqioutput(PQL_DEBUG_ALL, pqissllistenzone, out.str()); + + return 1; +} + +int pqissllistener::completeConnection(int fd, SSL *ssl, struct sockaddr_in &remote_addr) +{ + + // Get the Peer Certificate.... +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + XPGP *peercert = SSL_get_peer_pgp_certificate(ssl); +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + X509 *peercert = SSL_get_peer_certificate(ssl); +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + + if (peercert == NULL) + { + pqioutput(PQL_WARNING, pqissllistenzone, + "pqissllistener::completeConnection() Peer Did Not Provide Cert!"); + + // failure -1, pending 0, sucess 1. + // pqissllistenbase will shutdown! + return -1; + } + + // save certificate... (and ip locations) +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + cert *npc = sslccr -> registerCertificateXPGP(peercert, remote_addr, true); +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + cert *npc = sslccr -> registerCertificate(peercert, remote_addr, true); +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + + bool found = false; + std::map::iterator it; + + // Let connected one through as well! if ((npc == NULL) || (npc -> Connected())) + if (npc == NULL) + { + pqioutput(PQL_WARNING, pqissllistenzone, + "pqissllistener::completeConnection() registerCertificate Failed!"); + + // bad - shutdown. + // pqissllistenbase will shutdown! + return -1; + } + else + { + std::ostringstream out; + + out << "pqissllistener::continueSSL()" << std::endl; + out << "checking: " << npc -> Name() << std::endl; + // check if cert is in our list..... + for(it = listenaddr.begin();(found!=true) && (it!=listenaddr.end());) + { + out << "\tagainst: " << it->first->Name() << std::endl; + if (sslccr -> compareCerts(it -> first, npc) == 0) + { + out << "\t\tMatch!"; + found = true; + } + else + { + it++; + } + } + + pqioutput(PQL_DEBUG_BASIC, pqissllistenzone, out.str()); + } + + if (found == false) + { + std::ostringstream out; + out << "No Matching Certificate/Already Connected"; + out << " for Connection:" << inet_ntoa(remote_addr.sin_addr); + out << std::endl; + out << "pqissllistenbase: Will shut it down!" << std::endl; + pqioutput(PQL_WARNING, pqissllistenzone, out.str()); + return -1; + } + + pqissl *pqis = it -> second; + + // dont remove from the list of certificates. + // want to allow a new connection to replace a faulty one! + // listenaddr.erase(it); + + // timestamp + // done in sslroot... npc -> lr_timestamp = time(NULL); + + // hand off ssl conection. + pqis -> accept(ssl, fd, remote_addr); + return 1; +} + + + + diff --git a/libretroshare/src/pqi/pqissllistener.h b/libretroshare/src/pqi/pqissllistener.h new file mode 100644 index 000000000..39e374147 --- /dev/null +++ b/libretroshare/src/pqi/pqissllistener.h @@ -0,0 +1,117 @@ +/* + * "$Id: pqissllistener.h,v 1.2 2007-02-18 21:46:49 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + +#ifndef MRK_PQI_SSL_LISTEN_HEADER +#define MRK_PQI_SSL_LISTEN_HEADER + +#include + +// operating system specific network header. +#include "pqi/pqinetwork.h" + +#include +#include + +#include "pqi/pqi_base.h" + +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) +#include "pqi/xpgpcert.h" +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ +#include "pqi/sslcert.h" +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + +/***************************** pqi Net SSL Interface ********************************* + */ + +class pqissl; +class cert; + +class pqissllistenbase +{ + public: + + pqissllistenbase(struct sockaddr_in addr); +virtual ~pqissllistenbase(); + +int setListenAddr(struct sockaddr_in addr); +int setuplisten(); +int resetlisten(); + +int acceptconnection(); +int continueaccepts(); +int continueSSL(SSL *ssl, struct sockaddr_in remote_addr, bool); + +virtual int tick(); +virtual int status(); + +virtual int completeConnection(int sockfd, SSL *in_connection, struct sockaddr_in &raddr) = 0; + + protected: + + struct sockaddr_in laddr; + sslroot *sslccr; + + private: + + // fn to get cert, anyway +int Extract_Failed_SSL_Certificate(SSL *ssl, struct sockaddr_in *inaddr); + + + bool active; + int lsock; + cert *localcert; + + std::map incoming_ssl; + +}; + + +class pqissllistener: public pqissllistenbase +{ + public: + + pqissllistener(struct sockaddr_in addr); +virtual ~pqissllistener(); + +int addlistenaddr(cert *c, pqissl *acc); +int removeListenPort(cert *c); + +//virtual int tick(); +virtual int status(); + +virtual int completeConnection(int sockfd, SSL *in_connection, struct sockaddr_in &raddr); + + private: + + std::map listenaddr; +}; + + +#endif // MRK_PQI_SSL_LISTEN_HEADER diff --git a/libretroshare/src/pqi/pqissludp.cc b/libretroshare/src/pqi/pqissludp.cc new file mode 100644 index 000000000..da0c1d80b --- /dev/null +++ b/libretroshare/src/pqi/pqissludp.cc @@ -0,0 +1,1307 @@ +/* + * "$Id: pqissludp.cc,v 1.16 2007-02-18 21:46:49 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "pqi/pqissludp.h" +#include "pqi/pqiudpproxy.h" +#include "pqi/pqinetwork.h" + +#include "tcponudp/tou.h" +#include "tcponudp/bio_tou.h" + +#include +#include + +#include "pqi/pqidebug.h" +#include + +const int pqissludpzone = 3144; + +static const int PQI_SSLUDP_STUN_TIMEOUT = 2; +static const int PQI_SSLUDP_STUN_ATTEMPTS = 15; + + /* we need a long timeout to give the local address + * discovery a chance. This must also allow for the + * time for the peer to check for a proxy connect (before lad starts). + * Remote = Check Time + 40 + */ +static const int PQI_SSLUDP_PROXY_CHECK_TIME = 29; +static const int PQI_SSLUDP_REMOTE_TIMEOUT = 70; + + /* we need a long timeout to give the udpproxy time + * to find proxies (at startup) + * this is only an emergency timeout anyway + */ +static const int PQI_SSLUDP_PROXY_TIMEOUT = 180; + + /* a final timeout, to ensure this never blocks completely + * 300 secs to complete udp/tcp/ssl connection. + * This is long as the udp connect can take some time. + */ +static const int PQI_SSLUDP_CONNECT_TIMEOUT = 300; + +/********** PQI SSL UDP STUFF **************************************/ + +pqissludp::pqissludp(cert *c, PQInterface *parent, pqiudpproxy *prxy) + :pqissl(c, NULL, parent), tou_bio(NULL), udpproxy(prxy), + listen_checktime(0) + +{ + sslmode = PQISSL_PASSIVE; + stun_addr.sin_addr.s_addr = 0; + return; +} + + +pqissludp::~pqissludp() +{ + pqioutput(PQL_ALERT, pqissludpzone, + "pqissludp::~pqissludp -> destroying pqissludp (+ pqiudproxy)"); + + /* must call reset from here, so that the + * virtual functions will still work. + * -> as they stop working in base class destructor. + * + * This means that reset() will be called twice, but this should + * be harmless. + */ + stoplistening(); /* remove from p3proxy listenqueue */ + reset(); + + if (udpproxy) + { + delete udpproxy; + } + + if (tou_bio) // this should be in the reset? + { + BIO_free(tou_bio); + } + return; +} + +int pqissludp::reset() +{ + /* and reset the udpproxy */ + if (udpproxy) + { + udpproxy->reset(); + } + /* reset for next time.*/ + stun_attempts = 0; + return pqissl::reset(); +} + + +void *pqissludp::generate_stun_pkt(struct sockaddr_in *stun_addr, int *len) +{ + /* just the header */ + void *stun_pkt = malloc(20); + ((uint16_t *) stun_pkt)[0] = 0x0001; + ((uint16_t *) stun_pkt)[1] = 0x0020; /* only header */ + /* transaction id - should be random */ + ((uint32_t *) stun_pkt)[1] = 0x0020; + ((uint32_t *) stun_pkt)[2] = 0x0121; + ((uint32_t *) stun_pkt)[3] = 0x0111; + ((uint32_t *) stun_pkt)[4] = 0x1010; + *len = 20; + return stun_pkt; +} + + +int pqissludp::getStunReturnedAddr(void *stun_pkt, int len, struct sockaddr_in *fw_addr) +{ + if (((uint16_t *) stun_pkt)[0] != 0x0101) + { + /* not a response */ + return 0; + } + + /* iterate through the packet */ + /* for now assume the address follows the header directly */ + fw_addr->sin_family = AF_INET; + fw_addr->sin_addr.s_addr = ((uint32_t *) stun_pkt)[6]; + fw_addr->sin_port = ((uint16_t *) stun_pkt)[11]; + + return 1; +} + + +// Udp Proxy service is started by the pqiudpproxy. +// connection is attempted by searching for common neighbours. +// Proxy Pkts are exchanged and an exchange of external addresses +// is done. these are passed to pqissludp, through a series +// of function calls. should all work perfectly. +// + +int pqissludp::Reattempt_Connection() +{ + pqioutput(PQL_DEBUG_BASIC, pqissludpzone, + "pqissludp::Reattempt_Connection() Failed Doing nothing"); + // notify the parent. + waiting = WAITING_NOT; + return -1; +} + + /* <===================== UDP Difference *******************/ + // The Proxy Version takes a few more step + // + // connectInterface is sent via message from the proxy. + // and is set here. + /* <===================== UDP Difference *******************/ + +int pqissludp::attach(struct sockaddr_in &addr) +{ + if (waiting != WAITING_PROXY_CONNECT) + { + pqioutput(PQL_WARNING, pqissludpzone, + "pqissludp::attach() not WAITING_PROXY_CONNECT"); + /* should be attached already! */ + return 1; + } + + sockfd = tou_socket(0,0,0); + if (0 > sockfd) + { + pqioutput(PQL_WARNING, pqissludpzone, + "pqissludp::attach() failed to create a socket"); + return -1; + } + + /* just fix the address to start with */ + int err = -1; + int fails = 0; + while(0 > (err = tou_bind(sockfd, (struct sockaddr *) &addr, sizeof(addr)))) + { + addr.sin_port = htons(ntohs(addr.sin_port) + 1); + + std::ostringstream out; + out << "pqissludp::attach() Changing udp bind address to: "; + out << inet_ntoa(addr.sin_addr) << ":" << ntohs(addr.sin_port); + pqioutput(PQL_WARNING, pqissludpzone, out.str()); + if (fails++ > 20) + { + pqioutput(PQL_WARNING, pqissludpzone, + "pqissludp::attach() Too many tou_bind attempts"); + net_internal_close(sockfd); + sockfd = -1; + return 0; + } + } + + // setup remote address + pqioutput(PQL_WARNING, pqissludpzone, + "pqissludp::attach() opening Local Udp Socket"); + + return 1; +} + + +// find a suitable STUN client. +// This is choosen from a list of neighbours. (AutoDiscovery) +// and failing a suitable STUN, uses googles STUN servers. +// send out message. + +int pqissludp::Request_Proxy_Connection() +{ + /* to start the whole thing rolling we need, to be connected + * (this don't match the fn name) + */ + + /* so start a connection */ + waiting = WAITING_PROXY_CONNECT; + proxy_timeout = time(NULL) + PQI_SSLUDP_PROXY_TIMEOUT; + pqioutput(PQL_DEBUG_BASIC, pqissludpzone, + "pqissludp::Request_Proxy_Connection() connectattempt!"); + return udpproxy -> connectattempt(); +} + +int pqissludp::Check_Proxy_Connection() +{ + int mode; + if (udpproxy -> isConnected(mode)) + { + pqioutput(PQL_WARNING, pqissludpzone, + "pqissludp::Check_Proxy_Connection() isConnected!"); + sslmode = mode; + waiting = WAITING_PROXY_CONNECT; + /* This will switch into WAITING_LOCAL_ADDR */ + return Request_Local_Address(); + } + if (udpproxy -> hasFailed()) + { + pqioutput(PQL_WARNING, pqissludpzone, + "pqissludp::Check_Proxy_Connection() hasFailed!"); + + /* failure */ + if (parent()) + { + + /* only notify of failure, if its an active connect attempt. + * ie not if waiting == WAITING_NOT and we are listening... + */ + + if (waiting == WAITING_PROXY_CONNECT) + { + pqioutput(PQL_WARNING, pqissludpzone, + "pqissludp::Check_Proxy_Connection() notifying parent - hasFailed!"); + + udpproxy->reset(); + if (parent()) + { + parent() -> notifyEvent(this, NET_CONNECT_FAILED); + } + } + else + { + pqioutput(PQL_WARNING, pqissludpzone, + "pqissludp::Check_Proxy_Connection() listen - not Connected....Ignore"); + } + } + else + { + pqioutput(PQL_WARNING, pqissludpzone, + "pqissludp::Check_Proxy_Connection() no parent to notify - hasFailed!"); + } + waiting = WAITING_FAIL_INTERFACE; + return -1; + } + + /* finally a proxy timeout - shouldn't be needed, but you don't know.... + */ + if (waiting == WAITING_PROXY_CONNECT) + { + if (proxy_timeout < time(NULL)) + { + pqioutput(PQL_ALERT, pqissludpzone, + "pqissludp::Check_Proxy_Connection() Proxy Connect Timed Out!"); + + udpproxy->reset(); + if (parent()) + { + parent() -> notifyEvent(this, NET_CONNECT_FAILED); + } + waiting = WAITING_FAIL_INTERFACE; + return -1; + } + } + + return 0; +} + +int pqissludp::Request_Local_Address() +{ + // reset of stun_addr, restarts attempts. + if (stun_addr.sin_addr.s_addr == 0) + { + stun_attempts = 0; + } + + udpproxy->requestStunServer(stun_addr); + + /* check its valid */ + if (!isValidNet((&(stun_addr.sin_addr)))) + { + pqioutput(PQL_WARNING, pqissludpzone, + "pqissludp::Request_Local_Address() No StunServers!"); + + + /* must do this manually - as we don't know if ::reset() will send notification. + */ + + udpproxy->reset(); + if (sockfd > 0) /* might be valid - might not */ + { + net_internal_close(sockfd); + } + waiting = WAITING_FAIL_INTERFACE; + if (parent()) + { + // not enough stun attempts. FAILED (not UNREACHABLE) + parent() -> notifyEvent(this, NET_CONNECT_FAILED); + } + return -1; + } + + /* add +1 to get correct stun addr */ + stun_addr.sin_port = htons(ntohs(stun_addr.sin_port) + 1); + + /* + * send of pkt. + */ + + net_attempt = PQISSL_UDP_FLAG; + + pqioutput(PQL_WARNING, pqissludpzone, + "pqissludp::Request_Local_Address() Opening Local Socket"); + + /* only if the first time */ + if (waiting == WAITING_PROXY_CONNECT) + { + /* open socket. */ + local_addr = sslccr -> getOwnCert() -> localaddr; + if (0 > attach(local_addr)) + { + pqioutput(PQL_WARNING, pqissludpzone, + "pqissludp::Request_Local_Address() Failed to Attach"); + + udpproxy->reset(); + waiting = WAITING_FAIL_INTERFACE; + parent() -> notifyEvent(this, NET_CONNECT_FAILED); + return -1; + } + } + + /* then send packet */ + int len; + void *stun_pkt = generate_stun_pkt(&stun_addr, &len); + if (!tou_sendto(sockfd, stun_pkt, len, 0, + (const sockaddr *) &stun_addr, sizeof(stun_addr))) + { + pqioutput(PQL_WARNING, pqissludpzone, + "pqissludp::Request_Local_Address() Failed to Stun"); + free(stun_pkt); + return -1; + } + + { + std::ostringstream out; + out << "pqissludp::Request_Local_Address() Sent StunPkt to: "; + out << inet_ntoa(stun_addr.sin_addr); + out << ":" << ntohs(stun_addr.sin_port); + + pqioutput(PQL_WARNING, pqissludpzone, out.str()); + } + + free(stun_pkt); + waiting = WAITING_LOCAL_ADDR; + stun_timeout = time(NULL) + PQI_SSLUDP_STUN_TIMEOUT; + return 0; +} + + +int pqissludp::Determine_Local_Address() +{ + /* have we recieved anything from the Stun server? */ + /* now find the listenUdp port */ + struct sockaddr_in stun_addr_in; + socklen_t addrlen = sizeof(stun_addr_in); + int size = 1000; + char data[size]; + + pqioutput(PQL_DEBUG_BASIC, pqissludpzone, + "pqissludp::Determine_Local_Address() Waiting Local Addr - Can't do nothing,!"); + + size = tou_recvfrom(sockfd, data, size, 0, + (struct sockaddr *) &stun_addr_in, &addrlen); + + if (0 < size) + { + { + std::ostringstream out; + out << "pqissludp::Determine_Local_Address() Received + Decoding Stun Reply: " << size; + pqioutput(PQL_DEBUG_BASIC, pqissludpzone, out.str()); + } + + /* get the firewall_address out. + */ + + if (getStunReturnedAddr(data, size, &firewall_addr)) + { + std::ostringstream out; + out << "pqissludp::Listen_for_Proxy() Got ExtAddr: "; + out << inet_ntoa(firewall_addr.sin_addr) << ":"; + out << ntohs(firewall_addr.sin_port) << std::endl; + + pqioutput(PQL_DEBUG_BASIC, pqissludpzone, out.str()); + + /* initiate (or complete) a connection via the proxy */ + + /* now tell the udpproxy our address */ + udpproxy -> sendExternalAddress(firewall_addr); + waiting = WAITING_REMOTE_ADDR; + remote_timeout = time(NULL) + PQI_SSLUDP_REMOTE_TIMEOUT; + return Determine_Remote_Address(); + } + else + { + std::ostringstream out; + out << "pqissludp::Listen_for_Proxy() Failed to Get StunRtn Addr"; + pqioutput(PQL_DEBUG_BASIC, pqissludpzone, out.str()); + } + } + + // switched to time based timeout. + //if (stun_timeout++ > PQI_SSLUDP_STUN_TIMEOUT) + if (stun_timeout < time(NULL)) + { + /* too many times? */ + if (stun_attempts++ > PQI_SSLUDP_STUN_ATTEMPTS) + { + std::ostringstream out; + out << "pqissludp::Listen_for_Proxy() Too Many Stun Attempts"; + out << std::endl; + out << "Will notifyEvent(NET_CONNECT_UNREACHABLE)"; + out << std::endl; + pqioutput(PQL_ALERT, pqissludpzone, out.str()); + + reset(); + return -1; + } + + /* retry. + */ + return Request_Local_Address(); + } + return 0; +} + + +int pqissludp::Determine_Remote_Address() +{ + int ret; + int cMode; + if (waiting != WAITING_REMOTE_ADDR) + { + pqioutput(PQL_WARNING, pqissludpzone, + "pqissludp::Determine_Remote_Address() ERROR: waiting != REMOTE_ADDR!"); + return -1; + } + + if (0 > (ret = udpproxy -> gotRemoteAddress(remote_addr, cMode))) + { + pqioutput(PQL_WARNING, pqissludpzone, + "pqissludp::Determine_Remote_Address() FAILURE to Get Remote Address"); + + reset(); + waiting = WAITING_FAIL_INTERFACE; + return -1; + + } + if (ret == 0) + { + pqioutput(PQL_DEBUG_BASIC, pqissludpzone, + "pqissludp::Determine_Remote_Address() Remote Address Acquistion in progress"); + /* inprogress */ + + /* check if its timed out */ + if (remote_timeout < time(NULL)) + { + pqioutput(PQL_WARNING, pqissludpzone, + "pqissludp::Determine_Remote_Address() Timed out: NOTIFY of FAILURE"); + + reset(); + waiting = WAITING_FAIL_INTERFACE; + return -1; + } + return 0; + } + + /* success */ + + sslmode = cMode; /* set the connect mode */ + + std::ostringstream out; + out << "pqissludp::Determine_Remote_Address() Success:"; + out << "Remote Address: " << inet_ntoa(remote_addr.sin_addr) << ":"; + out << ntohs(remote_addr.sin_port); + out << " sslMode: " << (int) sslmode; + pqioutput(PQL_DEBUG_BASIC, pqissludpzone, out.str()); + + return Initiate_Connection(); +} + + +int pqissludp::Initiate_Connection() +{ + int err; + remote_addr.sin_family = AF_INET; + + pqioutput(PQL_DEBUG_BASIC, pqissludpzone, + "pqissludp::Initiate_Connection() Attempting Outgoing Connection...."); + + if (waiting != WAITING_REMOTE_ADDR) + { + pqioutput(PQL_WARNING, pqissludpzone, + "pqissludp::Initiate_Connection() Already Attempt in Progress!"); + return -1; + } + + pqioutput(PQL_DEBUG_BASIC, pqissludpzone, + "pqissludp::Initiate_Connection() Opening Socket"); + + { + std::ostringstream out; + out << "pqissludp::Initiate_Connection() "; + out << "Connecting To: " << inet_ntoa(remote_addr.sin_addr) << ":"; + out << ntohs(remote_addr.sin_port) << std::endl; + pqioutput(PQL_WARNING, pqissludpzone, out.str()); + } + + if (remote_addr.sin_addr.s_addr == 0) + { + std::ostringstream out; + out << "pqissludp::Initiate_Connection() "; + out << "Invalid (0.0.0.0) Remote Address,"; + out << " Aborting Connect."; + out << std::endl; + pqioutput(PQL_WARNING, pqissludpzone, out.str()); + waiting = WAITING_FAIL_INTERFACE; + + reset(); + return -1; + } + + { + std::ostringstream out; + out << "Connecting to "; + out << sslcert -> Name() << " via "; + out << inet_ntoa(remote_addr.sin_addr); + out << ":" << ntohs(remote_addr.sin_port); + pqioutput(PQL_DEBUG_BASIC, pqissludpzone, out.str()); + } + + udp_connect_timeout = time(NULL) + PQI_SSLUDP_CONNECT_TIMEOUT; + /* <===================== UDP Difference *******************/ + if (0 != (err = tou_connect(sockfd, (struct sockaddr *) &remote_addr, sizeof(remote_addr)))) + /* <===================== UDP Difference *******************/ + { + int tou_err = tou_errno(sockfd); + std::cerr << "pqissludp::Initiate_Connection() connect returns:"; + std::cerr << err << " -> errno: " << tou_err << " error: "; + std::cerr << socket_errorType(tou_err) << std::endl; + + std::ostringstream out; + out << "pqissludp::Initiate_Connection()"; + + if ((tou_err == EINPROGRESS) || (tou_err == EAGAIN)) + { + // set state to waiting..... + waiting = WAITING_SOCK_CONNECT; + + out << " EINPROGRESS Waiting for Socket Connection"; + pqioutput(PQL_WARNING, pqissludpzone, out.str()); + + return 0; + } + else if ((tou_err == ENETUNREACH) || (tou_err == ETIMEDOUT)) + { + out << "ENETUNREACHABLE: cert" << sslcert -> Name(); + out << std::endl; + + // Then send unreachable message. + waiting = WAITING_FAIL_INTERFACE; + net_unreachable |= net_attempt; + } + + out << "Error: Connection Failed: " << tou_err; + out << " - " << socket_errorType(tou_err) << std::endl; + + reset(); + + pqioutput(PQL_WARNING, pqissludpzone, out.str()); + return -1; + } + else + { + pqioutput(PQL_WARNING, pqissludpzone, + "pqissludp::Init_Connection() connect returned 0"); + } + + waiting = WAITING_SOCK_CONNECT; + + pqioutput(PQL_DEBUG_BASIC, pqissludpzone, + "pqissludp::Initiate_Connection() Waiting for Socket Connect"); + + return 1; +} + +/********* VERY DIFFERENT **********/ +int pqissludp::Basic_Connection_Complete() +{ + pqioutput(PQL_DEBUG_BASIC, pqissludpzone, + "pqissludp::Basic_Connection_Complete()..."); + + + if (time(NULL) > udp_connect_timeout) + { + pqioutput(PQL_DEBUG_BASIC, pqissludpzone, + "pqissludp::Basic_Connection_Complete() Connectoin Timed Out!"); + /* as sockfd is valid, this should close it all up */ + reset(); + } + + + if (waiting != WAITING_SOCK_CONNECT) + { + pqioutput(PQL_DEBUG_BASIC, pqissludpzone, + "pqissludp::Basic_Connection_Complete() Wrong Mode"); + return -1; + } + + + + + /* new approach is to check for an error */ + /* check for an error */ + int err; + if (0 != (err = tou_errno(sockfd))) + { + if (err == EINPROGRESS) + { + + std::ostringstream out; + out << "pqissludp::Basic_Connection_Complete()"; + out << "EINPROGRESS: cert" << sslcert -> Name(); + pqioutput(PQL_WARNING, pqissludpzone, out.str()); + + } + else if ((err == ENETUNREACH) || (err == ETIMEDOUT)) + { + std::ostringstream out; + out << "pqissludp::Basic_Connection_Complete()"; + out << "ENETUNREACH/ETIMEDOUT: cert"; + out << sslcert -> Name() << std::endl; + + net_unreachable |= net_attempt; + + reset(); + + // Then send unreachable message. + waiting = WAITING_FAIL_INTERFACE; + + out << "pqissludp::Basic_Connection_Complete()"; + out << "Error: Connection Failed: " << err; + out << " - " << socket_errorType(err); + pqioutput(PQL_WARNING, pqissludpzone, out.str()); + return -1; + } + } + + /* <===================== UDP Difference *******************/ + if (tou_connected(sockfd)) + /* <===================== UDP Difference *******************/ + { + pqioutput(PQL_WARNING, pqissludpzone, + "pqissludp::Basic_Connection_Complete() Connection Complete!"); + return 1; + } + else + { + // not ready return -1; + pqioutput(PQL_WARNING, pqissludpzone, + "pqissludp::Basic_Connection_Complete() Not Yet Ready!"); + return 0; + } + + return -1; +} + + +/* New Internal Functions required to generalise tcp/udp version + * of the programs + */ + +// used everywhere +int pqissludp::net_internal_close(int fd) +{ + pqioutput(PQL_ALERT, pqissludpzone, + "pqissludp::net_internal_close() -> tou_close()"); + return tou_close(fd); +} + +// install udp BIO. +int pqissludp::net_internal_SSL_set_fd(SSL *ssl, int fd) +{ + pqioutput(PQL_DEBUG_BASIC, pqissludpzone, + "pqissludp::net_internal_SSL_set_fd()"); + + /* create the bio's */ + tou_bio =BIO_new(BIO_s_tou_socket()); + + /* attach the fd's to the BIO's */ + BIO_set_fd(tou_bio, fd, BIO_NOCLOSE); + SSL_set_bio(ssl, tou_bio, tou_bio); + return 1; +} + +int pqissludp::net_internal_fcntl_nonblock(int fd) +{ + pqioutput(PQL_DEBUG_BASIC, pqissludpzone, + "pqissludp::net_internal_fcntl_nonblock()"); + return 0; +} + + +/* These are identical to pqinetssl version */ +//int pqissludp::status() + +int pqissludp::tick() +{ + /* check the udpproxy, if we should be listening */ + if ((waiting == WAITING_NOT) && (sslcert -> Listening())) + { + if (time(NULL) > listen_checktime) + { + listen_checktime = time(NULL) + + PQI_SSLUDP_PROXY_CHECK_TIME; + + /* check the Proxy anyway (every xxx secs) */ + Check_Proxy_Connection(); + } + + } + + pqissl::tick(); + udpproxy->tick(); + return 1; +} + + // listen fns call the udpproxy. +int pqissludp::listen() +{ + { + std::ostringstream out; + out << "pqissludp::listen()"; + pqioutput(PQL_ALERT, pqissludpzone, out.str()); + } + return udpproxy->listen(); +} + +int pqissludp::stoplistening() +{ + { + std::ostringstream out; + out << "pqissludp::stoplistening()"; + pqioutput(PQL_ALERT, pqissludpzone, out.str()); + } + return udpproxy->stoplistening(); +} + + + +/********** PQI STREAMER OVERLOADING *********************************/ + +bool pqissludp::moretoread() +{ + { + std::ostringstream out; + out << "pqissludp::moretoread()"; + out << " polling socket (" << sockfd << ")"; + pqioutput(PQL_DEBUG_ALL, pqissludpzone, out.str()); + } + + /* check for more to read first ... if nothing... check error + */ + /* <===================== UDP Difference *******************/ + if (tou_maxread(sockfd)) + /* <===================== UDP Difference *******************/ + { + pqioutput(PQL_DEBUG_BASIC, pqissludpzone, + "pqissludp::moretoread() Data to Read!"); + return 1; + } + + /* else check the error */ + pqioutput(PQL_DEBUG_ALL, pqissludpzone, + "pqissludp::moretoread() No Data to Read!"); + + int err; + if (0 != (err = tou_errno(sockfd))) + { + if ((err == EAGAIN) || (err == EINPROGRESS)) + { + + std::ostringstream out; + out << "pqissludp::moretoread() "; + out << "EAGAIN/EINPROGRESS: cert" << sslcert -> Name(); + pqioutput(PQL_WARNING, pqissludpzone, out.str()); + return 0; + + } + else if ((err == ENETUNREACH) || (err == ETIMEDOUT)) + { + std::ostringstream out; + out << "pqissludp::moretoread() "; + out << "ENETUNREACH/ETIMEDOUT: cert"; + out << sslcert -> Name(); + pqioutput(PQL_WARNING, pqissludpzone, out.str()); + + } + else if (err == EBADF) + { + std::ostringstream out; + out << "pqissludp::moretoread() "; + out << "EBADF: cert"; + out << sslcert -> Name(); + pqioutput(PQL_WARNING, pqissludpzone, out.str()); + + } + else + { + std::ostringstream out; + out << "pqissludp::moretoread() "; + out << " Unknown ERROR: " << err << ": cert"; + out << sslcert -> Name(); + pqioutput(PQL_WARNING, pqissludpzone, out.str()); + + } + + reset(); + return 0; + } + + /* otherwise - not error - strange! */ + pqioutput(PQL_DEBUG_BASIC, pqissludpzone, + "pqissludp::moretoread() No Data + No Error (really nothing)"); + + return 0; + + +} + +bool pqissludp::cansend() +{ + pqioutput(PQL_DEBUG_ALL, pqissludpzone, + "pqissludp::cansend() polling socket!"); + + /* <===================== UDP Difference *******************/ + return (0 < tou_maxwrite(sockfd)); + /* <===================== UDP Difference *******************/ + +} + + + +pqiudplistener::pqiudplistener(p3udpproxy *p, struct sockaddr_in addr) + :p3u(p), sockfd(-1), active(false), laststun(0), firstattempt(0), + lastattempt(0) +{ + pqioutput(PQL_DEBUG_BASIC, pqissludpzone, + "pqiudplistener::pqiudplistener()"); + + setListenAddr(addr); + setuplisten(); + + stunpkt = malloc(1024); /* 20 = size of a stun request */ + stunpktlen = 1024; +} + + +int pqiudplistener::setListenAddr(struct sockaddr_in addr) +{ + laddr = addr; + // increment the port by 1. (can't open on same) + laddr.sin_port = htons(ntohs(laddr.sin_port) + 1); + + return 1; +} + +int pqiudplistener::resetlisten() +{ + if (sockfd > -1) + { + /* close it down */ + tou_close(sockfd); + sockfd = -1; + } + active = false; + return 1; +} + +int pqiudplistener::setuplisten() +{ + sockfd = tou_socket(0,0,0); + if (0 == tou_bind(sockfd, (struct sockaddr *) &laddr, sizeof(laddr))) + { + active = true; + pqioutput(PQL_DEBUG_BASIC, pqissludpzone, "pqiudplistener::setuplisten Succeeded!"); + return 1; + } + active = false; + pqioutput(PQL_DEBUG_BASIC, pqissludpzone, "pqiudplistener::setuplisten Failed!"); + + std::cerr << "pqiudplistener failed to bind to :" << inet_ntoa(laddr.sin_addr); + std::cerr << ":" << ntohs(laddr.sin_port) << std::endl; + return 0; +} + +int pqiudplistener::status() +{ + + return 1; +} + +int pqiudplistener::tick() +{ + int dsize = 1024; + char data[dsize]; + struct sockaddr_in addr, pot_ext_addr; + + /* must check if address is okay. + */ + if (!active) + { + /* can't do much ... */ + return 1; + } + + serverStun(); + + if (recvfrom(data, &dsize, addr)) + { + if (response(data, dsize, pot_ext_addr)) + { + checkExtAddr(addr, data, dsize, pot_ext_addr); + } + else + { + reply(data, dsize, addr); + } + } + + return 1; +} + +const int MIN_STUN_PERIOD = 24 * 60 * 60; /* 1 day */ +const int MIN_STUN_GAP = 10; /* seconds. */ +const int MAX_STUN_ATTEMPTS = 60; /* 6 * 10 sec attempts */ +const int STUN_RETRY_PERIOD = 10; // * 60; /* 20 minutes */ + +int pqiudplistener::serverStun() +{ + pqioutput(PQL_DEBUG_BASIC, pqissludpzone, "pqiudplistener::serverStun()"); + /* get the list from p3disc() */ + int ts = time(NULL); + if (!firstattempt) firstattempt = ts; + + /* if not stunned */ + if ((!laststun) && (ts - firstattempt > MAX_STUN_ATTEMPTS)) + { + pqioutput(PQL_DEBUG_BASIC, pqissludpzone, "pqiudplistener::Stun Paused!"); + /* will fail until RETRY_PERIOD */ + if (ts - firstattempt > STUN_RETRY_PERIOD) + { + firstattempt = ts; + } + + return 0; + } + + if (ts - laststun < MIN_STUN_PERIOD) + { + pqioutput(PQL_DEBUG_BASIC, pqissludpzone, "pqiudplistener::Stun Paused! 2"); + return 0; + } + + if (ts - lastattempt < MIN_STUN_GAP) + { + pqioutput(PQL_DEBUG_BASIC, pqissludpzone, "pqiudplistener::Stun Paused! 3"); + return 0; + } + + lastattempt = ts; + + /* stun someone */ + if (!p3u -> requestStunServer(stun_addr)) + { + pqioutput(PQL_DEBUG_BASIC, pqissludpzone, + "pqiudplistener::serverStun() No Stun Server"); + /* failed, wait a bit */ + return 0; + } + + /* send out a stun packet -> save in the local variable */ + + int tmplen = stunpktlen; + bool done = generate_stun_pkt(stunpkt, &tmplen); + if (!done) + return 0; + + /* increment the port +1 */ + stun_addr.sin_port = htons(ntohs(stun_addr.sin_port) + 1); + /* and send it off */ + // int sentlen = + tou_sendto(sockfd, stunpkt, tmplen, 0, + (const struct sockaddr *) &stun_addr, sizeof(stun_addr)); + + std::ostringstream out; + out << "pqiudplistener::serverStun() Sent Stun Packet to:"; + out << inet_ntoa(stun_addr.sin_addr) << ":" << ntohs(stun_addr.sin_port); + pqioutput(PQL_DEBUG_BASIC, pqissludpzone, out.str()); + + return 1; +} + + + +bool pqiudplistener::response(void *stun_pkt, int size, struct sockaddr_in &addr) +{ + /* check what type it is */ + if (size < 28) + { + return false; + } + + if (((uint16_t *) stun_pkt)[0] != 0x0101) + { + /* not a response */ + return false; + } + + /* iterate through the packet */ + /* for now assume the address follows the header directly */ + /* all stay in netbyteorder! */ + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = ((uint32_t *) stun_pkt)[6]; + addr.sin_port = ((uint16_t *) stun_pkt)[11]; + + + std::ostringstream out; + out << "pqiudplistener::response() Recvd a Stun Response, ext_addr: "; + out << inet_ntoa(addr.sin_addr) << ":" << ntohs(addr.sin_port); + pqioutput(PQL_ALERT, pqissludpzone, out.str()); + + return true; + +} + +int pqiudplistener::checkExtAddr(struct sockaddr_in &src_addr, + void *data, int size, struct sockaddr_in &ext_addr) +{ + + /* display it */ + { + std::ostringstream out; + out << "pqiudplistener::checkExtAddr(): received Stun Pkt" << std::endl; + out << "\t\text_addr: "; + out << inet_ntoa(ext_addr.sin_addr) << ":" << ntohs(ext_addr.sin_port); + out << std::endl; + out << "\t\tsrc_addr: "; + out << inet_ntoa(src_addr.sin_addr) << ":" << ntohs(src_addr.sin_port); + pqioutput(PQL_WARNING, pqissludpzone, out.str()); + } + + /* decide if its better than the current external address */ + + cert *own = getSSLRoot() -> getOwnCert(); + + + /* if src is same network as local, or it is not external ... then ignore */ + if ((sameNet(&(src_addr.sin_addr), &(own->localaddr.sin_addr))) || + (!isExternalNet(&(src_addr.sin_addr)))) + { + std::ostringstream out; + out << "Cannot use returned StunAddr:"; + out << " srcAddr !Ext || sameNet(srcAddr, localAddr)"; + pqioutput(PQL_WARNING, pqissludpzone, out.str()); + return 0; + } + + /* if extAddr is not ext, then don't accept */ + if (!isExternalNet(&(ext_addr.sin_addr))) + { + std::ostringstream out; + out << "Cannot use returned StunAddr:"; + out << " returnedAddr is !External"; + pqioutput(PQL_WARNING, pqissludpzone, out.str()); + return 0; + } + + /* port is harder.... + * there are a couple of cases. + * --- NOT Firewalled --------------------- + * (1) ext = local, port should = local.port. + * --- Firewalled --------------------- + * (2) own->Forwarded(), keep old port number. + * (3) behind firewall -> port is irrelevent, can't connect. put 0. + */ + + /* default is case (3) */ + unsigned short server_port = 0; + /* incase they have actually forwarded a port, set it correct! */ + server_port = ntohs(ext_addr.sin_port) - 1; + + if (isValidNet(&(own->serveraddr.sin_addr))) + { + /* Final extra check.... + * if src Address is same network as current server addr... + * then its not far enough away + */ + + /*************************** + * ... but until network is well established we wont switch this + * rule on... + * + if (isSameNet(src_addr, own->serveraddr)) + { + std::ostringstream out; + out << "Cannot use returned StunAddr:"; + out << " sameNet(srcAddr, current srvAddr)"; + pqioutput(PQL_WARNING, pqissludpzone, out.str()); + return 0; + } + * + * + **************************/ + + /* port case (2) */ + if (own->Forwarded()) + { + /* this *MUST* have been set by the user, so + * keep the port number.... + */ + server_port = ntohs(own->serveraddr.sin_port); + + std::ostringstream out; + out << "We are marked as Forwarded(), using existing port: "; + out << server_port; + pqioutput(PQL_WARNING, pqissludpzone, out.str()); + } + } + + /* port case (1) */ + if (0 == inaddr_cmp(ext_addr, own->localaddr)) + { + server_port = ntohs(own->localaddr.sin_port); + { + std::ostringstream out; + out << "extAddr == localAddr, Not Firewalled() + using local port: "; + out << server_port; + pqioutput(PQL_WARNING, pqissludpzone, out.str()); + } + + /* if it is the same as local address -> then not firewalled */ + if (own->Firewalled()) + { + std::ostringstream out; + out << "We are currently Marked as Firewalled, changing to NotFirewalled()"; + own->Firewalled(false); + pqioutput(PQL_WARNING, pqissludpzone, out.str()); + } + } + + /* otherwise we will take the addr */ + own->serveraddr = ext_addr; + + /* set the port number finally */ + own->serveraddr.sin_port = htons(server_port); + + /* save timestamp of successful stun */ + laststun = time(NULL); + + return 1; +} + + +/************************** Basic Functionality ******************/ +int pqiudplistener::recvfrom(void *data, int *size, struct sockaddr_in &addr) +{ + /* check the socket */ + socklen_t addrlen = sizeof(addr); + + int rsize = tou_recvfrom(sockfd, data, *size, 0, (struct sockaddr *) &addr, &addrlen); + if (rsize > 0) + { + std::ostringstream out; + out << "pqiudplistener::recvfrom() Recved a Pkt from: "; + out << inet_ntoa(addr.sin_addr) << ":" << ntohs(addr.sin_port); + pqioutput(PQL_ALERT, pqissludpzone, out.str()); + + *size = rsize; + return 1; + } + return 0; +} + +int pqiudplistener::reply(void *data, int size, struct sockaddr_in &addr) +{ + /* so we design a new packet with the external address in it */ + int pktlen = 0; + void *pkt = generate_stun_reply(&addr, &pktlen); + + /* and send it off */ + int sentlen = tou_sendto(sockfd, pkt, pktlen, 0, + (const struct sockaddr *) &addr, sizeof(addr)); + + free(pkt); + + /* display status */ + std::ostringstream out; + out << "pqiudplistener::reply() Responding to a Stun Req, ext_addr: "; + out << inet_ntoa(addr.sin_addr) << ":" << ntohs(addr.sin_port); + pqioutput(PQL_ALERT, pqissludpzone, out.str()); + + return sentlen; +} + +bool pqiudplistener::generate_stun_pkt(void *stun_pkt, int *len) +{ + if (*len < 20) + { + return false; + } + + /* just the header */ + ((uint16_t *) stun_pkt)[0] = 0x0001; + ((uint16_t *) stun_pkt)[1] = 0x0020; /* only header */ + /* transaction id - should be random */ + ((uint32_t *) stun_pkt)[1] = 0x0020; + ((uint32_t *) stun_pkt)[2] = 0x0121; + ((uint32_t *) stun_pkt)[3] = 0x0111; + ((uint32_t *) stun_pkt)[4] = 0x1010; + *len = 20; + return true; +} + + +void *pqiudplistener::generate_stun_reply(struct sockaddr_in *stun_addr, int *len) +{ + /* just the header */ + void *stun_pkt = malloc(28); + ((uint16_t *) stun_pkt)[0] = 0x0101; + ((uint16_t *) stun_pkt)[1] = 0x0028; /* only header + 8 byte addr */ + /* transaction id - should be random */ + ((uint32_t *) stun_pkt)[1] = 0x0020; + ((uint32_t *) stun_pkt)[2] = 0x0121; + ((uint32_t *) stun_pkt)[3] = 0x0111; + ((uint32_t *) stun_pkt)[4] = 0x1010; + /* now add address + * 0 1 2 3 + * + * + */ + + ((uint32_t *) stun_pkt)[6] = stun_addr->sin_addr.s_addr; + ((uint16_t *) stun_pkt)[11] = stun_addr->sin_port; + + *len = 28; + return stun_pkt; +} + + diff --git a/libretroshare/src/pqi/pqissludp.h b/libretroshare/src/pqi/pqissludp.h new file mode 100644 index 000000000..1a3f0737b --- /dev/null +++ b/libretroshare/src/pqi/pqissludp.h @@ -0,0 +1,177 @@ +/* + * "$Id: pqissludp.h,v 1.8 2007-02-18 21:46:49 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + +#ifndef MRK_PQI_SSL_UDP_HEADER +#define MRK_PQI_SSL_UDP_HEADER + +#include + +// operating system specific network header. +#include "pqi/pqinetwork.h" + +#include +#include + +#include "pqi/pqissl.h" + +// function for discovering certificates. +//int connectForExchange(struct sockaddr_in addr); +// +// +// +// + /* So pqissludp is the special firewall breaking protocol. + * This class will implement the basics of streaming + * ssl over udp using a tcponudp library.... + * and a small extension to ssl. + */ + +class pqissludp; +class pqiudpproxy; +class p3udpproxy; +class cert; + +/* no such thing as a listener .... actually each one + * can receive connections..... its the stateless you see!. + * + * so pqiudplistener + * + * will be the support udp listener for proxy connections. + * this will be used by the p3proxy for external addresses. + */ + +class pqiudplistener +{ + public: + + pqiudplistener(p3udpproxy *p, struct sockaddr_in addr); + +int resetlisten(); +int setListenAddr(struct sockaddr_in addr); +int setuplisten(); + +int tick(); /* does below */ +int status(); + +int recvfrom(void *data, int *size, struct sockaddr_in &addr); +int reply(void *data, int size, struct sockaddr_in &addr); + + private: +int serverStun(); +bool response(void *data, int size, struct sockaddr_in &addr); +int checkExtAddr(struct sockaddr_in &src_addr, + void *data, int size, struct sockaddr_in &ext_addr); + +bool generate_stun_pkt(void *stun_pkt, int *len); +void *generate_stun_reply(struct sockaddr_in *stun_addr, int *len); + + p3udpproxy *p3u; + + int sockfd; + struct sockaddr_in laddr; + bool active; + + int laststun, firstattempt, lastattempt; + + /* last stun packet sent out */ + struct sockaddr_in stun_addr; + void *stunpkt; + int stunpktlen; +}; + + +/* This provides a NetBinInterface, which is + * primarily inherited from pqissl. + * fns declared here are different -> all others are identical. + */ + +class pqissludp: public pqissl +{ +public: + pqissludp(cert *c, PQInterface *parent, pqiudpproxy *prxy); +virtual ~pqissludp(); + + // NetInterface. + // listen fns call the udpproxy. +virtual int listen(); +virtual int stoplistening(); +virtual int tick(); +virtual int reset(); + + // BinInterface. + // These are reimplemented. +virtual bool moretoread(); +virtual bool cansend(); + /* UDP always through firewalls -> always bandwidth Limited */ +virtual bool bandwidthLimited() { return true; } + + // pqissludp specific. + // These three functions must + // be called to initiate a connection; + +int attach(sockaddr_in&); + // stun packet handling. +void *generate_stun_pkt(struct sockaddr_in *stun_addr, int *len); +int getStunReturnedAddr(void *pkt, int len, struct sockaddr_in *stun_addr); + +protected: + +virtual int Request_Proxy_Connection();// Overloaded -> all 7. +virtual int Check_Proxy_Connection(); +virtual int Request_Local_Address(); +virtual int Determine_Local_Address(); +virtual int Determine_Remote_Address(); +virtual int Initiate_Connection(); +virtual int Basic_Connection_Complete(); +virtual int Reattempt_Connection(); + +//protected internal fns that are overloaded for udp case. +virtual int net_internal_close(int fd); +virtual int net_internal_SSL_set_fd(SSL *ssl, int fd); +virtual int net_internal_fcntl_nonblock(int fd); + +private: + + BIO *tou_bio; // specific to ssludp. + pqiudpproxy *udpproxy; + + // are these needed at all?? + struct sockaddr_in local_addr; // ssludp + struct sockaddr_in firewall_addr; // ssludp + + + struct sockaddr_in stun_addr; //pqissl. + int stun_timeout; + int stun_attempts; + int remote_timeout; + int proxy_timeout; + int udp_connect_timeout; + + long listen_checktime; +}; + +#endif // MRK_PQI_SSL_UDP_HEADER diff --git a/libretroshare/src/pqi/pqistreamer.cc b/libretroshare/src/pqi/pqistreamer.cc new file mode 100644 index 000000000..b20a7d964 --- /dev/null +++ b/libretroshare/src/pqi/pqistreamer.cc @@ -0,0 +1,743 @@ +/* + * "$Id: pqistreamer.cc,v 1.19 2007-02-18 21:46:50 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "pqi/pqistreamer.h" +#include "pqi/pqipacket.h" +#include +#include + +#include +#include "pqi/pqidebug.h" + +const int pqistreamerzone = 8221; + +const int PQISTREAM_ABS_MAX = 10000000; /* 10 MB/sec (actually per loop) */ + +pqistreamer::pqistreamer(BinInterface *bio_in, int bio_flags_in) + :bio(bio_in), bio_flags(bio_flags_in), + pkt_wpending(NULL), + totalRead(0), totalSent(0), + currRead(0), currSent(0), + avgReadCount(0), avgSentCount(0) +{ + avgLastUpdate = currReadTS = currSentTS = time(NULL); + + /* allocated once */ + pkt_rpend_size = pqipkt_maxsize(); + pkt_rpending = malloc(pkt_rpend_size); + + // 100 B/s (minimal) + setMaxRate(true, 0.1); + setMaxRate(false, 0.1); + setRate(true, 0); + setRate(false, 0); + + { + std::ostringstream out; + out << "pqistreamer::pqistreamer()"; + out << " Initialisation!" << std::endl; + pqioutput(PQL_DEBUG_ALL, pqistreamerzone, out.str()); + } + + if (!bio_in) + { + std::ostringstream out; + out << "pqistreamer::pqistreamer()"; + out << " NULL bio, FATAL ERROR!" << std::endl; + pqioutput(PQL_ALERT, pqistreamerzone, out.str()); + exit(1); + } + + return; +} + +pqistreamer::~pqistreamer() +{ + { + std::ostringstream out; + out << "pqistreamer::~pqistreamer()"; + out << " Destruction!" << std::endl; + pqioutput(PQL_DEBUG_ALL, pqistreamerzone, out.str()); + } + + if (bio_flags & BIN_FLAGS_NO_CLOSE) + { + std::ostringstream out; + out << "pqistreamer::~pqistreamer()"; + out << " Not Closing BinInterface!" << std::endl; + pqioutput(PQL_DEBUG_ALL, pqistreamerzone, out.str()); + } + else if (bio) + { + std::ostringstream out; + out << "pqistreamer::~pqistreamer()"; + out << " Deleting BinInterface!" << std::endl; + pqioutput(PQL_DEBUG_ALL, pqistreamerzone, out.str()); + + delete bio; + } + + // clean up outgoing. (cntrl packets) + while(out_pkt.size() > 0) + { + void *pkt = out_pkt.front(); + out_pkt.pop_front(); + pqipkt_delete(pkt); + } + + // clean up outgoing (data packets) + while(out_data.size() > 0) + { + void *pkt = out_data.front(); + out_data.pop_front(); + pqipkt_delete(pkt); + } + + if (pkt_wpending) + { + pqipkt_delete(pkt_wpending); + pkt_wpending = NULL; + } + + free(pkt_rpending); + + // clean up outgoing. + while(incoming.size() > 0) + { + PQItem *i = incoming.front(); + incoming.pop_front(); + delete i; + } + return; +} + + +// Get/Send Items. +int pqistreamer::SendItem(PQItem *si) +{ + { + std::ostringstream out; + out << "pqistreamer::SendItem():" << std::endl; + si -> print(out); + pqioutput(PQL_DEBUG_ALL, pqistreamerzone, out.str()); + } + + return queue_outpqi(si); +} + +PQItem *pqistreamer::GetItem() +{ + { + std::ostringstream out; + out << "pqistreamer::GetItem()"; + pqioutput(PQL_DEBUG_ALL, pqistreamerzone, out.str()); + } + + std::list::iterator it; + + it = incoming.begin(); + if (it == incoming.end()) { return NULL; } + + PQItem *osr = (*it); + incoming.erase(it); + return osr; +} + +// // PQInterface +int pqistreamer::tick() +{ + { + std::ostringstream out; + out << "pqistreamer::tick()"; + out << std::endl; + if (getContact()) + { + out << getContact() -> Name() << ": currRead/Sent: " << currRead << "/" << currSent; + } + else + { + out << "Unknown Contact" << ": currRead/Sent: " << currRead << "/" << currSent; + } + out << std::endl; + + pqioutput(PQL_DEBUG_ALL, pqistreamerzone, out.str()); + } + + bio->tick(); + + /* short circuit everything is bio isn't active */ + if (!(bio->isactive())) + { + return 0; + } + + + /* must do both, as outgoing will catch some bad sockets, + * that incoming will not + */ + + handleincoming(); + handleoutgoing(); + + /* give details of the packets */ + { + std::list::iterator it; + + std::ostringstream out; + out << "pqistreamer::tick() Queued Data:"; + if (getContact()) + { + out << " for " << getContact() -> Name(); + } + if (bio->isactive()) + { + out << " (active)"; + } + else + { + out << " (waiting)"; + } + out << std::endl; + + int total = 0; + for(it = out_pkt.begin(); it != out_pkt.end(); it++) + { + total += pqipkt_rawlen(*it); + } + + out << "\t Out Packets [" << out_pkt.size() << "] => " << total; + out << " bytes" << std::endl; + + total = 0; + for(it = out_data.begin(); it != out_data.end(); it++) + { + total += pqipkt_rawlen(*it); + } + + out << "\t Out Data [" << out_data.size() << "] => " << total; + out << " bytes" << std::endl; + + out << "\t Incoming [" << incoming.size() << "]"; + out << std::endl; + + pqioutput(PQL_DEBUG_BASIC, pqistreamerzone, out.str()); + } + + /* if there is more stuff in the queues */ + if ((incoming.size() > 0) || (out_pkt.size() > 0) || (out_data.size() > 0)) + { + return 1; + } + return 0; +} + +int pqistreamer::status() +{ + { + std::ostringstream out; + out << "pqistreamer::status()"; + pqioutput(PQL_DEBUG_ALL, pqistreamerzone, out.str()); + } + + if (bio->isactive()) + { + std::ostringstream out; + out << "Data in:" << totalRead << " out:" << totalSent; + pqioutput(PQL_DEBUG_BASIC, pqistreamerzone, out.str()); + } + + return 0; +} + +// +/**************** HANDLE OUTGOING TRANSLATION + TRANSMISSION ******/ + +int pqistreamer::queue_outpqi(PQItem *pqi) +{ + { + std::ostringstream out; + out << "pqistreamer::queue_outpqi()"; + pqioutput(PQL_DEBUG_ALL, pqistreamerzone, out.str()); + } + + /* decide which type of packet it is */ + PQFileData *dta = dynamic_cast(pqi); + bool isCntrl = (dta == NULL); + + + void *ptr = pqipkt_makepkt(pqi); + if (NULL != ptr) + { + if (isCntrl) + { + out_pkt.push_back(ptr); + } + else + { + out_data.push_back(ptr); + } + delete pqi; + return 1; + } + + std::ostringstream out; + out << "pqistreamer::queue_outpqi() Null Pkt generated!"; + out << std::endl; + out << "Caused By: " << std::endl; + pqi -> print(out); + pqioutput(PQL_ALERT, pqistreamerzone, out.str()); + + delete pqi; + return 1; // keep error internal. +} + +int pqistreamer::handleincomingitem(PQItem *pqi) +{ + { + std::ostringstream out; + out << "pqistreamer::handleincomingitem()"; + pqioutput(PQL_DEBUG_ALL, pqistreamerzone, out.str()); + } + + // Use overloaded Contact function + pqi -> p = getContact(); + incoming.push_back(pqi); + return 1; +} + +int pqistreamer::handleoutgoing() +{ + { + std::ostringstream out; + out << "pqistreamer::handleoutgoing()"; + pqioutput(PQL_DEBUG_ALL, pqistreamerzone, out.str()); + } + + int maxbytes = outAllowedBytes(); + int sentbytes = 0; + int len; + int ss; + + std::list::iterator it; + + // if not connection, or cannot send anything... pause. + if (!(bio->isactive())) + { + /* if we are not active - clear anything in the queues. */ + for(it = out_pkt.begin(); it != out_pkt.end(); ) + { + pqipkt_delete(*it); + it = out_pkt.erase(it); + + std::ostringstream out; + out << "pqistreamer::handleoutgoing() Not active -> Clearing Pkt!"; + pqioutput(PQL_DEBUG_BASIC, pqistreamerzone, out.str()); + } + for(it = out_data.begin(); it != out_data.end(); ) + { + pqipkt_delete(*it); + it = out_data.erase(it); + + std::ostringstream out; + out << "pqistreamer::handleoutgoing() Not active -> Clearing DPkt!"; + pqioutput(PQL_DEBUG_BASIC, pqistreamerzone, out.str()); + } + + /* also remove the pending packets */ + if (pkt_wpending) + { + pqipkt_delete(pkt_wpending); + pkt_wpending = NULL; + } + + outSentBytes(sentbytes); + return 0; + } + + // a very simple round robin + + bool sent = true; + while(sent) // catch if all items sent. + { + sent = false; + + if ((!(bio->cansend())) || (maxbytes < sentbytes)) + { + outSentBytes(sentbytes); + return 0; + } + + // send a out_pkt., else send out_data. unless + // there is a pending packet. + if (!pkt_wpending) + { + if (out_pkt.size() > 0) + { + pkt_wpending = *(out_pkt.begin()); + out_pkt.pop_front(); + } + else if (out_data.size() > 0) + { + pkt_wpending = *(out_data.begin()); + out_data.pop_front(); + } + } + + if (pkt_wpending) + { + std::ostringstream out; + out << "Sending Out Pkt!"; + // write packet. + len = pqipkt_rawlen(pkt_wpending); + if (len != (ss = bio->senddata(pkt_wpending, len))) + { + out << "Problems with Send Data!"; + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqistreamerzone, out.str()); + + outSentBytes(sentbytes); + // pkt_wpending will keep til next time. + // ensuring exactly the same data is written (openSSL requirement). + return -1; + } + + out << " Success!" << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqistreamerzone, out.str()); + + pqipkt_delete(pkt_wpending); + pkt_wpending = NULL; + + sentbytes += len; + sent = true; + } + } + outSentBytes(sentbytes); + return 1; +} + + +/* Handles reading from input stream. + */ + +int pqistreamer::handleincoming() +{ + int readbytes = 0; + + { + std::ostringstream out; + out << "pqistreamer::handleincoming()"; + pqioutput(PQL_DEBUG_ALL, pqistreamerzone, out.str()); + } + + if (!(bio->isactive())) + { + inReadBytes(readbytes); + return 0; + } + + // enough space to read any packet. + int maxlen = pkt_rpend_size; + void *block = pkt_rpending; + + // initial read size: basic packet. + int blen = pqipkt_basesize(); + + int tmplen; + int pktlen; + int maxin = inAllowedBytes(); + + while((maxin > readbytes) && (bio->moretoread())) + { + // read the basic block (minimum packet size) + if (blen != (tmplen = bio->readdata(block, blen))) + { + pqioutput(PQL_DEBUG_BASIC, pqistreamerzone, + "pqistreamer::handleincoming() Didn't read BasePkt!"); + + // error.... (either blocked or failure) + inReadBytes(readbytes); + if (tmplen == 0) + { + + // most likely blocked! + pqioutput(PQL_DEBUG_BASIC, pqistreamerzone, + "pqistreamer::handleincoming() read blocked"); + + return 0; + } + else if (tmplen < 0) + { + // assume the worse, that + // the stream is bust ... and jump away. + pqioutput(PQL_WARNING, pqistreamerzone, + "pqistreamer::handleincoming() Error in bio read"); + return -1; + } + else // tmplen > 0 + { + // strange case.... + std::ostringstream out; + out << "pqistreamer::handleincoming() Incomplete "; + out << "(Strange) read of " << tmplen << " bytes"; + pqioutput(PQL_ALERT, pqistreamerzone, out.str()); + return -1; + } + } + readbytes += tmplen; + pktlen = tmplen; + + // workout how much more to read. + int extralen = pqipkt_rawlen(block) - blen; + if (extralen > maxlen - blen) + { + pqioutput(PQL_ALERT, pqistreamerzone, "ERROR: Read Packet too Big!"); + exit(1); + } + + if (extralen > 0) + { + void *extradata = (void *) (((char *) block) + blen); + + if (extralen != (tmplen = bio->readdata(extradata, extralen))) + { + std::ostringstream out; + out << "Error Completing Read (read "; + out << tmplen << "/" << extralen << ")" << std::endl; + pqioutput(PQL_ALERT, pqistreamerzone, out.str()); + + // temp to catch this.... + // if it is triggered ... need to modify code. + // XXXX Bug to fix! + exit(1); + + // error.... + inReadBytes(readbytes); + return -1; + } + + readbytes += extralen; + pktlen += extralen; + } + + + // create packet, based on header. + { + std::ostringstream out; + out << "Read Data Block -> Incoming Pkt("; + out << blen + extralen << ")" << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqistreamerzone, out.str()); + } + + PQItem *pkt = NULL; + if (pqipkt_check(block, pktlen)) + { + pkt = pqipkt_create(block); + } + + if ((pkt != NULL) && (0 < handleincomingitem(pkt))) + { + pqioutput(PQL_DEBUG_BASIC, pqistreamerzone, + "Successfully Read a Packet!"); + } + else + { + pqioutput(PQL_ALERT, pqistreamerzone, + "Failed to handle Packet!"); + inReadBytes(readbytes); + return -1; + } + } + + inReadBytes(readbytes); + return 0; +} + + + +/* BandWidth Management Assistance */ + +float pqistreamer::outTimeSlice() +{ + { + std::ostringstream out; + out << "pqistreamer::outTimeSlice()"; + pqioutput(PQL_DEBUG_ALL, pqistreamerzone, out.str()); + } + + fixme("pqistreamer::outTimeSlice()", 1); + return 1; +} + +// very simple..... +int pqistreamer::outAllowedBytes() +{ + int t = time(NULL); // get current timestep. + + /* allow a lot if not bandwidthLimited */ + if (!bio->bandwidthLimited()) + { + currSent = 0; + currSentTS = t; + return PQISTREAM_ABS_MAX; + } + + int dt = t - currSentTS; + // limiter -> for when currSentTs -> 0. + if (dt > 5) + dt = 5; + + int maxout = (int) (getMaxRate(false) * 1000.0); + currSent -= dt * maxout; + if (currSent < 0) + { + currSent = 0; + } + + currSentTS = t; + + { + std::ostringstream out; + out << "pqistreamer::outAllowedBytes() is "; + out << maxout - currSent << "/"; + out << maxout; + pqioutput(PQL_DEBUG_ALL, pqistreamerzone, out.str()); + } + + + return maxout - currSent; +} + +int pqistreamer::inAllowedBytes() +{ + int t = time(NULL); // get current timestep. + + /* allow a lot if not bandwidthLimited */ + if (!bio->bandwidthLimited()) + { + currReadTS = t; + currRead = 0; + return PQISTREAM_ABS_MAX; + } + + int dt = t - currReadTS; + // limiter -> for when currReadTs -> 0. + if (dt > 5) + dt = 5; + + int maxin = (int) (getMaxRate(true) * 1000.0); + currRead -= dt * maxin; + if (currRead < 0) + { + currRead = 0; + } + + currReadTS = t; + + { + std::ostringstream out; + out << "pqistreamer::inAllowedBytes() is "; + out << maxin - currRead << "/"; + out << maxin; + pqioutput(PQL_DEBUG_ALL, pqistreamerzone, out.str()); + } + + + return maxin - currRead; +} + + +static const float AVG_PERIOD = 5; // sec +static const float AVG_FRAC = 0.8; // for low pass filter. + +void pqistreamer::outSentBytes(int outb) +{ + { + std::ostringstream out; + out << "pqistreamer::outSentBytes(): "; + out << outb << "@" << getRate(false) << "kB/s" << std::endl; + pqioutput(PQL_DEBUG_ALL, pqistreamerzone, out.str()); + } + + + totalSent += outb; + currSent += outb; + avgSentCount += outb; + + int t = time(NULL); // get current timestep. + if (t - avgLastUpdate > AVG_PERIOD) + { + float avgReadpSec = getRate(true); + float avgSentpSec = getRate(false); + + avgReadpSec *= AVG_FRAC; + avgReadpSec += (1.0 - AVG_FRAC) * avgReadCount / + (1000.0 * (t - avgLastUpdate)); + + avgSentpSec *= AVG_FRAC; + avgSentpSec += (1.0 - AVG_FRAC) * avgSentCount / + (1000.0 * (t - avgLastUpdate)); + + + /* pretend our rate is zero if we are + * not bandwidthLimited(). + */ + if (bio->bandwidthLimited()) + { + setRate(true, avgReadpSec); + setRate(false, avgSentpSec); + } + else + { + setRate(true, 0); + setRate(false, 0); + } + + + avgLastUpdate = t; + avgReadCount = 0; + avgSentCount = 0; + } + return; +} + +void pqistreamer::inReadBytes(int inb) +{ + { + std::ostringstream out; + out << "pqistreamer::inReadBytes(): "; + out << inb << "@" << getRate(true) << "kB/s" << std::endl; + pqioutput(PQL_DEBUG_ALL, pqistreamerzone, out.str()); + } + + totalRead += inb; + currRead += inb; + avgReadCount += inb; + + return; +} + diff --git a/libretroshare/src/pqi/pqistreamer.h b/libretroshare/src/pqi/pqistreamer.h new file mode 100644 index 000000000..16a764f5d --- /dev/null +++ b/libretroshare/src/pqi/pqistreamer.h @@ -0,0 +1,104 @@ +/* + * "$Id: pqistreamer.h,v 1.10 2007-02-18 21:46:50 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + +#ifndef MRK_PQI_STREAMER_HEADER +#define MRK_PQI_STREAMER_HEADER + +// Only dependent on the base stuff. +#include "pqi/pqi_base.h" + +#include + +// Fully implements the PQInterface. +// and communicates with peer etc via the BinInterface. +// +// The interface does not handle connection, just communication. + +class pqistreamer: public PQInterface +{ +public: + pqistreamer(BinInterface *bio_in, int bio_flagsin); +virtual ~pqistreamer(); + +// PQInterface +virtual int SendItem(PQItem *); +virtual PQItem *GetItem(); + +virtual int tick(); +virtual int status(); + + private: + /* Implementation */ + + // to filter functions - detect filecancel/data and act! +int queue_outpqi( PQItem *i); +int handleincomingitem(PQItem *i); + + // ticked regularly (manages out queues and sending + // via above interfaces. +int handleoutgoing(); +int handleincoming(); + + // Bandwidth/Streaming Management. +float outTimeSlice(); + +int outAllowedBytes(); +void outSentBytes(int ); + +int inAllowedBytes(); +void inReadBytes(int ); + + // Binary Interface for IO, initialisated at startup. + BinInterface *bio; + unsigned int bio_flags; // only BIN_NO_CLOSE at the moment. + + void *pkt_wpending; // storage for pending packet to write. + int pkt_rpend_size; // size of pkt_rpending. + void *pkt_rpending; // storage for read in pending packets. + + // Temp Storage for transient data..... + std::list out_pkt; // Cntrl / Search / Results queue + std::list out_data; // FileData - secondary queue. + std::list incoming; + + // data for network stats. + int totalRead; + int totalSent; + + // these are representative (but not exact) + int currRead; + int currSent; + int currReadTS; // TS from which these are measured. + int currSentTS; + + int avgLastUpdate; // TS from which these are measured. + float avgReadCount; + float avgSentCount; +}; + + +#endif //MRK_PQI_STREAMER_HEADER diff --git a/libretroshare/src/pqi/pqistunner.cc b/libretroshare/src/pqi/pqistunner.cc new file mode 100644 index 000000000..1efbc82ea --- /dev/null +++ b/libretroshare/src/pqi/pqistunner.cc @@ -0,0 +1,264 @@ +/* + * "$Id: pqistunner.cc,v 1.2 2007-02-18 21:46:50 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "pqi/pqistunner.h" +#include "tcponudp/tou.h" + +#include "pqi/pqidebug.h" +#include + +const int pqistunzone = 13754; + + +pqistunner::pqistunner(struct sockaddr_in addr) + :sockfd(-1), active(false) +{ + pqioutput(PQL_ALERT, pqistunzone, + "pqistunner::pqistunner()"); + + setListenAddr(addr); + setuplisten(); + + stunpkt = malloc(1024); /* 20 = size of a stun request */ + stunpktlen = 1024; +} + + +int pqistunner::setListenAddr(struct sockaddr_in addr) +{ + laddr = addr; + // increment the port by 1. (can't open on same) + laddr.sin_port = htons(ntohs(laddr.sin_port) + 1); + + return 1; +} + +int pqistunner::resetlisten() +{ + if (sockfd > -1) + { + /* close it down */ + std::ostringstream out; + out << "pqistunner::resetlisten() Closed stun port"; + pqioutput(PQL_ALERT, pqistunzone, out.str()); + + tou_close(sockfd); + sockfd = -1; + } + active = false; + return 1; +} + +int pqistunner::setuplisten() +{ + sockfd = tou_socket(0,0,0); + if (0 == tou_bind(sockfd, (struct sockaddr *) &laddr, sizeof(laddr))) + { + active = true; + std::ostringstream out; + out << "pqistunner::setuplisten() Attached to Listen Address: "; + out << inet_ntoa(laddr.sin_addr) << ":" << ntohs(laddr.sin_port); + pqioutput(PQL_ALERT, pqistunzone, out.str()); + } + else + { + pqioutput(PQL_ALERT, pqistunzone, "pqistunner::setuplisten Failed!"); + } + return 1; +} + +int pqistunner::stun(struct sockaddr_in stun_addr) +{ + pqioutput(PQL_DEBUG_BASIC, pqistunzone, "pqistunner::stun()"); + + /* send out a stun packet -> save in the local variable */ + if (!active) + { + pqioutput(PQL_ALERT, pqistunzone, "pqistunner::stun() Not Active!"); + return 0; + } + + int tmplen = stunpktlen; + bool done = generate_stun_pkt(stunpkt, &tmplen); + if (!done) + { + pqioutput(PQL_ALERT, pqistunzone, "pqistunner::stun() Failed!"); + return 0; + } + + /* increment the port +1 */ + stun_addr.sin_port = htons(ntohs(stun_addr.sin_port) + 1); + /* and send it off */ + int sentlen = tou_sendto(sockfd, stunpkt, stunpktlen, 0, + (const struct sockaddr *) &stun_addr, sizeof(stun_addr)); + + std::ostringstream out; + out << "pqistunner::stun() Sent Stun Packet(" << sentlen << ") from:"; + out << inet_ntoa(laddr.sin_addr) << ":" << ntohs(laddr.sin_port); + out << " to:"; + out << inet_ntoa(stun_addr.sin_addr) << ":" << ntohs(stun_addr.sin_port); + pqioutput(PQL_ALERT, pqistunzone, out.str()); + + return 1; +} + + + +bool pqistunner::response(void *stun_pkt, int size, struct sockaddr_in &addr) +{ + /* check what type it is */ + if (size < 28) + { + return false; + } + + if (((uint16_t *) stun_pkt)[0] != 0x0101) + { + /* not a response */ + return false; + } + + /* iterate through the packet */ + /* for now assume the address follows the header directly */ + /* all stay in netbyteorder! */ + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = ((uint32_t *) stun_pkt)[6]; + addr.sin_port = ((uint16_t *) stun_pkt)[11]; + + + std::ostringstream out; + out << "pqistunner::response() Recvd a Stun Response, ext_addr: "; + out << inet_ntoa(addr.sin_addr) << ":" << ntohs(addr.sin_port); + pqioutput(PQL_ALERT, pqistunzone, out.str()); + + return true; + +} + + + +/************************** Basic Functionality ******************/ +int pqistunner::recvfrom(void *data, int *size, struct sockaddr_in &addr) +{ + if (!active) + { + pqioutput(PQL_ALERT, pqistunzone, "pqistunner::recvfrom() Not Active!"); + return 0; + } + + /* check the socket */ + socklen_t addrlen = sizeof(addr); + + int rsize = tou_recvfrom(sockfd, data, *size, 0, (struct sockaddr *) &addr, &addrlen); + if (rsize > 0) + { + std::ostringstream out; + out << "pqistunner::recvfrom() Recvd a Pkt on: "; + out << inet_ntoa(laddr.sin_addr) << ":" << ntohs(laddr.sin_port); + out << " from: "; + out << inet_ntoa(addr.sin_addr) << ":" << ntohs(addr.sin_port); + pqioutput(PQL_ALERT, pqistunzone, out.str()); + + *size = rsize; + return 1; + } + return 0; +} + +int pqistunner::reply(void *data, int size, struct sockaddr_in &addr) +{ + /* so we design a new packet with the external address in it */ + int pktlen = 0; + void *pkt = generate_stun_reply(&addr, &pktlen); + + /* and send it off */ + int sentlen = tou_sendto(sockfd, pkt, pktlen, 0, + (const struct sockaddr *) &addr, sizeof(addr)); + + { + std::ostringstream out; + out << "pqistunner::reply() Replying from: "; + out << inet_ntoa(laddr.sin_addr) << ":" << ntohs(laddr.sin_port); + out << " to: "; + out << inet_ntoa(addr.sin_addr) << ":" << ntohs(addr.sin_port); + pqioutput(PQL_ALERT, pqistunzone, out.str()); + } + + free(pkt); + + /* display status */ + + return sentlen; +} + +bool pqistunner::generate_stun_pkt(void *stun_pkt, int *len) +{ + if (*len < 20) + { + return false; + } + + /* just the header */ + ((uint16_t *) stun_pkt)[0] = 0x0001; + ((uint16_t *) stun_pkt)[1] = 0x0020; /* only header */ + /* transaction id - should be random */ + ((uint32_t *) stun_pkt)[1] = 0x0020; + ((uint32_t *) stun_pkt)[2] = 0x0121; + ((uint32_t *) stun_pkt)[3] = 0x0111; + ((uint32_t *) stun_pkt)[4] = 0x1010; + *len = 20; + return true; +} + + +void *pqistunner::generate_stun_reply(struct sockaddr_in *stun_addr, int *len) +{ + /* just the header */ + void *stun_pkt = malloc(28); + ((uint16_t *) stun_pkt)[0] = 0x0101; + ((uint16_t *) stun_pkt)[1] = 0x0028; /* only header + 8 byte addr */ + /* transaction id - should be random */ + ((uint32_t *) stun_pkt)[1] = 0x0020; + ((uint32_t *) stun_pkt)[2] = 0x0121; + ((uint32_t *) stun_pkt)[3] = 0x0111; + ((uint32_t *) stun_pkt)[4] = 0x1010; + /* now add address + * 0 1 2 3 + * + * + */ + + ((uint32_t *) stun_pkt)[6] = stun_addr->sin_addr.s_addr; + ((uint16_t *) stun_pkt)[11] = stun_addr->sin_port; + + *len = 28; + return stun_pkt; +} + + diff --git a/libretroshare/src/pqi/pqistunner.h b/libretroshare/src/pqi/pqistunner.h new file mode 100644 index 000000000..f96a7cce8 --- /dev/null +++ b/libretroshare/src/pqi/pqistunner.h @@ -0,0 +1,68 @@ +/* + * "$Id: pqistunner.h,v 1.2 2007-02-18 21:46:50 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "pqi/pqinetwork.h" + + +class pqistunner +{ + public: + + pqistunner(struct sockaddr_in addr); + +int setListenAddr(struct sockaddr_in addr); +int setuplisten(); + +int resetlisten(); + +int stun(struct sockaddr_in stun_addr); + +bool response(void *stun_pkt, int size, struct sockaddr_in &addr); +int recvfrom(void *data, int *size, struct sockaddr_in &addr); +int reply(void *data, int size, struct sockaddr_in &addr); + + private: + +/************************** Basic Functionality ******************/ + +bool generate_stun_pkt(void *stun_pkt, int *len); +void * generate_stun_reply(struct sockaddr_in *stun_addr, int *len); + + + int sockfd; + bool active; + void *stunpkt; + unsigned int stunpktlen; + + struct sockaddr_in laddr, stun_addr; + +}; + + + diff --git a/libretroshare/src/pqi/pqisupernode.cc b/libretroshare/src/pqi/pqisupernode.cc new file mode 100644 index 000000000..d90a8359f --- /dev/null +++ b/libretroshare/src/pqi/pqisupernode.cc @@ -0,0 +1,482 @@ +/* + * "$Id: pqisupernode.cc,v 1.3 2007-02-18 21:46:50 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "pqi/pqisupernode.h" + +/* +#include "pqi/pqiproxy.h" +#include "pqi/pqitunnelproxy.h" + */ + + +#include "pqi/p3disc.h" +#include "pqi/p3channel.h" + +#include "pqi/pqissl.h" +#include "pqi/pqissllistener.h" + +/* + * #include "pqi/pqiudpproxy.h" + * #include "pqi/pqissludp.h" + */ + +#ifdef PQI_USE_PROXY + #include "pqi/pqiudpproxy.h" + #include "pqi/pqissludp.h" +#endif + +//#include "pqi/pqitunneltst.h" + +#include "pqi/pqidebug.h" +#include + +const int pqisupernodezone = 65904; + +// get the Tunnel and TunnelInit packets from the queue. +bool isTunnelItem(PQItem *item) +{ + if (item -> type == PQI_ITEM_TYPE_TUNNELITEM) + return true; + return false; +} + +bool isTunnelInitItem(PQItem *item) +{ + if (item -> type == PQI_ITEM_TYPE_TUNNELINITITEM) + return true; + return false; +} + +// handle the tunnel services. +int pqisupernode::tickTunnelServer() +{ + PQItem *pqi = NULL; + { + std::ostringstream out; + out << "pqisupernode::tickTunnelServer()"; + pqioutput(PQL_DEBUG_ALL, pqisupernodezone, out.str()); + } + + PQTunnelServer::tick(); + + while(NULL != (pqi = SelectOtherPQItem(isTunnelInitItem))) + { + pqioutput(PQL_DEBUG_BASIC, pqisupernodezone, + "pqisupernode::tickTunnelServer() Incoming TunnelInitItem"); + incoming(pqi); + } + while(NULL != (pqi = SelectOtherPQItem(isTunnelItem))) + { + pqioutput(PQL_DEBUG_BASIC, pqisupernodezone, + "pqisupernode::tickTunnelServer() Incoming TunnelItem"); + incoming(pqi); + } + + while(NULL != (pqi = outgoing())) + { + pqioutput(PQL_DEBUG_BASIC, pqisupernodezone, + "pqisupernode::tickTunnelServer() OutGoing PQItem"); + + SendOtherPQItem(pqi); + } + return 1; +} + + + // inits +pqisupernode::pqisupernode(SecurityPolicy *glob, sslroot *sr) + :pqihandler(glob), sslr(sr), p3d(NULL) +#ifdef PQI_USE_PROXY + ,p3p(NULL) +#endif +{ + // add a p3proxy & p3disc. + p3d = new p3disc(sr); +#ifdef PQI_USE_PROXY + p3p = new p3udpproxy(p3d); +#endif + + if (!(sr -> active())) + { + pqioutput(PQL_ALERT, pqisupernodezone, "sslroot not active... exiting!"); + exit(1); + } + + // make listen + Person *us = sr -> getOwnCert(); + if (us != NULL) + { + pqisslnode = new pqisslsupernode(us -> localaddr, this); +#ifdef PQI_USE_PROXY + pqiudpl = new pqiudplistener((p3udpproxy *) p3p, + us -> localaddr); +#endif + } + else + { + pqioutput(PQL_ALERT, pqisupernodezone, "No Us! what are we!"); + exit(1); + } + + addService(p3d); + registerTunnelType(PQI_TUNNEL_DISC_ITEM_TYPE, createDiscItems); + +#ifdef PQI_USE_PROXY + addService(p3p); + registerTunnelType(PQI_TUNNEL_PROXY_TYPE, createPQTunnelProxy); + registerTunnelInitType(PQI_TUNNEL_PROXY_TYPE, createPQTunnelProxyInit); +#endif + return; +} + + +int pqisupernode::run() +{ + while(1) + { + sleep(1); + tick(); + } + return 1; +} + +int pqisupernode::tick() +{ + pqisslnode -> tick(); +#ifdef PQI_USE_PROXY + pqiudpl->tick(); +#endif + tickTunnelServer(); + + return pqihandler::tick(); +} + + +int pqisupernode::status() +{ + pqisslnode -> status(); +#ifdef PQI_USE_PROXY + pqiudpl->status(); +#endif + return pqihandler::status(); +} + + // control the connections. + +int pqisupernode::cert_accept(cert *a) +{ + /* this function does nothing */ + pqioutput(PQL_ALERT, pqisupernodezone, + "pqisupernode::cert_accept() Null Fn."); + + return -1; +} + +int pqisupernode::cert_deny(cert *a) +{ + std::map::iterator it; + SearchModule *mod; + bool found = false; + + // if used find search module.... + if (a -> InUse()) + { + // find module. + for(it = mods.begin(); (!found) && (it != mods.end());it++) + { + mod = it -> second; + if (a == (cert *) ((pqiperson *) + (mod -> pqi)) -> getContact()) + { + found = true; + } + } + if (found) + { + RemoveSearchModule(mod); + secpolicy_delete(mod -> sp); + pqiperson *p = (pqiperson *) mod -> pqi; + p -> reset(); + delete p; + a -> InUse(false); + } + } + a -> Accepted(false); + return 1; +} + +int pqisupernode::cert_auto(cert *a, bool b) +{ + pqioutput(PQL_ALERT, pqisupernodezone, + "pqisupernode::cert_auto() Null Fn."); + return 1; +} + + +int pqisupernode::restart_listener() +{ + pqisslnode -> resetlisten(); + cert *own = sslr -> getOwnCert(); + pqisslnode -> setListenAddr(own -> localaddr); + pqisslnode -> setuplisten(); + +#ifdef PQI_USE_PROXY + pqiudpl -> resetlisten(); + pqiudpl -> setListenAddr(own -> localaddr); + pqiudpl -> setuplisten(); +#endif + return 1; +} + + +static const std::string pqih_ftr("PQIH_FTR"); + +int pqisupernode::save_config() +{ + char line[512]; + sprintf(line, "%f %f %f %f", getMaxRate(true), getMaxRate(false), + getMaxIndivRate(true), getMaxIndivRate(false)); + sslr -> setSetting(pqih_ftr, std::string(line)); + return 1; +} + + + +int pqisupernode::load_config() +{ + std::string line = sslr -> getSetting(pqih_ftr); + float mri, mro, miri, miro; + + if (4 == sscanf(line.c_str(), "%f %f %f %f", &mri, &mro, &miri, &miro)) + { + setMaxRate(true, mri); + setMaxRate(false, mro); + setMaxIndivRate(true, miri); + setMaxIndivRate(false, miro); + } + else + { + pqioutput(PQL_DEBUG_BASIC, pqisupernodezone, + "pqisupernode::load_config() Loading Default Rates!"); + + setMaxRate(true, 20.0); + setMaxRate(false, 20.0); + setMaxIndivRate(true, 5.0); + setMaxIndivRate(false, 5.0); + } + + return 1; +} + + + /* Overloaded PQItem Check */ +int pqisupernode::checkOutgoingPQItem(PQItem *item, int global) +{ + /* check cid vs Person */ + if ((global) && (item->cid.route[0] == 0)) + { + /* allowed through as for all! */ + pqioutput(PQL_DEBUG_BASIC, pqisupernodezone, + "pqisupernode::checkOutgoingPQItem() Allowing global"); + return 1; + } + + if (item -> p == NULL) + { + pqioutput(PQL_ALERT, pqisupernodezone, + "pqisupernode::checkOutgoingPQItem() ERROR: NULL Person"); + + std::ostringstream out; + item -> print(out); + pqioutput(PQL_ALERT, pqisupernodezone,out.str()); + + return 0; + } + + cert *c = (cert *) item -> p; + if (0 != pqicid_cmp(&(c -> cid), &(item -> cid))) + { + std::ostringstream out; + out << "pqisupernode::checkOutgoingPQItem() c->cid != item->cid"; + out << std::endl; + out << "c -> CID [" << c->cid.route[0]; + for(int i = 0; i < 10; i++) + { + out << ":" << c->cid.route[i]; + } + out << "]" << std::endl; + + out << "item -> CID [" << item->cid.route[0]; + for(int i = 0; i < 10; i++) + { + out << ":" << item->cid.route[i]; + } + out << "]" << std::endl; + + item -> print(out); + + pqioutput(PQL_ALERT, pqisupernodezone,out.str()); + pqicid_copy(&(c->cid), &(item->cid)); + } + + /* check the top one */ + + return 1; +} + +int pqisupernode::recvdConnection(int fd, SSL *in_connection, + cert *peer, struct sockaddr_in *raddr) +{ + /* so we need to accept the certificate */ + if (peer -> InUse()) + { + pqioutput(PQL_DEBUG_BASIC, pqisupernodezone, + "pqisupernode::recvdConnection() Cert in Use!"); + + return -1; + } + + pqiperson *pqip = new pqiperson(peer); + pqissl *pqis = new pqissl(peer, pqisslnode, pqip); + pqiconnect *pqisc = new pqiconnect(pqis); + pqip -> addChildInterface(pqisc); + + /* first set the certificate options off! */ + /* listening off, connecting off */ + // setup no behaviour. (no remote address) + // + + // add the certificate to sslroot... + sslr -> addUntrustedCertificate(peer); + + peer -> InUse(true); + peer -> Accepted(true); + peer -> WillListen(false); + peer -> WillConnect(false); + peer -> Manual(true); + + // attach to pqihandler + SearchModule *sm = new SearchModule(); + sm -> smi = 2; + sm -> pqi = pqip; + sm -> sp = secpolicy_create(); + + // reset it to start it working. + pqis -> reset(); + AddSearchModule(sm); // call to pqihandler.... + + pqis -> accept(in_connection, fd, *raddr); + + /* finally tell the system to listen - if the connection fails */ + peer -> WillListen(true); + + /* done! */ + return 1; +} + + +/************************ PQI SSL SUPER NODE **************************** + * + * This is the special listener, that accepts all connections. + * + */ + +pqisslsupernode::pqisslsupernode(struct sockaddr_in addr, pqisupernode *grp) + :pqissllistener(addr), psn(grp) +{ + return; +} + +pqisslsupernode::~pqisslsupernode() +{ + return; +} + + +int pqisslsupernode::completeConnection(int fd, SSL *ssl, struct sockaddr_in &remote_addr) +{ + /* first attempt a pqissllistener connect (ie if we are listening for it!) + * + * if this fails, try adding it! + */ + + if (0 < pqissllistener::completeConnection(fd,ssl, remote_addr)) + { + return 1; /* done! */ + } + + /* else ask the pqisupernode to create it! */ + + // Get the Peer Certificate.... +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + XPGP *peercert = SSL_get_peer_pgp_certificate(ssl); +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + X509 *peercert = SSL_get_peer_certificate(ssl); +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + + if (peercert == NULL) + { + pqioutput(PQL_WARNING, pqisupernodezone, + "pqisslsupernode::completeConnection() Peer Did Not Provide Cert!"); + return -1; + } + + + // save certificate... (and ip locations) + /* the first registerCertificate can fail, + * but this is in pqissllistener .... + * so this one should succeed. + */ +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + cert *npc = sslccr -> registerCertificateXPGP(peercert, remote_addr, true); +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + cert *npc = sslccr -> registerCertificate(peercert, remote_addr, true); +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + + if ((npc == NULL) || (npc -> Connected())) + { + std::ostringstream out; + out << "No Matching Certificate/Already Connected"; + out << " for Connection:" << inet_ntoa(remote_addr.sin_addr); + out << std::endl; + out << "Shutting it down!" << std::endl; + pqioutput(PQL_WARNING, pqisupernodezone, out.str()); + return -1; + } + + // hand off ssl conection. + psn -> recvdConnection(fd, ssl, npc, &remote_addr); + return 1; +} + diff --git a/libretroshare/src/pqi/pqisupernode.h b/libretroshare/src/pqi/pqisupernode.h new file mode 100644 index 000000000..f63c647e7 --- /dev/null +++ b/libretroshare/src/pqi/pqisupernode.h @@ -0,0 +1,166 @@ +/* + * "$Id: pqisupernode.h,v 1.2 2007-02-18 21:46:50 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + +#ifndef MRK_PQI_SUPER_NODE_HEADER +#define MRK_PQI_SUPER_NODE_HEADER + +#include "pqi/pqihandler.h" +#include "pqi/pqiperson.h" +#include "pqi/pqitunnel.h" +#include "pqi/pqissllistener.h" + +/***************************************************************** + * So a super node, is a very special being, + * and used to assist in the setup of a retro share network. + * + * It role is to accept all connections, + * and allow discovery/proxying for facilitating connections. + * + * Therefore this interface includes + * both a p3disc + p3udpproxy, but + * doesn't allow any other traffic through.... + * + * each person will only include a pqissl (generated by the listener). + * + * The tricky part is allowing the pqissl to be + * generated on the fly, as the connections are made! + * + */ + + +class p3proxy; +class p3disc; + +class pqiudplistener; +class pqisslsupernode; + +class pqisupernode: public pqihandler, public PQTunnelServer +{ + public: + pqisupernode(SecurityPolicy *, sslroot *sr); + + // overloaded from pqihandler -> null fns + + virtual int Search(SearchItem *ns) { if (ns) delete ns; return 1; } + virtual int CancelSearch(SearchItem *ns) { if (ns) delete ns; return 1; } + virtual int SendSearchResult(PQFileItem *ns){ if (ns) delete ns; return 1; } + + // inputs. + virtual PQFileItem * GetSearchResult() { return NULL; } + virtual SearchItem * RequestedSearch() { return NULL; } + virtual SearchItem * CancelledSearch() { return NULL; } + + // file i/o + virtual int SendFileItem(PQFileItem *ns) { if (ns) delete ns; return 1; } + virtual PQFileItem * GetFileItem() { return NULL; } + + // Chat Interface + virtual int SendMsg(ChatItem *ns) { if (ns) delete ns; return 1; } + virtual ChatItem *GetMsg() { return NULL; } + + // end of overloaded from pqihandler -> null fns + + + // control the connections. +int cert_accept(cert *a); +int cert_deny(cert *a); +int cert_auto(cert *a, bool b); + +int restart_listener(); + +int save_config(); +int load_config(); + + // tick interfaces. +virtual int run(); +virtual int tick(); +virtual int status(); + + + // the pqisslsupernode, is derived from the pqissllistener, + // except it doesn't track who it should listen for. + // instead each connection is accepted blind, + // and passed to the pqisupernode. which can attach it + // to a pqissl, if desired.... + // + // The first basic version of this will accept up to a total + // limit...... +virtual int recvdConnection(int fd, SSL *in_connection, + cert *peer, struct sockaddr_in *raddr); + + + + // overloaded functions to disable various features of pqihandler + + // + SearchInterface which should automatically handle stuff + + // acess to services. + p3disc *getP3Disc() { return p3d; } + p3proxy *getP3Proxy() { return p3p; } + + protected: + /* Overloaded PQItem Check + * checks item->cid vs Person + */ +virtual int checkOutgoingPQItem(PQItem *item, int global); + + private: + + // The tunnelserver operation. + int tickTunnelServer(); + + pqisslsupernode *pqisslnode; + pqiudplistener *pqiudpl; + + sslroot *sslr; + + p3disc *p3d; + p3proxy *p3p; +}; + + + +class pqisslsupernode: public pqissllistener +{ + public: + + pqisslsupernode(struct sockaddr_in addr, pqisupernode *grp); +virtual ~pqisslsupernode(); + +//virtual int tick(); +//virtual int status(); + +virtual int completeConnection(int sockfd, SSL *in_connection, struct sockaddr_in &raddr); + + private: + + pqisupernode *psn; +}; + + + +#endif // MRK_PQI_SUPER_NODE_HEADER diff --git a/libretroshare/src/pqi/pqitunnel.cc b/libretroshare/src/pqi/pqitunnel.cc new file mode 100644 index 000000000..95fda7002 --- /dev/null +++ b/libretroshare/src/pqi/pqitunnel.cc @@ -0,0 +1,403 @@ +/* + * "$Id: pqitunnel.cc,v 1.4 2007-02-18 21:46:50 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "pqi/pqitunnel.h" + +const int pqitunnelzone = 60478; +#include "pqi/pqidebug.h" +#include + + +PQTunnel::PQTunnel(int st) + :PQItem(PQI_ITEM_TYPE_TUNNELITEM, st) +{ + pqioutput(PQL_DEBUG_BASIC, pqitunnelzone, + "PQTunnel::PQTunnel() Creation..."); + + return; +} + +PQTunnel::~PQTunnel() +{ +} + +// This is commented out - because +// it should never be cloned at this level! +// +//PQTunnel *PQTunnel::clone() +//{ +// pqioutput(PQL_DEBUG_BASIC, pqitunnelzone, +// "PQTunnel::clone"); +// +// PQTunnel *t = new PQTunnel(subtype); +// t -> copy(this); +// return t; +//} + +void PQTunnel::copy(const PQTunnel *src) +{ + pqioutput(PQL_DEBUG_BASIC, pqitunnelzone, + "PQTunnel::copy() : Only the Base!"); + PQItem::copy(src); +} + +std::ostream &PQTunnel::print(std::ostream &out) +{ + out << "-------- PQTunnel"; + PQItem::print(out); + + out << "PQTunnel size:" << getSize(); + out << "--------" << std::endl; + return out; +} + + +//const int PQTunnel::getSize() const +//{ +// return size; +//} +// +//const void *PQTunnel::getData() const +//{ +// return data; +//} +// +//int PQTunnel::out(void *dta, const int n) const +//{ +// pqioutput(PQL_DEBUG_BASIC, pqitunnelzone, +// "PQTunnel::out()"); +// +// if ((dta == NULL) || (data == NULL)) +// { +// return -1; +// } +// if (size == 0) +// { +// return 0; +// } +// +// if (n < size) +// return -1; +// memcpy(dta, data, size); +// return size; +//} +// +//int PQTunnel::in(const void *dta, const int n) +//{ +// pqioutput(PQL_DEBUG_BASIC, pqitunnelzone, +// "PQTunnel::in()"); +// +// if (data) +// { +// if (n != size) +// { +// free(data); +// data = malloc(n); +// size = n; +// } +// } +// else +// { +// data = malloc(n); +// size = n; +// } +// +// memcpy(data, dta, size); +// return 1; +//} + +PQTunnelInit::PQTunnelInit(int st) + :PQItem(PQI_ITEM_TYPE_TUNNELINITITEM, st), mode(Request) +{ + pqioutput(PQL_DEBUG_BASIC, pqitunnelzone, + "PQTunnelInit::PQTunnelInit()"); + return; +} + +PQTunnelInit::~PQTunnelInit() +{ + return; +} + + +PQTunnelInit *PQTunnelInit::clone() +{ + pqioutput(PQL_DEBUG_BASIC, pqitunnelzone, + "PQTunnelInit::clone()"); + + PQTunnelInit *ni = new PQTunnelInit(subtype); + ni -> copy(this); + return ni; +} + +void PQTunnelInit::copy(const PQTunnelInit *item) +{ + pqioutput(PQL_DEBUG_BASIC, pqitunnelzone, + "PQTunnelInit::copy()"); + + PQItem::copy(item); + + mode = item -> mode; +} + +std::ostream &PQTunnelInit::print(std::ostream &out) +{ + out << "---- ---- PQTunnelInit" << std::endl; + PQItem::print(out); + out << "mode: "; + switch(mode) + { + case Request: + out << "Request" << std::endl; + break; + case Connect: + out << "Connect" << std::endl; + break; + case End: + out << "End" << std::endl; + break; + default: + out << "Unknown" << std::endl; + break; + } + + out << "---- ----" << std::endl; + + return out; +} + +const int PQTunnelInit::getSize() const +{ + return 4; +} + +int PQTunnelInit::out(void *data, const int size) const +{ + if (size < PQTunnelInit::getSize()) + return -1; + ((int *) data)[0] = (int) mode; + return PQTunnelInit::getSize(); +} + + +int PQTunnelInit::in(const void *data, const int size) +{ + if (size < PQTunnelInit::getSize()) + return -1; + mode = (InitMsg) ((int *) data)[0]; + return PQTunnelInit::getSize(); +} + +PQTunnelServer::PQTunnelServer() +{ + pqioutput(PQL_DEBUG_BASIC, pqitunnelzone, + "PQTunnelServer::PQTunnelServer()"); + + rrit = services.begin(); + return; +} + +int PQTunnelServer::addService(PQTunnelService *ts) +{ + pqioutput(PQL_DEBUG_BASIC, pqitunnelzone, + "PQTunnelServer::addService()"); + + std::map::iterator it; + it = services.find(ts -> getSubType()); + if (it != services.end()) + { + // it exists already! + return -1; + } + + services[ts -> getSubType()] = ts; + rrit = services.begin(); + return 1; +} + +int PQTunnelServer::incoming(PQItem *item) +{ + pqioutput(PQL_DEBUG_BASIC, pqitunnelzone, + "PQTunnelServer::incoming()"); + + { + std::ostringstream out; + out << "PQTunnelServer::incoming() Service: "; + out << item -> subtype << std::endl; + out << "Item:" << std::endl; + item -> print(out); + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqitunnelzone, out.str()); + } + + std::map::iterator it; + it = services.find(item -> subtype); + if (it == services.end()) + { + pqioutput(PQL_DEBUG_BASIC, pqitunnelzone, + "PQTunnelServer::incoming() Service: No Service - deleting"); + + // delete it. + delete item; + + // it exists already! + return -1; + } + + switch(item -> type) + { + case PQI_ITEM_TYPE_TUNNELITEM: + { + std::ostringstream out; + out << "PQTunnelServer::incoming() Sending to"; + out << it -> second << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqitunnelzone, out.str()); + + return (it->second) -> receive((PQTunnel *) item); + } + break; + case PQI_ITEM_TYPE_TUNNELINITITEM: + { + std::ostringstream out; + out << "PQTunnelServer::incoming() Sending to"; + out << it -> second << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqitunnelzone, out.str()); + + return (it->second) -> receive((PQTunnelInit *) item); + } + break; + default: + break; + } + delete item; + return -1; +} + + + +PQItem *PQTunnelServer::outgoing() +{ + pqioutput(PQL_DEBUG_ALL, pqitunnelzone, + "PQTunnelServer::outgoing()"); + + if (rrit != services.end()) + { + rrit++; + } + else + { + rrit = services.begin(); + } + + std::map::iterator sit = rrit; + // run to the end. + PQItem *item; + + // run through to the end, + for(;rrit != services.end();rrit++) + { + // send out init items first. + if (NULL != (item = (rrit -> second) -> sendInit())) + { + std::ostringstream out; + out << "PQTunnelServer::outgoing() Got InitItem From:"; + out << rrit -> second << std::endl; + + item -> print(out); + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqitunnelzone, out.str()); + return item; + } + if (NULL != (item = (rrit -> second) -> send())) + { + std::ostringstream out; + out << "PQTunnelServer::outgoing() Got Item From:"; + out << rrit -> second << std::endl; + + item -> print(out); + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqitunnelzone, out.str()); + return item; + } + } + + // from the beginning to where we started. + for(rrit = services.begin();rrit != sit; rrit++) + { + if (NULL != (item = (rrit -> second) -> sendInit())) + { + std::ostringstream out; + out << "PQTunnelServer::outgoing() Got InitItem From:"; + out << rrit -> second << std::endl; + + item -> print(out); + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqitunnelzone, out.str()); + return item; + } + if (NULL != (item = (rrit -> second) -> send())) + { + std::ostringstream out; + out << "PQTunnelServer::outgoing() Got Item From:"; + out << rrit -> second << std::endl; + + item -> print(out); + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqitunnelzone, out.str()); + return item; + } + } + return NULL; +} + + + +int PQTunnelServer::tick() +{ + pqioutput(PQL_DEBUG_ALL, pqitunnelzone, + "PQTunnelServer::tick()"); + + std::map::iterator it; + + // from the beginning to where we started. + for(it = services.begin();it != services.end(); it++) + { + std::ostringstream out; + out << "PQTunnelServer::service id:" << it -> first; + out << " -> Service: " << it -> second; + out << std::endl; + pqioutput(PQL_DEBUG_ALL, pqitunnelzone, out.str()); + + // now we should actually tick the service. + (it -> second) -> tick(); + } + return 1; +} + + + diff --git a/libretroshare/src/pqi/pqitunnel.h b/libretroshare/src/pqi/pqitunnel.h new file mode 100644 index 000000000..b1e57d3e9 --- /dev/null +++ b/libretroshare/src/pqi/pqitunnel.h @@ -0,0 +1,168 @@ +/* + * "$Id: pqitunnel.h,v 1.3 2007-02-18 21:46:50 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + +#ifndef PQI_TUNNEL_HEADER +#define PQI_TUNNEL_HEADER + +#include "pqi/pqi_base.h" + +// PQI Tunnel, this is a raw tunnel of data. +// The bottom layer on which other services +// can run on. +// +// these packets get passed through the +// server, to a service that is registered. +// +// example services: +// proxytunnel. -> p3proxy. +// sockettunnel +// -> either broadcast (attach to +// open socket instead +// of broadcast address) +// -> or requested/signon. +// +// games, +// voice +// video +// + +class PQTunnel: public PQItem +{ + // private copy constructor... prevent copying... + PQTunnel(const PQTunnel &) {return; } +protected: + PQTunnel(int st); // initialise with subtypes. +public: +virtual ~PQTunnel(); + + // copy functions. +//virtual PQTunnel *clone() = 0; +void copy(const PQTunnel *src); + +// These will be made pure virtual. +virtual const int getSize() const { return 0; } +virtual int out(void *data, const int size) const { return 0;} +virtual int in(const void *data, const int size) { return 0;} + // an overloaded + // fn that will + // mean the building + // fns will be attached. + // to the class. and + // dont have to + +virtual std::ostream &print(std::ostream &out); + +// int size; +// void *data; +}; + + + + +class PQTunnelInit: public PQItem +{ + // private copy constructor... prevent copying... + PQTunnelInit(const PQTunnelInit &) {return; } +protected: + PQTunnelInit(int st); // initialise with subtypes. +public: +virtual ~PQTunnelInit(); + + // copy functions. +virtual PQTunnelInit *clone(); +void copy(const PQTunnelInit *src); + +std::ostream &print(std::ostream &out); + + // These are overloaded from PQTunnelInit. + // these should be able to construct + destruct + // the whole packet from here. + virtual const int getSize() const; + virtual int out(void *data, const int size) const; // write + virtual int in(const void *data, const int size); // read, + + enum InitMsg { Request, Connect, End }; + InitMsg mode; +}; + + +class PQTunnelService +{ + protected: + + PQTunnelService(int s) // our type of packets. + :subtype(s) { return; } + +virtual ~PQTunnelService() { return; } + + public: + // +virtual int receive(PQTunnel *) = 0; +virtual PQTunnel * send() = 0; + +virtual int receive(PQTunnelInit *) = 0; +virtual PQTunnelInit * sendInit() = 0; + +int getSubType() { return subtype; } + +virtual int tick() { return 1; } + + private: + int subtype; +}; + +#include + + +class PQTunnelServer +{ +public: + PQTunnelServer(); + +int addService(PQTunnelService *); + +int incoming(PQItem *); +PQItem *outgoing(); + +int tick(); + +private: + +std::map services; +std::map::iterator rrit; + +}; + + + + + + + + + +#endif // PQI_TUNNEL_HEADER diff --git a/libretroshare/src/pqi/pqitunnelproxy.cc b/libretroshare/src/pqi/pqitunnelproxy.cc new file mode 100644 index 000000000..c7f49ad02 --- /dev/null +++ b/libretroshare/src/pqi/pqitunnelproxy.cc @@ -0,0 +1,389 @@ +/* + * "$Id: pqitunnelproxy.cc,v 1.4 2007-02-18 21:46:50 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "pqi/pqitunnelproxy.h" + +PQTunnel *createPQTunnelProxy(void *d, int n) +{ + return new PQTunnelProxy(); +} + + +PQTunnelInit *createPQTunnelProxyInit(void *d, int n) +{ + return new PQTunnelProxyInit(); +} + + +PQTunnelProxy::PQTunnelProxy() +:PQTunnel(PQI_TUNNEL_PROXY_TYPE), seq(0), size(0), data(NULL) +{ + return; +} + +PQTunnelProxy::~PQTunnelProxy() +{ + if (data) + free(data); +} + + + // copy functions. +PQTunnelProxy *PQTunnelProxy::clone() +{ + PQTunnelProxy *item = new PQTunnelProxy(); + item -> copy(this); + return item; +} + + + +void PQTunnelProxy::copy(const PQTunnelProxy *item) +{ + // copy parents. + PQTunnel::copy(item); + + if (data) + free(data); + size = 0; + size = item -> PQTunnelProxy::getSize() - PQTunnelProxy::getSize(); + data = malloc(size); + + seq = item -> seq; + src = item -> src; + dest = item -> dest; + //proxy = item -> proxy; + + memcpy(data, item -> data, size); + memcpy(sign, item -> sign, PQI_TUNNEL_SIGN_SIZE); +} + + +int PQTunnelProxy::out(void *dta, const int n) const +{ + //std::cerr << "PQTunnelProxy::out()" << std::endl; + if (n < PQTunnelProxy::getSize()) + { + std::cerr << "PQTunnelProxy::out() Failed 1" << std::endl; + return -1; + } + + if (PQTunnel::getSize() != PQTunnel::out(dta, n)) + { + std::cerr << "PQTunnelProxy::out() Failed 2" << std::endl; + return -1; + } + + if (n < PQTunnelProxy::getSize()) + return -1; + char *ptr = (char *) dta; + ptr += PQTunnel::getSize(); + + + memcpy(ptr, &seq, 4); + ptr += 4; + memcpy(ptr, src.data, CERTSIGNLEN); + ptr += CERTSIGNLEN; + memcpy(ptr, dest.data, CERTSIGNLEN); + ptr += CERTSIGNLEN; + + memcpy(ptr, data, size); + ptr += size; + + memcpy(ptr, sign, PQI_TUNNEL_SIGN_SIZE); + ptr += PQI_TUNNEL_SIGN_SIZE; + + return PQTunnelProxy::getSize(); +} + +// The Size +int PQTunnelProxy::in(const void *dta, const int n) +{ + //std::cerr << "PQTunnelProxy::in()" << std::endl; + + if ((dta == NULL) || (n < PQTunnelProxy::getSize())) + { + std::cerr << "PQTunnelProxy::in() Failed 1" << std::endl; + if (dta == NULL) + std::cerr << "PQTunnelProxy::in() dta==NULL" << std::endl; + std::cerr << "PQTunnelProxy::in() is? n: " << n << " < "; + std::cerr << PQTunnelProxy::getSize() << std::endl; + if (n < PQTunnelProxy::getSize()) + std::cerr << "PQTunnelProxy::in() not Enough Space" << std::endl; + + return -1; + } + + if (PQTunnel::getSize() != PQTunnel::in(dta, n)) + { + std::cerr << "PQTunnelProxy::in() Failed 2" << std::endl; + return -1; + } + + // range check size. + if (data) + { + if (n != PQTunnelProxy::getSize()) + { + free(data); + size = 0; + size = n - PQTunnelProxy::getSize(); + data = malloc(size); + } + } + else + { + size = 0; + size = n - PQTunnelProxy::getSize(); + data = malloc(size); + } + + char *ptr = (char *) dta; + ptr += PQTunnel::getSize(); + + memcpy(&seq, ptr, 4); + ptr += 4; + memcpy(src.data, ptr, CERTSIGNLEN); + ptr += CERTSIGNLEN; + memcpy(dest.data, ptr, CERTSIGNLEN); + ptr += CERTSIGNLEN; + + memcpy(data, ptr, size); + ptr += size; + + memcpy(sign, ptr, PQI_TUNNEL_SIGN_SIZE); + ptr += PQI_TUNNEL_SIGN_SIZE; + + return PQTunnelProxy::getSize(); +} + +const int PQTunnelProxy::getSize() const +{ + //std::cerr << "PQTunnelProxy::getSize()" << std::endl; + return PQTunnel::getSize() + sizeof(long) + + CERTSIGNLEN * 2 + + + size + PQI_TUNNEL_SIGN_SIZE; +} + + +#include "pqipacket.h" + +std::ostream &PQTunnelProxy::print(std::ostream &out) +{ + out << "-------- PQTunnelProxy" << std::endl; + PQItem::print(out); + + out << "-------- -------- Tunnelling" << std::endl; + PQItem *pkt = NULL; + if ((data == NULL) || (size == 0)) + { + out << "NULL Pkt" << std::endl; + } + else if (pqipkt_check(data, size)) + { + pkt = pqipkt_create(data); + } + + if (pkt == NULL) + { + out << "Unknown Packet Type" << std::endl; + } + else + { + pkt -> print(out); + delete pkt; + } + out << "-------- -------- " << std::endl; + return out << "-------- PQTunnelProxy" << std::endl; +} + + + +PQTunnelProxyInit::PQTunnelProxyInit() + :PQTunnelInit(PQI_TUNNEL_PROXY_TYPE), seq(0) +{ + return; +} + +PQTunnelProxyInit::~PQTunnelProxyInit() +{ + return; +} + +PQTunnelProxyInit *PQTunnelProxyInit::clone() +{ + PQTunnelProxyInit *ni = new PQTunnelProxyInit(); + ni -> copy(this); + return ni; +} + +void PQTunnelProxyInit::copy(const PQTunnelProxyInit *item) +{ + PQTunnelInit::copy(item); + + mode = item -> mode; + seq = item -> seq; + src = item -> src; + dest = item -> dest; + proxy = item -> proxy; + memcpy(challenge, item -> challenge, CERTSIGNLEN); + memcpy(sign, item -> sign, PQI_TUNNEL_SIGN_SIZE); + +} + + +std::ostream &PQTunnelProxyInit::print(std::ostream &out) +{ + out << "-----------------PQTunnelProxyInit" << std::endl; + PQTunnelInit::print(out); + out << "Mode: " << mode << std::endl; + out << "Seq: " << seq << std::endl; + + out << std::hex; + out << "Src: "; + int i; + for(i = 0; i < CERTSIGNLEN; i++) + { + out << ":" << (unsigned int) src.data[i]; + } + out << std::endl; + + out << "Proxy: "; + for(i = 0; i < CERTSIGNLEN; i++) + { + out << ":" << (unsigned int) proxy.data[i]; + } + out << std::endl; + + out << "Dest: "; + for(i = 0; i < CERTSIGNLEN; i++) + { + out << ":" << (unsigned int) dest.data[i]; + } + out << std::endl; + out << std::dec; + + out << "-----------------PQTunnelProxyInit" << std::endl; + + return out; +} + + +int PQTunnelProxyInit::out(void *dta, const int n) const +{ + //std::cerr << "PQTunnelProxyInit::out()" << std::endl; + if (n < PQTunnelProxyInit::getSize()) + { + std::cerr << "PQTunnelProxyInit::out() Failed 1" << std::endl; + return -1; + } + + if (PQTunnelInit::getSize() != PQTunnelInit::out(dta, n)) + { + std::cerr << "PQTunnelProxyInit::out() Failed 2" << std::endl; + return -1; + } + + + char *ptr = (char *) dta; + ptr += PQTunnelInit::getSize(); + + memcpy(ptr, &seq, 4); + ptr += 4; + memcpy(ptr, &mode, 4); + ptr += 4; + memcpy(ptr, src.data, CERTSIGNLEN); + ptr += CERTSIGNLEN; + memcpy(ptr, proxy.data, CERTSIGNLEN); + ptr += CERTSIGNLEN; + memcpy(ptr, dest.data, CERTSIGNLEN); + ptr += CERTSIGNLEN; + + memcpy(ptr, challenge, PQI_PROXY_CHALLENGE_SIZE); + ptr += PQI_PROXY_CHALLENGE_SIZE; + + memcpy(ptr, sign, PQI_TUNNEL_SIGN_SIZE); + ptr += PQI_TUNNEL_SIGN_SIZE; + + return PQTunnelProxyInit::getSize(); +} + + +int PQTunnelProxyInit::in(const void *dta, const int n) +{ + //std::cerr << "PQTunnelProxyInit::in()" << std::endl; + + if ((dta == NULL) || (n < PQTunnelProxyInit::getSize())) + { + std::cerr << "PQTunnelProxyInit::in() Failed 1" << std::endl; + + return -1; + } + + if (PQTunnelInit::getSize() != PQTunnelInit::in(dta, n)) + { + std::cerr << "PQTunnelProxyInit::in() Failed 2" << std::endl; + return -1; + } + + char *ptr = (char *) dta; + ptr += PQTunnelInit::getSize(); + + memcpy(&seq, ptr, 4); + ptr += 4; + memcpy(&mode, ptr, 4); + ptr += 4; + memcpy(src.data, ptr, CERTSIGNLEN); + ptr += CERTSIGNLEN; + memcpy(proxy.data, ptr, CERTSIGNLEN); + ptr += CERTSIGNLEN; + memcpy(dest.data, ptr, CERTSIGNLEN); + ptr += CERTSIGNLEN; + + memcpy(challenge, ptr, PQI_PROXY_CHALLENGE_SIZE); + ptr += PQI_PROXY_CHALLENGE_SIZE; + + memcpy(sign, ptr, PQI_TUNNEL_SIGN_SIZE); + ptr += PQI_TUNNEL_SIGN_SIZE; + + return PQTunnelProxyInit::getSize(); +} + + + +const int PQTunnelProxyInit::getSize() const +{ + //std::cerr << "PQTunnelProxyInit::getSize()" << std::endl; + + return PQTunnelInit::getSize() + + 2 * sizeof(long) + + 3 * CERTSIGNLEN + + PQI_PROXY_CHALLENGE_SIZE + + PQI_TUNNEL_SIGN_SIZE; +} + diff --git a/libretroshare/src/pqi/pqitunnelproxy.h b/libretroshare/src/pqi/pqitunnelproxy.h new file mode 100644 index 000000000..05a650a48 --- /dev/null +++ b/libretroshare/src/pqi/pqitunnelproxy.h @@ -0,0 +1,120 @@ +/* + * "$Id: pqitunnelproxy.h,v 1.3 2007-02-18 21:46:50 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + +#ifndef PQI_TUNNEL_PROXY_HEADER +#define PQI_TUNNEL_PROXY_HEADER + +#include "pqi/pqitunnel.h" + +#define PQI_TUNNEL_PROXY_TYPE 0x0024 + +#define PQI_TUNNEL_SIGN_SIZE 256 +#define PQI_TUNNEL_SHRT_SIGN_SIZE 16 +#define PQI_PROXY_CHALLENGE_SIZE 1024 + +// mode types... +#define PQI_TI_REQUEST 0x01 +#define PQI_TI_CONNECT 0x02 +#define PQI_TI_END 0x03 + +PQTunnel *createPQTunnelProxy(void *d, int n); +PQTunnelInit *createPQTunnelProxyInit(void *d, int n); +// defined at the end of header. + +class PQTunnelProxyInit: public PQTunnelInit +{ + // private copy constructor... prevent copying... + PQTunnelProxyInit(const PQTunnelProxyInit &) + :PQTunnelInit(PQI_TUNNEL_PROXY_TYPE) + {return; } + +public: + PQTunnelProxyInit(); +virtual ~PQTunnelProxyInit(); + + // copy functions. +virtual PQTunnelProxyInit *clone(); +void copy(const PQTunnelProxyInit *src); + + // These are overloaded from PQTunnelInit. +virtual const int getSize() const; +virtual int out(void *data, const int size) const; // write +virtual int in(const void *data, const int size); // read, + +std::ostream &print(std::ostream &out); + + long seq; + + int mode; + + // source + certsign src; + certsign proxy; + certsign dest; + + unsigned char challenge[PQI_PROXY_CHALLENGE_SIZE]; + unsigned char sign[PQI_TUNNEL_SIGN_SIZE]; + +}; + +// Data Via Proxy. + +class PQTunnelProxy: public PQTunnel +{ + // private copy constructor... prevent copying... + PQTunnelProxy(const PQTunnelProxy &) + :PQTunnel(PQI_TUNNEL_PROXY_TYPE) + {return; } + +public: + PQTunnelProxy(); +virtual ~PQTunnelProxy(); + + // copy functions. +virtual PQTunnelProxy *clone(); +void copy(const PQTunnelProxy *src); + +virtual const int getSize() const; +virtual int out(void *data, const int size) const; // write +virtual int in(const void *data, const int size); // read, + +std::ostream &print(std::ostream &out); + +//private: + // full redefinition of the data space. + + long seq; + + certsign src, dest; + + int size; + void *data; + + unsigned char sign[PQI_TUNNEL_SIGN_SIZE]; +}; + +#endif // PQI_TUNNEL_HEADER diff --git a/libretroshare/src/pqi/pqitunnelproxyudp.cc b/libretroshare/src/pqi/pqitunnelproxyudp.cc new file mode 100644 index 000000000..1a21bfabd --- /dev/null +++ b/libretroshare/src/pqi/pqitunnelproxyudp.cc @@ -0,0 +1,162 @@ +/* + * "$Id: pqitunnelproxyudp.cc,v 1.3 2007-02-18 21:46:50 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "pqi/pqitunnelproxyudp.h" + +PQProxyUdp::PQProxyUdp() + :type(0), ksize(0), key(NULL), connectMode(0) + { + return; + } + +PQProxyUdp::PQProxyUdp(void *data, int n) + :ksize(0), key(NULL), connectMode(0) + { + in(data, n); + } + + // construct from info. +PQProxyUdp::PQProxyUdp(struct sockaddr_in *proxyaddr, void *ikey, int n) + :type(PQI_TPUDP_TYPE_1), paddr(*proxyaddr), ksize(n), key(NULL), + connectMode(0) + + { + key = malloc(ksize); + memcpy(key, ikey, ksize); + } + +PQProxyUdp::PQProxyUdp(struct sockaddr_in *neighaddr, + struct sockaddr_in *peeraddr, int cMode) + :type(PQI_TPUDP_TYPE_2), + naddr(*neighaddr), + paddr(*peeraddr), + ksize(0), key(NULL), connectMode(cMode) + { + return; + } + +PQProxyUdp::~PQProxyUdp() +{ + if (key) + { + ksize = 0; + free(key); + } +} + +const int PQProxyUdp::getSize() const +{ + return sizeof(int) + 2 * sizeof(struct sockaddr_in) + + sizeof(int) + ksize; +} + +int PQProxyUdp::out(void *dta, const int n) const // write +{ + if (n < getSize()) + return -1; + + char *loc = (char *) dta; // so we can count bytes + int cs = sizeof(int); + memcpy(loc, &type, cs); + loc += cs; + cs = sizeof(struct sockaddr_in); + memcpy(loc, &naddr, cs); + loc += cs; + memcpy(loc, &paddr, cs); + loc += cs; + + /* add in ConnectMode */ + cs = sizeof(int); + memcpy(loc, &connectMode, cs); + loc += cs; + + if (ksize) + { + memcpy(loc, key, ksize); + } + loc += ksize; + + return getSize(); +} + +int PQProxyUdp::in(const void *dta, const int n) // read, +{ + if (key) + { + ksize = 0; + free(key); + key = NULL; + } + + if (n < getSize()) /* smaller than min ksize */ + { + std::cerr << "PQTunnelProxy::in() Failed (n < getSize())" << std::endl; + return -1; + } + + char *loc = (char *) dta; + int cs = sizeof(int); + memcpy(&type, loc, cs); + loc += cs; + cs = sizeof(struct sockaddr_in); + memcpy(&naddr, loc, cs); + loc += cs; + memcpy(&paddr, loc, cs); + loc += cs; + + /* get in ConnectMode */ + cs = sizeof(int); + memcpy(&connectMode,loc, cs); + loc += cs; + + ksize = 0; + ksize = n - getSize(); + if (ksize) + { + key = malloc(ksize); + memcpy(key, loc, ksize); + } + return getSize(); /* should be equal to n */ +} + + +std::ostream &PQProxyUdp::print(std::ostream &out) +{ + out << "-------- PQProxyUdp" << std::endl; + out << "Type: " << type << std::endl; + out << "naddr: " << inet_ntoa(naddr.sin_addr) << ":"; + out << ntohs(naddr.sin_port) << std::endl; + out << "paddr: " << inet_ntoa(paddr.sin_addr) << ":"; + out << ntohs(paddr.sin_port) << std::endl; + out << "ConnectMode: " << connectMode << std::endl; + out << "KeySize: " << ksize << std::endl; + return out << "-------- PQProxyUdp" << std::endl; +} + + diff --git a/libretroshare/src/pqi/pqitunnelproxyudp.h b/libretroshare/src/pqi/pqitunnelproxyudp.h new file mode 100644 index 000000000..09ba238b3 --- /dev/null +++ b/libretroshare/src/pqi/pqitunnelproxyudp.h @@ -0,0 +1,65 @@ +/* + * "$Id: pqitunnelproxyudp.h,v 1.3 2007-02-18 21:46:50 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + +#ifndef PQI_TUNNEL_PROXY_UDP_HEADER +#define PQI_TUNNEL_PROXY_UDP_HEADER + +#include "pqi/pqitunnel.h" + +#define PQI_TPUDP_TYPE_1 0x0001 +#define PQI_TPUDP_TYPE_2 0x0002 + +class PQProxyUdp +{ +public: + // construct from data. + PQProxyUdp(void *data, int size); + PQProxyUdp(); + + // construct from info. + PQProxyUdp(struct sockaddr_in *proxyaddr, void *key, int size); + PQProxyUdp(struct sockaddr_in *neighaddr, + struct sockaddr_in *peeraddr, int cMode); + +virtual ~PQProxyUdp(); + + // no copy functions. + +virtual const int getSize() const; +virtual int out(void *data, const int size) const; // write +virtual int in(const void *data, const int size); // read, + +std::ostream &print(std::ostream &out); + + int type; + struct sockaddr_in naddr, paddr; + int ksize; + void *key; + int connectMode; +}; + +#endif // PQI_TUNNEL_PROXY_UDP_HEADER diff --git a/libretroshare/src/pqi/pqitunneltst.cc b/libretroshare/src/pqi/pqitunneltst.cc new file mode 100644 index 000000000..f73cb5435 --- /dev/null +++ b/libretroshare/src/pqi/pqitunneltst.cc @@ -0,0 +1,36 @@ +/* + * "$Id: pqitunneltst.cc,v 1.3 2007-02-18 21:46:50 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "pqi/pqitunneltst.h" + +PQTunnel *createPQTStst(void *d, int n) +{ + return new PQTunnelTst(); +} + + diff --git a/libretroshare/src/pqi/pqitunneltst.h b/libretroshare/src/pqi/pqitunneltst.h new file mode 100644 index 000000000..e53b928b1 --- /dev/null +++ b/libretroshare/src/pqi/pqitunneltst.h @@ -0,0 +1,146 @@ +/* + * "$Id: pqitunneltst.h,v 1.4 2007-02-18 21:46:50 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + +#ifndef PQI_TUNNEL_TST_HEADER +#define PQI_TUNNEL_TST_HEADER + +#include "pqi/pqitunnel.h" + +#define PQI_TUNNEL_TST_TYPE 0x0265 + + +#define pqitunnelzone 71849 +#include "pqi/pqidebug.h" +#include + + +PQTunnel *createPQTStst(void *d, int n); + + +class PQTunnelTst: public PQTunnel +{ +public: + PQTunnelTst() + :PQTunnel(PQI_TUNNEL_TST_TYPE) + { + pqioutput(PQL_DEBUG_BASIC, pqitunnelzone, + "PQTunnelTst::PQTunnelTst()"); + return; + } + +virtual ~PQTunnelTst() +{ + pqioutput(PQL_DEBUG_BASIC, pqitunnelzone, + "PQTunnelTst::~PQTunnelTst()"); + return; +} + +virtual PQTunnelTst *clone() +{ + PQTunnelTst *pqt = new PQTunnelTst(); + // getData() no longer exists. + //pqt -> in(getData(), getSize()); + return pqt; +} + + +virtual std::ostream &print(std::ostream &out) +{ + out << "----------------" << std::endl; + out << "PQTunnelTst" << std::endl; + // getData() no longer exists. + // out << "Msg:" << (char *) getData() << std::endl; + PQTunnel::print(out); + out << "----------------" << std::endl; + return out; +} + +}; + + +class PQTStst: public PQTunnelService +{ +public: + PQTStst() :PQTunnelService(PQI_TUNNEL_TST_TYPE) + { + pqioutput(PQL_DEBUG_BASIC, pqitunnelzone, + "PQTStst::PQTStst()"); + + ts = time(NULL); + return; + } + +int receive(PQTunnel *item) +{ + pqioutput(PQL_DEBUG_BASIC, pqitunnelzone, + "PQTStst::receive()"); + + PQTunnelTst *tst = (PQTunnelTst *) item; + std::cerr << "PQTStst::receive()...." << std::endl; + tst -> print(std::cerr); + delete item; + return 1; +} + +PQTunnel *send() +{ + if (time(NULL) - ts > 100.0 * rand()/(RAND_MAX + 1.0) ) + { + pqioutput(PQL_DEBUG_BASIC, pqitunnelzone, + "PQTStst::send() Sending Test Packet!"); + // make an item. + PQTunnelTst *tst = new PQTunnelTst(); + std::string msg = "Hello"; + tst -> in(msg.c_str(), msg.length()); + ts = time(NULL); + return tst; + } + return NULL; +} + +int receive(PQTunnelInit *item) +{ + pqioutput(PQL_DEBUG_BASIC, pqitunnelzone, + "PQTStst::receive() Cleaning PQTunnelInit"); + delete item; + return 1; +} + +PQTunnelInit *sendInit() +{ + pqioutput(PQL_DEBUG_BASIC, pqitunnelzone, + "PQTStst::sendInit() returning NULL"); + return NULL; +} + + private: + long ts; +}; + + + +#endif // PQI_TUNNEL_TST_HEADER diff --git a/libretroshare/src/pqi/pqiudpproxy.cc b/libretroshare/src/pqi/pqiudpproxy.cc new file mode 100644 index 000000000..593c7c361 --- /dev/null +++ b/libretroshare/src/pqi/pqiudpproxy.cc @@ -0,0 +1,859 @@ +/* + * "$Id: pqiudpproxy.cc,v 1.7 2007-02-18 21:46:50 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "pqi/pqiudpproxy.h" +#include "pqi/pqitunnelproxyudp.h" +#include "pqi/pqissludp.h" +#include "pqi/p3disc.h" + +#include +#include "pqi/pqidebug.h" + +#include "tcponudp/tou.h" + +const int pqiudpproxyzone = 6846; + +class udpAddrPair +{ +public: + udpAddrPair(cert *n1, cert *n2, int fd); + ~udpAddrPair(); + + int match(cert *src, cert *peer, struct sockaddr_in &addr); + bool bothMatched(); + + cert *cert1, *cert2; + int m1count, m2count; + bool matched1, matched2; + struct sockaddr_in addr1, addr2; + char *key1, *key2; + int keysize1, keysize2; + int sockfd; +}; + + +udpAddrPair:: udpAddrPair(cert *n1, cert *n2, int fd) + :cert1(n1), cert2(n2), + matched1(false), matched2(false), + key1(NULL), key2(NULL), + keysize1(0), keysize2(0), sockfd(fd) +{ + + /* choose a random number 20 - 100 */ + keysize1 = 20 + (int) (80.0 * (rand() / (RAND_MAX + 1.0))); + keysize2 = 20 + (int) (80.0 * (rand() / (RAND_MAX + 1.0))); + int i; + + /* generate keys */ + key1 = (char *) malloc(keysize1); + key2 = (char *) malloc(keysize2); + for(i = 0; i < keysize1; i++) + { + key1[i] = (char) (256.0 * (rand() / (RAND_MAX + 1.0))); + } + for(i = 0; i < keysize2; i++) + { + key2[i] = (char) (256.0 * (rand() / (RAND_MAX + 1.0))); + } + /* done! */ +} + +udpAddrPair::~udpAddrPair() +{ + free(key1); + free(key2); +} + +int udpAddrPair::match(cert *src, cert *peer, struct sockaddr_in &addr) +{ + if ((src == cert1) && (peer == cert2)) + { + /* matched 1 */ + matched1 = true; + m1count++; + addr1 = addr; + + std::ostringstream out; + out << "udpAddrPair::match() Matched Cert 1" << std::endl; + out << "FROM: " << inet_ntoa(addr.sin_addr) << ":"; + out << ntohs(addr.sin_port) << " count: " << m1count; + pqioutput(PQL_DEBUG_BASIC, pqiudpproxyzone, out.str()); + return true; + + } + + if ((src == cert2) && (peer == cert1 )) + { + matched2 = true; + m2count++; + addr2 = addr; + + std::ostringstream out; + out << "udpAddrPair::match() Matched Key 2" << std::endl; + out << "FROM: " << inet_ntoa(addr.sin_addr) << ":"; + out << ntohs(addr.sin_port) << " count: " << m1count; + pqioutput(PQL_DEBUG_BASIC, pqiudpproxyzone, out.str()); + return true; + } + + pqioutput(PQL_DEBUG_ALL, pqiudpproxyzone, "not matched"); + return false; +} + +bool udpAddrPair::bothMatched() +{ + return (matched1 && matched2); +} + + + p3udpproxy::p3udpproxy(p3disc *p) + :p3proxy(p) +{ + /* if we have a udp_server, + * setup a listener. + */ + + /* check that the sslcert flags are good. */ + //if ((sslcert->isFirewalled() && sslcert->isForwarded() || + // (!(sslcert->isFirewalled()))) + { + /* then check address */ + /* attempt to setup a udp port to listen... + */ + struct sockaddr_in *addr = &(getSSLRoot()->getOwnCert()->localaddr); + { + std::ostringstream out; + out << "p3udpproxy::p3udpproxy()"; + out << " Creating a UDP Listening port:"; + out << inet_ntoa(addr->sin_addr) << ":" << ntohs(addr->sin_port); + pqioutput(PQL_DEBUG_BASIC, pqiudpproxyzone, out.str()); + } + + int sockfd = tou_socket(0,0,0); + tou_bind(sockfd, (struct sockaddr *) addr, + sizeof(struct sockaddr_in)); + + tou_listen(sockfd, 1); + tou_extaddr(sockfd, (struct sockaddr *) addr, + sizeof(struct sockaddr_in)); + } + + return; +} + +p3udpproxy::~p3udpproxy() +{ + /* should clean up! */ + return; +} + + +// PQTunnelService Overloading. +// +// Major overloaded function. +// +// The receive function now has two distinct roles. +// 1) Proxy role: receive Ext Addresses (in an established connection) +// -> when multiple recieved, return address pair to initiate +// -> transaction. +// +// The generic (p3proxy) recieve should split the +// packet depending on if we are proxy, or end destination. +// +// expects to recieve +// 1) if we are the proxy ... add address to the +// waiting pairs. +// +// if have both -> respond. +// +// 2) if receive as destination, and they've +// sent the addr pair, then we can +// commence the connection. + + + /* only two types of packets are expected over the + * proxy connection...... + * 1) ProxyAddress + Key. + * 2) discovered addresses. + * + * This information comes from the Proxy for us. + * and is encapsulated in a PQProxyUdp packet. + */ + +int p3udpproxy::receiveAsProxy(PQTunnelProxy* pqtp, cert *src, cert *dest) +{ + /* if connected (checked already!) */ + { + std::ostringstream out; + out << "p3udpproxy::receiveAsProxy()"; + out << " Received PQTunnel Packet! - Yet to do anything!" << std::endl; + pqtp -> print(out); + pqioutput(PQL_DEBUG_BASIC, pqiudpproxyzone, out.str()); + } + + /* add to waiting */ + PQProxyUdp udppkt; + if (pqtp->size != udppkt.in(pqtp->data, pqtp->size)) + { + delete pqtp; + pqioutput(PQL_WARNING, pqiudpproxyzone, + "PQTunnel is Not a PQProxyUdp Pkt...Deleting"); + return -1; + } + + if ((cert *) pqtp->p != src) + { + // error + std::ostringstream out; + out << "p3udpproxy::receiveAsProxy() ERROR pqtp->p != src"; + pqioutput(PQL_ALERT, pqiudpproxyzone, out.str()); + return -1; + } + + // order very important.... packet from src, for connection to dest!. + checkUdpPacket(&udppkt, src, dest); + + /* cleanup */ + delete pqtp; + return 1; +} + +int p3udpproxy::receiveAsError(PQTunnelProxy* pqtp, cert *src, cert *from, cert *dest) +{ + /* don't do much */ + return 1; +} + +int p3udpproxy::receiveAsDestination(PQTunnelProxy* pqtp, cert *src, cert *from, cert *dest, pqiproxy *pqip) + + +{ + { + std::ostringstream out; + out << "p3udpproxy::receiveAsDestination("; + out << src -> Name(); + out << " -> " << from -> Name(); + out << " -> " << dest -> Name() << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqiudpproxyzone, out.str()); + } + + PQProxyUdp udppkt; + if (pqtp->size != udppkt.in(pqtp->data, pqtp->size)) + { + delete pqtp; + pqioutput(PQL_WARNING, pqiudpproxyzone, + "PQTunnel is Not a PQProxyUdp Pkt...Deleting"); + return -1; + } + + // inform the pqiudpproxy + pqiudpproxy *udpproxy = dynamic_cast(pqip); + if (udpproxy == NULL) + { + std::ostringstream out; + out << "pqiproxy -> NOT a pqiudpproxy....Trouble"; + pqioutput(PQL_WARNING, pqiudpproxyzone, out.str()); + + // mismatch reject. + delete pqtp; + return -1; + } + + if (udppkt.type != PQI_TPUDP_TYPE_2) + { + pqioutput(PQL_DEBUG_BASIC, pqiudpproxyzone, + "Unknown Proxy Packet"); + delete pqtp; + return -1; + } + + + pqioutput(PQL_DEBUG_BASIC, pqiudpproxyzone, + "Packet -> Discovered Address"); + udpproxy->discoveredaddresses(&(udppkt.naddr), &(udppkt.paddr), + udppkt.connectMode); + + /* we have now completed that proxy connection. + * shut it down + */ + + delete pqtp; + return 1; +} + +/* This is called by the pqiudpproxy, when an address should + * be transmitted..... + */ + +int p3udpproxy::sendExternalAddress(pqiudpproxy *pqip, + struct sockaddr_in &ext_addr) +{ + // first find the certs. + cert *dest = pqip -> getContact(); + cert *own = sroot -> getOwnCert(); + + std::map::iterator it; + it = connectionmap.find(dest); + /* check certs for basic safety */ + if (it == connectionmap.end()) + { + /* cannot */ + return -1; + } + cert *prxy = it -> second; + + std::ostringstream out; + out << "p3udpproxy::sendExternalAddress():"; + out << " & " << inet_ntoa(ext_addr.sin_addr); + out << ":" << ntohs(ext_addr.sin_port); + pqioutput(PQL_DEBUG_BASIC, pqiudpproxyzone, out.str()); + + PQProxyUdp *udppkt = new PQProxyUdp(&ext_addr, &ext_addr, sizeof(ext_addr)); + + /* now pack them in PQTunnelProxy pkts */ + PQTunnelProxy *tp1 = createProxyUdpPkt(dest, prxy, own, udppkt); + delete udppkt; + + /* send them off */ + outPkts.push_back(tp1); + return 1; +} + + + +int p3udpproxy::connectionCompletedAsProxy(cert *n1, cert *n2) +{ + /* As the proxy, we do nothing at the completion of the connection + * except wait for the two external addresses to be forwarded to us + * (this is handled in receiveAsProxy()). + */ + + { + std::ostringstream out; + out << "p3udpproxy::completeConnectAsProxy()"; + pqioutput(PQL_DEBUG_BASIC, pqiudpproxyzone, out.str()); + } + + /* generate keys */ + udpAddrPair *uc = new udpAddrPair(n1, n2, 1); /* sockfd - legacy = 1? */ + + /* save keys in list */ + keysWaiting.push_back(uc); + return 1; +} + + +int p3udpproxy::checkUdpPacket(PQProxyUdp *pkt, cert *src, cert *dest) +{ + { + std::ostringstream out; + out << "p3udpproxy::checkUdpPacket()"; + pqioutput(PQL_DEBUG_BASIC, pqiudpproxyzone, out.str()); + } + + /* only if we are the proxy */ + struct sockaddr_in ext_addr = pkt->paddr; + + /* the packet should just contain the key */ + std::list::iterator it; + for(it = keysWaiting.begin(); it != keysWaiting.end(); it++) + { + if ((*it) -> match(src, dest, ext_addr)) + { + std::ostringstream out; + out << "p3udpproxy::checkUdpPacket() Matched Key!"; + pqioutput(PQL_DEBUG_BASIC, pqiudpproxyzone, out.str()); + } + else + { + // only way to continue loop! + continue; + } + + if ((*it) -> bothMatched()) + { + udpAddrPair *uc = (*it); + + std::ostringstream out; + out << "p3udpproxy::checkUdpPacket() Both Keys Matched!"; + out << "p3udpproxy::checkUdpPacket() Sending addresses: "; + out << inet_ntoa(uc->addr1.sin_addr) << ":"; + out << ntohs(uc->addr1.sin_port); + out << " & " << inet_ntoa(uc->addr2.sin_addr); + out << ":" << ntohs(uc->addr2.sin_port); + pqioutput(PQL_DEBUG_BASIC, pqiudpproxyzone, out.str()); + + + /* remove packet, and send addresses to both! + * Arbitarily decide which is active (one with addr1) + */ + PQProxyUdp *p1 = new PQProxyUdp( + &(uc->addr1), &(uc->addr2), 1); + PQProxyUdp *p2 = new PQProxyUdp( + &(uc->addr2), &(uc->addr1), 0); + + + /* now pack them in PQTunnelProxy pkts */ + PQTunnelProxy *tp1 = createProxyUdpPkt(uc->cert1, NULL, uc->cert2, p1); + PQTunnelProxy *tp2 = createProxyUdpPkt(uc->cert2, NULL, uc->cert1, p2); + + delete p1; + delete p2; + + /* send them off */ + outPkts.push_back(tp1); + outPkts.push_back(tp2); + + /* remove */ + it = keysWaiting.erase(it); + + } + /* if we matched -> then good! */ + return 1; + } + + { + std::ostringstream out; + out << "p3udpproxy::checkUdpPacket() FAILED to Match Incoming UdpPkt"; + pqioutput(PQL_DEBUG_BASIC, pqiudpproxyzone, out.str()); + } + + return 0; +} + +int p3udpproxy::reset(pqiproxy *p, cert *c) +{ + { + std::ostringstream out; + out << "p3udpproxy::reset()"; + pqioutput(PQL_DEBUG_BASIC, pqiudpproxyzone, out.str()); + } + // restart. + // remove from keysWaiting ??? + return p3proxy::reset(p,c); +} + + +int p3udpproxy::outgoingpkt(pqiproxy *p, cert *c, void *d, int size) +{ + { + std::ostringstream out; + out << "p3udpproxy::outgoingpkt() For: " << c -> Name(); + pqioutput(PQL_DEBUG_BASIC, pqiudpproxyzone, out.str()); + } + /* fails in udpproxy */ + return 0; +} + + +int p3udpproxy::incomingpkt(pqiproxy *p, void *d, int maxsize) +{ + { + std::ostringstream out; + out << "p3udpproxy::incomingpkt()"; + pqioutput(PQL_DEBUG_ALL, pqiudpproxyzone, out.str()); + } + /* fails in udpproxy */ + return 0; +} + + +int p3udpproxy::status() +{ + { + std::ostringstream out; + out << "p3udpproxy::status()"; + pqioutput(PQL_DEBUG_BASIC, pqiudpproxyzone, out.str()); + } + p3proxy::status(); + return 1; +} + + +int p3udpproxy::processincoming() +{ + { + std::ostringstream out; + out << "p3udpproxy::processincoming()"; + pqioutput(PQL_DEBUG_ALL, pqiudpproxyzone, out.str()); + } + + return 1; +} + + +/* this is only called by the proxy */ +PQTunnelProxy *p3udpproxy::createProxyUdpPkt(cert *dest, cert *prxy, cert *src, PQProxyUdp *uap) +{ + PQTunnelProxy *pi = new PQTunnelProxy(); + cert *o = sroot -> getOwnCert(); + + { + std::ostringstream out; + out << "p3udpproxy::createProxyUdpPkt()" << std::endl; + out << "Dest: " << dest -> Name() << std::endl; + if (!prxy) + { + out << "Proxy: US!" << std::endl; + } + else + { + out << "Proxy: " << prxy -> Name() << std::endl; + } + out << "Src: " << src -> Name() << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqiudpproxyzone, out.str()); + } + + // Fill in Details.... + // only src = peer to fill in . + if (!sroot -> getcertsign(src, pi -> src)) + { + std::ostringstream out; + out << "p3proxy::createProxyPkt()"; + out << " Error: Failed to Get Signature 1..."; + pqioutput(PQL_DEBUG_BASIC, pqiudpproxyzone, out.str()); + + delete pi; + return NULL; + } + if (!sroot -> getcertsign(dest, pi -> dest)) + { + std::ostringstream out; + out << "p3proxy::createProxyPkt()"; + out << " Error: Failed to Get Signature 2..."; + pqioutput(PQL_DEBUG_BASIC, pqiudpproxyzone, out.str()); + + delete pi; + return NULL; + } + + // initialise packets. + pi -> sid = 0; // doesn't matter. + pi -> seq = 0; + + /* HACK HERE */ + if (prxy == NULL) /* then we are the proxy */ + { + /* send on */ + pi -> cid = dest -> cid; // destination. + pi -> p = o; // from us; + } + else + { + pi -> cid = prxy -> cid; // send to proxy. + pi -> p = o; // from us; + } + + + // ProxyInit Details. + pi -> size = uap -> getSize(); + pi -> data = malloc(pi->size); + uap->out(pi->data, pi->size); + // Sign Packet. + + return pi; +} + + +/************************ PQI PROXY *************************/ + +#define PUP_CLOSED 0 +#define PUP_WAITING_PROXY 1 +#define PUP_PROXY_CONNECT 2 +#define PUP_WAITING_DISC 3 +#define PUP_WAITING_UDP 4 +#define PUP_WAITING_SSL 5 +#define PUP_CONNECTED 6 + +pqiudpproxy::pqiudpproxy(cert *c, p3udpproxy *l, PQInterface *p) + :pqipeerproxy(c, l, p), state(PUP_CLOSED) +{ + { + std::ostringstream out; + out << "pqiudpproxy::pqiudpproxy()"; + pqioutput(PQL_DEBUG_BASIC, pqiudpproxyzone, out.str()); + } + + return; +} + +pqiudpproxy::~pqiudpproxy() +{ + { + std::ostringstream out; + out << "pqiudpproxy::~pqiudpproxy()"; + //pqioutput(PQL_DEBUG_BASIC, pqiudpproxyzone, out.str()); + pqioutput(PQL_ALERT, pqiudpproxyzone, out.str()); + } + state = PUP_CLOSED; + return; +} + + // pqiconnect Interface. +int pqiudpproxy::connectattempt() // as pqiproxy/ +{ + { + std::ostringstream out; + out << "pqiudpproxy::connectattempt()"; + pqioutput(PQL_DEBUG_BASIC, pqiudpproxyzone, out.str()); + } + state = PUP_WAITING_PROXY; + return pqipeerproxy::connectattempt(); +} + + +int pqiudpproxy::listen() +{ + { + std::ostringstream out; + out << "pqiudpproxy::listen()"; + pqioutput(PQL_DEBUG_BASIC, pqiudpproxyzone, out.str()); + } + state = PUP_WAITING_PROXY; + return pqipeerproxy::listen(); +} + + +int pqiudpproxy::stoplistening() +{ + //state = PUP_WAITING_PROXY; + return pqipeerproxy::stoplistening(); +} + +int pqiudpproxy::disconnected() +{ + pqipeerproxy::disconnected(); + state = PUP_CLOSED; + reset(); + return 1; +} + +/* pqiproxy interface */ +int pqiudpproxy::connected(bool act) +{ + { + std::ostringstream out; + out << "pqiudpproxy::connected() - Set State!"; + pqioutput(PQL_DEBUG_BASIC, pqiudpproxyzone, out.str()); + } + state = PUP_PROXY_CONNECT; + return pqipeerproxy::connected(act); +} + +// called by the p3udpproxy .... means attempt failed.... +int pqiudpproxy::disconnect() +{ + { + std::ostringstream out; + out << "pqiudpproxy::disconnect()"; + pqioutput(PQL_DEBUG_BASIC, pqiudpproxyzone, out.str()); + } + /* if we haven't got remote address yet! */ + if (state < PUP_WAITING_SSL) + { + disconnected(); + } + /* else is okay */ + return 1; +} + + +int pqiudpproxy::reset() +{ + { + std::ostringstream out; + out << "pqiudpproxy::reset()"; + pqioutput(PQL_DEBUG_BASIC, pqiudpproxyzone, out.str()); + } + pqipeerproxy::reset(); + state = PUP_CLOSED; + return 1; +} + + + + // Overloaded from PQInterface +int pqiudpproxy::status() +{ + { + std::ostringstream out; + out << "pqiudpproxy::status() state = " << state; + pqioutput(PQL_DEBUG_BASIC, pqiudpproxyzone, out.str()); + } + pqipeerproxy::status(); + return 1; +} + + + +int pqiudpproxy::tick() +{ + { + std::ostringstream out; + out << "pqiudpproxy::tick()"; + pqioutput(PQL_DEBUG_ALL, pqiudpproxyzone, out.str()); + } + + if (state == PUP_CLOSED) /* silent state */ + { + + } + else if (state == PUP_WAITING_PROXY) /* just started connection */ + { + //state = PUP_WAITING_DISC; + } + else if (state == PUP_PROXY_CONNECT) + { + //state = PUP_WAITING_DISC; + } + else if (state == PUP_WAITING_DISC) + { + //state = PUP_WAITING_DISC; + } + else if (state == PUP_WAITING_SSL) + { + + } + + pqipeerproxy::tick(); + return 1; +} + +int pqiudpproxy::notifyEvent(int type) +{ + { + std::ostringstream out; + out << "pqiudpproxy::notifyEvent(" << type << ")"; + pqioutput(PQL_DEBUG_BASIC, pqiudpproxyzone, out.str()); + } + return pqipeerproxy::notifyEvent(type); +} + + +int p3udpproxy::requestStunServer(struct sockaddr_in &addr) +{ + if (potentials.size() == 0) + { + potentials = p3d -> requestStunServers(); + } + + if (potentials.size() > 0) + { + /* pop the first one off and return it */ + addr = potentials.front(); + potentials.pop_front(); + return 1; + } + + return 0; +} + +/* The pqissludp interface is below, in order of execution + */ + +bool pqiudpproxy::isConnected(int &mode) +{ + if (isactive()) + { + mode = connect_mode; + return true; + } + return false; +} + + +bool pqiudpproxy::hasFailed() +{ + return (state == PUP_CLOSED); +} + +int pqiudpproxy::requestStunServer(struct sockaddr_in &addr) +{ + return ((p3udpproxy *) p3p) -> requestStunServer(addr); +} + + // notification from pqissludp. +bool pqiudpproxy::sendExternalAddress(struct sockaddr_in &ext_addr) +{ + return ((p3udpproxy *) p3p) -> + sendExternalAddress(this, ext_addr); +} + +// +int pqiudpproxy::discoveredaddresses(struct sockaddr_in *our_addr, + struct sockaddr_in *peer, int cMode) +{ + /* we have our own address!, and peers address */ + { + std::ostringstream out; + out << "pqiudpproxy::discoveredaddresses() Connect"; + out << std::endl; + out << "Our Address: " << inet_ntoa(our_addr->sin_addr) << ":"; + out << ntohs(our_addr->sin_port); + out << std::endl; + out << " Peers Address: " << inet_ntoa(peer->sin_addr) << ":"; + out << ntohs(peer->sin_port); + + pqioutput(PQL_ALERT, pqiudpproxyzone, out.str()); + } + + remote_addr = *peer; + if (cMode) + { + connectMode = 1; /* active */ + } + else + { + connectMode = 0; /* passive */ + } + state = PUP_WAITING_UDP; + + // shutdown the proxy Connection. + // by calling the pqipeerproxy::reset(). + pqipeerproxy::reset(); + + pqioutput(PQL_ALERT, pqiudpproxyzone, + "sent pqipeerproxy::reset() should shutdown proxy connect"); + return 1; +} + + // poll by pqissludp for state completion. +bool pqiudpproxy::gotRemoteAddress(struct sockaddr_in &raddr, int &cMode) +{ + if (state == PUP_WAITING_UDP) + { + raddr = remote_addr; + cMode = connectMode; + return true; + } + return false; +} + + + diff --git a/libretroshare/src/pqi/pqiudpproxy.h b/libretroshare/src/pqi/pqiudpproxy.h new file mode 100644 index 000000000..5c3e66cef --- /dev/null +++ b/libretroshare/src/pqi/pqiudpproxy.h @@ -0,0 +1,287 @@ +/* + * "$Id: pqiudpproxy.h,v 1.6 2007-02-18 21:46:50 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + +#ifndef MRK_PQI_UDP_PROXY_HEADER +#define MRK_PQI_UDP_PROXY_HEADER + + +#include + + +#include +#include +#include + +#include "pqi/pqiproxy.h" + +class pqiudpproxy; +class udpAddrPair; +class pqissludp; +class PQProxyUdp; + +class p3udpproxy: public p3proxy +{ + public: + p3udpproxy(p3disc *p); +virtual ~p3udpproxy(); + + // New udp functions. + // this first one will be called from + // inside p3proxy, at the appropriate time. + int checkUdpPacket(PQProxyUdp *, cert *src, cert *peer); + + + // PQTunnelService Overloading. (none) + // Overloaded from p3proxy. + // receive now plays role of + // collecting address packets. + + // interface to pqiproxy. +//int attach(pqiproxy *p, cert *c); +//int detach(pqiproxy *p, cert *c); + +//int listen(pqiproxy *p, cert *c); +//int stoplistening(pqiproxy *p, cert *c); + +int reset(pqiproxy *p, cert *c); + +virtual int outgoingpkt(pqiproxy *p, cert *, void *d, int size); +virtual int incomingpkt(pqiproxy *p, void *d, int maxsize); + +int requestStunServer(struct sockaddr_in &addr); +int sendExternalAddress(pqiudpproxy *pqip, + struct sockaddr_in &ext_addr); + + +// overloaded from many sources. +//virtual int tick(); + +int status(); + +//int connectattempt(pqiproxy*, cert*); +//int connectattempt(); +//int nextconnectattempt(cert *, cert *); + + protected: /* interface not clean enough for private */ + + // overload connection Completion. +virtual int connectionCompletedAsProxy(cert*, cert*); +//virtual int connectionCompletedAsPeer(cert*, cert*); + + // overload receiving Tunnel Data. +virtual int receiveAsProxy(PQTunnelProxy *pqtp, cert *src, cert *dest); +virtual int receiveAsDestination(PQTunnelProxy *pqtp, + cert *src, cert *from, cert *dest, pqiproxy *pqip); +virtual int receiveAsError(PQTunnelProxy *pqtp, cert *src, cert *from, cert *dest); + +virtual int processincoming(); + + + PQTunnelProxy *createProxyUdpPkt(cert *dest, cert *prxy, cert *src, PQProxyUdp *uap); + + std::list keysWaiting; + std::list potentials; // stun addresses. +}; + + +// pqiconnect, derives from pqistreamer/PQInterface. +// +// pqiproxy provide. +// 1) read/write data. +// 2) connect functions. +// +// pqiudpproxy provides the +// linking, and redirects +// the sending the udpssl layer below. +// +// small extensions to the pqiproxy interface +// are required. + +class pqiudpproxy: public pqipeerproxy +{ +public: + pqiudpproxy(cert *c, p3udpproxy *l, PQInterface *parent); +virtual ~pqiudpproxy(); + + // Net Interface. +virtual int connectattempt(); +virtual int listen(); +virtual int stoplistening(); +virtual int reset(); +virtual int disconnect(); + +// PQInterface +virtual int tick(); +virtual int status(); + + // Bin Interface disabled. +virtual int senddata(void*, int) { return 0; } +virtual int readdata(void*, int) { return 0; } +virtual int netstatus() { return 0; } +//virtual int isactive(); -> same as peer. +virtual bool moretoread() { return false; } + + // The interface to p3proxy. +virtual int notifyEvent(int type); + // unneeded notification. + + // notification from p3proxy. +virtual int connected(bool active); +virtual int disconnected(); + + // Below is the pqissludp interface to us. + // in order of execution..... + + // poll by pqissludp for state completion. +bool isConnected(int &mode); +bool hasFailed(); + + // requests from pqissludp layer. +int requestStunServer(struct sockaddr_in &addr); + // notification from pqissludp. +bool sendExternalAddress(struct sockaddr_in &ext_addr); + + // notification of external address exchange! +virtual int discoveredaddresses(struct sockaddr_in *our_addr, + struct sockaddr_in *peer, int cMode); + + // poll by pqissludp for state completion. +bool gotRemoteAddress(struct sockaddr_in &remote_addr, int &cMode); + +private: + int state; + struct sockaddr_in ext_addr; + struct sockaddr_in remote_addr; + int connectMode; /* sent with the remote addresses */ +}; + +/* Documenting the virtual (proxy) pqi interface. + * + * This is used to create proxy interface + * for people behind firewalls. + * + * P1 PROXY P2 + * requests a + * proxy interface. + * ---------> + * end attempt <----- IF Not + * Available. + * + * else ---------------> Check for proxy/person auth + * end attempt <------ cancel ------- If Not Auth. + * + * else, if allowed. + * build proxy server. + * Build proxy <------ setup ---------- send okay + * server connection. + * + * Determine Local + * External Addr + * Determine Local + * External Addr + * + * send ext addr -------> + * collect addresses. + * <---------- send ext addr -------> + * complete proxy part. + * <-------- send addresses -------> + * + * + * Initiate Udp Connection. --------------------> Initiate Udp Connection. + * <-------------------------------- + * + * + * So the initial stuff is the same..... + * but there is no pipe at the end + * just the exchange of addresses. + * + * there is a udp listener on the same address + * as the ssllistener (just udp). This port + * will be used by the stunServer, and will supply + * external addresses to clients that request them. + * + * + * Order of udp connection: + * (1) establish a proxy connection. + * (2) determine external address. + * (3) send external address to proxy. + * (4) recieve address pair + * (5) initiate a udp connection. + * + * Each udpproxy must stun to get their connection addr. + * this might end up with lots of stuns? + * does that matter? + * + * pqissl. + * -> proxy interface. + * Send() + * return proxymsg locally + * pulled by proxy server. + * + * ps -> send proxy msg + * to correct pqissl. + * ----------> popped out to + * the proxy server. + * if file cache. + * redirect ------> recieved by pqissl. + * pulled by proxy server. + * + * proxy server + * + * all proxied information is + * going to be signed/or encrypted. + * + * very simple - that is the only + * necessary change. + * + * proxy msg. + * --------------------- + * type : init + * end + * msg (signed) + * tunnelled (includes init of ssl.) + * dest cert signature: + * + * encryption/signature mode. + * + * signature len: + * signature: + * + * data len: + * data + * + * + * + * + * + * is this the right place to add it? + * or is pqistreamer the answer. + * + */ + +#endif + diff --git a/libretroshare/src/pqi/sslcert.cc b/libretroshare/src/pqi/sslcert.cc new file mode 100644 index 000000000..2c2db8bae --- /dev/null +++ b/libretroshare/src/pqi/sslcert.cc @@ -0,0 +1,2031 @@ +/* + * Core PQI networking: sslcert.cc + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "sslcert.h" + +#include "pqi.h" +#include "pqinetwork.h" + +#include +#include +#include + +#include +#include + +#include "pqidebug.h" + +const int pqisslrootzone = 1211; + + +// other fns +std::string getCertName(cert *c) +{ + std::string name = c -> certificate -> name; + // strip out bad chars. + for(int i = 0; i < (signed) name.length(); i++) + { + if ((name[i] == '/') || (name[i] == ' ') || (name[i] == '=') || + (name[i] == '\\') || (name[i] == '\t') || (name[i] == '\n')) + { + name[i] = '_'; + } + } + return name; +} + + + +int pem_passwd_cb(char *buf, int size, int rwflag, void *password) +{ + strncpy(buf, (char *)(password), size); + buf[size - 1] = '\0'; + return(strlen(buf)); +} + + +/* This class handles openssl library init/destruct. + * only one of these... handles + * the CTX and setup? + * + * it will also handle the certificates..... + * mantaining a library of recieved certs, + * and ip addresses that the connections come from... + * + */ + +// the single instance of this. +static sslroot instance_sslroot; + +sslroot *getSSLRoot() +{ + return &instance_sslroot; +} + +sslroot::sslroot() + :sslctx(NULL), init(0), certsChanged(1), + certsMajorChanged(1), pkey(NULL) +{ +} + +int sslroot::active() +{ + return init; +} + +// args: server cert, server private key, trusted certificates. + +int sslroot::initssl(const char *cert_file, const char *priv_key_file, + const char *CA_FILE, const char *passwd) +{ +static int initLib = 0; + if (!initLib) + { + initLib = 1; + SSL_load_error_strings(); + SSL_library_init(); + } + + + if (init == 1) + { + return 1; + } + + if ((cert_file == NULL) || + (priv_key_file == NULL) || + (passwd == NULL)) + { + fprintf(stderr, "sslroot::initssl() missing parameters!\n"); + return 0; + } + + + SSL_load_error_strings(); + SSL_library_init(); + // XXX TODO + // actions_to_seed_PRNG(); + + pqioutput(PQL_WARNING, pqisslrootzone, "SSL Library Init!"); + + // setup connection method + sslctx = SSL_CTX_new(SSLv23_method()); + + // setup cipher lists. + SSL_CTX_set_cipher_list(sslctx, "DEFAULT"); + + // certificates (Set Local Server Certificate). + FILE *ownfp = fopen(cert_file, "r"); + if (ownfp == NULL) + { + pqioutput(PQL_ALERT, pqisslrootzone, + "Couldn't open Own Certificate!"); + return -1; + } + + X509 *x509 = PEM_read_X509(ownfp, NULL, NULL, NULL); + fclose(ownfp); + if (x509 != NULL) + { + SSL_CTX_use_certificate(sslctx, x509); + own_cert = makeCertificate(x509); + if (own_cert == NULL) + { + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, + "Failed to Make Own Cert!"); + return -1; + } + addCertificate(own_cert); + } + else + { + return -1; + } + + + // SSL_CTX_use_certificate_chain_file(sslctx, cert_file_chain); + + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, "SSL Set Chain File"); + + SSL_CTX_load_verify_locations(sslctx, CA_FILE, 0); + + // enable verification of certificates (PEER) + SSL_CTX_set_verify(sslctx, SSL_VERIFY_PEER | + SSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL); + + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, "SSL Verification Set"); + + // setup private key + FILE *pkfp = fopen(priv_key_file, "rb"); + if (pkfp == NULL) + { + pqioutput(PQL_ALERT, pqisslrootzone, "Couldn't Open PrivKey File!"); + closessl(); + return -1; + } + + pkey = PEM_read_PrivateKey(pkfp, NULL, NULL, (void *) passwd); + + SSL_CTX_use_PrivateKey(sslctx, pkey); + + if (1 != SSL_CTX_check_private_key(sslctx)) + { + std::ostringstream out; + out << "Issues With Private Key! - Doesn't match your Cert" << std::endl; + out << "Check your input key/certificate:" << std::endl; + out << priv_key_file << " & " << cert_file; + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, out.str()); + + closessl(); + return -1; + } + + + // Load CA for clients. + STACK_OF(X509_NAME) *cert_names; + cert_names = SSL_load_client_CA_file(CA_FILE); + + if (cert_names != NULL) + { + SSL_CTX_set_client_CA_list(sslctx, cert_names); + } + else + { + std::ostringstream out; + out << "Couldn't Load Client CA files!" << std::endl; + out << "Check That (" << CA_FILE << ") is valid"; + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, out.str()); + closessl(); + return -1; + } + + /* configure basics on the certificate. */ + std::string tagname; // = "LOCL:"; + own_cert -> Name(tagname + getX509CNString(own_cert -> certificate -> cert_info -> subject)); + + init = 1; + return 1; +} + + + +int sslroot::closessl() +{ + SSL_CTX_free(sslctx); + + // clean up private key.... + // remove certificates etc -> opposite of initssl. + init = 0; + return 1; +} + +/* Context handling */ +SSL_CTX *sslroot::getCTX() +{ + return sslctx; +} + +int sslroot::setConfigDirs(const char *cdir, const char *ndir) +{ + certdir = cdir; + neighbourdir = ndir; + return 1; +} + +static const unsigned int OPT_LEN = 16; +static const unsigned int VAL_LEN = 1000; + +int sslroot::saveCertificates() +{ + if (certfile.length() > 1) + return saveCertificates(certfile.c_str()); + return -1; +} + + +int sslroot::saveCertificates(const char *fname) +{ + // construct file name. + // + // create the file in memory - hash + sign. + // write out data to a file. + + std::string neighdir = certdir + "/" + neighbourdir + "/"; + std::string configname = certdir + "/"; + configname += fname; + + std::map::iterator mit; + + + std::string conftxt; + std::string empty(""); + unsigned int i; + + std::list::iterator it; + for(it = peercerts.begin(); it != peercerts.end(); it++) + { + std::string neighfile = neighdir + getCertName(*it) + ".pqi"; + savecertificate((*it), neighfile.c_str()); + conftxt += "CERT "; + conftxt += getCertName(*it); + conftxt += "\n"; + conftxt += (*it) -> Hash(); + conftxt += "\n"; + } + + // Now add the options. + for(mit = settings.begin(); mit != settings.end(); mit++) + { + // only save the nonempty settings. + if (mit -> second != empty) { + conftxt += "OPT "; + for(i = 0; (i < OPT_LEN) && (i < mit -> first.length()); i++) + { + conftxt += mit -> first[i]; + } + conftxt += "\n"; + for(i = 0; i < VAL_LEN; i++) + { + if (i < mit -> second.length()) + { + conftxt += mit -> second[i]; + } + else + { + conftxt += '\0'; + } + } + conftxt += "\n"; + } + } + + // now work out signature of it all. This relies on the + // EVP library of openSSL..... We are going to use signing + // for the moment. + + unsigned int signlen = EVP_PKEY_size(pkey); + unsigned char signature[signlen]; + + //OpenSSL_add_all_digests(); + + EVP_MD_CTX *mdctx = EVP_MD_CTX_create(); + + if (0 == EVP_SignInit_ex(mdctx, EVP_sha1(), NULL)) + { + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, + "EVP_SignInit Failure!"); + } + + if (0 == EVP_SignUpdate(mdctx, conftxt.c_str(), conftxt.length())) + { + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, + "EVP_SignUpdate Failure!"); + } + + + if (0 == EVP_SignFinal(mdctx, signature, &signlen, pkey)) + { + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, + "EVP_SignFinal Failure!"); + } + + { + std::ostringstream out; + out << "Conf Signature is(" << signlen << "): "; + for(i = 0; i < signlen; i++) + { + out << std::hex << std::setw(2) << (int) signature[i]; + conftxt += signature[i]; + } + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, out.str()); + } + + FILE *cfd = fopen(configname.c_str(), "wb"); + int wrec; + if (1 != (wrec = fwrite(conftxt.c_str(), conftxt.length(), 1, cfd))) + { + std::ostringstream out; + out << "Error writing: " << configname << std::endl; + out << "Wrote: " << wrec << "/" << 1 << " Records" << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, out.str()); + } + + EVP_MD_CTX_destroy(mdctx); + fclose(cfd); + + return 1; +} + +int sslroot::loadCertificates(const char *conf_fname) +{ + // open the configuration file. + // + // read in CERT + Hash. + + // construct file name. + // + // create the file in memory - hash + sign. + // write out data to a file. + + std::string neighdir = certdir + "/" + neighbourdir + "/"; + std::string configname = certdir + "/"; + configname += conf_fname; + + // save name for later save attempts. + certfile = conf_fname; + + std::string conftxt; + + unsigned int maxnamesize = 1024; + char name[maxnamesize]; + + int c; + unsigned int i; + + FILE *cfd = fopen(configname.c_str(), "rb"); + if (cfd == NULL) + { + std::ostringstream out; + out << "Unable to Load Configuration File!" << std::endl; + out << "File: " << configname << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, out.str()); + return -1; + } + + std::list fnames; + std::list hashes; + std::map::iterator mit; + std::map tmpsettings; + + unsigned int signlen = EVP_PKEY_size(pkey); + unsigned char conf_signature[signlen]; + char *ret = NULL; + + for(ret = fgets(name, maxnamesize, cfd); + ((ret != NULL) && (!strncmp(name, "CERT ", 5))); + ret = fgets(name, maxnamesize, cfd)) + { + for(i = 5; (name[i] != '\n') && (i < (unsigned) maxnamesize); i++); + + if (name[i] == '\n') + { + name[i] = '\0'; + } + + // so the name is first.... + std::string fname = &(name[5]); + + // now read the + std::string hash; + std::string signature; + + for(i = 0; i < signlen; i++) + { + if (EOF == (c = fgetc(cfd))) + { + std::ostringstream out; + out << "Error Reading Signature of: "; + out << fname; + out << std::endl; + out << "ABorting Load!"; + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, out.str()); + return -1; + } + unsigned char uc = (unsigned char) c; + signature += (unsigned char) uc; + } + if ('\n' != (c = fgetc(cfd))) + { + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, + "Warning Mising seperator"); + } + + { + std::ostringstream out; + out << "Read fname:" << fname << std::endl; + out << "Signature:" << std::endl; + for(i = 0; i < signlen; i++) + { + out << std::hex << std::setw(2) << (int) signature[i]; + } + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, out.str()); + } + + // push back..... + fnames.push_back(fname); + hashes.push_back(signature); + + conftxt += "CERT "; + conftxt += fname; + conftxt += "\n"; + conftxt += signature; + conftxt += "\n"; + + // be sure to write over a bit... + name[0] = 'N'; + name[1] = 'O'; + } + + // string already waiting! + for(; ((ret != NULL) && (!strncmp(name, "OPT ", 4))); + ret = fgets(name, maxnamesize, cfd)) + { + for(i = 4; (name[i] != '\n') && (i < OPT_LEN); i++); + // terminate the string. + name[i] = '\0'; + + // so the name is first.... + std::string opt = &(name[4]); + + // now read the + std::string val; // cleaned up value. + std::string valsign; // value in the file. + + for(i = 0; i < VAL_LEN; i++) + { + if (EOF == (c = fgetc(cfd))) + { + std::ostringstream out; + out << "Error Reading Value of: "; + out << opt; + out << std::endl; + out << "ABorting Load!"; + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, out.str()); + return -1; + } + // remove zeros on strings... + if (c != '\0') + { + val += (unsigned char) c; + } + valsign += (unsigned char) c; + } + if ('\n' != (c = fgetc(cfd))) + { + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, + "Warning Mising seperator"); + } + + { + std::ostringstream out; + out << "Read OPT:" << opt; + out << " Val:" << val << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, out.str()); + } + + // push back..... + tmpsettings[opt] = val; + + conftxt += "OPT "; + conftxt += opt; + conftxt += "\n"; + conftxt += valsign; + conftxt += "\n"; + + // be sure to write over a bit... + name[0] = 'N'; + name[1] = 'O'; + } + + // only read up to the first newline symbol.... + // continue... + for(i = 0; (name[i] != '\n') && (i < signlen); i++); + + //printf("Stepping over [%d] %0x\n", i, name[i]); + + + if (i != signlen) + { + for(i++; i < signlen; i++) + { + c = fgetc(cfd); + if (c == EOF) + { + pqioutput(PQL_ALERT, pqisslrootzone, + "Error Reading Conf Signature:"); + return 1; + } + unsigned char uc = (unsigned char) c; + name[i] = uc; + } + } + + { + std::ostringstream out; + out << "Configuration File Signature: " << std::endl; + for(i = 0; i < signlen; i++) + { + out << std::hex << std::setw(2) << (int) name[i]; + } + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, out.str()); + } + + + // when we get here - should have the final signature in the buffer. + // check. + // + // compare signatures. + // instead of verifying with the public key.... + // we'll sign it again - and compare .... FIX LATER... + + EVP_MD_CTX *mdctx = EVP_MD_CTX_create(); + + if (0 == EVP_SignInit(mdctx, EVP_sha1())) + { + pqioutput(PQL_ALERT, pqisslrootzone, "EVP_SignInit Failure!"); + } + + if (0 == EVP_SignUpdate(mdctx, conftxt.c_str(), conftxt.length())) + { + pqioutput(PQL_ALERT, pqisslrootzone, "EVP_SignUpdate Failure!"); + } + + if (0 == EVP_SignFinal(mdctx, conf_signature, &signlen, pkey)) + { + pqioutput(PQL_ALERT, pqisslrootzone, "EVP_SignFinal Failure!"); + } + + EVP_MD_CTX_destroy(mdctx); + fclose(cfd); + + { + std::ostringstream out; + out << "Recalced File Signature: " << std::endl; + for(i = 0; i < signlen; i++) + { + out << std::hex << std::setw(2) << (int) conf_signature[i]; + } + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, out.str()); + } + + bool same = true; + for(i = 0; i < signlen; i++) + { + if ((unsigned char) name[i] != conf_signature[i]) + { + same = false; + } + } + + if (same == false) + { + pqioutput(PQL_ALERT, pqisslrootzone, + "ERROR VALIDATING CONFIGURATION! -- PLEASE FIX!"); + return -1; + } + std::list::iterator it; + std::list::iterator it2; + for(it = fnames.begin(), it2 = hashes.begin(); it != fnames.end(); it++, it2++) + { + std::string neighfile = neighdir + (*it) + ".pqi"; + cert *nc = loadcertificate(neighfile.c_str(), (*it2)); + if (nc != NULL) + { + if (0 > addCertificate(nc)) + { + // cleanup. + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, + "Updated Certificate....but no need for addition"); + // X509_free(nc -> certificate); + //delete nc; + } + } + } + for(mit = tmpsettings.begin(); mit != tmpsettings.end(); mit++) + { + settings[mit -> first] = mit -> second; + } + return 1; +} + + +int sslroot::savecertificate(cert *c, const char *fname) +{ + // load certificates from file. + FILE *setfp = fopen(fname, "wb"); + if (setfp == NULL) + { + std::ostringstream out; + out << "sslroot::savecertificate() Bad File: " << fname; + out << " Cannot be Written!" << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, out.str()); + return -1; + } + + { + std::ostringstream out; + out << "Writing out Cert...:" << c -> Name() << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, out.str()); + } + + PEM_write_X509(setfp, c -> certificate); + + // writing out details.... + + // read in a line..... + int size = 1024; + char line[size]; + std::list::iterator it; + + int i; + + // This will need to be made portable..... + + struct sockaddr_in *addr_inet; + struct sockaddr_in *addr_inet2; + struct sockaddr_in *addr_inet3; + + int pos_status = 0; + int pos_addr = sizeof(int); + int pos_addr2 = pos_addr + sizeof(*addr_inet); + int pos_addr3 = pos_addr2 + sizeof(*addr_inet2); + + int pos_lcts = pos_addr3 + sizeof(*addr_inet3); + int pos_lrts = pos_lcts + sizeof(int); + int pos_ncts = pos_lrts + sizeof(int); + int pos_ncvl = pos_ncts + sizeof(int); + int pos_name = pos_ncvl + sizeof(int); + int pos_end = pos_name + 20; // \n. for readability. + + int *status = (int *) &(line[pos_status]); + addr_inet = (struct sockaddr_in *) &(line[pos_addr]); + addr_inet2 = (struct sockaddr_in *) &(line[pos_addr2]); + addr_inet3 = (struct sockaddr_in *) &(line[pos_addr3]); + int *lcts = (int *) &(line[pos_lcts]); + int *lrts = (int *) &(line[pos_lrts]); + char *ncts = &(line[pos_ncts]); + char *ncvl = &(line[pos_ncvl]); + char *name = &(line[pos_name]); + char *end = &(line[pos_end]); + + for(i = 0; i < 1024; i++) + line[i] = 0; + + *status = c -> Status(); + *addr_inet = c -> lastaddr; + *addr_inet2 = c -> localaddr; + *addr_inet3 = c -> serveraddr; + + *lcts = c -> lc_timestamp; + *lrts = c -> lr_timestamp; + *ncts = c -> nc_timestamp; + *ncvl = c -> nc_timeintvl; + + std::string tmpname = c -> Name(); + for(i = 0; (i < (signed) tmpname.length()) && (i < 20 - 1); i++) + { + name[i] = tmpname[i]; + } + name[20 - 1] = '\0'; + end[0] = '\n'; + + + if (1 != fwrite(line, size,1, setfp)) + { + pqioutput(PQL_ALERT, pqisslrootzone, + "Error Writing Peer Record!"); + return -1; + } + fclose(setfp); + + // then reopen to generate hash. + setfp = fopen(fname, "rb"); + if (setfp == NULL) + { + std::ostringstream out; + out << "sslroot::savecertificate() Bad File: " << fname; + out << " Opened for ReHash!" << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, out.str()); + return -1; + } + + unsigned int signlen = EVP_PKEY_size(pkey); + unsigned char signature[signlen]; + + int maxsize = 10240; + int rbytes; + char inall[maxsize]; + if (0 == (rbytes = fread(inall, 1, maxsize, setfp))) + { + pqioutput(PQL_ALERT, pqisslrootzone, + "Error Writing Peer Record!"); + return -1; + } + + { + std::ostringstream out; + out << "Read " << rbytes << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, out.str()); + } + + // so we read rbytes. + // hash. + //OpenSSL_add_all_digests(); + + EVP_MD_CTX *mdctx = EVP_MD_CTX_create(); + + if (0 == EVP_SignInit_ex(mdctx, EVP_sha1(), NULL)) + { + pqioutput(PQL_ALERT, pqisslrootzone, "EVP_SignInit Failure!"); + } + + if (0 == EVP_SignUpdate(mdctx, inall, rbytes)) + { + pqioutput(PQL_ALERT, pqisslrootzone, "EVP_SignUpdate Failure!"); + } + + if (0 == EVP_SignFinal(mdctx, signature, &signlen, pkey)) + { + pqioutput(PQL_ALERT, pqisslrootzone, "EVP_SignFinal Failure!"); + } + + std::string signstr; + { + std::ostringstream out; + out << "Cert + Setting Signature is(" << signlen << "): "; + for(i = 0; i < (signed) signlen; i++) + { + out << std::hex << std::setw(2) << (int) signature[i]; + signstr += signature[i]; + } + out << std::dec << std::endl; + + c -> Hash(signstr); + out << "Stored Hash Length: " << (c -> Hash()).length() << std::endl; + out << "Real Hash Length: " << signlen << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, out.str()); + } + + fclose(setfp); + + EVP_MD_CTX_destroy(mdctx); + + return 1; +} + +cert *sslroot::loadcertificate(const char *fname, std::string hash) +{ + // if there is a hash - check that the file matches it before loading. + FILE *pcertfp; + if (hash.length() > 1) + { + pcertfp = fopen(fname, "rb"); + // load certificates from file. + if (pcertfp == NULL) + { + std::ostringstream out; + out << "sslroot::loadcertificate() Bad File: " << fname; + out << " Cannot be Hashed!" << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, out.str()); + return NULL; + } + + unsigned int signlen = EVP_PKEY_size(pkey); + unsigned char signature[signlen]; + + int maxsize = 10240; + int rbytes; + char inall[maxsize]; + if (0 == (rbytes = fread(inall, 1, maxsize, pcertfp))) + { + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, + "Error Reading Peer Record!"); + return NULL; + } + + EVP_MD_CTX *mdctx = EVP_MD_CTX_create(); + + if (0 == EVP_SignInit_ex(mdctx, EVP_sha1(), NULL)) + { + pqioutput(PQL_ALERT, pqisslrootzone, "EVP_SignInit Failure!"); + } + + if (0 == EVP_SignUpdate(mdctx, inall, rbytes)) + { + pqioutput(PQL_ALERT, pqisslrootzone, "EVP_SignUpdate Failure!"); + } + + if (0 == EVP_SignFinal(mdctx, signature, &signlen, pkey)) + { + pqioutput(PQL_ALERT, pqisslrootzone, "EVP_SignFinal Failure!"); + } + + fclose(pcertfp); + EVP_MD_CTX_destroy(mdctx); + + bool same = true; + if (signlen != hash.length()) + { + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, + "Different Length Signatures... Cannot Load Cert!"); + return NULL; + } + + for(int i = 0; i < (signed) signlen; i++) + { + if (signature[i] != (unsigned char) hash[i]) + { + same = false; + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, + "Invalid Signature... Cannot Load Certificate!"); + return NULL; + } + } + + { + std::ostringstream out; + out << "Verified Signature for: " << fname; + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, out.str()); + } + + + } + else + { + pqioutput(PQL_ALERT, pqisslrootzone, "Not checking cert signature"); + } + + pcertfp = fopen(fname, "rb"); + + // load certificates from file. + if (pcertfp == NULL) + { + std::ostringstream out; + out << "sslroot::loadcertificate() Bad File: " << fname; + out << " Cannot be Read!" << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, out.str()); + return NULL; + } + + + X509 *pc; + cert *npc = NULL; + + if ((pc = PEM_read_X509(pcertfp, NULL, NULL, NULL)) != NULL) + { + // read a certificate. + std::ostringstream out; + out << "Loaded Certificate: "; + out << pc -> name << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, out.str()); + + npc = makeCertificate(pc); + if (npc == NULL) + { + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, "Failed to Create Cert!"); + return NULL; + } + } + else // (pc == NULL) + { + unsigned long err = ERR_get_error(); + std::ostringstream out; + out << "Read Failed .... CODE(" << err << ")" << std::endl; + out << ERR_error_string(err, NULL) << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, out.str()); + return NULL; + } + + // Now we try to read in 1024 bytes..... + // if successful, then have settings! + + // read in a line..... + int size = 1024; + char line[size]; + + // Data arrangment. + // so far + // ------------ + // 4 - (int) status + // 8 - sockaddr + // 8 - sockaddr + // 8 - sockaddr + // 4 - lc_timestamp + // 4 - lr_timestamp + // 4 - nc_timestamp + // 4 - nc_timeintvl + // 20 - name. + // 1 - end + + // This will need to be made portable..... + + struct sockaddr_in *addr_inet; + struct sockaddr_in *addr_inet2; + struct sockaddr_in *addr_inet3; + + //int pos_status = 0; + int pos_addr = sizeof(int); + int pos_addr2 = pos_addr + sizeof(*addr_inet); + int pos_addr3 = pos_addr2 + sizeof(*addr_inet2); + int pos_lcts = pos_addr3 + sizeof(*addr_inet3); + + int pos_lrts = pos_lcts + sizeof(int); + int pos_ncts = pos_lrts + sizeof(int); + int pos_ncvl = pos_ncts + sizeof(int); + int pos_name = pos_ncvl + sizeof(int); + //int pos_end = pos_name + 20; // \n. for readability. + + int *status = (int *) line; + addr_inet = (struct sockaddr_in *) &(line[pos_addr]); + addr_inet2 = (struct sockaddr_in *) &(line[pos_addr2]); + addr_inet3 = (struct sockaddr_in *) &(line[pos_addr3]); + int *lcts = (int *) &(line[pos_lcts]); + int *lrts = (int *) &(line[pos_lrts]); + char *ncts = &(line[pos_ncts]); + char *ncvl = &(line[pos_ncvl]); + char *name = &(line[pos_name]); + //char *end = &(line[pos_end]); + + // end of data structures.... + + if (1 != (signed) fread(line, size,1, pcertfp)) + { + pqioutput(PQL_WARNING, pqisslrootzone, + "Error Reading Setting: Only Cert Retrieved"); + return npc; + } + + + // fill in the data. + cert *c = npc; + c -> Status(*status); + // but ensure that inUse is not set. + c -> InUse(false); + + c -> lastaddr = *addr_inet; + c -> localaddr = *addr_inet2; + c -> serveraddr = *addr_inet3; + + c -> lc_timestamp = *lcts; + c -> lr_timestamp = *lrts; + c -> nc_timestamp = *ncts; + c -> nc_timeintvl = *ncvl; + + + name[20 - 1] = '\0'; + c -> Name(std::string(name)); + + // save the hash. + c -> Hash(hash); + + fclose(pcertfp); + + // small hack - as the timestamps seem wrong..... + // could be a saving thing - or a bug.... + c -> lc_timestamp = 0; + c -> lr_timestamp = 0; + + // reset these. as well. + c -> nc_timestamp = 0; + c -> nc_timeintvl = 5; + + return c; +} + + +int sslroot::printCertificate(cert *c, std::ostream &out) +{ + out << "Cert Name:" << (c -> certificate) -> name << std::endl; + //X509_print_fp(stderr, c -> certificate); + return 1; +} + +// This function will clean up X509 *c if necessary. + +cert *sslroot::makeCertificate(X509 *c) +{ + if (c == NULL) + { + return NULL; + } + + // At this point we check to see if there is a duplicate. + cert *dup = checkDuplicateX509(c); + cert *npc = NULL; + if (dup == NULL) + { + npc = new cert(); + npc -> certificate = c; + if (!addtosignmap(npc)) // only allow the cert if no dup + { + + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, + "sslroot::makeCertificate() Failed to Get Signature - Not Allowed!"); + + // failed!... cannot add it!. + delete npc; + return NULL; + } + + allcerts.push_back(npc); + { + std::ostringstream out; + out << "sslroot::makeCertificate() For " << c -> name; + out << " A-Okay!" << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, out.str()); + } + // at this point we need to add to the signaturelist.... + + } + else if (c == dup -> certificate) + { + // identical - so okay. + npc = dup; + std::ostringstream out; + out << "sslroot::makeCertificate() For " << c -> name; + out << " Found Identical - A-Okay!" << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, out.str()); + } + else + { + std::ostringstream out; + out << "sslroot::makeCertificate() For " << c -> name; + out << " Cleaning up other X509!" << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, out.str()); + // clean up c. + X509_free(c); + npc = dup; + } + return npc; +} + + +cert *sslroot::checkDuplicateX509(X509 *x) +{ + if (x == NULL) + return NULL; + + // loop through and print - then check. + std::list::iterator it; + for(it = allcerts.begin(); it != allcerts.end(); it++) + { + if (0 == X509_cmp((*it) -> certificate, x)) + { + return (*it); + } + } + return NULL; +} + + +cert *sslroot::checkPeerX509(X509 *x) +{ + if (x == NULL) + return NULL; + + // loop through and print - then check. + std::list::iterator it; + for(it = peercerts.begin(); it != peercerts.end(); it++) + { + if (0 == X509_cmp((*it) -> certificate, x)) + { + return (*it); + } + } + return NULL; +} + + + +cert *sslroot::findpeercert(const char *name) +{ + // loop through and print - then check. + //std::cerr << "Checking Certs for: " << name << std::endl; + std::list::iterator it; + for(it = peercerts.begin(); it != peercerts.end(); it++) + { + char *certname = ((*it) -> certificate) -> name; + //std::cerr << "Cert Name:" << certname << std::endl; + if (strstr(certname, name) != NULL) + { + //std::cerr << "Matches!" << std::endl; + return (*it); + } + } + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, + "sslroot::findpeercert() Failed!"); + return NULL; +} + +// returns zero for the same. +int sslroot::compareCerts(cert *a, cert *b) +{ + // std::cerr << "Comparing Certificates:" << std::endl; + //printCertificate(a); + //printCertificate(b); + //X509_print_fp(stderr, a -> certificate); + //X509_print_fp(stderr, b -> certificate); + + int val = X509_cmp(a -> certificate, b -> certificate); + + { + std::ostringstream out; + out << "Certificate Comparison Returned: " << val << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, out.str()); + } + + return val; +} + +cert * sslroot::registerCertificate(X509 *nc, struct sockaddr_in raddr, bool in) +{ + if (nc == NULL) + return NULL; + + // shoud check all certs. + cert *c = checkDuplicateX509(nc); + if (c != NULL) + { + if (c -> certificate == nc) + { + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, + "sslroot::registerCertificate() Found Identical X509 cert"); + } + else + { + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, + "sslroot::registerCertificate() Found Same X509 cert/diff mem - Clean"); + X509_free(nc); + } + + if (!c -> Connected()) + { + c -> lastaddr = raddr; + + if (in == true) + { + c -> lr_timestamp = time(NULL); + // likely to be server address + // (with default port) + // if null! + if (!isValidNet(&(c -> serveraddr.sin_addr))) + { + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, + "Guessing Default Server Addr!"); + + c -> serveraddr = raddr; + c -> serveraddr.sin_port = + htons(PQI_DEFAULT_PORT); + } + } + else + { + c -> lc_timestamp = time(NULL); + // also likely to be servera address, + // but we can check and see if its local. + // can flag local + if (0 == inaddr_cmp(c -> localaddr, raddr)) + { + c -> Local(true); + // don't set serveraddr -> just ignore + } + else + { + c -> serveraddr = raddr; + c -> Firewalled(false); + } + } + } + else + { + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, + "WARNING: attempt to reg CONNECTED Cert!"); + } + return c; + } + + { + std::ostringstream out; + out << "sslroot::registerCertificate() Certificate Not Found!" << std::endl; + out << "Saving :" << nc -> name << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, out.str()); + } + + cert *npc = makeCertificate(nc); + if (npc == NULL) + { + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, + "Failed to Make Certificate"); + return NULL; + } + + npc -> Name(nc -> name); + + npc -> lastaddr = raddr; + if (in == true) + { + npc -> lr_timestamp = time(NULL); + // likely to be server address (with default port) + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, "Guessing Default Server Addr!"); + npc -> serveraddr = raddr; + npc -> serveraddr.sin_port = htons(PQI_DEFAULT_PORT); + } + else + { + npc -> lc_timestamp = time(NULL); + + // as it is a new cert... all fields are + // null and the earlier tests must be + // delayed until the discovery packets. + + // also likely to be server. + npc -> serveraddr = raddr; + } + + // push back onto collected. + npc -> nc_timestamp = 0; + collectedcerts.push_back(npc); + + // return NULL to indicate that it dosen't yet exist in dbase. + return NULL; +} + +cert * sslroot::getCollectedCert() +{ + if (collectedcerts.size() < 1) + return NULL; + + cert *c = collectedcerts.front(); + collectedcerts.pop_front(); + return c; +} + +bool sslroot::collectedCerts() +{ + return (collectedcerts.size() > 0); +} + + +int sslroot::removeCertificate(cert *c) +{ + if (c -> InUse()) + { + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, + "sslroot::removeCertificate() Failed: cert is in use."); + return -1; + } + + std::list::iterator it; + for(it = peercerts.begin(); it != peercerts.end(); it++) + { + if (c == (*it)) + { + peercerts.erase(it); + + c -> InUse(false); + c -> Accepted(false); + + + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, + "sslroot::removeCertificate() Success! Moved to Coll Certs"); + + collectedcerts.push_back(c); + + certsChanged.IndicateChanged(); + certsMajorChanged.IndicateChanged(); + return 1; + } + } + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, + "sslroot::removeCertificate() Failed to Match Cert!"); + + return 0; +} + + +int sslroot::addCertificate(cert *c) +{ + c -> InUse(false); + // let most flags through. + //c -> Accepted(false); + //c -> WillConnect(false); + if (c -> certificate == NULL) + { + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, + "sslroot::addCertificate() certificate==NULL, Not Adding"); + return 0; + } + + cert *dup = checkPeerX509(c -> certificate); + if (dup != NULL) + { + std::ostringstream out; + out << "sslroot::addCertificate() Not Adding"; + out << "Certificate with duplicate...." << std::endl; + out << "\t\tTry RegisterCertificate() " << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, out.str()); + + return -1; + } + + // else put in in the list. + peercerts.push_back(c); + + certsChanged.IndicateChanged(); + certsMajorChanged.IndicateChanged(); + + return 1; +} + + +int sslroot::addUntrustedCertificate(cert *c) +{ + // blank it all. + c -> Status(PERSON_STATUS_MANUAL); + // set Tag to be their X509CN. + c -> Name(getX509CNString(c -> certificate -> cert_info -> subject)); + + return addCertificate(c); +} + + + +int sslroot::validateCertificate(cert *c) +{ + std::ostringstream out; + out << "sslroot::validateCertificate() Why Not!" << std::endl; + c -> Valid(true); + out << "Cert Status: " << c -> Status() << std::endl; + pqioutput(PQL_ALERT, pqisslrootzone, out.str()); + return 1; +} + +/***** REMOVED! + * + * +std::list sslroot::listCertificates() +{ + std::list names; + std::list::iterator it; + for(it = peercerts.begin(); it != peercerts.end(); it++) + { + names.push_back(((*it) -> certificate) -> name); + } + return names; +} + * + * + *****/ + + +bool sslroot::CertsChanged() +{ + return certsChanged.Changed(0); +} + +bool sslroot::CertsMajorChanged() +{ + return certsMajorChanged.Changed(0); +} + +void sslroot::IndicateCertsChanged() +{ + certsChanged.IndicateChanged(); +} + + +std::list &sslroot::getCertList() +{ + return peercerts; +} + +std::string sslroot::getSetting(std::string opt) +{ + std::map::iterator it; + if (settings.end() != (it = settings.find(opt))) + { + // found setting. + std::ostringstream out; + out << "sslroot::getSetting(" << opt << ") = "; + out << it -> second << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, out.str()); + return it -> second; + } + // else return empty string. + + { + std::ostringstream out; + out << "sslroot::getSetting(" << opt; + out << ") Not There!" << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, out.str()); + } + + std::string empty(""); + return empty; +} + +void sslroot::setSetting(std::string opt, std::string val) +{ + // check settings.. + std::ostringstream out; + out << "sslroot::saveSetting(" << opt << ", "; + out << val << ")" << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, out.str()); + + settings[opt] = val; + return; +} + +cert *sslroot::getOwnCert() +{ + return own_cert; +} + +int sslroot::checkNetAddress() +{ + std::list addrs = getLocalInterfaces(); + std::list::iterator it; + + bool found = false; + for(it = addrs.begin(); (!found) && (it != addrs.end()); it++) + { + if ((*it) == inet_ntoa(own_cert -> localaddr.sin_addr)) + { + found = true; + } + } + /* check that we didn't catch 0.0.0.0 - if so go for prefered */ + if ((found) && (own_cert -> localaddr.sin_addr.s_addr == 0)) + { + found = false; + } + + if (!found) + { + own_cert -> localaddr.sin_addr = getPreferredInterface(); + } + if ((isPrivateNet(&(own_cert -> localaddr.sin_addr))) || + (isLoopbackNet(&(own_cert -> localaddr.sin_addr)))) + { + own_cert -> Firewalled(true); + } + else + { + //own_cert -> Firewalled(false); + } + + int port = ntohs(own_cert -> localaddr.sin_port); + if ((port < PQI_MIN_PORT) || (port > PQI_MAX_PORT)) + { + own_cert -> localaddr.sin_port = htons(PQI_DEFAULT_PORT); + } + + /* if localaddr = serveraddr, then ensure that the ports + * are the same (modify server)... this mismatch can + * occur when the local port is changed.... + */ + + if (own_cert -> localaddr.sin_addr.s_addr == + own_cert -> serveraddr.sin_addr.s_addr) + { + own_cert -> serveraddr.sin_port = + own_cert -> localaddr.sin_port; + } + + // ensure that address family is set, otherwise windows Barfs. + own_cert -> localaddr.sin_family = AF_INET; + own_cert -> serveraddr.sin_family = AF_INET; + own_cert -> lastaddr.sin_family = AF_INET; + + return 1; +} + + + + +/********** SSL ERROR STUFF ******************************************/ + +int printSSLError(SSL *ssl, int retval, int err, unsigned long err2, + std::ostream &out) +{ + std::string reason; + + std::string mainreason = std::string("UNKNOWN ERROR CODE"); + if (err == SSL_ERROR_NONE) + { + mainreason = std::string("SSL_ERROR_NONE"); + } + else if (err == SSL_ERROR_ZERO_RETURN) + { + mainreason = std::string("SSL_ERROR_ZERO_RETURN"); + } + else if (err == SSL_ERROR_WANT_READ) + { + mainreason = std::string("SSL_ERROR_WANT_READ"); + } + else if (err == SSL_ERROR_WANT_WRITE) + { + mainreason = std::string("SSL_ERROR_WANT_WRITE"); + } + else if (err == SSL_ERROR_WANT_CONNECT) + { + mainreason = std::string("SSL_ERROR_WANT_CONNECT"); + } + else if (err == SSL_ERROR_WANT_ACCEPT) + { + mainreason = std::string("SSL_ERROR_WANT_ACCEPT"); + } + else if (err == SSL_ERROR_WANT_X509_LOOKUP) + { + mainreason = std::string("SSL_ERROR_WANT_X509_LOOKUP"); + } + else if (err == SSL_ERROR_SYSCALL) + { + mainreason = std::string("SSL_ERROR_SYSCALL"); + } + else if (err == SSL_ERROR_SSL) + { + mainreason = std::string("SSL_ERROR_SSL"); + } + out << "RetVal(" << retval; + out << ") -> SSL Error: " << mainreason << std::endl; + out << "\t + ERR Error: " << ERR_error_string(err2, NULL) << std::endl; + return 1; +} + +cert::cert() + :certificate(NULL), hash("") +{ + return; +} + +cert::~cert() +{ + return; +} + +std::string cert::Signature() +{ + if (certificate == NULL) + { + return Name(); + } + else + { + // get signature from cert.... + return Name(); + } +} + + +std::string cert::Hash() +{ + return hash; +} + + +void cert::Hash(std::string h) +{ + hash = h; + return; +} + + + +/********************* signature stuff *********************/ + +bool certsign::operator<(const certsign &ref) const +{ + //compare the signature. + if (0 > strncmp(data, ref.data, CERTSIGNLEN)) + return true; + return false; +} + + +bool certsign::operator==(const certsign &ref) const +{ + //compare the signature. + return (0 == strncmp(data, ref.data, CERTSIGNLEN)); +} + + +/* Fns for relating cert signatures to structures */ +cert *sslroot::findcertsign(certsign &sign) +{ + std::map::iterator it; + + std::ostringstream out; + out << "sslroot::findcertsign()" << std::endl; + for (it = signmap.begin(); it != signmap.end(); it++) + { + out << "Checking Vs " << it -> second -> Name(); + if (sign == it -> first) + { + out << "Match!"; + } + out << std::endl; + } + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, out.str()); + + if (signmap.end() != (it = signmap.find(sign))) + { + return it -> second; + } + return NULL; +} + +int sslroot::getcertsign(cert *c, certsign &sign) +{ + if ((c == NULL) || (c->certificate == NULL)) + { + pqioutput(PQL_ALERT, pqisslrootzone, + "sslroot::getcertsign() ERROR: NULL c || c->certificate"); + return 0; + } + + // get the signature from the cert, and copy to the array. + ASN1_BIT_STRING *signature = c -> certificate -> signature; + int signlen = ASN1_STRING_length(signature); + if (signlen < CERTSIGNLEN) + { + pqioutput(PQL_ALERT, pqisslrootzone, + "sslroot::getcertsign() ERROR: short Signature"); + return 0; + } + // else copy in the first CERTSIGNLEN. + unsigned char *signdata = ASN1_STRING_data(signature); + memcpy(sign.data, signdata, CERTSIGNLEN); + + return 1; +} + +int sslroot::addtosignmap(cert *c) +{ + certsign cs; + if (!getcertsign(c, cs)) + { + // error. + pqioutput(PQL_ALERT, pqisslrootzone, + "sslroot::addsigntomap() ERROR: Fail to getcertsign()"); + return 0; + } + cert *c2 = findcertsign(cs); + if (c2 == NULL) + { + // add, and return okay. + signmap[cs] = c; + return 1; + } + if (c2 != c) + { + // error. + pqioutput(PQL_ALERT, pqisslrootzone, + "sslroot::addsigntomap() ERROR: Duplicate Entry()"); + return 0; + } + + // else already exists. + return 1; +} + + + + +int sslroot::hashFile(std::string fname, unsigned char *hash, unsigned int hlen) +{ + // open the file. + // setup the hash. + + // pipe the file through. + + + return 1; +} + +int sslroot::hashDigest(char *data, unsigned int dlen, + unsigned char *hash, unsigned int hlen) +{ + EVP_MD_CTX *mdctx = EVP_MD_CTX_create(); + + if (0 == EVP_DigestInit_ex(mdctx, EVP_sha1(), NULL)) + { + pqioutput(PQL_ALERT, pqisslrootzone, "EVP_DigestInit Failure!"); + return -1; + } + + if (0 == EVP_DigestUpdate(mdctx, data, dlen)) + { + pqioutput(PQL_ALERT, pqisslrootzone, "EVP_DigestUpdate Failure!"); + return -1; + } + + unsigned int signlen = hlen; + if (0 == EVP_DigestFinal_ex(mdctx, hash, &signlen)) + { + pqioutput(PQL_ALERT, pqisslrootzone, "EVP_DigestFinal Failure!"); + return -1; + } + + EVP_MD_CTX_destroy(mdctx); + return signlen; +} + + + +int sslroot::signDigest(EVP_PKEY *key, char *data, unsigned int dlen, + unsigned char *sign, unsigned int slen) +{ + unsigned int signlen = EVP_PKEY_size(key); + + { + std::ostringstream out; + out << "sslroot::signDigest(" << (void *) key; + out << ", " << (void *) data << ", " << dlen << ", "; + out << (void *) sign << ", " << slen << ")" << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, out.str()); + } + + if (signlen > slen) + { + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, + "sslroot::signDigest() Sign Length too short"); + return -1; + } + + EVP_MD_CTX *mdctx = EVP_MD_CTX_create(); + + if (0 == EVP_SignInit_ex(mdctx, EVP_sha1(), NULL)) + { + pqioutput(PQL_ALERT, pqisslrootzone, "EVP_SignInit Failure!"); + return -1; + } + + if (0 == EVP_SignUpdate(mdctx, data, dlen)) + { + pqioutput(PQL_ALERT, pqisslrootzone, "EVP_SignUpdate Failure!"); + return -1; + } + + signlen = slen; + if (0 == EVP_SignFinal(mdctx, sign, &signlen, key)) + { + pqioutput(PQL_ALERT, pqisslrootzone, "EVP_SignFinal Failure!"); + return -1; + } + + EVP_MD_CTX_destroy(mdctx); + return signlen; +} + + +int sslroot::verifyDigest(EVP_PKEY *key, char *data, unsigned int dlen, + unsigned char *enc, unsigned int elen) +{ + EVP_MD_CTX *mdctx = EVP_MD_CTX_create(); + + if (0 == EVP_VerifyInit_ex(mdctx, EVP_sha1(), NULL)) + { + pqioutput(PQL_ALERT, pqisslrootzone, "EVP_VerifyInit Failure!"); + return -1; + } + + if (0 == EVP_VerifyUpdate(mdctx, data, dlen)) + { + pqioutput(PQL_ALERT, pqisslrootzone, "EVP_VerifyUpdate Failure!"); + return -1; + } + + int vv; + if (0 > (vv = EVP_VerifyFinal(mdctx, enc, elen, key))) + { + pqioutput(PQL_ALERT, pqisslrootzone, "EVP_VerifyFinal Failure!"); + return -1; + } + if (vv == 1) + { + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, "Verified Signature OKAY"); + } + else + { + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, "Failed Verification!"); + } + + EVP_MD_CTX_destroy(mdctx); + return vv; +} + +// Think both will fit in the one Structure. +int sslroot::generateKeyPair(EVP_PKEY *keypair, unsigned int keylen) +{ + RSA *rsa = RSA_generate_key(2048, 65537, NULL, NULL); + EVP_PKEY_assign_RSA(keypair, rsa); + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, "sslroot::generateKeyPair()"); + return 1; +} + + +std::string getX509NameString(X509_NAME *name) +{ + std::string namestr; + for(int i = 0; i < X509_NAME_entry_count(name); i++) + { + X509_NAME_ENTRY *entry = X509_NAME_get_entry(name, i); + ASN1_STRING *entry_data = X509_NAME_ENTRY_get_data(entry); + ASN1_OBJECT *entry_obj = X509_NAME_ENTRY_get_object(entry); + + namestr += "\t"; + namestr += OBJ_nid2ln(OBJ_obj2nid(entry_obj)); + namestr += " : "; + + //namestr += entry_obj -> flags; + //namestr += entry_data -> length; + //namestr += entry_data -> type; + + //namestr += entry_data -> flags; + //entry -> set; + + if (entry_data -> data != NULL) + { + namestr += (char *) entry_data -> data; + } + else + { + namestr += "NULL"; + } + + if (i + 1 < X509_NAME_entry_count(name)) + { + namestr += "\n"; + } + + } + return namestr; +} + + +std::string getX509CNString(X509_NAME *name) +{ + std::string namestr; + for(int i = 0; i < X509_NAME_entry_count(name); i++) + { + X509_NAME_ENTRY *entry = X509_NAME_get_entry(name, i); + ASN1_STRING *entry_data = X509_NAME_ENTRY_get_data(entry); + ASN1_OBJECT *entry_obj = X509_NAME_ENTRY_get_object(entry); + + if (0 == strncmp("CN", OBJ_nid2sn(OBJ_obj2nid(entry_obj)), 2)) + { + if (entry_data -> data != NULL) + { + namestr += (char *) entry_data -> data; + } + else + { + namestr += "Unknown"; + } + return namestr; + } + } + return namestr; +} + + +std::string getX509TypeString(X509_NAME *name, char *type, int len) +{ + std::string namestr; + for(int i = 0; i < X509_NAME_entry_count(name); i++) + { + X509_NAME_ENTRY *entry = X509_NAME_get_entry(name, i); + ASN1_STRING *entry_data = X509_NAME_ENTRY_get_data(entry); + ASN1_OBJECT *entry_obj = X509_NAME_ENTRY_get_object(entry); + + if (0 == strncmp(type, OBJ_nid2sn(OBJ_obj2nid(entry_obj)), len)) + { + if (entry_data -> data != NULL) + { + namestr += (char *) entry_data -> data; + } + else + { + namestr += "Unknown"; + } + return namestr; + } + } + return namestr; +} + +std::string getX509LocString(X509_NAME *name) +{ + return getX509TypeString(name, "L", 2); +} + +std::string getX509OrgString(X509_NAME *name) +{ + return getX509TypeString(name, "O", 2); +} + + +std::string getX509CountryString(X509_NAME *name) +{ + return getX509TypeString(name, "C", 2); +} + + +std::string convert_to_str(certsign &sign) +{ + std::ostringstream id; + for(int i = 0; i < CERTSIGNLEN; i++) + { + id << std::hex << std::setw(2) << std::setfill('0') + << (uint16_t) (((uint8_t *) (sign.data))[i]); + } + return id.str(); +} + +bool convert_to_certsign(std::string id, certsign &sign) +{ + char num[3]; + if (id.length() < CERTSIGNLEN * 2) + { + return false; + } + + for(int i = 0; i < CERTSIGNLEN; i++) + { + num[0] = id[i * 2]; + num[1] = id[i * 2 + 1]; + num[2] = '\0'; + int32_t val; + if (1 != sscanf(num, "%x", &val)) + { + return false; + } + sign.data[i] = (uint8_t) val; + } + return true; +} + + diff --git a/libretroshare/src/pqi/sslcert.h b/libretroshare/src/pqi/sslcert.h new file mode 100644 index 000000000..b352e187c --- /dev/null +++ b/libretroshare/src/pqi/sslcert.h @@ -0,0 +1,195 @@ +#ifndef MRK_SSL_CERT_HEADER +#define MRK_SSL_CERT_HEADER + +/* + * Core PQI networking: sslcert.h + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 +#include + +#include +#include + +#include "pqi_base.h" +#include "pqinetwork.h" + +#include "pqiindic.h" + + +// helper fns. +int printSSLError(SSL *ssl, int retval, int err, unsigned long err2, std::ostream &out); +std::string getX509NameString(X509_NAME *name); +std::string getX509CNString(X509_NAME *name); + +std::string getX509OrgString(X509_NAME *name); +std::string getX509LocString(X509_NAME *name); +std::string getX509CountryString(X509_NAME *name); + + +/* definitions -> functions to be defined */ +std::string convert_to_str(certsign &sign); +bool convert_to_certsign(std::string id, certsign &sign); + +class sslroot; + +class cert: public Person +{ + public: + cert(); +virtual ~cert(); + +virtual std::string Signature(); +std::string Hash(); +void Hash(std::string); + + X509 *certificate; + std::string hash; +}; + + +// returns pointer to static variable. +// which must be inited.. +sslroot *getSSLRoot(); + +class sslroot +{ + public: + sslroot(); +int active(); +int setcertdir(char *path); +int initssl(const char *srvr_cert, const char *priv_key, + const char *CA_file, const char *passwd); +int closessl(); + +/* Context handling */ +SSL_CTX *getCTX(); + +/* Certificate handling */ +int compareCerts(cert *a, cert *b); + + // network interface. + + // program interface. +int addCertificate(cert *c); +int addUntrustedCertificate(cert *c); +int removeCertificate(cert *); + + // Creation of Certificates.... (From X509) + // Core functions.... +cert *checkDuplicateX509(X509 *x); +cert *checkPeerX509(X509 *x); +cert *makeCertificate(X509 *c); +cert *registerCertificate(X509 *nc, struct sockaddr_in, bool in); + +int validateCertificate(cert *c); + +// depreciated... +cert *findpeercert(const char *name); +//int loadpeercert(const char *fname); +//int savepeercert(const char *fname); + +// Configuration Handling... +int setConfigDirs(const char *cdir, const char *ndir); + +// these save both the certificates + the settings. +int saveCertificates(const char *fname); +int saveCertificates(); +int loadCertificates(const char *fname); + + // with a hash check/recalc in there for good measure. +cert * loadcertificate(const char* fname, std::string hash); +int savecertificate(cert *c, const char* fname); + +// digest hashing /signing or encrypting interface. +int hashFile(std::string fname, unsigned char *hash, unsigned int hlen); +int hashDigest(char *data, unsigned int dlen, unsigned char *hash, unsigned int hlen); +int signDigest(EVP_PKEY *key, char *data, unsigned int dlen, unsigned char *hash, unsigned int hlen); +int verifyDigest(EVP_PKEY *key, char *data, unsigned int dlen, unsigned char *enc, unsigned int elen); +int generateKeyPair(EVP_PKEY *keypair, unsigned int keylen); + + + +int printCertificate(cert *, std::ostream &out); + /****** REMOVED! + * + * +std::list listCertificates(); + * + * + ****/ + +std::list &getCertList(); + +cert * getOwnCert(); +int checkNetAddress(); + + // extra list for certs that aren't in main list. +cert * getCollectedCert(); +bool collectedCerts(); + +bool CertsChanged(); +bool CertsMajorChanged(); +void IndicateCertsChanged(); + +std::string getSetting(std::string opt); +void setSetting(std::string opt, std::string val); + + +/* Fns for relating cert signatures to structures */ +cert *findcertsign(certsign &sign); +int getcertsign(cert *c, certsign &sign); +int addtosignmap(cert *); + + private: /* data */ +std::list peercerts; +std::list allcerts; +std::list collectedcerts; + +// whenever a cert is added, it should also be put in the map. +std::map signmap; + + + +// General Configuration System +// easy it put it here - so it can be signed easily. +std::map settings; + +std::string certdir; +std::string neighbourdir; +std::string certfile; + +SSL_CTX *sslctx; +int init; + +Indicator certsChanged; +Indicator certsMajorChanged; + +EVP_PKEY *pkey; + +cert *own_cert; + +}; + +#endif // MRK_SSL_CERT_HEADER diff --git a/libretroshare/src/pqi/tstdns.cc b/libretroshare/src/pqi/tstdns.cc new file mode 100644 index 000000000..22cb472c8 --- /dev/null +++ b/libretroshare/src/pqi/tstdns.cc @@ -0,0 +1,16 @@ + +#include "pqi/pqinetwork.h" + +int main() +{ + struct sockaddr_in addr; + addr.sin_port = htons(1101); + + LookupDNSAddr("www.google.com", addr); + LookupDNSAddr("10.0.0.19", addr); + LookupDNSAddr("localhost", addr); + LookupDNSAddr("nameless", addr); + + return 1; +} + diff --git a/libretroshare/src/pqi/tstmsg.cc b/libretroshare/src/pqi/tstmsg.cc new file mode 100644 index 000000000..a1f659dc9 --- /dev/null +++ b/libretroshare/src/pqi/tstmsg.cc @@ -0,0 +1,100 @@ + +#include "pqi/pqipacket.h" +#include "pqi/pqi.h" + +#include +#include +#include + +int checkMsg(PQItem *item); + +int main() +{ + + MsgItem *item = new MsgItem(); + + item -> sendTime = 0x10203040; + item -> msg = "asdfghjklwertyuisdfghjkasdfghewrtyefrghfghdfghjklghjkdfghjdfghjdfghjdfghjdghjsdghdfghjdfghdfghdfghjdfghdfghjdfghjfghjdfghjdfghjfghjfghjfghjdfghj"; + item -> msg += " asdfghjklwertyuisdfghjkasdfghewrtyefrghfghdfghjklghjkdfghjdfghjdfghjdfghjdghjsdghdfghjdfghdfghdfghjdfghdfghjdfghjfghjdfghjdfghjfghjfghjfghjdfghj"; + item -> msg += " asdfghjklwertyuisdfghjkasdfghewrtyefrghfghdfghjklghjkdfghjdfghjdfghjdfghjdghjsdghdfghjdfghdfghdfghjdfghdfghjdfghjfghjdfghjdfghjfghjfghjfghjdfghj"; + + MsgFileItem mfi; + mfi.name = "A"; + mfi.hash = "B"; + mfi.size = 0xFFFFFFFF; + item -> files.push_back(mfi); + + mfi.name = "safjhlsafhlsa kfjdhlsa kjfh klsajhf lkjsahflkjhsafkljhsafkjhsafjkhsakfjhksjfhkla sjhf klsjhf kl"; + mfi.hash = "ia dfjsakfjhsalkfjhlsajkfhlhjksf ljksafhlkjsahflkjsahfl kjsahfl jkhsafl kjhsafkl jhsa fkljh "; + mfi.size = 0xFFFFFFFF; + item -> files.push_back(mfi); + + item -> title = "sadf"; + item -> header = "To you from me"; + + + /* fill it up with rubbish */ + checkMsg(item); + + ChatItem *item2 = new ChatItem(); + item2 -> msg = "A Short Message"; + checkMsg(item2); + + ChatItem *item3 = new ChatItem(); + item3 -> msg = "asdfjkhfjhl sajkfhjksahfkl jahs fjklhsakfj hsajk fh klajs hfklja hsfjkhsa kf hksjdfhksajhf klsajhfkl jhdsafkl jhsklfj hksfjh lksajf klsjhfkjsaf sah f;lksahfk; jshfl kjsahfl; kjhsa flkjhsal kfjh s;akfjhsakfjh ljksl kjsahf ;jksal;sajkfhowiher ;oi28y540832qy5h4rlkjqwhrp928y52hrl;kwajhr2098y54 25hujh 32u5h3 285y 319485yh 315jh3 1495y 13295y15ui1 h51o h51ou5A Short Message"; + checkMsg(item3); + + + + return 1; +} + +int checkMsg(PQItem *item) +{ + int i, j; + + std::cerr << "Input MsgItem: " << std::endl; + item -> print(std::cerr); + + /* stream it */ + std::cerr << "Streaming..." << std::endl; + + void *pkt = pqipkt_makepkt(item); + + if (!pkt) + { + std::cerr << "Pkt creation failed!" << std::endl; + return 1; + } + + /* print out packet */ + int size = pqipkt_rawlen(pkt); + + std::cerr << "Pkt Dump(" << size << ")" << std::endl; + std::ostringstream out; + for(i = 0; i < size;) + { + for(j = 0; (i + j < size) && (j < 8); j++) + { + unsigned char n = ((unsigned char *) pkt)[i+j]; + out << std::setw(2) << std::hex << (unsigned int) n << ":"; + } + i += j; + out << std::endl; + } + std::cerr << out.str(); + + /* stream back */ + PQItem *i2 = pqipkt_create(pkt); + + std::cerr << "Output MsgItem: " << std::endl; + i2 -> print(std::cerr); + + return 1; + +} + + + + + diff --git a/libretroshare/src/pqi/xpgpcert.cc b/libretroshare/src/pqi/xpgpcert.cc new file mode 100644 index 000000000..8b22f5040 --- /dev/null +++ b/libretroshare/src/pqi/xpgpcert.cc @@ -0,0 +1,2557 @@ +/* + * "$Id: xpgpcert.cc,v 1.18 2007-04-15 18:45:18 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "xpgpcert.h" +#include "pqipacket.h" + +#include "pqinetwork.h" + +#include +#include +#include + +#include +#include + +#include "pqidebug.h" + +const int pqisslrootzone = 1211; + +/** XPGP keyring interface ************ +int XPGP_add_certificate(XPGP_KEYRING *kr, XPGP *x); +int XPGP_auth_certficate(XPGP_KEYRING *kr, XPGP *x); +int XPGP_sign_certificate(XPGP_KEYRING *kr, XPGP *subj, XPGP *issuer); + +int XPGP_check_valid_certificate(XPGP *x); + +int XPGP_signer_trusted(XPGP_KEYRING *kr, XPGP *trusted); +int XPGP_signer_untrusted(XPGP_KEYRING *kr, XPGP *untrusted); + + int XPGP_copy_known_signatures(XPGP_KEYRING *kr, XPGP *dest, XPGP *src); + + * + * + */ + +unsigned char convertHexToChar(unsigned char a, unsigned char b); + + +// other fns +std::string getCertName(cert *c) +{ + std::string name = c -> certificate -> name; + // strip out bad chars. + for(int i = 0; i < (signed) name.length(); i++) + { + if ((name[i] == '/') || (name[i] == ' ') || (name[i] == '=') || + (name[i] == '\\') || (name[i] == '\t') || (name[i] == '\n')) + { + name[i] = '_'; + } + } + return name; +} + + + +int pem_passwd_cb(char *buf, int size, int rwflag, void *password) +{ + strncpy(buf, (char *)(password), size); + buf[size - 1] = '\0'; + return(strlen(buf)); +} + + +/* This class handles openssl library init/destruct. + * only one of these... handles + * the CTX and setup? + * + * it will also handle the certificates..... + * mantaining a library of recieved certs, + * and ip addresses that the connections come from... + * + */ + +// the single instance of this. +static sslroot instance_sslroot; + +sslroot *getSSLRoot() +{ + return &instance_sslroot; +} + +sslroot::sslroot() + :sslctx(NULL), init(0), certsChanged(1), + certsMajorChanged(1), pkey(NULL) +{ +} + +int sslroot::active() +{ + return init; +} + +// args: server cert, server private key, trusted certificates. + +int sslroot::initssl(const char *cert_file, const char *priv_key_file, + const char *passwd) +{ +static int initLib = 0; + if (!initLib) + { + initLib = 1; + SSL_load_error_strings(); + SSL_library_init(); + } + + + if (init == 1) + { + return 1; + } + + if ((cert_file == NULL) || + (priv_key_file == NULL) || + (passwd == NULL)) + { + fprintf(stderr, "sslroot::initssl() missing parameters!\n"); + return 0; + } + + + // XXX TODO + // actions_to_seed_PRNG(); + + std::cerr << "SSL Library Init!" << std::endl; + + // setup connection method + sslctx = SSL_CTX_new(PGPv1_method()); + + // setup cipher lists. + SSL_CTX_set_cipher_list(sslctx, "DEFAULT"); + + // certificates (Set Local Server Certificate). + FILE *ownfp = fopen(cert_file, "r"); + if (ownfp == NULL) + { + std::cerr << "Couldn't open Own Certificate!" << std::endl; + return -1; + } + + + + // get xPGP certificate. + XPGP *xpgp = PEM_read_XPGP(ownfp, NULL, NULL, NULL); + fclose(ownfp); + + if (xpgp == NULL) + { + return -1; + } + SSL_CTX_use_pgp_certificate(sslctx, xpgp); + + // get private key + FILE *pkfp = fopen(priv_key_file, "rb"); + if (pkfp == NULL) + { + std::cerr << "Couldn't Open PrivKey File!" << std::endl; + closessl(); + return -1; + } + + pkey = PEM_read_PrivateKey(pkfp, NULL, NULL, (void *) passwd); + fclose(pkfp); + + if (pkey == NULL) + { + return -1; + } + SSL_CTX_use_pgp_PrivateKey(sslctx, pkey); + + if (1 != SSL_CTX_check_pgp_private_key(sslctx)) + { + std::cerr << "Issues With Private Key! - Doesn't match your Cert" << std::endl; + std::cerr << "Check your input key/certificate:" << std::endl; + std::cerr << priv_key_file << " & " << cert_file; + std::cerr << std::endl; + closessl(); + return -1; + } + + // make keyring. + pgp_keyring = createPGPContext(xpgp, pkey); + SSL_CTX_set_XPGP_KEYRING(sslctx, pgp_keyring); + + + // Setup the certificate. (after keyring is made!). + + own_cert = makeCertificateXPGP(xpgp); + if (own_cert == NULL) + { + std::cerr << "Failed to Make Own Cert!" << std::endl; + return -1; + } + addCertificate(own_cert); + + // enable verification of certificates (PEER) + SSL_CTX_set_verify(sslctx, SSL_VERIFY_PEER | + SSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL); + + std::cerr << "SSL Verification Set" << std::endl; + + + + /* configure basics on the certificate. */ + own_cert -> Name(getX509CNString(own_cert -> certificate -> subject -> subject)); + + init = 1; + return 1; +} + + + +int sslroot::closessl() +{ + SSL_CTX_free(sslctx); + + // clean up private key.... + // remove certificates etc -> opposite of initssl. + init = 0; + return 1; +} + +/* Context handling */ +SSL_CTX *sslroot::getCTX() +{ + return sslctx; +} + +int sslroot::setConfigDirs(const char *cdir, const char *ndir) +{ + certdir = cdir; + neighbourdir = ndir; + return 1; +} + +static const unsigned int OPT_LEN = 16; +static const unsigned int VAL_LEN = 1000; + +int sslroot::saveCertificates() +{ + if (certfile.length() > 1) + return saveCertificates(certfile.c_str()); + return -1; +} + + +int sslroot::saveCertificates(const char *fname) +{ + // construct file name. + // + // create the file in memory - hash + sign. + // write out data to a file. + + std::string neighdir = certdir + "/" + neighbourdir + "/"; + std::string configname = certdir + "/"; + configname += fname; + + std::map::iterator mit; + + + std::string conftxt; + std::string empty(""); + unsigned int i; + + std::list::iterator it; + for(it = peercerts.begin(); it != peercerts.end(); it++) + { + std::string neighfile = neighdir + getCertName(*it) + ".pqi"; + savecertificate((*it), neighfile.c_str()); + conftxt += "CERT "; + conftxt += getCertName(*it); + conftxt += "\n"; + conftxt += (*it) -> Hash(); + conftxt += "\n"; + std::cerr << std::endl; + } + + // Now add the options. + for(mit = settings.begin(); mit != settings.end(); mit++) + { + // only save the nonempty settings. + if (mit -> second != empty) { + conftxt += "OPT "; + for(i = 0; (i < OPT_LEN) && (i < mit -> first.length()); i++) + { + conftxt += mit -> first[i]; + } + conftxt += "\n"; + for(i = 0; i < VAL_LEN; i++) + { + if (i < mit -> second.length()) + { + conftxt += mit -> second[i]; + } + else + { + conftxt += '\0'; + } + } + conftxt += "\n"; + std::cerr << std::endl; + } + } + + // now work out signature of it all. This relies on the + // EVP library of openSSL..... We are going to use signing + // for the moment. + + unsigned int signlen = EVP_PKEY_size(pkey); + unsigned char signature[signlen]; + + //OpenSSL_add_all_digests(); + + EVP_MD_CTX *mdctx = EVP_MD_CTX_create(); + + if (0 == EVP_SignInit_ex(mdctx, EVP_sha1(), NULL)) + { + std::cerr << "EVP_SignInit Failure!" << std::endl; + } + + if (0 == EVP_SignUpdate(mdctx, conftxt.c_str(), conftxt.length())) + { + std::cerr << "EVP_SignUpdate Failure!" << std::endl; + } + + + if (0 == EVP_SignFinal(mdctx, signature, &signlen, pkey)) + { + std::cerr << "EVP_SignFinal Failure!" << std::endl; + } + + std::cerr << "Conf Signature is(" << signlen << "): "; + for(i = 0; i < signlen; i++) + { + fprintf(stderr, "%02x", signature[i]); + conftxt += signature[i]; + } + std::cerr << std::endl; + + FILE *cfd = fopen(configname.c_str(), "wb"); + int wrec; + if (1 != (wrec = fwrite(conftxt.c_str(), conftxt.length(), 1, cfd))) + { + std::cerr << "Error writing: " << configname << std::endl; + std::cerr << "Wrote: " << wrec << "/" << 1 << " Records" << std::endl; + } + + EVP_MD_CTX_destroy(mdctx); + fclose(cfd); + + return 1; +} + +int sslroot::loadCertificates(const char *conf_fname) +{ + // open the configuration file. + // + // read in CERT + Hash. + + // construct file name. + // + // create the file in memory - hash + sign. + // write out data to a file. + + std::string neighdir = certdir + "/" + neighbourdir + "/"; + std::string configname = certdir + "/"; + configname += conf_fname; + + // save name for later save attempts. + certfile = conf_fname; + + std::string conftxt; + + unsigned int maxnamesize = 1024; + char name[maxnamesize]; + + int c; + unsigned int i; + + FILE *cfd = fopen(configname.c_str(), "rb"); + if (cfd == NULL) + { + std::cerr << "Unable to Load Configuration File!" << std::endl; + std::cerr << "File: " << configname << std::endl; + return -1; + } + + std::list fnames; + std::list hashes; + std::map::iterator mit; + std::map tmpsettings; + + unsigned int signlen = EVP_PKEY_size(pkey); + unsigned char conf_signature[signlen]; + char *ret = NULL; + + for(ret = fgets(name, maxnamesize, cfd); + ((ret != NULL) && (!strncmp(name, "CERT ", 5))); + ret = fgets(name, maxnamesize, cfd)) + { + for(i = 5; (name[i] != '\n') && (i < (unsigned) maxnamesize); i++); + + if (name[i] == '\n') + { + name[i] = '\0'; + } + + // so the name is first.... + std::string fname = &(name[5]); + + // now read the + std::string hash; + std::string signature; + + for(i = 0; i < signlen; i++) + { + if (EOF == (c = fgetc(cfd))) + { + std::cerr << "Error Reading Signature of: "; + std::cerr << fname; + std::cerr << std::endl; + std::cerr << "ABorting Load!"; + std::cerr << std::endl; + return -1; + } + unsigned char uc = (unsigned char) c; + signature += (unsigned char) uc; + } + if ('\n' != (c = fgetc(cfd))) + { + std::cerr << "Warning Mising seperator" << std::endl; + } + + std::cerr << "Read fname:" << fname << std::endl; + std::cerr << "Signature:" << std::endl; + for(i = 0; i < signlen; i++) + { + fprintf(stderr, "%02x", (unsigned char) signature[i]); + } + std::cerr << std::endl; + std::cerr << std::endl; + + // push back..... + fnames.push_back(fname); + hashes.push_back(signature); + + conftxt += "CERT "; + conftxt += fname; + conftxt += "\n"; + conftxt += signature; + conftxt += "\n"; + + // be sure to write over a bit... + name[0] = 'N'; + name[1] = 'O'; + } + + // string already waiting! + for(; ((ret != NULL) && (!strncmp(name, "OPT ", 4))); + ret = fgets(name, maxnamesize, cfd)) + { + for(i = 4; (name[i] != '\n') && (i < OPT_LEN); i++); + // terminate the string. + name[i] = '\0'; + + // so the name is first.... + std::string opt = &(name[4]); + + // now read the + std::string val; // cleaned up value. + std::string valsign; // value in the file. + for(i = 0; i < VAL_LEN; i++) + { + if (EOF == (c = fgetc(cfd))) + { + std::cerr << "Error Reading Value of: "; + std::cerr << opt; + std::cerr << std::endl; + std::cerr << "ABorting Load!"; + std::cerr << std::endl; + return -1; + } + // remove zeros on strings... + if (c != '\0') + { + val += (unsigned char) c; + } + valsign += (unsigned char) c; + } + if ('\n' != (c = fgetc(cfd))) + { + std::cerr << "Warning Mising seperator" << std::endl; + } + + std::cerr << "Read OPT:" << opt; + std::cerr << " Val:" << val << std::endl; + + // push back..... + tmpsettings[opt] = val; + + conftxt += "OPT "; + conftxt += opt; + conftxt += "\n"; + conftxt += valsign; + conftxt += "\n"; + + // be sure to write over a bit... + name[0] = 'N'; + name[1] = 'O'; + } + + // only read up to the first newline symbol.... + // continue... + for(i = 0; (name[i] != '\n') && (i < signlen); i++); + + //printf("Stepping over [%d] %0x\n", i, name[i]); + + + if (i != signlen) + { + for(i++; i < signlen; i++) + { + c = fgetc(cfd); + if (c == EOF) + { + std::cerr << "Error Reading Conf Signature:"; + std::cerr << std::endl; + return 1; + } + unsigned char uc = (unsigned char) c; + name[i] = uc; + } + } + + std::cerr << "Configuration File Signature: " << std::endl; + for(i = 0; i < signlen; i++) + { + fprintf(stderr, "%02x", (unsigned char) name[i]); + } + std::cerr << std::endl; + + + // when we get here - should have the final signature in the buffer. + // check. + // + // compare signatures. + // instead of verifying with the public key.... + // we'll sign it again - and compare .... FIX LATER... + + EVP_MD_CTX *mdctx = EVP_MD_CTX_create(); + + if (0 == EVP_SignInit(mdctx, EVP_sha1())) + { + std::cerr << "EVP_SignInit Failure!" << std::endl; + } + + if (0 == EVP_SignUpdate(mdctx, conftxt.c_str(), conftxt.length())) + { + std::cerr << "EVP_SignUpdate Failure!" << std::endl; + } + + if (0 == EVP_SignFinal(mdctx, conf_signature, &signlen, pkey)) + { + std::cerr << "EVP_SignFinal Failure!" << std::endl; + } + + EVP_MD_CTX_destroy(mdctx); + fclose(cfd); + + std::cerr << "Recalced File Signature: " << std::endl; + for(i = 0; i < signlen; i++) + { + fprintf(stderr, "%02x", conf_signature[i]); + } + std::cerr << std::endl; + + bool same = true; + for(i = 0; i < signlen; i++) + { + if ((unsigned char) name[i] != conf_signature[i]) + { + same = false; + } + } + + if (same == false) + { + std::cerr << "ERROR VALIDATING CONFIGURATION!" << std::endl; + std::cerr << "PLEASE FIX!" << std::endl; + return -1; + } + std::list::iterator it; + std::list::iterator it2; + for(it = fnames.begin(), it2 = hashes.begin(); it != fnames.end(); it++, it2++) + { + std::string neighfile = neighdir + (*it) + ".pqi"; + cert *nc = loadcertificate(neighfile.c_str(), (*it2)); + if (nc != NULL) + { + if (0 > addCertificate(nc)) + { + // cleanup. + std::cerr << "Updated Certificate....but no"; + std::cerr << " need for addition"; + std::cerr << std::endl; + // X509_free(nc -> certificate); + //delete nc; + } + } + } + for(mit = tmpsettings.begin(); mit != tmpsettings.end(); mit++) + { + settings[mit -> first] = mit -> second; + } + return 1; +} + + +const int PQI_SSLROOT_CERT_CONFIG_SIZE = 1024; + +int sslroot::savecertificate(cert *c, const char *fname) +{ + // load certificates from file. + FILE *setfp = fopen(fname, "wb"); + if (setfp == NULL) + { + std::cerr << "sslroot::savecertificate() Bad File: " << fname; + std::cerr << " Cannot be Written!" << std::endl; + return -1; + } + + std::cerr << "Writing out Cert...:" << c -> Name() << std::endl; + PEM_write_XPGP(setfp, c -> certificate); + + // writing out details.... + + // read in a line..... + int size = PQI_SSLROOT_CERT_CONFIG_SIZE; + char line[size]; + std::list::iterator it; + + int i; + + // This will need to be made portable..... + + struct sockaddr_in *addr_inet; + struct sockaddr_in *addr_inet2; + struct sockaddr_in *addr_inet3; + + int pos_status = 0; + int pos_addr = sizeof(int); + int pos_addr2 = pos_addr + sizeof(*addr_inet); + int pos_addr3 = pos_addr2 + sizeof(*addr_inet2); + + int pos_lcts = pos_addr3 + sizeof(*addr_inet3); + int pos_lrts = pos_lcts + sizeof(int); + int pos_ncts = pos_lrts + sizeof(int); + int pos_ncvl = pos_ncts + sizeof(int); + int pos_name = pos_ncvl + sizeof(int); + int pos_end = pos_name + 20; // \n. for readability. + + int *status = (int *) &(line[pos_status]); + addr_inet = (struct sockaddr_in *) &(line[pos_addr]); + addr_inet2 = (struct sockaddr_in *) &(line[pos_addr2]); + addr_inet3 = (struct sockaddr_in *) &(line[pos_addr3]); + int *lcts = (int *) &(line[pos_lcts]); + int *lrts = (int *) &(line[pos_lrts]); + int *ncts = (int *) &(line[pos_ncts]); + int *ncvl = (int *) &(line[pos_ncvl]); + char *name = &(line[pos_name]); + char *end = &(line[pos_end]); + + for(i = 0; i < 1024; i++) + line[i] = 0; + + *status = c -> Status(); + *addr_inet = c -> lastaddr; + *addr_inet2 = c -> localaddr; + *addr_inet3 = c -> serveraddr; + + *lcts = c -> lc_timestamp; + *lrts = c -> lr_timestamp; + *ncts = c -> nc_timestamp; + *ncvl = c -> nc_timeintvl; + + std::string tmpname = c -> Name(); + for(i = 0; (i < (signed) tmpname.length()) && (i < 20 - 1); i++) + { + name[i] = tmpname[i]; + } + name[20 - 1] = '\0'; + end[0] = '\n'; + + /* now convert it to hex */ + char config_hex[2 * size]; + for(i = 0; i < size; i++) + { + sprintf(&(config_hex[i * 2]), "%02x", + (unsigned int) ((unsigned char *) line)[i]); + } + + if (1 != fwrite(config_hex, size * 2,1, setfp)) + { + std::cerr << "Error Writing Peer Record!" << std::endl; + return -1; + } + fclose(setfp); + + // then reopen to generate hash. + setfp = fopen(fname, "rb"); + if (setfp == NULL) + { + std::cerr << "sslroot::savecertificate() Bad File: " << fname; + std::cerr << " Opened for ReHash!" << std::endl; + return -1; + } + + unsigned int signlen = EVP_PKEY_size(pkey); + unsigned char signature[signlen]; + + int maxsize = 20480; + int rbytes; + char inall[maxsize]; + if (0 == (rbytes = fread(inall, 1, maxsize, setfp))) + { + std::cerr << "Error Writing Peer Record!" << std::endl; + return -1; + } + std::cerr << "Read " << rbytes << std::endl; + + // so we read rbytes. + // hash. + //OpenSSL_add_all_digests(); + + EVP_MD_CTX *mdctx = EVP_MD_CTX_create(); + + if (0 == EVP_SignInit_ex(mdctx, EVP_sha1(), NULL)) + { + std::cerr << "EVP_SignInit Failure!" << std::endl; + } + + if (0 == EVP_SignUpdate(mdctx, inall, rbytes)) + { + std::cerr << "EVP_SignUpdate Failure!" << std::endl; + } + + if (0 == EVP_SignFinal(mdctx, signature, &signlen, pkey)) + { + std::cerr << "EVP_SignFinal Failure!" << std::endl; + } + + std::cerr << "Saved Cert: " << c -> Name() << " Status: "; + std::cerr << std::hex << (unsigned int) c->Status() << std::dec << std::endl; + + std::cerr << "Cert + Setting Signature is(" << signlen << "): "; + std::string signstr; + for(i = 0; i < (signed) signlen; i++) + { + fprintf(stderr, "%02x", signature[i]); + signstr += signature[i]; + } + std::cerr << std::endl; + + c -> Hash(signstr); + std::cerr << "Stored Hash Length: " << (c -> Hash()).length() << std::endl; + std::cerr << "Real Hash Length: " << signlen << std::endl; + + fclose(setfp); + + EVP_MD_CTX_destroy(mdctx); + + return 1; +} + +cert *sslroot::loadcertificate(const char *fname, std::string hash) +{ + // if there is a hash - check that the file matches it before loading. + FILE *pcertfp; + + /* We only check a signature's hash if + * we are loading from a configuration file. + * Therefore we saved the file and it should be identical. + * and a direct load + verify will work. + * + * If however it has been transported by email.... + * Then we might have to correct the data (strip out crap) + * from the configuration at the end. (XPGP load should work!) + */ + + if (hash.length() > 1) + { + pcertfp = fopen(fname, "rb"); + // load certificates from file. + if (pcertfp == NULL) + { + std::cerr << "sslroot::loadcertificate() Bad File: " << fname; + std::cerr << " Cannot be Hashed!" << std::endl; + return NULL; + } + + unsigned int signlen = EVP_PKEY_size(pkey); + unsigned char signature[signlen]; + + int maxsize = 20480; /* should be enough for about 50 signatures */ + int rbytes; + char inall[maxsize]; + if (0 == (rbytes = fread(inall, 1, maxsize, pcertfp))) + { + std::cerr << "Error Reading Peer Record!" << std::endl; + return NULL; + } + //std::cerr << "Read " << rbytes << std::endl; + + + EVP_MD_CTX *mdctx = EVP_MD_CTX_create(); + + if (0 == EVP_SignInit_ex(mdctx, EVP_sha1(), NULL)) + { + std::cerr << "EVP_SignInit Failure!" << std::endl; + } + + if (0 == EVP_SignUpdate(mdctx, inall, rbytes)) + { + std::cerr << "EVP_SignUpdate Failure!" << std::endl; + } + + if (0 == EVP_SignFinal(mdctx, signature, &signlen, pkey)) + { + std::cerr << "EVP_SignFinal Failure!" << std::endl; + } + + fclose(pcertfp); + EVP_MD_CTX_destroy(mdctx); + + bool same = true; + if (signlen != hash.length()) + { + std::cerr << "Different Length Signatures... "; + std::cerr << "Cannot Load Certificate!" << std::endl; + return NULL; + } + + for(int i = 0; i < (signed) signlen; i++) + { + if (signature[i] != (unsigned char) hash[i]) + { + same = false; + std::cerr << "Invalid Signature... "; + std::cerr << "Cannot Load Certificate!" << std::endl; + return NULL; + } + } + std::cerr << "Verified Signature for: " << fname; + std::cerr << std::endl; + + + } + else + { + std::cerr << "Not checking cert signature" << std::endl; + } + + pcertfp = fopen(fname, "rb"); + + // load certificates from file. + if (pcertfp == NULL) + { + std::cerr << "sslroot::loadcertificate() Bad File: " << fname; + std::cerr << " Cannot be Read!" << std::endl; + return NULL; + } + + + XPGP *pc; + cert *npc = NULL; + + if ((pc = PEM_read_XPGP(pcertfp, NULL, NULL, NULL)) != NULL) + { + // read a certificate. + std::cerr << "Loaded Certificate: "; + std::cerr << pc -> name << std::endl; + + npc = makeCertificateXPGP(pc); + if (npc == NULL) + { + std::cerr << "Failed to Create Cert!" << std::endl; + return NULL; + } + } + else // (pc == NULL) + { + unsigned long err = ERR_get_error(); + std::cerr << "Read Failed .... CODE(" << err << ")" << std::endl; + std::cerr << ERR_error_string(err, NULL) << std::endl; + return NULL; + } + + // Now we try to read in 1024 bytes..... + // if successful, then have settings! + + // read in a line..... + int size = PQI_SSLROOT_CERT_CONFIG_SIZE; + char config_hex[PQI_SSLROOT_CERT_CONFIG_SIZE * 4]; /* double for extra space */ + char line[PQI_SSLROOT_CERT_CONFIG_SIZE]; + + /* load as much as possible into the config_hex. + */ + + int rbytes = fread(config_hex, 1, size * 4, pcertfp); + bool configLoaded = false; + int i, j; + + if (rbytes < size * 2) + { + if ((hash.size() > 1) && (rbytes >= size)) + { + /* old format certificate (already verified) */ + std::cerr << "Loading Old Style Cert Config" << std::endl; + memcpy(line, config_hex, size); + configLoaded = true; + } + else + { + std::cerr << "Error Reading Setting: Only Cert Retrieved" << std::endl; + return npc; + } + } + + /* if there was no hash then we need to check it */ + if (hash.size() <= 1) + { + std::cerr << "Checking Cert Configuration for spam char" << std::endl; + for(i = 0, j = 0; i < rbytes; i++) + { + if (isxdigit(config_hex[i])) + { + config_hex[j++] = config_hex[i]; + } + else + { + std::cerr << "Stripped out:" << config_hex[i] << " or " + << (int) config_hex[i] << "@" << i + << " j:" << j << std::endl; + } + + } + if (j < size * 2) + { + std::cerr << "Error Cert Config wrong size" << std::endl; + return npc; + } + std::cerr << "Stripped out " << i - j << " spam chars" << std::endl; + } + + /* now convert the hex into binary */ + if (!configLoaded) + { + for(i = 0; i < size; i++) + { + ((unsigned char *) line)[i] = convertHexToChar( + config_hex[2 * i], config_hex[2 * i + 1]); + } + configLoaded = true; + } + + // Data arrangment. + // so far + // ------------ + // 4 - (int) status + // 8 - sockaddr + // 8 - sockaddr + // 8 - sockaddr + // 4 - lc_timestamp + // 4 - lr_timestamp + // 4 - nc_timestamp + // 4 - nc_timeintvl + // 20 - name. + // 1 - end + + // This will need to be made portable..... + + struct sockaddr_in *addr_inet; + struct sockaddr_in *addr_inet2; + struct sockaddr_in *addr_inet3; + + //int pos_status = 0; + int pos_addr = sizeof(int); + int pos_addr2 = pos_addr + sizeof(*addr_inet); + int pos_addr3 = pos_addr2 + sizeof(*addr_inet2); + int pos_lcts = pos_addr3 + sizeof(*addr_inet3); + + int pos_lrts = pos_lcts + sizeof(int); + int pos_ncts = pos_lrts + sizeof(int); + int pos_ncvl = pos_ncts + sizeof(int); + int pos_name = pos_ncvl + sizeof(int); + //int pos_end = pos_name + 20; // \n. for readability. + + int *status = (int *) line; + addr_inet = (struct sockaddr_in *) &(line[pos_addr]); + addr_inet2 = (struct sockaddr_in *) &(line[pos_addr2]); + addr_inet3 = (struct sockaddr_in *) &(line[pos_addr3]); + int *lcts = (int *) &(line[pos_lcts]); + int *lrts = (int *) &(line[pos_lrts]); + int *ncts = (int *) &(line[pos_ncts]); + int *ncvl = (int *) &(line[pos_ncvl]); + char *name = &(line[pos_name]); + //char *end = &(line[pos_end]); + + // end of data structures.... + + + + // fill in the data. + cert *c = npc; + c -> Status(*status); + + std::cerr << "Loaded Cert: " << c -> Name() << " Prev Status: "; + std::cerr << std::hex << (unsigned int) c->Status() << std::dec << std::endl; + + // but ensure that inUse is not set. + c -> InUse(false); + + c -> lastaddr = *addr_inet; + c -> localaddr = *addr_inet2; + c -> serveraddr = *addr_inet3; + + c -> lc_timestamp = *lcts; + c -> lr_timestamp = *lrts; + c -> nc_timestamp = *ncts; + c -> nc_timeintvl = *ncvl; + + + name[20 - 1] = '\0'; + c -> Name(std::string(name)); + + // save the hash. + c -> Hash(hash); + + fclose(pcertfp); + + // small hack - as the timestamps seem wrong..... + // could be a saving thing - or a bug.... + c -> lc_timestamp = 0; + c -> lr_timestamp = 0; + + // reset these. as well. + c -> nc_timestamp = 0; + c -> nc_timeintvl = 5; + + return c; +} + + // for sending stuff as text + // cert * loadCertFromString(std::string pem); + // std::string saveCertAsString(cert *c); + // + +std::string sslroot::saveCertAsString(cert *c) +{ + // save certificate to a string, + // must use a BIO. + std::string certstr; + BIO *bp = BIO_new(BIO_s_mem()); + + std::cerr << "saveCertAsString:" << c -> Name() << std::endl; + PEM_write_bio_XPGP(bp, c -> certificate); + + /* translate the bp data to a string */ + char *data; + int len = BIO_get_mem_data(bp, &data); + for(int i = 0; i < len; i++) + { + certstr += data[i]; + } + + BIO_free(bp); + + return certstr; +} + +cert *sslroot::loadCertFromString(std::string pem) +{ + /* Put the data into a mem BIO */ + char *certstr = strdup(pem.c_str()); + + BIO *bp = BIO_new_mem_buf(certstr, -1); + + XPGP *pc; + cert *npc = NULL; + + pc = PEM_read_bio_XPGP(bp, NULL, NULL, NULL); + + BIO_free(bp); + free(certstr); + + if (pc != NULL) + { + // read a certificate. + std::cerr << "loadCertFromString: "; + std::cerr << pc -> name << std::endl; + + npc = makeCertificateXPGP(pc); + if (npc == NULL) + { + std::cerr << "Failed to Create Cert!" << std::endl; + return NULL; + } + } + else // (pc == NULL) + { + unsigned long err = ERR_get_error(); + std::cerr << "Read Failed .... CODE(" << err << ")" << std::endl; + std::cerr << ERR_error_string(err, NULL) << std::endl; + return NULL; + } + + // small hack - as the timestamps seem wrong..... + // could be a saving thing - or a bug.... + npc -> lc_timestamp = 0; + npc -> lr_timestamp = 0; + + // reset these. as well. + npc -> nc_timestamp = 0; + npc -> nc_timeintvl = 5; + + return npc; +} + + +unsigned char convertHexToChar(unsigned char a, unsigned char b) +{ + int num1 = 0; + int num2 = 0; + if (('0' <= a) && ('9' >= a)) + { + num1 = a - '0'; + } + else if (('a' <= a) && ('f' >= a)) + { + num1 = 10 + a - 'a'; + } + else if (('A' <= a) && ('F' >= a)) + { + num1 = 10 + a - 'A'; + } + + if (('0' <= b) && ('9' >= b)) + { + num2 = b - '0'; + } + else if (('a' <= b) && ('f' >= b)) + { + num2 = 10 + b - 'a'; + } + else if (('A' <= b) && ('F' >= b)) + { + num2 = 10 + b - 'A'; + } + + num1 *= 16; + num1 += num2; + + return (unsigned char) num1; +} + +int sslroot::printCertificate(cert *c, std::ostream &out) +{ + out << "Cert Name:" << (c -> certificate) -> name << std::endl; + //X509_print_fp(stderr, c -> certificate); + return 1; +} + +// This function will clean up X509 *c if necessary. +// This fn will also collate the signatures.... +// that are received via p3disc. +// (connections -> registerCertificate, which does similar sign merging) +// +cert *sslroot::makeCertificateXPGP(XPGP *c) +{ + if (c == NULL) + { + return NULL; + } + + // At this point we check to see if there is a duplicate. + cert *dup = checkDuplicateXPGP(c); + cert *npc = NULL; + if (dup == NULL) + { + npc = new cert(); + npc -> certificate = c; + if (!addtosignmap(npc)) // only allow the cert if no dup + { + std::cerr << "sslroot::makeCertificate()"; + std::cerr << "Failed to Get Signature - Not Allowed!"; + std::cerr << std::endl; + + // failed!... cannot add it!. + delete npc; + return NULL; + } + + /* setup the defaults */ + npc -> Status(PERSON_STATUS_MANUAL); + npc -> trustLvl = -1; + // set Tag to be their X509CN. + npc -> Name(getX509CNString(npc->certificate-> + subject->subject)); + + allcerts.push_back(npc); + std::cerr << "sslroot::makeCertificate() For " << c -> name; + std::cerr << " A-Okay!" << std::endl; + // at this point we need to add to the signaturelist.... + + } + else if (c == dup -> certificate) + { + // identical - so okay. + npc = dup; + std::cerr << "sslroot::makeCertificate() For " << c -> name; + std::cerr << " Found Identical - A-Okay!" << std::endl; + } + else + { + std::cerr << "sslroot::makeCertificate() For " << c -> name; + std::cerr << " Cleaning up other XPGP!" << std::endl; + std::cerr << " Also moving new signatures ... " << std::endl; + // clean up c. + XPGP_copy_known_signatures(pgp_keyring, dup -> certificate, c); + XPGP_free(c); + npc = dup; + } + return npc; +} + + +cert *sslroot::checkDuplicateXPGP(XPGP *x) +{ + if (x == NULL) + return NULL; + + // loop through and print - then check. + std::list::iterator it; + for(it = allcerts.begin(); it != allcerts.end(); it++) + { + if (0 == XPGP_cmp((*it) -> certificate, x)) + { + return (*it); + } + } + return NULL; +} + + +cert *sslroot::checkPeerXPGP(XPGP *x) +{ + if (x == NULL) + return NULL; + + // loop through and print - then check. + std::list::iterator it; + for(it = peercerts.begin(); it != peercerts.end(); it++) + { + if (0 == XPGP_cmp((*it) -> certificate, x)) + { + return (*it); + } + } + return NULL; +} + + + +cert *sslroot::findpeercert(const char *name) +{ + // loop through and print - then check. + //std::cerr << "Checking Certs for: " << name << std::endl; + std::list::iterator it; + for(it = peercerts.begin(); it != peercerts.end(); it++) + { + char *certname = ((*it) -> certificate) -> name; + //std::cerr << "Cert Name:" << certname << std::endl; + if (strstr(certname, name) != NULL) + { + //std::cerr << "Matches!" << std::endl; + return (*it); + } + } + std::cerr << "sslroot::findpeercert() Failed!" << std::endl; + return NULL; +} + +// returns zero for the same. +int sslroot::compareCerts(cert *a, cert *b) +{ + // std::cerr << "Comparing Certificates:" << std::endl; + //printCertificate(a); + //printCertificate(b); + //X509_print_fp(stderr, a -> certificate); + //X509_print_fp(stderr, b -> certificate); + + int val = XPGP_cmp(a -> certificate, b -> certificate); + + std::cerr << "Certificate Comparison Returned: " << val << std::endl; + + return val; +} + +cert * sslroot::registerCertificateXPGP(XPGP *nc, struct sockaddr_in raddr, bool in) +{ + if (nc == NULL) + return NULL; + + // shoud check all certs. + cert *c = checkDuplicateXPGP(nc); + if (c != NULL) + { + if (c -> certificate == nc) + { + std::cerr << "sslroot::registerCertificate()"; + std::cerr << " Found Identical XPGP cert"; + std::cerr << std::endl; + } + else + { + std::cerr << "sslroot::registerCertificate()"; + std::cerr << " Found Same XPGP cert/diff mem - Clean"; + std::cerr << std::endl; + std::cerr << "sslroot::registerCertificate()"; + std::cerr << " Copying New Signatures before deleting"; + std::cerr << std::endl; + /* copy across the signatures -> if necessary */ + XPGP_copy_known_signatures(pgp_keyring, c->certificate, nc); + XPGP_free(nc); + } + + if (!c -> Connected()) + { + c -> lastaddr = raddr; + + if (in == true) + { + c -> lr_timestamp = time(NULL); + // likely to be server address + // (with default port) + // if null! + if (!isValidNet(&(c -> serveraddr.sin_addr))) + { + std::cerr << "Guessing Default Server Addr!"; + std::cerr << std::endl; + c -> serveraddr = raddr; + c -> serveraddr.sin_port = + htons(PQI_DEFAULT_PORT); + } + } + else + { + c -> lc_timestamp = time(NULL); + // also likely to be servera address, + // but we can check and see if its local. + // can flag local + if (0 == inaddr_cmp(c -> localaddr, raddr)) + { + c -> Local(true); + // don't set serveraddr -> just ignore + } + else + { + c -> serveraddr = raddr; + c -> Firewalled(false); + } + } + } + else + { + std::cerr << "WARNING: attempt to reg CONNECTED Cert!"; + std::cerr << std::endl; + } + return c; + } + + std::cerr << "sslroot::registerCertificate() Certificate Not Found!" << std::endl; + std::cerr << "Saving :" << nc -> name << std::endl; + std::cerr << std::endl; + + cert *npc = makeCertificateXPGP(nc); + if (npc == NULL) + { + std::cerr << "Failed to Make Certificate"; + std::cerr << std::endl; + return NULL; + } + + npc -> Name(nc -> name); + + npc -> lastaddr = raddr; + if (in == true) + { + npc -> lr_timestamp = time(NULL); + // likely to be server address (with default port) + std::cerr << "Guessing Default Server Addr!"; + std::cerr << std::endl; + npc -> serveraddr = raddr; + npc -> serveraddr.sin_port = htons(PQI_DEFAULT_PORT); + } + else + { + npc -> lc_timestamp = time(NULL); + + // as it is a new cert... all fields are + // null and the earlier tests must be + // delayed until the discovery packets. + + // also likely to be server. + npc -> serveraddr = raddr; + } + + // push back onto collected. + npc -> nc_timestamp = 0; + collectedcerts.push_back(npc); + + // return NULL to indicate that it dosen't yet exist in dbase. + return NULL; +} + +cert * sslroot::getCollectedCert() +{ + if (collectedcerts.size() < 1) + return NULL; + + cert *c = collectedcerts.front(); + collectedcerts.pop_front(); + return c; +} + +bool sslroot::collectedCerts() +{ + return (collectedcerts.size() > 0); +} + + +int sslroot::removeCertificate(cert *c) +{ + if (c -> InUse()) + { + std::cerr << "sslroot::removeCertificate() Failed" << std::endl; + std::cerr << "\t a cert is in use." << std::endl; + return -1; + } + + std::list::iterator it; + for(it = peercerts.begin(); it != peercerts.end(); it++) + { + if (c == (*it)) + { + peercerts.erase(it); + + c -> InUse(false); + c -> Accepted(false); + + std::cerr << "sslroot::removeCertificate() "; + std::cerr << "Success!" << std::endl; + std::cerr << "\tMoved to Collected Certs" << std::endl; + + /* remove from the keyring */ + XPGP_remove_certificate(pgp_keyring, c->certificate); + + collectedcerts.push_back(c); + + certsChanged.IndicateChanged(); + certsMajorChanged.IndicateChanged(); + return 1; + } + } + std::cerr << "sslroot::removeCertificate() "; + std::cerr << "Failed to Match Cert!" << std::endl; + + return 0; +} + + +int sslroot::addCertificate(cert *c) +{ + std::cerr << "sslroot::addCertificate()" << std::endl; + c -> InUse(false); + // let most flags through. + //c -> Accepted(false); + //c -> WillConnect(false); + if (c -> certificate == NULL) + { + std::cerr << "sslroot::addCertificate() certificate==NULL" << std::endl; + std::cerr << "\tNot Adding Certificate!" << std::endl; + return 0; + } + + cert *dup = checkPeerXPGP(c -> certificate); + if (dup != NULL) + { + std::cerr << "sslroot::addCertificate() Not Adding"; + std::cerr << "Certificate with duplicate...." << std::endl; + std::cerr << "\t\tTry RegisterCertificate() " << std::endl; + + return -1; + } + + // else put in in the list. + peercerts.push_back(c); + + /* add to keyring */ + XPGP_add_certificate(pgp_keyring, c->certificate); + + /* if this should be a trusted cert... setup */ + if (c-> Trusted()) + { + if (XPGP_signer_trusted(pgp_keyring, c -> certificate)) + { + c -> Trusted(true); + } + else + { + c -> Trusted(false); + } + } + + c -> trustLvl = XPGP_auth_certificate(pgp_keyring, c->certificate); + + certsChanged.IndicateChanged(); + certsMajorChanged.IndicateChanged(); + + return 1; +} + + +int sslroot::addUntrustedCertificate(cert *c) +{ + // blank it all. + c -> Status(PERSON_STATUS_MANUAL); + // set Tag to be their X509CN. + c -> Name(getX509CNString(c -> certificate -> subject -> subject)); + + return addCertificate(c); +} + + +int sslroot::addCollectedCertificate(cert *c) +{ + // blank it all. + c -> Status(PERSON_STATUS_MANUAL); + // set Tag to be their X509CN. + c -> Name(getX509CNString(c -> certificate -> subject -> subject)); + + // put in the collected certs ... + collectedcerts.push_back(c); + return 1; +} + + + +int sslroot::validateCertificateXPGP(cert *c) +{ + std::cerr << "sslroot::validateCertificate() Why Not!" << std::endl; + if (XPGP_check_valid_certificate(c->certificate)) + { + c -> Valid(true); + } + else + { + c -> Valid(false); + } + std::cerr << "Cert Status: " << c -> Status() << std::endl; + return 1; +} + + +/* this redoes the trust calculations */ +int sslroot::checkAuthCertificate(cert *xpgp) +{ + std::cerr << "sslroot::checkAuthCertificate()" << std::endl; + if ((xpgp == NULL) || (xpgp -> certificate == NULL)) + { + return -1; + } + + /* reevaluate the auth of the xpgp */ + xpgp -> trustLvl = XPGP_auth_certificate(pgp_keyring, xpgp->certificate); + + /* this also merges the signature into the keyring */ + certsChanged.IndicateChanged(); + certsMajorChanged.IndicateChanged(); + return 1; +} + + +int sslroot::signCertificate(cert *xpgp) +{ + std::cerr << "sslroot::signCertificate()" << std::endl; + cert *own = getOwnCert(); + + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, + "sslroot::signCertificate()"); + + /* check that cert is suitable */ + /* sign it */ + XPGP_sign_certificate(pgp_keyring, xpgp -> certificate, own -> certificate); + + /* reevaluate the auth of the xpgp */ + xpgp -> trustLvl = XPGP_auth_certificate(pgp_keyring, xpgp->certificate); + + /* this also merges the signature into the keyring */ + certsChanged.IndicateChanged(); + certsMajorChanged.IndicateChanged(); + return 1; +} + +int sslroot::trustCertificate(cert *c, bool totrust) +{ + std::cerr << "sslroot::trustCertificate()" << std::endl; + /* check auth status of certificate */ + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, + "sslroot::trustCertificate()"); + + /* if trusted -> untrust */ + if (!totrust) + { + XPGP_signer_untrusted(pgp_keyring, c -> certificate); + c -> Trusted(false); + } + else + { + /* if auth then we can trust them */ + if (XPGP_signer_trusted(pgp_keyring, c -> certificate)) + { + c -> Trusted(true); + } + } + + /* reevaluate the auth of the xpgp */ + c -> trustLvl = XPGP_auth_certificate(pgp_keyring, c->certificate); + + certsChanged.IndicateChanged(); + certsMajorChanged.IndicateChanged(); + + return 1; +} + +int sslroot::superNodeMode() +{ +# +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS // UNIX only. + + XPGP_supernode(pgp_keyring); +#endif +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ + return 1; +} + +/***** REMOVED!!! + * + * +std::list sslroot::listCertificates() +{ + std::list names; + std::list::iterator it; + for(it = peercerts.begin(); it != peercerts.end(); it++) + { + names.push_back(((*it) -> certificate) -> name); + } + return names; +} + * + * + * + */ + + +bool sslroot::CertsChanged() +{ + return certsChanged.Changed(0); +} + +bool sslroot::CertsMajorChanged() +{ + return certsMajorChanged.Changed(0); +} + +void sslroot::IndicateCertsChanged() +{ + certsChanged.IndicateChanged(); +} + + +std::list &sslroot::getCertList() +{ + return peercerts; +} + +std::string sslroot::getSetting(std::string opt) +{ + std::map::iterator it; + if (settings.end() != (it = settings.find(opt))) + { + // found setting. + std::cerr << "sslroot::getSetting(" << opt << ") = "; + std::cerr << it -> second << std::endl; + return it -> second; + } + // else return empty string. + std::cerr << "sslroot::getSetting(" << opt; + std::cerr << ") Not There!" << std::endl; + + std::string empty(""); + return empty; +} + +void sslroot::setSetting(std::string opt, std::string val) +{ + // check settings.. + std::cerr << "sslroot::saveSetting(" << opt << ", "; + std::cerr << val << ")" << std::endl; + + settings[opt] = val; + return; +} + +cert *sslroot::getOwnCert() +{ + return own_cert; +} + +int sslroot::checkNetAddress() +{ + std::list addrs = getLocalInterfaces(); + std::list::iterator it; + + bool found = false; + for(it = addrs.begin(); (!found) && (it != addrs.end()); it++) + { + if ((*it) == inet_ntoa(own_cert -> localaddr.sin_addr)) + { + found = true; + } + } + /* check that we didn't catch 0.0.0.0 - if so go for prefered */ + if ((found) && (own_cert -> localaddr.sin_addr.s_addr == 0)) + { + found = false; + } + + if (!found) + { + own_cert -> localaddr.sin_addr = getPreferredInterface(); + } + if ((isPrivateNet(&(own_cert -> localaddr.sin_addr))) || + (isLoopbackNet(&(own_cert -> localaddr.sin_addr)))) + { + own_cert -> Firewalled(true); + } + else + { + //own_cert -> Firewalled(false); + } + + int port = ntohs(own_cert -> localaddr.sin_port); + if ((port < PQI_MIN_PORT) || (port > PQI_MAX_PORT)) + { + own_cert -> localaddr.sin_port = htons(PQI_DEFAULT_PORT); + } + + /* if localaddr = serveraddr, then ensure that the ports + * are the same (modify server)... this mismatch can + * occur when the local port is changed.... + */ + + if (own_cert -> localaddr.sin_addr.s_addr == + own_cert -> serveraddr.sin_addr.s_addr) + { + own_cert -> serveraddr.sin_port = + own_cert -> localaddr.sin_port; + } + + // ensure that address family is set, otherwise windows Barfs. + own_cert -> localaddr.sin_family = AF_INET; + own_cert -> serveraddr.sin_family = AF_INET; + own_cert -> lastaddr.sin_family = AF_INET; + + return 1; +} + + + + +/********** SSL ERROR STUFF ******************************************/ + +int printSSLError(SSL *ssl, int retval, int err, unsigned long err2, + std::ostream &out) +{ + std::string reason; + + std::string mainreason = std::string("UNKNOWN ERROR CODE"); + if (err == SSL_ERROR_NONE) + { + mainreason = std::string("SSL_ERROR_NONE"); + } + else if (err == SSL_ERROR_ZERO_RETURN) + { + mainreason = std::string("SSL_ERROR_ZERO_RETURN"); + } + else if (err == SSL_ERROR_WANT_READ) + { + mainreason = std::string("SSL_ERROR_WANT_READ"); + } + else if (err == SSL_ERROR_WANT_WRITE) + { + mainreason = std::string("SSL_ERROR_WANT_WRITE"); + } + else if (err == SSL_ERROR_WANT_CONNECT) + { + mainreason = std::string("SSL_ERROR_WANT_CONNECT"); + } + else if (err == SSL_ERROR_WANT_ACCEPT) + { + mainreason = std::string("SSL_ERROR_WANT_ACCEPT"); + } + else if (err == SSL_ERROR_WANT_X509_LOOKUP) + { + mainreason = std::string("SSL_ERROR_WANT_X509_LOOKUP"); + } + else if (err == SSL_ERROR_SYSCALL) + { + mainreason = std::string("SSL_ERROR_SYSCALL"); + } + else if (err == SSL_ERROR_SSL) + { + mainreason = std::string("SSL_ERROR_SSL"); + } + out << "RetVal(" << retval; + out << ") -> SSL Error: " << mainreason << std::endl; + out << "\t + ERR Error: " << ERR_error_string(err2, NULL) << std::endl; + return 1; +} + +cert::cert() + :certificate(NULL), hash("") +{ + return; +} + +cert::~cert() +{ + return; +} + +std::string cert::Signature() +{ + if (certificate == NULL) + { + return Name(); + } + else + { + std::ostringstream out; + certsign cs; + getSSLRoot() -> getcertsign(this, cs); + + out << std::hex; + for(int i = 0; i < CERTSIGNLEN; i++) + { + + unsigned char n = cs.data[i]; + out << std::hex << std::setw(2) << std::setfill('0') + << std::setprecision(2) << (unsigned int) n; + } + return out.str(); + } +} + +std::string cert::Hash() +{ + return hash; +} + + +void cert::Hash(std::string h) +{ + hash = h; + return; +} + + + +/********************* signature stuff *********************/ + +bool certsign::operator<(const certsign &ref) const +{ + //compare the signature. + if (0 > memcmp(data, ref.data, CERTSIGNLEN)) + return true; + return false; +} + + +bool certsign::operator==(const certsign &ref) const +{ + //compare the signature. + return (0 == memcmp(data, ref.data, CERTSIGNLEN)); +} + + +/* Fns for relating cert signatures to structures */ +cert *sslroot::findcertsign(certsign &sign) +{ + std::map::iterator it; + + std::ostringstream out; + out << "sslroot::findcertsign()" << std::endl; + for (it = signmap.begin(); it != signmap.end(); it++) + { + out << "Checking Vs " << it -> second -> Name(); + if (sign == it -> first) + { + out << "Match!"; + } + out << std::endl; + } + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, out.str()); + + if (signmap.end() != (it = signmap.find(sign))) + { + return it -> second; + } + pqioutput(PQL_WARNING, pqisslrootzone, + "sslroot::findcertsign() ERROR: No Matching Entry"); + return NULL; +} + +int sslroot::getcertsign(cert *c, certsign &sign) +{ + // bug ... segv a couple of times here! + if ((c == NULL) || (c->certificate == NULL)) + { + pqioutput(PQL_ALERT, pqisslrootzone, + "sslroot::getcertsign() ERROR: NULL c || c->certificate"); + return 0; + } + + // a Bit of a hack here..... + // get the first signature.... + if (sk_XPGP_SIGNATURE_num(c->certificate->signs) < 1) + { + pqioutput(PQL_ALERT, pqisslrootzone, + "sslroot::getcertsign() ERROR: No Signatures"); + return 0; + } + XPGP_SIGNATURE *xpgpsign = sk_XPGP_SIGNATURE_value(c->certificate->signs, 0); + + // get the signature from the cert, and copy to the array. + ASN1_BIT_STRING *signature = xpgpsign->signature; + int signlen = ASN1_STRING_length(signature); + if (signlen < CERTSIGNLEN) + { + pqioutput(PQL_ALERT, pqisslrootzone, + "sslroot::getcertsign() ERROR: short Signature"); + return 0; + } + // else copy in the first CERTSIGNLEN. + unsigned char *signdata = ASN1_STRING_data(signature); + memcpy(sign.data, signdata, CERTSIGNLEN); + + return 1; +} + +int sslroot::addtosignmap(cert *c) +{ + certsign cs; + if (!getcertsign(c, cs)) + { + // error. + pqioutput(PQL_ALERT, pqisslrootzone, + "sslroot::addsigntomap() ERROR: Fail to getcertsign()"); + return 0; + } + cert *c2 = findcertsign(cs); + if (c2 == NULL) + { + // add, and return okay. + signmap[cs] = c; + return 1; + } + if (c2 != c) + { + // error. + pqioutput(PQL_ALERT, pqisslrootzone, + "sslroot::addsigntomap() ERROR: Duplicate Entry()"); + return 0; + } + + // else already exists. + return 1; +} + + + + +int sslroot::hashFile(std::string fname, unsigned char *hash, unsigned int hlen) +{ + // open the file. + // setup the hash. + + // pipe the file through. + + + return 1; +} + +int sslroot::hashDigest(char *data, unsigned int dlen, + unsigned char *hash, unsigned int hlen) +{ + EVP_MD_CTX *mdctx = EVP_MD_CTX_create(); + + if (0 == EVP_DigestInit_ex(mdctx, EVP_sha1(), NULL)) + { + std::cerr << "EVP_DigestInit Failure!" << std::endl; + return -1; + } + + if (0 == EVP_DigestUpdate(mdctx, data, dlen)) + { + std::cerr << "EVP_DigestUpdate Failure!" << std::endl; + return -1; + } + + unsigned int signlen = hlen; + if (0 == EVP_DigestFinal_ex(mdctx, hash, &signlen)) + { + std::cerr << "EVP_DigestFinal Failure!" << std::endl; + return -1; + } + + EVP_MD_CTX_destroy(mdctx); + return signlen; +} + + + +int sslroot::signDigest(EVP_PKEY *key, char *data, unsigned int dlen, + unsigned char *sign, unsigned int slen) +{ + unsigned int signlen = EVP_PKEY_size(key); + + { + std::ostringstream out; + out << "sslroot::signDigest(" << (void *) key; + out << ", " << (void *) data << ", " << dlen << ", "; + out << (void *) sign << ", " << slen << ")" << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, out.str()); + } + + if (signlen > slen) + { + pqioutput(PQL_ALERT, pqisslrootzone, + "sslroot::signDigest() Sign Length too short"); + return -1; + } + + EVP_MD_CTX *mdctx = EVP_MD_CTX_create(); + + if (0 == EVP_SignInit_ex(mdctx, EVP_sha1(), NULL)) + { + pqioutput(PQL_ALERT, pqisslrootzone, + "sslroot::signDigest() EVP_SignInit Failure!"); + return -1; + } + + if (0 == EVP_SignUpdate(mdctx, data, dlen)) + { + pqioutput(PQL_ALERT, pqisslrootzone, + "sslroot::signDigest() EVP_SignUpdate Failure!"); + return -1; + } + + signlen = slen; + if (0 == EVP_SignFinal(mdctx, sign, &signlen, key)) + { + pqioutput(PQL_ALERT, pqisslrootzone, + "sslroot::signDigest() EVP_SignFinal Failure!"); + return -1; + } + + { + // display signed data + std::ostringstream out; + out << "sslroot::signDigest() Data Display" << std::endl; + out << "Data To Sign (" << dlen << "):::::::::::::" << std::hex; + for(unsigned int i = 0; i < dlen; i++) + { + if (i % 16 == 0) + { + out << std::endl; + out << std::setw(4) << i << " : "; + } + out << std::setw(2) << (unsigned int) ((unsigned char *) data)[i] << " "; + } + out << std::endl; + out << "Signature (" << std::dec << slen << "):::::::::::::" << std::hex; + for(unsigned int i = 0; i < slen; i++) + { + if (i % 16 == 0) + { + out << std::endl; + out << std::setw(4) << i << " : "; + } + out << std::setw(2) << (unsigned int) ((unsigned char *) sign)[i] << " "; + } + out << std::endl; + out << "::::::::::::::::::::::::::::::::::::::::::::::" << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, out.str()); + + } + + + EVP_MD_CTX_destroy(mdctx); + return signlen; +} + + +int sslroot::verifyDigest(EVP_PKEY *key, char *data, unsigned int dlen, + unsigned char *sign, unsigned int slen) +{ + EVP_MD_CTX *mdctx = EVP_MD_CTX_create(); + + if (0 == EVP_VerifyInit_ex(mdctx, EVP_sha1(), NULL)) + { + pqioutput(PQL_ALERT, pqisslrootzone, + "sslroot::verifyDigest() EVP_VerifyInit Failure!"); + return -1; + } + + if (0 == EVP_VerifyUpdate(mdctx, data, dlen)) + { + pqioutput(PQL_ALERT, pqisslrootzone, + "sslroot::verifyDigest() EVP_VerifyUpdate Failure!"); + return -1; + } + + int vv; + if (0 > (vv = EVP_VerifyFinal(mdctx, sign, slen, key))) + { + pqioutput(PQL_ALERT, pqisslrootzone, + "sslroot::verifyDigest() EVP_VerifyFinale Failure!"); + return -1; + } + if (vv == 1) + { + pqioutput(PQL_DEBUG_BASIC, pqisslrootzone, + "sslroot::verifyDigest() Verified Signature OKAY"); + } + else + { + std::ostringstream out; + out << "sslroot::verifyDigest() Failed Verification!" << std::endl; + out << "Data To Verify (" << dlen << "):::::::::::::" << std::hex; + for(unsigned int i = 0; i < dlen; i++) + { + if (i % 16 == 0) + { + out << std::endl; + out << std::setw(4) << i << " : "; + } + out << std::setw(2) << (unsigned int) ((unsigned char *) data)[i] << " "; + } + out << std::endl; + out << "Signature (" << std::dec << slen << "):::::::::::::" << std::hex; + for(unsigned int i = 0; i < slen; i++) + { + if (i % 16 == 0) + { + out << std::endl; + out << std::setw(4) << i << " : "; + } + out << std::setw(2) << (unsigned int) ((unsigned char *) sign)[i] << " "; + } + out << std::endl; + out << "::::::::::::::::::::::::::::::::::::::::::::::" << std::endl; + out << "sslroot::verifyDigest() Should Clear SSL Error!"; + + pqioutput(PQL_ALERT, pqisslrootzone, out.str()); + } + + EVP_MD_CTX_destroy(mdctx); + return vv; +} + +// Think both will fit in the one Structure. +int sslroot::generateKeyPair(EVP_PKEY *keypair, unsigned int keylen) +{ + RSA *rsa = RSA_generate_key(2048, 65537, NULL, NULL); + EVP_PKEY_assign_RSA(keypair, rsa); + std::cerr << "sslroot::generateKeyPair()" << std::endl; + return 1; +} + +// Extra features for XPGP..... (for login window) + + + +// This fn installs and signs a trusted peer. +// It is limited to only working just after certificate creation. +// this is done by checking the timestamps. +// +// It should be called before the pqi handler is initiated, +// otherwise the connection will not be automatically started. + +int sslroot::loadInitialTrustedPeer(std::string tp_file) +{ + /* we will only do this if various conditions are met. + * (1) check validity of certificate + * (2) check that we don't have any other certificates loaded. + * (3) check that our certificate has just been created (timestamp) and only has one signature. + */ + + bool canLoad = true; + + std::string userName; + + /* check (1) valid cert */ + if (!LoadCheckXPGPandGetName(tp_file.c_str(),userName)) + { + std::cerr << "sslroot::loadInitialTrustedPeer() Failed TrustedPeer Checks!(1)"; + std::cerr << std::endl; + canLoad = false; + return 0; + } + + /* check (2) no other certificates loaded */ + if (peercerts.size() != 1) + { + /* too many certs loaded! */ + std::cerr << "sslroot::loadInitialTrustedPeer() Failed TrustedPeer Checks!(2a)"; + std::cerr << std::endl; + canLoad = false; + return 0; + } + + /* that one must be our own */ + cert *ourcert = getOwnCert(); + if ((!ourcert) || (ourcert != *(peercerts.begin())) || (!ourcert->certificate)) + { + /* too many certs loaded! */ + std::cerr << "sslroot::loadInitialTrustedPeer() Failed TrustedPeer Checks!(2b)"; + std::cerr << std::endl; + canLoad = false; + return 0; + } + + XPGP *xpgp = ourcert->certificate; + if (sk_XPGP_SIGNATURE_num(xpgp->signs) != 1) + { + /* too many certs loaded! */ + std::cerr << "sslroot::loadInitialTrustedPeer() Failed TrustedPeer Checks!(3a)"; + std::cerr << std::endl; + canLoad = false; + return 0; + } + + /* check own certificate timestamps */ + time_t cts = time(NULL); + X509_VAL *certv = xpgp->key->validity; + XPGP_SIGNATURE *ownsign = sk_XPGP_SIGNATURE_value(xpgp->signs, 0); + ASN1_TIME *signts = ownsign->timestamp; + ASN1_TIME *createts = certv->notBefore; + + /* compare timestamps + * Certificate timestamp should have been generated + * within the last 5 seconds, */ + time_t max_initts = cts - 5; + if ((0 > X509_cmp_time(createts, &max_initts)) || (0 > X509_cmp_time(signts, &max_initts))) + { + std::cerr << "sslroot::loadInitialTrustedPeer() Failed TrustedPeer Checks!(3b)"; + std::cerr << std::endl; + canLoad = false; + return 0; + } + + /* or if in the future! */ + if ((0 < X509_cmp_current_time(createts)) || (0 < X509_cmp_current_time(signts))) + { + std::cerr << "sslroot::loadInitialTrustedPeer() Failed TrustedPeer Checks!(3c)"; + std::cerr << std::endl; + canLoad = false; + return 0; + } + + /* if we get here - it has passed the tests, and we can sign it, and install it */ + cert *trusted_cert = loadcertificate(tp_file.c_str(), ""); /* no Hash! */ + if (!trusted_cert) + { + std::cerr << "sslroot::loadInitialTrustedPeer() Failed TrustedPeer Checks!(4a)"; + std::cerr << std::endl; + canLoad = false; + return 0; + } + + /* now add it */ + if (1 != addCertificate(trusted_cert)) + { + std::cerr << "sslroot::loadInitialTrustedPeer() Failed TrustedPeer Checks!(4b)"; + std::cerr << std::endl; + canLoad = false; + return 0; + } + + /* must set these flags completely - as they aren't changed */ + trusted_cert->Accepted(true); + trusted_cert->Manual(false); + trusted_cert->WillConnect(true); + trusted_cert->WillListen(true); + /* use existing firewall/forwarded flags */ + + /* sign it! (must be after add) */ + if (!signCertificate(trusted_cert)) + { + std::cerr << "sslroot::loadInitialTrustedPeer() Failed TrustedPeer Checks!(4c)"; + std::cerr << std::endl; + canLoad = false; + return 0; + } + + if (canLoad) + { + std::cerr << "sslroot::loadInitialTrustedPeer() Loaded: " << userName; + std::cerr << std::endl; + return 1; + } + return 0; +} + + + + + +// Not dependent on sslroot. load, and detroys the XPGP memory. + +int LoadCheckXPGPandGetName(const char *cert_file, std::string &userName) +{ + /* This function loads the XPGP certificate from the file, + * and checks the certificate + */ + + FILE *tmpfp = fopen(cert_file, "r"); + if (tmpfp == NULL) + { + std::cerr << "sslroot::LoadCheckAndGetXPGPName()"; + std::cerr << " Failed to open Certificate File:" << cert_file; + std::cerr << std::endl; + return 0; + } + + // get xPGP certificate. + XPGP *xpgp = PEM_read_XPGP(tmpfp, NULL, NULL, NULL); + fclose(tmpfp); + + // check the certificate. + bool valid = false; + if (xpgp) + { + valid = XPGP_check_valid_certificate(xpgp); + } + + if (valid) + { + // extract the name. + userName = getX509CNString(xpgp->subject->subject); + } + + // clean up. + XPGP_free(xpgp); + + if (valid) + { + // happy! + return 1; + } + else + { + // something went wrong! + return 0; + } +} + +std::string getX509NameString(X509_NAME *name) +{ + std::string namestr; + for(int i = 0; i < X509_NAME_entry_count(name); i++) + { + X509_NAME_ENTRY *entry = X509_NAME_get_entry(name, i); + ASN1_STRING *entry_data = X509_NAME_ENTRY_get_data(entry); + ASN1_OBJECT *entry_obj = X509_NAME_ENTRY_get_object(entry); + + namestr += "\t"; + namestr += OBJ_nid2ln(OBJ_obj2nid(entry_obj)); + namestr += " : "; + + //namestr += entry_obj -> flags; + //namestr += entry_data -> length; + //namestr += entry_data -> type; + + //namestr += entry_data -> flags; + //entry -> set; + + if (entry_data -> data != NULL) + { + namestr += (char *) entry_data -> data; + } + else + { + namestr += "NULL"; + } + + if (i + 1 < X509_NAME_entry_count(name)) + { + namestr += "\n"; + } + + } + return namestr; +} + + +std::string getX509CNString(X509_NAME *name) +{ + std::string namestr; + for(int i = 0; i < X509_NAME_entry_count(name); i++) + { + X509_NAME_ENTRY *entry = X509_NAME_get_entry(name, i); + ASN1_STRING *entry_data = X509_NAME_ENTRY_get_data(entry); + ASN1_OBJECT *entry_obj = X509_NAME_ENTRY_get_object(entry); + + if (0 == strncmp("CN", OBJ_nid2sn(OBJ_obj2nid(entry_obj)), 2)) + { + if (entry_data -> data != NULL) + { + namestr += (char *) entry_data -> data; + } + else + { + namestr += "Unknown"; + } + return namestr; + } + } + return namestr; +} + + +std::string getX509TypeString(X509_NAME *name, char *type, int len) +{ + std::string namestr; + for(int i = 0; i < X509_NAME_entry_count(name); i++) + { + X509_NAME_ENTRY *entry = X509_NAME_get_entry(name, i); + ASN1_STRING *entry_data = X509_NAME_ENTRY_get_data(entry); + ASN1_OBJECT *entry_obj = X509_NAME_ENTRY_get_object(entry); + + if (0 == strncmp(type, OBJ_nid2sn(OBJ_obj2nid(entry_obj)), len)) + { + if (entry_data -> data != NULL) + { + namestr += (char *) entry_data -> data; + } + else + { + namestr += "Unknown"; + } + return namestr; + } + } + return namestr; +} + + +std::string getX509LocString(X509_NAME *name) +{ + return getX509TypeString(name, "L", 2); +} + +std::string getX509OrgString(X509_NAME *name) +{ + return getX509TypeString(name, "O", 2); +} + + +std::string getX509CountryString(X509_NAME *name) +{ + return getX509TypeString(name, "C", 2); +} + + +std::string convert_to_str(certsign &sign) +{ + std::ostringstream id; + for(int i = 0; i < CERTSIGNLEN; i++) + { + id << std::hex << std::setw(2) << std::setfill('0') << (uint16_t) (((uint8_t *) (sign.data))[i]); + } + return id.str(); +} + +bool convert_to_certsign(std::string id, certsign &sign) +{ + char num[3]; + if (id.length() < CERTSIGNLEN * 2) + { + return false; + } + + for(int i = 0; i < CERTSIGNLEN; i++) + { + num[0] = id[i * 2]; + num[1] = id[i * 2 + 1]; + num[2] = '\0'; + int32_t val; + if (1 != sscanf(num, "%x", &val)) + { + return false; + } + sign.data[i] = (uint8_t) val; + } + return true; +} + + diff --git a/libretroshare/src/pqi/xpgpcert.h b/libretroshare/src/pqi/xpgpcert.h new file mode 100644 index 000000000..45ec93a80 --- /dev/null +++ b/libretroshare/src/pqi/xpgpcert.h @@ -0,0 +1,218 @@ +/* + * "$Id: xpgpcert.h,v 1.9 2007-04-15 18:45:18 rmf24 Exp $" + * + * 3P/PQI network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + +#ifndef MRK_SSL_XPGP_CERT_HEADER +#define MRK_SSL_XPGP_CERT_HEADER + +/* This is the trial XPGP version + * + * It has to be compiled against XPGP ssl version. + * this is only a hacked up version, merging + * (so both can operate in parallel will happen later) + * + */ + +#include +#include + +#include +#include + +#include "pqi_base.h" +#include "pqinetwork.h" + +#include "pqiindic.h" + + +// helper fns. +int printSSLError(SSL *ssl, int retval, int err, unsigned long err2, std::ostream &out); +std::string getX509NameString(X509_NAME *name); +std::string getX509CNString(X509_NAME *name); + +std::string getX509OrgString(X509_NAME *name); +std::string getX509LocString(X509_NAME *name); +std::string getX509CountryString(X509_NAME *name); + +int LoadCheckXPGPandGetName(const char *cert_file, std::string &userName); + +std::string convert_to_str(certsign &sign); +bool convert_to_certsign(std::string id, certsign &sign); + +class sslroot; + +class cert: public Person +{ + public: + cert(); +virtual ~cert(); + +virtual std::string Signature(); +std::string Hash(); +void Hash(std::string); + + XPGP *certificate; + std::string hash; +}; + + +// returns pointer to static variable. +// which must be inited.. +sslroot *getSSLRoot(); + +class sslroot +{ + public: + sslroot(); +int active(); +int setcertdir(char *path); +int initssl(const char *srvr_cert, const char *priv_key, + const char *passwd); +int closessl(); + +/* Context handling */ +SSL_CTX *getCTX(); + +/* Certificate handling */ +int compareCerts(cert *a, cert *b); + + // network interface. + + // program interface. +int addCertificate(cert *c); +int addUntrustedCertificate(cert *c); +int addCollectedCertificate(cert *c); + +int removeCertificate(cert *); + + // Creation of Certificates.... (From X509) + // Core functions.... +cert *checkDuplicateXPGP(XPGP *x); +cert *checkPeerXPGP(XPGP *x); +cert *makeCertificateXPGP(XPGP *c); +cert *registerCertificateXPGP(XPGP *nc, struct sockaddr_in, bool in); + +int validateCertificateXPGP(cert *c); + + /* Fns specific to XPGP */ +int checkAuthCertificate(cert *xpgp); +int signCertificate(cert *); +int trustCertificate(cert *, bool totrust); +int superNodeMode(); +int loadInitialTrustedPeer(std::string tp_file); + +// depreciated... +cert *findpeercert(const char *name); +//int loadpeercert(const char *fname); +//int savepeercert(const char *fname); + +// Configuration Handling... +int setConfigDirs(const char *cdir, const char *ndir); + +// these save both the certificates + the settings. +int saveCertificates(const char *fname); +int saveCertificates(); +int loadCertificates(const char *fname); + + // with a hash check/recalc in there for good measure. +cert * loadcertificate(const char* fname, std::string hash); +int savecertificate(cert *c, const char* fname); + + // for sending stuff as text +cert * loadCertFromString(std::string pem); +std::string saveCertAsString(cert *c); + +// digest hashing /signing or encrypting interface. +int hashFile(std::string fname, unsigned char *hash, unsigned int hlen); +int hashDigest(char *data, unsigned int dlen, unsigned char *hash, unsigned int hlen); +int signDigest(EVP_PKEY *key, char *data, unsigned int dlen, unsigned char *hash, unsigned int hlen); +int verifyDigest(EVP_PKEY *key, char *data, unsigned int dlen, unsigned char *enc, unsigned int elen); +int generateKeyPair(EVP_PKEY *keypair, unsigned int keylen); + + + +int printCertificate(cert *, std::ostream &out); +/* removing the list of certificate names - ambiguity! + * +std::list listCertificates(); + * + */ + +std::list &getCertList(); + +cert * getOwnCert(); +int checkNetAddress(); + + // extra list for certs that aren't in main list. +cert * getCollectedCert(); +bool collectedCerts(); + +bool CertsChanged(); +bool CertsMajorChanged(); +void IndicateCertsChanged(); + +std::string getSetting(std::string opt); +void setSetting(std::string opt, std::string val); + + +/* Fns for relating cert signatures to structures */ +cert *findcertsign(certsign &sign); +int getcertsign(cert *c, certsign &sign); +int addtosignmap(cert *); + + private: /* data */ +std::list peercerts; +std::list allcerts; +std::list collectedcerts; + +// whenever a cert is added, it should also be put in the map. +std::map signmap; + + + +// General Configuration System +// easy it put it here - so it can be signed easily. +std::map settings; + +std::string certdir; +std::string neighbourdir; +std::string certfile; + +SSL_CTX *sslctx; +int init; + +Indicator certsChanged; +Indicator certsMajorChanged; + +EVP_PKEY *pkey; + +cert *own_cert; + +XPGP_KEYRING *pgp_keyring; + +}; + +#endif // MRK_SSL_XPGP_CERT_HEADER diff --git a/libretroshare/src/rsiface/Makefile b/libretroshare/src/rsiface/Makefile new file mode 100644 index 000000000..89c0efd9e --- /dev/null +++ b/libretroshare/src/rsiface/Makefile @@ -0,0 +1,24 @@ + +RS_TOP_DIR = .. +include ../make.opt + +OBJ = notifytxt.o retroshare.o + +TESTS = + +all : $(OBJ) retroshare-nogui + +retroshare-nogui: $(OBJ) + $(CC) $(RSCFLAGS) -o retroshare-nogui $(OBJ) $(RSLIBS) + +.cc.o: + $(CC) $(RSCFLAGS) -c $< + + +clean: + -/bin/rm $(OBJ) + +clobber: clean + -/bin/rm retroshare-nogui + + diff --git a/libretroshare/src/rsiface/notifytxt.cc b/libretroshare/src/rsiface/notifytxt.cc new file mode 100644 index 000000000..58df0ce62 --- /dev/null +++ b/libretroshare/src/rsiface/notifytxt.cc @@ -0,0 +1,189 @@ +/* + * "$Id: notifytxt.cc,v 1.1 2007-02-19 20:08:30 rmf24 Exp $" + * + * RetroShare C++ Interface. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "rsiface/notifytxt.h" + +#include +#include + +void NotifyTxt::notifyErrorMsg(int list, int type, std::string msg) +{ + return; +} + +void NotifyTxt::notifyChat() +{ + return; +} + +void NotifyTxt::notifyListChange(int list, int type) +{ + std::cerr << "NotifyTxt::notifyListChange()" << std::endl; + switch(list) + { + case NOTIFY_LIST_NEIGHBOURS: + displayNeighbours(); + break; + case NOTIFY_LIST_FRIENDS: + displayFriends(); + break; + case NOTIFY_LIST_DIRLIST: + displayDirectories(); + break; + case NOTIFY_LIST_SEARCHLIST: + displaySearch(); + break; + case NOTIFY_LIST_MESSAGELIST: + displayMessages(); + break; + case NOTIFY_LIST_CHANNELLIST: + displayChannels(); + break; + case NOTIFY_LIST_TRANSFERLIST: + displayTransfers(); + break; + default: + break; + } + return; +} + + + +void NotifyTxt::displayNeighbours() +{ + iface->lockData(); /* Lock Interface */ + + std::map::const_iterator it; + const std::map &neighs = iface->getNeighbourMap(); + + std::ostringstream out; + for(it = neighs.begin(); it != neighs.end(); it++) + { + out << "Neighbour: "; + out << it ->second.name << " "; + out << it ->second.status << " "; + out << it ->second.trustLvl << " "; + out << std::endl; + } + std::cerr << out.str(); + + iface->unlockData(); /* UnLock Interface */ +} + +void NotifyTxt::displayFriends() +{ + iface->lockData(); /* Lock Interface */ + + std::map::const_iterator it; + const std::map &friends = iface->getFriendMap(); + + std::ostringstream out; + for(it = friends.begin(); it != friends.end(); it++) + { + out << "Friend: "; + out << it->second.name << " "; + out << it->second.status << " "; + out << it->second.trustLvl << " "; + out << std::endl; + } + std::cerr << out.str(); + + iface->unlockData(); /* UnLock Interface */ +} + +void NotifyTxt::displayDirectories() +{ + iface->lockData(); /* Lock Interface */ + + std::ostringstream out; + std::cerr << out.str(); + + iface->unlockData(); /* UnLock Interface */ +} + + +void NotifyTxt::displaySearch() +{ + iface->lockData(); /* Lock Interface */ + + std::ostringstream out; + std::cerr << out.str(); + + iface->unlockData(); /* UnLock Interface */ +} + + +void NotifyTxt::displayMessages() +{ + iface->lockData(); /* Lock Interface */ + + std::ostringstream out; + std::cerr << out.str(); + + std::list::const_iterator it; + const std::list &msgs = iface->getMessages(); + + std::list::const_iterator fit; + int i; + + for(it = msgs.begin(); it != msgs.end(); it++) + { + out << "Message: "; + out << it->title << std::endl; + out << "\t" << it->msg << std::endl; + const std::list &files = it -> files; + for(fit = files.begin(), i = 1; fit != files.end(); fit++, i++) + { + out << "\t\tFile(" << i << ") " << fit->fname << std::endl; + } + out << std::endl; + } + + iface->unlockData(); /* UnLock Interface */ +} + +void NotifyTxt::displayChannels() +{ + iface->lockData(); /* Lock Interface */ + + std::ostringstream out; + std::cerr << out.str(); + + iface->unlockData(); /* UnLock Interface */ +} + + +void NotifyTxt::displayTransfers() +{ + iface->lockData(); /* Lock Interface */ + + std::ostringstream out; + std::cerr << out.str(); + + iface->unlockData(); /* UnLock Interface */ +} + diff --git a/libretroshare/src/rsiface/notifytxt.h b/libretroshare/src/rsiface/notifytxt.h new file mode 100644 index 000000000..13bd7f1b6 --- /dev/null +++ b/libretroshare/src/rsiface/notifytxt.h @@ -0,0 +1,57 @@ +#ifndef RSIFACE_NOTIFY_TXT_H +#define RSIFACE_NOTIFY_TXT_H +/* + * "$Id: notifytxt.h,v 1.1 2007-02-19 20:08:30 rmf24 Exp $" + * + * RetroShare C++ Interface. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "rsiface/rsiface.h" + +#include + +class NotifyTxt: public NotifyBase +{ + public: + NotifyTxt() { return; } + virtual ~NotifyTxt() { return; } + void setRsIface(RsIface *i) { iface = i; } + +virtual void notifyListChange(int list, int type); +virtual void notifyErrorMsg(int list, int sev, std::string msg); +virtual void notifyChat(); + + private: + + void displayNeighbours(); + void displayFriends(); + void displayDirectories(); + void displaySearch(); + void displayMessages(); + void displayChannels(); + void displayTransfers(); + + RsIface *iface; /* so we can get the data */ +}; + +#endif diff --git a/libretroshare/src/rsiface/retroshare.cc b/libretroshare/src/rsiface/retroshare.cc new file mode 100644 index 000000000..7510779c9 --- /dev/null +++ b/libretroshare/src/rsiface/retroshare.cc @@ -0,0 +1,70 @@ + +/* + * "$Id: retroshare.cc,v 1.4 2007-04-21 19:08:51 rmf24 Exp $" + * + * RetroShare C++ Interface. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "rsiface/rsiface.h" /* definition of iface */ + +#include "rsiface/notifytxt.h" + +#include +#ifdef WINDOWS_SYS +#include +#endif + + +int main(int argc, char **argv) +{ + /* Objects */ + RsInit *config = InitRsConfig(); + InitRetroShare(argc, argv, config); + LoadCertificates(config, false); + + //NotifyBase *notify = new NotifyBase(); + NotifyTxt *notify = new NotifyTxt(); + RsIface *iface = createRsIface(*notify); + RsControl *rsServer = createRsControl(*iface, *notify); + + notify->setRsIface(iface); + + rsServer -> StartupRetroShare(config); + CleanupRsConfig(config); + + /* pass control to the GUI */ + while(1) + { + std::cerr << "GUI Tick()" << std::endl; +#ifndef WINDOWS_SYS + sleep(1); +#else + Sleep(1000); +#endif + } + return 1; +} + + + + diff --git a/libretroshare/src/rsiface/rsexpr.h b/libretroshare/src/rsiface/rsexpr.h new file mode 100755 index 000000000..07e9dfcad --- /dev/null +++ b/libretroshare/src/rsiface/rsexpr.h @@ -0,0 +1,241 @@ +#ifndef RS_EXPRESSIONS_H +#define RS_EXPRESSIONS_H + +/* + * rs-core/src/rsiface: rsexpr.h + * + * RetroShare C++ Interface. + * + * Copyright 2007-2008 by Kashif Kaleem. + * + * 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 +#include + +/****************************************************************************************** +Enumerations defining the Operators usable in the Boolean search expressions +******************************************************************************************/ + + +enum LogicalOperator{ + AndOp=0, /* exp AND exp */ + OrOp, /* exp OR exp */ + XorOp /* exp XOR exp */ +}; + + +/*Operators for String Queries*/ +enum StringOperator{ + ContainsAnyStrings = 0, /* e.g. name contains any of 'conference' 'meeting' 'presentation' */ + ContainsAllStrings, /* same as above except that it contains ALL of the strings */ + EqualsString /* exactly equal*/ +}; + +/*Relational operators ( >, <, >=, <=, == and InRange )*/ +enum RelOperator{ + Equals = 0, + GreaterEquals, + Greater, + SmallerEquals, + Smaller, + InRange /* lower limit <= value <= upper limit*/ +}; + +/****************************************************************************************** +Boolean Search Expression +classes: + + Expression: The base class of all expression typest + CompoundExpression: The expression which uses a logical operator to combine + the results of two expressions + StringExpression: An expression which uses some sort of string comparison. + RelExpression: A Relational Expression where > < >= <= == make sense. + e.g. size date etc + +******************************************************************************************/ + +class FileEntry; + +class Expression{ +public: + virtual bool eval (FileEntry *file) = 0; + virtual ~Expression() {}; +}; + + +class CompoundExpression : public Expression { +public: + CompoundExpression( enum LogicalOperator op, Expression * exp1, Expression *exp2) + : Lexp(exp1), Rexp(exp2), Op(op){ } + + bool eval (FileEntry *file) { + if (Lexp == NULL or Rexp == NULL) { + return false; + } + switch (Op){ + case AndOp: + return Lexp->eval(file) && Rexp->eval(file); + case OrOp: + return Lexp->eval(file) || Rexp->eval(file); + case XorOp: + return Lexp->eval(file) ^ Rexp->eval(file); + default: + return false; + } + } + virtual ~CompoundExpression(){ + delete Lexp; + delete Rexp; + } +private: + Expression *Lexp; + Expression *Rexp; + enum LogicalOperator Op; + +}; + +class StringExpression: public Expression { +public: + StringExpression(enum StringOperator op, std::list &t, + bool ic): Op(op),terms(t), IgnoreCase(ic){} +protected: + bool evalStr(std::string &str); +private: + enum StringOperator Op; + std::list terms; + bool IgnoreCase; +}; + +template +class RelExpression: public Expression { +public: + RelExpression(enum RelOperator op, T lv, T hv): + Op(op), LowerValue(lv), HigherValue(hv) {} +protected: + bool evalRel(T val); +private: + enum RelOperator Op; + T LowerValue; + T HigherValue; +}; + +template +bool RelExpression::evalRel(T val) { + switch (Op) { + case Equals: + return LowerValue == val; + case GreaterEquals: + return LowerValue >= val; + case Greater: + return LowerValue > val; + case SmallerEquals: + return LowerValue <= val; + case Smaller: + return LowerValue < val; + case InRange: + return (LowerValue <= val) && (val <= HigherValue); + default: + return false; + } +} + + +/****************************************************************************************** +Binary Predicate for Case Insensitive search + +******************************************************************************************/ +/*Binary predicate for case insensitive character comparison.*/ +/*TODOS: + *Factor locales in the comparison + */ +struct CompareCharIC : + public std::binary_function< char , char , bool> { + + bool operator () ( char ch1 , char ch2 ) const { + return tolower( static_cast < unsigned char > (ch1) ) + == tolower( static_cast < unsigned char > (ch2) ); + } + +}; + +/****************************************************************************************** +Some implementations of StringExpressions. + +******************************************************************************************/ + +class NameExpression: public StringExpression { +public: + NameExpression(enum StringOperator op, std::list &t, bool ic): + StringExpression(op,t,ic) {} + bool eval(FileEntry *file); +}; + +class PathExpression: public StringExpression { +public: + PathExpression(enum StringOperator op, std::list &t, bool ic): + StringExpression(op,t,ic) {} + bool eval(FileEntry *file); +}; + +class ExtExpression: public StringExpression { +public: + ExtExpression(enum StringOperator op, std::list &t, bool ic): + StringExpression(op,t,ic) {} + bool eval(FileEntry *file); +}; + +class HashExpression: public StringExpression { +public: + HashExpression(enum StringOperator op, std::list &t): + StringExpression(op,t, true) {} + bool eval(FileEntry *file); +}; + +/****************************************************************************************** +Some implementations of Relational Expressions. + +******************************************************************************************/ + +class DateExpression: public RelExpression { +public: + DateExpression(enum RelOperator op, int v): RelExpression(op,v,v){} + DateExpression(enum RelOperator op, int lv, int hv): + RelExpression(op,lv,hv) {} + bool eval(FileEntry *file); +}; + +class SizeExpression: public RelExpression { +public: + SizeExpression(enum RelOperator op, int v): RelExpression(op,v,v){} + SizeExpression(enum RelOperator op, int lv, int hv): + RelExpression(op,lv,hv) {} + bool eval(FileEntry *file); +}; + +class PopExpression: public RelExpression { +public: + PopExpression(enum RelOperator op, int v): RelExpression(op,v,v){} + PopExpression(enum RelOperator op, int lv, int hv): + RelExpression(op,lv,hv) {} + bool eval(FileEntry *file); +}; + +#endif /* RS_EXPRESSIONS_H */ diff --git a/libretroshare/src/rsiface/rsiface.h b/libretroshare/src/rsiface/rsiface.h new file mode 100644 index 000000000..a8fb3849f --- /dev/null +++ b/libretroshare/src/rsiface/rsiface.h @@ -0,0 +1,349 @@ +#ifndef RETROSHARE_GUI_INTERFACE_H +#define RETROSHARE_GUI_INTERFACE_H + +/* + * "$Id: rsiface.h,v 1.9 2007-04-21 19:08:51 rmf24 Exp $" + * + * RetroShare C++ Interface. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "rstypes.h" + +#include + +class NotifyBase; +class RsIface; +class RsControl; +//class RsServer; +class RsInit; +class Expression; + +/* declare single RsIface for everyone to use! */ + +extern RsIface *rsiface; +extern RsControl *rsicontrol; + +/* RsInit -> Configuration Parameters for RetroShare Startup + */ + +RsInit *InitRsConfig(); +const char *RsConfigDirectory(RsInit *config); +void CleanupRsConfig(RsInit *); + + +// Called First... (handles comandline options) +int InitRetroShare(int argc, char **argv, RsInit *config); + +// This Functions are used for Login. +bool ValidateCertificate(RsInit *config, std::string &userName); +bool ValidateTrustedUser(RsInit *config, std::string fname, std::string &userName); +bool LoadPassword(RsInit *config, std::string passwd); +bool RsGenerateCertificate(RsInit *config, std::string name, std::string org, + std::string loc, std::string country, std::string passwd, std::string &errString); + +/* Auto Login Fns */ +bool RsTryAutoLogin(RsInit *config); +bool RsStoreAutoLogin(RsInit *config); +bool RsClearAutoLogin(std::string basedir); + +// Handle actual Login. +int LoadCertificates(RsInit *config, bool autoLoginNT); + +RsIface *createRsIface (NotifyBase ¬ify); +RsControl *createRsControl(RsIface &iface, NotifyBase ¬ify); + + +class RsIface /* The Main Interface Class - create a single one! */ +{ +public: + RsIface(NotifyBase &callback) + :cb(callback) { return; } + virtual ~RsIface() { return; } + +/****************************************/ + + /* Stubs for Very Important Fns -> Locking Functions */ +virtual void lockData() = 0; +virtual void unlockData() = 0; + + const std::map &getNeighbourMap() + { return mNeighbourMap; } + + const std::map &getFriendMap() + { return mFriendMap; } + + const NeighbourInfo * getFriend(std::string id); + + const std::list &getTransferList() + { return mTransferList; } + + const std::list &getRemoteDirectoryList() + { return mRemoteDirList; } + + const std::list &getLocalDirectoryList() + { return mLocalDirList; } + + const PersonInfo *getPerson(std::string id); + const DirInfo *getDirectory(std::string id, std::string path); + + const std::list &getMessages() + { return mMessageList; } + + const std::map &getChannels() + { return mChannelMap; } + + const std::map &getOurChannels() + { return mChannelOwnMap; } + + const MessageInfo *getMessage(std::string cId, std::string mId); + const MessageInfo *getChannelMsg(std::string chId, std::string mId); + + std::list getChatNew() + { + std::list newList = mChatList; + mChatList.clear(); + return newList; + } + + const std::list &getRecommendList() + { return mRecommendList; } + + const RsConfig &getConfig() + { return mConfig; } +/****************************************/ + + + /* Flags to indicate used or not */ + enum DataFlags + { + Neighbour = 0, + Friend = 1, + DirLocal = 2, /* Not Used - QModel instead */ + DirRemote = 3, /* Not Used - QModel instead */ + Transfer = 4, + Message = 5, + Channel = 6, + Chat = 7, + Recommend = 8, + Config = 9, + NumOfFlags = 10 + }; + + + /* + * Operations for flags + */ + +bool setChanged(DataFlags set); /* set to true */ +bool getChanged(DataFlags set); /* leaves it */ +bool hasChanged(DataFlags set); /* resets it */ + + private: + + /* Internal Fn for getting the Directory Entry */ + PersonInfo *getPersonMod(std::string id); + DirInfo *getDirectoryMod(std::string id, std::string path); + +void fillLists(); /* create some dummy data to display */ + + /* Internals */ + std::map mNeighbourMap; + std::map mFriendMap; + std::list mRemoteDirList; + std::list mLocalDirList; + std::list mTransferList; + std::list mMessageList; + std::map mChannelMap; + std::map mChannelOwnMap; + std::list mChatList; + std::list mRecommendList; + + bool mChanged[NumOfFlags]; + + RsConfig mConfig; + + NotifyBase &cb; + + /* Classes which can update the Lists! */ + friend class RsControl; + friend class RsServer; +}; + + +class RsControl /* The Main Interface Class - for controlling the server */ +{ + public: + + RsControl(RsIface &i, NotifyBase &callback) + :cb(callback), rsIface(i) { return; } + +virtual ~RsControl() { return; } + + /* Real Startup Fn */ +virtual int StartupRetroShare(RsInit *config) = 0; + +/****************************************/ + /* Neighbour Operations */ +virtual std::string NeighGetInvite() = 0; +virtual int NeighLoadPEMString(std::string pem, std::string &id) = 0; +virtual int NeighLoadCertificate(std::string fname, std::string &id) = 0; +virtual int NeighAuthFriend(std::string id, RsAuthId code) = 0; +virtual int NeighAddFriend(std::string id) = 0; +virtual int NeighGetSigners(std::string uid, char *out, int len) = 0; + +/****************************************/ + /* Friend Operations */ +virtual int FriendStatus(std::string id, bool accept) = 0; +virtual int FriendRemove(std::string id) = 0; +virtual int FriendConnectAttempt(std::string id) = 0; + +virtual int FriendSignCert(std::string id) = 0; +virtual int FriendTrustSignature(std::string id, bool trust) = 0; + +virtual int FriendSetLocalAddress(std::string id, std::string addr, + unsigned short port) = 0; +virtual int FriendSetExtAddress(std::string id, std::string addr, + unsigned short port) = 0; +virtual int FriendSetDNSAddress(std::string id, std::string addr) = 0; +virtual int FriendSetFirewall(std::string id, bool firewalled, bool forwarded) = 0; + +virtual int FriendSaveCertificate(std::string id, std::string fname) = 0; + +/* +virtual int FriendSetConnectMode(std::string id, int mode) = 0; +*/ +virtual int FriendSetBandwidth(std::string id, float outkB, float inkB) = 0; + +/****************************************/ + /* Directory Actions */ +virtual int RequestDirDetails(std::string uid, std::string path, DirDetails &details) = 0; +virtual int RequestDirDetails(void *ref, DirDetails &details, uint32_t flags) = 0; + +/****************************************/ + /* Search Actions */ +virtual int SearchKeywords(std::list keywords, std::list &results) = 0; +virtual int SearchBoolExp(Expression *exp, std::list &results) = 0; + +/****************************************/ + /* Actions For Upload/Download */ + +//virtual int FileDelete(std::string uId, std::string fname) = 0; +//virtual int FileMove(std::string uId, std::string src, std::string dest) = 0; + +virtual int FileRecommend(std::string fname, std::string hash, int size) = 0; +virtual int FileRequest(std::string fname, std::string hash, uint32_t size, std::string dest) = 0; +virtual int FileCancel(std::string fname, std::string hash, uint32_t size) = 0; + +// Transfer control. +virtual int FileClearCompleted() = 0; +virtual int FileSetBandwidthTotals(float outkB, float inkB) = 0; + +/****************************************/ + /* Message Items */ +virtual int MessageSend(MessageInfo &info) = 0; +virtual int MessageDelete(std::string id) = 0; +virtual int MessageRead(std::string id) = 0; + + /* Channel Items */ +virtual int ChannelCreateNew(ChannelInfo &info) = 0; +virtual int ChannelSendMsg(ChannelInfo &info) = 0; + +/****************************************/ + /* Chat */ +virtual int ChatSend(ChatInfo &ci) = 0; + +/****************************************/ + + /* Flagging Persons / Channels / Files in or out of a set (CheckLists) */ +virtual int SetInChat(std::string id, bool in) = 0; /* friend : chat msgs */ +virtual int SetInMsg(std::string id, bool in) = 0; /* friend : msg receipients */ +virtual int SetInBroadcast(std::string id, bool in) = 0; /* channel : channel broadcast */ +virtual int SetInSubscribe(std::string id, bool in) = 0; /* channel : subscribed channels */ +virtual int SetInRecommend(std::string id, bool in) = 0; /* file : recommended file */ +virtual int ClearInChat() = 0; +virtual int ClearInMsg() = 0; +virtual int ClearInBroadcast() = 0; +virtual int ClearInSubscribe() = 0; +virtual int ClearInRecommend() = 0; + +/****************************************/ + /* RsIface Networking */ +virtual int NetworkDHTActive(bool active) = 0; +virtual int NetworkUPnPActive(bool active) = 0; + +/****************************************/ + /* Config */ +virtual int ConfigAddSharedDir( std::string dir ) = 0; +virtual int ConfigRemoveSharedDir( std::string dir ) = 0; +virtual int ConfigSetIncomingDir( std::string dir ) = 0; + +virtual int ConfigSetLocalAddr( std::string ipAddr, int port ) = 0; +virtual int ConfigSetExtAddr( std::string ipAddr, int port ) = 0; +virtual int ConfigSetExtName( std::string addr ) = 0; +virtual int ConfigSetLanConfig( bool fire, bool forw ) = 0; + +virtual int ConfigSetDataRates( int total, int indiv ) = 0; +virtual int ConfigSetBootPrompt( bool on ) = 0; +virtual int ConfigSave( ) = 0; + +/****************************************/ + + NotifyBase &getNotify() { return cb; } + RsIface &getIface() { return rsIface; } + + private: + NotifyBase &cb; + RsIface &rsIface; +}; + + +/********************** Overload this Class for callback *****************/ + + +class NotifyBase +{ + public: + NotifyBase() { return; } + virtual ~NotifyBase() { return; } + virtual void notifyListPreChange(int list, int type) { (void) list; (void) type; return; } + virtual void notifyListChange(int list, int type) { (void) list; (void) type; return; } + virtual void notifyErrorMsg(int list, int sev, std::string msg) { (void) list; (void) sev; (void) msg; return; } + virtual void notifyChat() { return; } +}; + +const int NOTIFY_LIST_NEIGHBOURS = 1; +const int NOTIFY_LIST_FRIENDS = 2; +const int NOTIFY_LIST_DIRLIST = 3; +const int NOTIFY_LIST_SEARCHLIST = 4; +const int NOTIFY_LIST_MESSAGELIST = 5; +const int NOTIFY_LIST_CHANNELLIST = 6; +const int NOTIFY_LIST_TRANSFERLIST = 7; + +const int NOTIFY_TYPE_SAME = 0x01; +const int NOTIFY_TYPE_MOD = 0x02; /* general purpose, check all */ +const int NOTIFY_TYPE_ADD = 0x04; /* flagged additions */ +const int NOTIFY_TYPE_DEL = 0x08; /* flagged deletions */ + + + +#endif diff --git a/libretroshare/src/rsiface/rstypes.h b/libretroshare/src/rsiface/rstypes.h new file mode 100644 index 000000000..2c535d4bb --- /dev/null +++ b/libretroshare/src/rsiface/rstypes.h @@ -0,0 +1,410 @@ +#ifndef RS_TYPES_GUI_INTERFACE_H +#define RS_TYPES_GUI_INTERFACE_H + +/* + * "$Id: rstypes.h,v 1.7 2007-05-05 16:10:05 rmf24 Exp $" + * + * RetroShare C++ Interface. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 +#include +#include + +#define RSCERTIDLEN 16 + +class RsCertId +{ + public: + RsCertId(); + RsCertId(std::string idstr); + + bool operator<(const RsCertId &ref) const; + bool operator==(const RsCertId &ref) const; + bool operator!=(const RsCertId &ref) const; + char data[RSCERTIDLEN]; +}; + +std::ostream &operator<<(std::ostream &out, const RsCertId &id); + +/* use RsCertId, (not unsigned long) because the definition will change +typedef unsigned long RsCertId; +*/ + +typedef RsCertId RsChanId; +typedef RsCertId RsMsgId; + +typedef std::string RsAuthId; + + +/* forward declarations of the classes */ + +#define INFO_SAME 0x01 +#define INFO_CHG 0x02 +#define INFO_NEW 0x04 +#define INFO_DEL 0x08 + +class BaseInfo +{ + public: + BaseInfo() :flags(0), mId(0) { return; } + RsCertId id; /* key for matching everything */ + int flags; /* INFO_TAG above */ + + /* allow this to be tweaked by the GUI Model */ + mutable unsigned int mId; /* (GUI) Model Id -> unique number */ +}; + +class NeighbourInfo: public BaseInfo +{ + public: + std::string name; + std::string org; + std::string loc; + std::string state; + std::string country; + int trustLvl; + std::string trustString; + std::list signers; + std::string authCode; + int status; + + std::string acceptString; + std::string statusString; + std::string connectString; + std::string lastConnect; + std::string peerAddress; + + /* server settings */ + std::string localAddr; + int localPort; + std::string extAddr; + int extPort; + std::string extName; + + bool firewalled; + bool forwardPort; + + int maxRate; /* kb */ + + bool ownsign; + + /* Flags to indicate if they are in + * chat or msg list + */ + + bool inChat; + bool inMsg; +}; + +/********************** For the Directory Listing *****************/ + +class FileInfo: public BaseInfo +{ + public: + +static const int kRsFiStatusNone = 0; +static const int kRsFiStatusStall = 1; +static const int kRsFiStatusProgress = 2; +static const int kRsFiStatusDone = 2; + + /* FileInfo(); */ + + int searchId; /* 0 if none */ + std::string path; + std::string fname; + std::string hash; + std::string ext; + + int size; + int avail; /* how much we have */ + int status; + + bool inRecommend; + + double rank; + int age; +}; + +class DirInfo: public BaseInfo +{ + public: + + DirInfo() :infoAge(0), nofiles(0), nobytes(0) { return; } + std::string path; + std::string dirname; + std::list subdirs; + std::list files; + int infoAge; + int nofiles; + int nobytes; + + double rank; + int age; + +int merge(const DirInfo &udir); + +bool exists(const DirInfo&); +DirInfo* existsPv(const DirInfo&); +bool add(const DirInfo&); +int update(const DirInfo &udir); + + +bool exists(const FileInfo&); +FileInfo* existsPv(const FileInfo&); +bool add(const FileInfo&); + +}; + +class PersonInfo: public BaseInfo +{ + public: + std::string name; + bool online; + int infoAge; /* time() at when this was last updated */ + + DirInfo rootdir; +}; + +/********************** For Messages and Channels *****************/ + +class FileTransferInfo: public FileInfo +{ + public: + std::string source; + int transfered; + double tfRate; /* kbytes */ + bool download; + int downloadStatus; /* 0 = Err, 1 = Ok, 2 = Done */ +}; + + +/********************** For Messages and Channels *****************/ + +#define RS_MSG_BOXMASK 0x000f /* Mask for determining Box */ + +#define RS_MSG_OUTGOING 0x0001 /* !Inbox */ +#define RS_MSG_PENDING 0x0002 /* OutBox */ +#define RS_MSG_DRAFT 0x0004 /* Draft */ + +/* ORs of above */ +#define RS_MSG_INBOX 0x00 /* Inbox */ +#define RS_MSG_SENTBOX 0x01 /* Sentbox */ +#define RS_MSG_OUTBOX 0x03 /* Outbox */ +#define RS_MSG_DRAFTBOX 0x05 /* Draftbox */ + +#define RS_MSG_NEW 0x0010 + +class MessageInfo: public BaseInfo +{ + public: + MessageInfo() {} + RsMsgId msgId; + + unsigned int msgflags; + std::string srcname; + std::string title; + std::string header; + std::string msg; + std::list files; + int size; /* total of files */ + int count; /* file count */ + + int ts; +}; + +class ChannelInfo: public BaseInfo +{ + public: + ChannelInfo() :publisher(false) {} + RsChanId chanId; + bool publisher; + std::string chanName; + std::list msglist; + + /* details */ + int mode; + float rank; + + bool inBroadcast; + bool inSubscribe; + + int size; /* total of msgs */ + int count; /* msg count */ +}; + +#define RS_CHAT_PUBLIC 0x0001 +#define RS_CHAT_PRIVATE 0x0002 + +class ChatInfo: public BaseInfo +{ + public: + std::string rsid; + unsigned int chatflags; + std::string name; + std::string msg; +}; + +/* matched to the uPnP states */ +#define UPNP_STATE_UNINITIALISED 0 +#define UPNP_STATE_UNAVAILABILE 1 +#define UPNP_STATE_READY 2 +#define UPNP_STATE_FAILED_TCP 3 +#define UPNP_STATE_FAILED_UDP 4 +#define UPNP_STATE_ACTIVE 5 + +class RsConfig +{ + public: + std::string ownId; + std::string ownName; + + std::list sharedDirList; + std::string incomingDir; + + std::string localAddr; + int localPort; + std::string extAddr; + int extPort; + std::string extName; + + bool firewalled; + bool forwardPort; + + int maxDataRate; /* kb */ + int maxIndivDataRate; /* kb */ + + int promptAtBoot; /* popup the password prompt */ + + bool DHTActive; + bool uPnPActive; + + int uPnPState; + int DHTPeers; +}; + +/********************** For Search Interface *****************/ + +/* This is still rough, implement later! */ + + /* text based ones */ +const std::string TypeExt = "ext"; +const std::string TypeName = "name"; +const std::string TypeHash = "hash"; +const std::string TypeSize = "size"; + +const int OpContains = 0x001; +const int OpExactMatch = 0x002; +const int OpLessThan = 0x003; +const int OpGreaterThan = 0x004; + +class Condition +{ + public: + + std::string type; + int op; + double value; + std::string name; +}; + +class SearchRequest +{ + public: + int searchId; + RsCertId toId; /* all zeros for everyone! */ + std::list tests; +}; + + +std::ostream &operator<<(std::ostream &out, const NeighbourInfo &info); +std::ostream &operator<<(std::ostream &out, const MessageInfo &info); +std::ostream &operator<<(std::ostream &out, const ChannelInfo &info); +std::ostream &operator<<(std::ostream &out, const ChatInfo &info); +std::ostream &operator<<(std::ostream &out, const PersonInfo &info); +std::ostream &print(std::ostream &out, const DirInfo &info, int indentLvl); + +/********************** For FileCache Interface *****************/ + +#define DIR_TYPE_ROOT 0x01 +#define DIR_TYPE_PERSON 0x02 +#define DIR_TYPE_DIR 0x04 +#define DIR_TYPE_FILE 0x08 + +/* flags for Directry request - + * two types; + * (1) Local / Remote (top byte) + * (2) Request type: Parent / Child - allows reduction in workload. + * (TODO) + */ + +#define DIR_FLAGS_LOCAL 0x1000 +#define DIR_FLAGS_REMOTE 0x2000 + +#define DIR_FLAGS_PARENT 0x0001 +#define DIR_FLAGS_DETAILS 0x0002 +#define DIR_FLAGS_CHILDREN 0x0004 + +class DirStub +{ + public: + uint8_t type; + std::string name; + void *ref; +}; + +class DirDetails +{ + public: + void *parent; + uint32_t prow; /* parent row */ + + void *ref; + uint8_t type; + std::string id; + std::string name; + std::string hash; + std::string path; + uint32_t count; + uint32_t age; + uint32_t rank; + + std::list children; +}; + +class FileDetail +{ + public: + std::string id; + std::string name; + std::string hash; + std::string path; + uint32_t size; + uint32_t age; + uint32_t rank; +}; + + +#endif + + diff --git a/libretroshare/src/rsserver/Makefile b/libretroshare/src/rsserver/Makefile new file mode 100644 index 000000000..73b675078 --- /dev/null +++ b/libretroshare/src/rsserver/Makefile @@ -0,0 +1,31 @@ + +RS_TOP_DIR = .. +include ../make.opt + +OBJ = pqistrings.o \ + p3face-people.o p3face-file.o \ + p3face-msgs.o p3face-server.o \ + p3face-config.o \ + p3face-network.o \ + p3face-startup.o \ + rstypes.o \ + rsiface.o \ + +TESTS = + +all : $(OBJ) librs $(TESTS) + +librs: $(OBJ) + $(AR) r $(LIBRS) $(OBJ) + $(RANLIB) $(LIBRS) + +.cc.o: + $(CC) $(CFLAGS) -c $< + + +clean: + -/bin/rm $(OBJ) + +clobber: clean + + diff --git a/libretroshare/src/rsserver/p3face-config.cc b/libretroshare/src/rsserver/p3face-config.cc new file mode 100644 index 000000000..dda7e7397 --- /dev/null +++ b/libretroshare/src/rsserver/p3face-config.cc @@ -0,0 +1,368 @@ + +/* + * "$Id: p3face-config.cc,v 1.4 2007-05-05 16:10:05 rmf24 Exp $" + * + * RetroShare C++ Interface. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "rsserver/p3face.h" + +#include +#include + +#include "pqi/pqidebug.h" +const int p3facemsgzone = 11453; + +#include +#include + + +/****************************************/ +/* RsIface Config */ +/* Config */ + +int RsServer::ConfigAddSharedDir( std::string dir ) +{ + /* call the server... */ + RsIface &iface = getIface(); + + /* lock Mutexes */ + lockRsCore(); /* LOCK */ + iface.lockData(); /* LOCK */ + + server -> addSearchDirectory(dir); + + /* unlock Mutexes */ + iface.unlockData(); /* UNLOCK */ + unlockRsCore(); /* UNLOCK */ + + /* does its own locking */ + UpdateAllConfig(); + return 1; + +} + +int RsServer::ConfigRemoveSharedDir( std::string dir ) +{ + /* fill the rsiface class */ + RsIface &iface = getIface(); + + /* lock Mutexes */ + lockRsCore(); /* LOCK */ + iface.lockData(); /* LOCK */ + + server -> removeSearchDirectory(dir); + + /* unlock Mutexes */ + iface.unlockData(); /* UNLOCK */ + unlockRsCore(); /* UNLOCK */ + + /* does its own locking */ + UpdateAllConfig(); + return 1; + +} + +int RsServer::ConfigSetIncomingDir( std::string dir ) +{ + /* fill the rsiface class */ + RsIface &iface = getIface(); + + /* lock Mutexes */ + lockRsCore(); /* LOCK */ + iface.lockData(); /* LOCK */ + + server -> setSaveDir(dir); + + /* unlock Mutexes */ + iface.unlockData(); /* UNLOCK */ + unlockRsCore(); /* UNLOCK */ + + /* does its own locking */ + UpdateAllConfig(); + return 1; + + + +} + +#ifdef MOVE_TO_RS_NETWORK + +int RsServer::ConfigSetLocalAddr( std::string ipAddr, int port ) +{ + /* check if this is all necessary */ + struct in_addr inaddr_local; + if (0 == inet_aton(ipAddr.c_str(), &inaddr_local)) + { + //bad address - reset. + return 0; + } + + /* fill the rsiface class */ + RsIface &iface = getIface(); + + /* lock Mutexes */ + lockRsCore(); /* LOCK */ + iface.lockData(); /* LOCK */ + + /* a little rough and ready, should be moved to the server! */ + cert *c = sslr -> getOwnCert(); + + /* always change the address (checked by sslr->checkNetAddress()) */ + c -> localaddr.sin_addr = inaddr_local; + c -> localaddr.sin_port = htons((short) port); + + sslr -> checkNetAddress(); + pqih -> restart_listener(); + sslr -> CertsChanged(); + + /* unlock Mutexes */ + iface.unlockData(); /* UNLOCK */ + unlockRsCore(); /* UNLOCK */ + + /* does its own locking */ + UpdateAllConfig(); + return 1; +} + + +int RsServer::ConfigSetExtAddr( std::string ipAddr, int port ) +{ + /* check if this is all necessary */ + struct in_addr inaddr; + if (0 == inet_aton(ipAddr.c_str(), &inaddr)) + { + //bad address - reset. + return 0; + } + + /* fill the rsiface class */ + RsIface &iface = getIface(); + + /* lock Mutexes */ + lockRsCore(); /* LOCK */ + iface.lockData(); /* LOCK */ + + /* a little rough and ready, should be moved to the server! */ + cert *c = sslr -> getOwnCert(); + + /* always change the address (checked by sslr->checkNetAddress()) */ + c -> serveraddr.sin_addr = inaddr; + c -> serveraddr.sin_port = htons((short) port); + + sslr -> checkNetAddress(); + sslr -> CertsChanged(); + + /* unlock Mutexes */ + iface.unlockData(); /* UNLOCK */ + unlockRsCore(); /* UNLOCK */ + + /* does its own locking */ + UpdateAllConfig(); + return 1; +} + +#endif /* MOVE_TO_RS_NETWORK */ + + +int RsServer::ConfigSetLanConfig( bool firewalled, bool forwarded ) +{ + /* fill the rsiface class */ + RsIface &iface = getIface(); + + /* lock Mutexes */ + lockRsCore(); /* LOCK */ + iface.lockData(); /* LOCK */ + + /* a little rough and ready, should be moved to the server! */ + cert *c = sslr -> getOwnCert(); + + c -> Firewalled(firewalled); + c -> Forwarded(forwarded); + + sslr -> checkNetAddress(); + sslr -> CertsChanged(); + + /* unlock Mutexes */ + iface.unlockData(); /* UNLOCK */ + unlockRsCore(); /* UNLOCK */ + + /* does its own locking */ + UpdateAllConfig(); + return 1; +} + + +int RsServer::ConfigSetExtName( std::string addr ) +{ + /* fill the rsiface class */ + RsIface &iface = getIface(); + + /* lock Mutexes */ + lockRsCore(); /* LOCK */ + iface.lockData(); /* LOCK */ + + /* a little rough and ready, should be moved to the server! */ + //cert *c = sslr -> getOwnCert(); + + /* set the Name here */ + + sslr -> checkNetAddress(); + sslr -> CertsChanged(); + + /* unlock Mutexes */ + iface.unlockData(); /* UNLOCK */ + unlockRsCore(); /* UNLOCK */ + + /* does its own locking */ + UpdateAllConfig(); + return 1; +} + + +int RsServer::ConfigSetDataRates( int total, int indiv ) /* in kbrates */ +{ + /* fill the rsiface class */ + RsIface &iface = getIface(); + + /* lock Mutexes */ + lockRsCore(); /* LOCK */ + iface.lockData(); /* LOCK */ + + pqih -> setMaxRate(true, total); + pqih -> setMaxRate(false, total); + pqih -> setMaxIndivRate(true, indiv); + pqih -> setMaxIndivRate(false, indiv); + + /* unlock Mutexes */ + iface.unlockData(); /* UNLOCK */ + unlockRsCore(); /* UNLOCK */ + + /* does its own locking */ + UpdateAllConfig(); + return 1; +} + + +int RsServer::ConfigSetBootPrompt( bool on ) +{ + + return 1; +} + + + +int RsServer::UpdateAllConfig() +{ + /* fill the rsiface class */ + RsIface &iface = getIface(); + + /* lock Mutexes */ + lockRsCore(); /* LOCK */ + iface.lockData(); /* LOCK */ + + RsConfig &config = iface.mConfig; + + cert *own = sslr -> getOwnCert(); + + /* set the id. */ + { + RsCertId rid = intGetCertId(own); + std::ostringstream out; + out << rid; + config.ownId = out.str(); + } + + config.ownName = own->Name(); + + /* shared dirs */ + std::list &dirs = server -> getSearchDirectories(); + config.sharedDirList = dirs; + config.incomingDir = server->getSaveDir(); + + /* ports */ + config.localAddr = inet_ntoa(own -> localaddr.sin_addr); + config.localPort = ntohs(own -> localaddr.sin_port); + + config.firewalled = own -> Firewalled(); + config.forwardPort = own -> Forwarded(); + + if (own -> Firewalled() && !own -> Forwarded()) + { + config.extAddr = "0.0.0.0"; + config.extPort = 0; + config.extName = ""; + } + else + { + config.extAddr = inet_ntoa(own -> serveraddr.sin_addr); + config.extPort = ntohs(own -> serveraddr.sin_port); + config.extName = ""; + } + + /* data rates */ + config.maxDataRate = (int) pqih -> getMaxRate(true); /* kb */ + config.maxIndivDataRate = (int) pqih -> getMaxIndivRate(true);/* kb */ + config.promptAtBoot = true; /* popup the password prompt */ + + /* update DHT/UPnP config */ + UpdateNetworkConfig(config); + + /* Notify of Changes */ + iface.setChanged(RsIface::Config); + + /* unlock Mutexes */ + iface.unlockData(); /* UNLOCK */ + unlockRsCore(); /* UNLOCK */ + + return 1; + + +} + + +int RsServer::ConfigSave() +{ + /* fill the rsiface class */ + RsIface &iface = getIface(); + + /* lock Mutexes */ + lockRsCore(); /* LOCK */ + iface.lockData(); /* LOCK */ + + // call save all the other parts. + server -> save_config(); + ad -> save_configuration(); + pqih -> save_config(); + sslr -> saveCertificates(); + + /* unlock Mutexes */ + iface.unlockData(); /* UNLOCK */ + unlockRsCore(); /* UNLOCK */ + + return 1; + + +} + + diff --git a/libretroshare/src/rsserver/p3face-file.cc b/libretroshare/src/rsserver/p3face-file.cc new file mode 100644 index 000000000..ee7d668b7 --- /dev/null +++ b/libretroshare/src/rsserver/p3face-file.cc @@ -0,0 +1,365 @@ + +/* + * "$Id: p3face-file.cc,v 1.6 2007-04-15 18:45:23 rmf24 Exp $" + * + * RetroShare C++ Interface. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "rsiface/rsiface.h" +#include "rsserver/p3face.h" +#include "util/rsdir.h" + +#include +#include + +#include "pqi/pqidebug.h" +const int p3facefilezone = 11452; + +#include +#include + +static const int FileMaxAge = 1800; /* Reload Data after 30 minutes */ + +/* add in an extension if necessary */ +int ensureExtension(std::string &name, std::string def_ext) +{ + return 1; +} + + +/****************************************/ +/****************************************/ +int RsServer::UpdateRemotePeople() +{ + RsIface &iface = getIface(); + + /* lock Mutexes */ + lockRsCore(); /* LOCK */ + iface.lockData(); /* LOCK */ + + /* unlock Mutexes */ + iface.unlockData(); /* UNLOCK */ + unlockRsCore(); /* UNLOCK */ + + return 1; +} + +/****************************************/ +/****************************************/ +int RsServer::UpdateAllTransfers() +{ + NotifyBase &cb = getNotify(); + cb.notifyListPreChange(NOTIFY_LIST_TRANSFERLIST, NOTIFY_TYPE_MOD); + + RsIface &iface = getIface(); + + /* lock Mutexes */ + lockRsCore(); /* LOCK */ + iface.lockData(); /* LOCK */ + + + /* clear the old transfer list() */ + std::list &transfers = iface.mTransferList; + transfers.clear(); + + std::list nTransList = server -> getTransfers(); + std::list::iterator it; + + for(it = nTransList.begin(); it != nTransList.end(); it++) + { + FileTransferInfo ti; + if ((*it) -> p) + { + ti.source = (*it) -> p -> Name(); + } + else + { + ti.source = "Unknown"; + } + + ti.id = intGetCertId((cert *) (*it) -> p); + ti.fname = (*it) -> name; + ti.hash = (*it) -> hash; + ti.path = (*it) -> path; + ti.size = (*it) -> size; + ti.transfered = (*it) -> transferred; + /* other ones!!! */ + ti.tfRate = (*it) -> crate; + ti.downloadStatus = (*it) -> state; + transfers.push_back(ti); + } + + iface.setChanged(RsIface::Transfer); + + /* unlock Mutexes */ + iface.unlockData(); /* UNLOCK */ + unlockRsCore(); /* UNLOCK */ + + /* Now Notify of the Change */ + cb.notifyListChange(NOTIFY_LIST_TRANSFERLIST, NOTIFY_TYPE_MOD); + + return 1; +} + + +int RsServer::FileRequest(std::string fname, std::string hash, + uint32_t size, std::string dest) +{ + lockRsCore(); /* LOCKED */ + + std::cerr << "RsServer::FileRequest(" << fname << ", "; + std::cerr << hash << ", " << size << ", " << dest << ")" << std::endl; + + int ret = server -> getFile(fname, hash, size, dest); + + unlockRsCore(); /* UNLOCKED */ + + return ret; +} + + + /* Actions For Upload/Download */ +int RsServer::FileRecommend(std::string fname, std::string hash, int size) +{ + /* check for new data */ + RsIface &iface = getIface(); + + /* lock Mutexes */ + lockRsCore(); /* LOCK */ + iface.lockData(); /* LOCK */ + + /* add the entry to FileRecommends. + */ + + std::list &recList = iface.mRecommendList; + std::list::iterator it; + + FileInfo fi; + fi.path = ""; /* this is not needed / wanted anymore */ + fi.hash = hash; + fi.fname = fname; + fi.size = size; + fi.rank = 1; + fi.inRecommend = false; + + /* check if it exists already! */ + bool found = false; + for(it = recList.begin(); (!found) && (it != recList.end()); it++) + { + if ((it->hash == fi.hash) && (it -> fname == fi.fname)) + { + found = true; + } + } + + if (!found) + { + recList.push_back(fi); + } + + /* Notify of change */ + iface.setChanged(RsIface::Recommend); + + /* lock Mutexes */ + iface.unlockData(); /* UNLOCK */ + unlockRsCore(); /* UNLOCK */ + + return true; +} + +int RsServer::FileCancel(std::string fname, std::string hash, uint32_t size) +{ + lockRsCore(); /* LOCKED */ + + server -> cancelTransfer(fname, hash, size); + + unlockRsCore(); /* UNLOCKED */ + + return 1; +} + + +int RsServer::FileClearCompleted() +{ + std::cerr << "RsServer::FileClearCompleted()" << std::endl; + + /* check for new data */ + RsIface &iface = getIface(); + + /* lock Mutexes */ + lockRsCore(); /* LOCK */ + iface.lockData(); /* LOCK */ + + server -> clear_old_transfers(); + + /* lock Mutexes */ + iface.unlockData(); /* UNLOCK */ + unlockRsCore(); /* UNLOCK */ + + /* update data */ + UpdateAllTransfers(); + + return 1; +} + + +int RsServer::FileSetBandwidthTotals(float outkB, float inkB) +{ + int ret = 0; + return ret; +} + + +/**************************************************************************/ +#if 0 + +int RsServer::FileBroadcast(std::string id, std::string src, int size) +{ + lockRsCore(); /* LOCKED */ + RsCertId uId(id); + + int ret = 1; + cert *c = intFindCert(uId); + if ((c == NULL) || (c == sslr -> getOwnCert())) + { + ret = 0; + } + + if (ret) + { + /* TO DO */ + } + + unlockRsCore(); /* UNLOCKED */ + + return ret; +} + +int RsServer::FileDelete(std::string id, std::string fname) +{ + lockRsCore(); /* LOCKED */ + RsCertId uId(id); + + int ret = 1; + cert *c = intFindCert(uId); + if ((c == NULL) || (c == sslr -> getOwnCert())) + { + ret = 0; + } + + if (ret) + { + /* TO DO */ + } + + unlockRsCore(); /* UNLOCKED */ + + return ret; +} + +#endif +/**************************************************************************/ + + + +int RsServer::RequestDirDetails(std::string uid, std::string path, + DirDetails &details) +{ + /* lock Mutexes */ + RsIface &iface = getIface(); + + lockRsCore(); /* LOCK */ + iface.lockData(); /* LOCK */ + + /* call to filedexserver */ + int val = server->RequestDirDetails(uid, path, details); + + /* done! */ + /* unlock Mutexes */ + iface.unlockData(); /* UNLOCK */ + unlockRsCore(); /* UNLOCK */ + + return val; + +} + +int RsServer::RequestDirDetails(void *ref, DirDetails &details, uint32_t flags) +{ + + /* lock Mutexes */ + RsIface &iface = getIface(); + + lockRsCore(); /* LOCK */ + iface.lockData(); /* LOCK */ + + /* call to filedexserver */ + int val = server->RequestDirDetails(ref, details, flags); + + /* done! */ + /* unlock Mutexes */ + iface.unlockData(); /* UNLOCK */ + unlockRsCore(); /* UNLOCK */ + + return val; +} + + +int RsServer::SearchKeywords(std::list keywords, std::list &results) +{ + /* lock Mutexes */ + RsIface &iface = getIface(); + + lockRsCore(); /* LOCK */ + iface.lockData(); /* LOCK */ + + /* call to filedexserver */ + int val = server->SearchKeywords(keywords, results); + + /* done! */ + /* unlock Mutexes */ + iface.unlockData(); /* UNLOCK */ + unlockRsCore(); /* UNLOCK */ + + return val; +} + +int RsServer::SearchBoolExp(Expression *exp, std::list &results) +{ + /* lock Mutexes */ + RsIface &iface = getIface(); + + lockRsCore(); /* LOCK */ + iface.lockData(); /* LOCK */ + + /* call to filedexserver */ + int val = server->SearchBoolExp(exp, results); + + /* done! */ + /* unlock Mutexes */ + iface.unlockData(); /* UNLOCK */ + unlockRsCore(); /* UNLOCK */ + + return val; +} + + diff --git a/libretroshare/src/rsserver/p3face-msgs.cc b/libretroshare/src/rsserver/p3face-msgs.cc new file mode 100644 index 000000000..76d5ddb6b --- /dev/null +++ b/libretroshare/src/rsserver/p3face-msgs.cc @@ -0,0 +1,740 @@ + +/* + * "$Id: p3face-msgs.cc,v 1.7 2007-05-05 16:10:06 rmf24 Exp $" + * + * RetroShare C++ Interface. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "rsserver/p3face.h" +#include "util/rsdir.h" + +#include +#include + +#include "pqi/pqidebug.h" +const int p3facemsgzone = 11453; + +#include +#include + + +unsigned long getMsgId(RsMsgId &id) +{ + unsigned long mid = 0; + mid = (id.data[0] << 24); + mid |= (id.data[1] << 16); + mid |= (id.data[2] << 8); + mid |= id.data[3]; + + return mid; +} + +void getRsMsgId(RsMsgId &rsmid, unsigned int mid) +{ + /* version that uses the uniqueMsgId stored in sid */ + /* 16 Bytes XXX Must be equal! */ + for(int i = 0; i < CHAN_SIGN_SIZE; i++) + rsmid.data[i] = 0; + + rsmid.data[0] = (0xff & (mid >> 24)); + rsmid.data[1] = (0xff & (mid >> 16)); + rsmid.data[2] = (0xff & (mid >> 8)); + rsmid.data[3] = (0xff & (mid >> 0)); + + return; +} + + +/****************************************/ +/****************************************/ + /* Message Items */ +int RsServer::MessageSend(MessageInfo &info) +{ + /* so we send this.... */ + lockRsCore(); /* LOCK */ + + MsgItem *msg = new MsgItem(); + + /* id who it is to */ + msg -> p = intFindCert(info.id); + msg -> cid = msg -> p -> cid; + + msg -> title = info.title; + msg -> header = info.header; + msg -> msg = info.msg; + msg -> sendTime = time(NULL); + + std::list::iterator it; + for(it = info.files.begin(); it != info.files.end(); it++) + { + MsgFileItem mfi; + mfi.hash = it -> hash; + mfi.name = it -> fname; + mfi.size = it -> size; + msg -> files.push_back(mfi); + } + + std::cerr << "RsServer::MessageSend()" << std::endl; + msg->print(std::cerr); + + server -> sendMessage(msg); + + unlockRsCore(); /* UNLOCK */ + + UpdateAllMsgs(); + return 1; +} + +/****************************************/ +/****************************************/ +int RsServer::MessageDelete(std::string id) +{ + lockRsCore(); /* LOCK */ + + RsMsgId uid(id); + + unsigned long mid = getMsgId(uid); + + std::cerr << "RsServer::MessageDelete()" << std::endl; + std::cerr << "str: " << id << std::endl; + std::cerr << "uid: " << uid << std::endl; + std::cerr << "mid: " << mid << std::endl; + + server -> removeMsgId(mid); + + unlockRsCore(); /* UNLOCK */ + + UpdateAllMsgs(); + return 1; +} + +int RsServer::MessageRead(std::string id) +{ + lockRsCore(); /* LOCK */ + + RsMsgId uid(id); + + unsigned long mid = getMsgId(uid); + + std::cerr << "RsServer::MessageRead()" << std::endl; + std::cerr << "str: " << id << std::endl; + std::cerr << "uid: " << uid << std::endl; + std::cerr << "mid: " << mid << std::endl; + + server -> markMsgIdRead(mid); + + unlockRsCore(); /* UNLOCK */ + + // (needed?) UpdateAllMsgs(); + return 1; +} + +/****************************************/ +/****************************************/ +int RsServer::ChannelCreateNew(ChannelInfo &info) +{ + UpdateAllChannels(); + return 1; +} + +/****************************************/ +/****************************************/ +int RsServer::ChannelSendMsg(ChannelInfo &info) +{ + UpdateAllChannels(); + return 1; +} + +/****************************************/ +/****************************************/ +int RsServer::ChatSend(ChatInfo &ci) +{ + lockRsCore(); /* LOCK */ + /* send a message to all for now */ + if (ci.chatflags & RS_CHAT_PRIVATE) + { + + /* to only one person */ + RsCertId id(ci.rsid); + cert *c = intFindCert(id); + ChatItem *item = new ChatItem(); + item -> sid = getPQIsearchId(); + item -> p = c; + item -> cid = c -> cid; + item -> msg = ci.msg; + item -> flags = PQI_ITEM_FLAG_PRIVATE; + server -> sendPrivateChat(item); + } + else + { + /* global */ + server -> sendChat(ci.msg); + } + unlockRsCore(); /* UNLOCK */ + + UpdateAllChat(); + return 1; +} + +int RsServer::UpdateAllChat() +{ + RsIface &iface = getIface(); + + /* lock Mutexes */ + lockRsCore(); /* LOCK */ + iface.lockData(); /* LOCK */ + + /* get any messages and push them to iface */ + +#if 1 + // at the end here, we handle chats. + if (server -> chatChanged.Changed(0)) + { + // get the items from the list. + std::list clist = server -> getChatQueue(); + std::list::iterator it; + for(it = clist.begin(); it != clist.end(); it++) + { + ChatInfo ci; + initRsChatInfo((*it), ci); + iface.mChatList.push_back(ci); + delete (*it); + } + } +#endif + iface.setChanged(RsIface::Chat); + + /* unlock Mutexes */ + iface.unlockData(); /* UNLOCK */ + unlockRsCore(); /* UNLOCK */ + + return 1; +} + +/****************************************/ +/****************************************/ +int RsServer::UpdateAllMsgs() +{ + NotifyBase &cb = getNotify(); + cb.notifyListPreChange(NOTIFY_LIST_MESSAGELIST, NOTIFY_TYPE_MOD); + + RsIface &iface = getIface(); + + /* lock Mutexes */ + lockRsCore(); /* LOCK */ + iface.lockData(); /* LOCK */ + + /* do stuff */ + std::list &msglist = server -> getMsgList(); + std::list &msgOutlist = server -> getMsgOutList(); + std::list::iterator mit; + + std::list &msgs = iface.mMessageList; + + msgs.clear(); + + for(mit = msglist.begin(); mit != msglist.end(); mit++) + { + MessageInfo mi; + initRsMI(*mit, mi); + msgs.push_back(mi); + } + + for(mit = msgOutlist.begin(); mit != msgOutlist.end(); mit++) + { + MessageInfo mi; + initRsMI(*mit, mi); + msgs.push_back(mi); + } + + iface.setChanged(RsIface::Message); + + /* unlock Mutexes */ + iface.unlockData(); /* UNLOCK */ + unlockRsCore(); /* UNLOCK */ + + cb.notifyListChange(NOTIFY_LIST_MESSAGELIST, NOTIFY_TYPE_MOD); + + return 1; +} + + +/****************************************/ +/****************************************/ +int RsServer::UpdateAllChannels() +{ + +#ifdef PQI_USE_CHANNELS + + std::list chanlist; + std::list::iterator cit; + + NotifyBase &cb = getNotify(); + cb.notifyListPreChange(NOTIFY_LIST_CHANNELLIST, NOTIFY_TYPE_MOD); + + RsIface &iface = getIface(); + + /* lock Mutexes */ + lockRsCore(); /* LOCK */ + iface.lockData(); /* LOCK */ + + std::map &chs = iface.mChannelMap; + + server->getAvailableChannels(chanlist); + + /* empty the old list */ + chs.clear(); + + for(cit = chanlist.begin(); cit != chanlist.end(); ++cit) + { + ChannelInfo ci; + initRsCI(*cit, ci); + intAddChannel(ci); + + { + std::ostringstream out; + out << "fltkserver::UpdateAllChannels() Added: "; + out << ci; + pqioutput(PQL_DEBUG_BASIC, p3facemsgzone, out.str()); + } + + /* then add msgs */ + std::list summarylist; + std::list::iterator mit; + + channelSign sign = (*cit)->getSign(); + server->getChannelMsgList(sign, summarylist); + + for(mit = summarylist.begin(); mit != summarylist.end(); mit++) + { + channelMsg *cm = NULL; + cm = server->getChannelMsg(sign, mit->mh); + + MessageInfo msg; + + initRsCMI(*cit, cm, msg); + // the files.... + PQChanItem::FileList::const_iterator it; + for(it = cm->msg->files.begin(); it != cm->msg->files.end(); ++it) + { + FileInfo file; + + /* add to the message */ + //ChanFileDisItem *cfdi = new ChanFileDisItem(it->name, it->size); + initRsCMFI(*cit, &(*mit), &(*it), file); + msg.files.push_back(file); + + msg.size += file.size; + msg.count++; + } // files loop. + + ci.size += msg.size; + ci.count += ci.count; + + /* add the Msg? */ + intAddChannelMsg(ci.chanId, msg); + + } // msg loop + + } // channel loop. + + /* Notify of Changes */ + iface.setChanged(RsIface::Channel); + + /* release Mutexes */ + iface.unlockData(); /* UNLOCK */ + unlockRsCore(); /* UNLOCK */ + + cb.notifyListChange(NOTIFY_LIST_CHANNELLIST, NOTIFY_TYPE_MOD); +#endif + + return 1; +} + +/**** HELPER FNS For Chat/Msg/Channel Lists ************ + * + * The iface->Mutex is required to be locked + * for intAddChannel / intAddChannelMsg. + */ + +void RsServer::initRsChatInfo(ChatItem *c, ChatInfo &i) +{ + RsCertId id = intGetCertId((cert *) c->p); + std::ostringstream out; + out << id; + + i.name = c -> p -> Name(); + i.rsid = out.str(); + i.msg = c -> msg; + if (c -> flags & PQI_ITEM_FLAG_PRIVATE) + { + std::cerr << "RsServer::initRsChatInfo() Chat Private!!!"; + i.chatflags = RS_CHAT_PRIVATE; + } + else + { + i.chatflags = RS_CHAT_PUBLIC; + std::cerr << "RsServer::initRsChatInfo() Chat Public!!!"; + } + std::cerr << std::endl; +} + +#ifdef PQI_USE_CHANNELS + +int RsServer::intAddChannel(ChannelInfo &info) +{ + RsIface &iface = getIface(); + + std::map &chs = iface.mChannelMap; + chs[info.chanId] = info; + return 1; +} + + +int RsServer::intAddChannelMsg(RsChanId id, MessageInfo &msg) +{ + RsIface &iface = getIface(); + + std::map &chs = iface.mChannelMap; + std::map::iterator it = chs.find(id); + if (it != chs.end()) + { + /* add the message */ + /* + std::map &msgs = + it -> second.msglist; + msgs[MsgId] = msg; + */ + std::list &msgs = + it -> second.msglist; + msgs.push_back(msg); + } + return 1; +} + +RsChanId RsServer::signToChanId(const channelSign &cs) const +{ + /* hackish here */ + RsChanId id; + int i; + + for(i = 0; i < CHAN_SIGN_SIZE; i++) /* 16 Bytes XXX Must be equal! */ + id.data[i] = cs.sign[i]; + + return id; +} + +void RsServer::initRsCI(pqichannel *in, ChannelInfo &out) +{ + out.chanId = signToChanId(in -> getSign()); + out.mode = in -> getMode(); + out.rank = in -> getRanking(); + out.chanName = in -> getName(); + out.count = in -> getMsgCount(); + /* + out.size = in -> getMsgSize(); + */ +} + +void RsServer::initRsCMI(pqichannel *chan, channelMsg *cm, MessageInfo &msg) +{ + msg.title = cm->msg->title; + msg.msg = cm->msg->msg; + + int i; + MsgHash h = getMsgHash(cm->msg); /* call from p3channel.h */ + /* Copy MsgId over */ + for(i = 0; i < CHAN_SIGN_SIZE; i++) /* 16 Bytes XXX Must be equal! */ + msg.msgId.data[i] = h.sign[i]; + + /* init size to zero */ + msg.size = 0; + msg.count = 0; +} + +void RsServer::initRsCMFI(pqichannel *chan, chanMsgSummary *msg, + const PQChanItem::FileItem *cfdi, + FileInfo &file) +{ + file.searchId = 0; + file.path = ""; + file.fname = cfdi -> name; + file.hash = cfdi -> hash; + file.ext = ""; + file.size = cfdi -> size; + file.inRecommend = false; + + /* check the status */ + file.status = FileInfo::kRsFiStatusNone; + /* cfdi -> status; */ + if (file.status > FileInfo::kRsFiStatusNone) + { + intCheckFileStatus(file); + } + else + { + file.avail = 0; + file.rank = 0; + } +} + +#endif + + +void RsServer::intCheckFileStatus(FileInfo &file) +{ + /* see if its being transfered */ + file.avail = file.size / 2; + file.rank = 0; +} + + +void RsServer::initRsMI(MsgItem *msg, MessageInfo &mi) +{ + mi.id = intGetCertId((cert *) msg->p); + + mi.msgflags = 0; + + /* translate flags, if we sent it... outgoing */ + if ((msg->msgflags & PQI_MI_FLAGS_OUTGOING) + || (msg->p == sslr->getOwnCert())) + { + mi.msgflags |= RS_MSG_OUTGOING; + } + /* if it has a pending flag, then its in the outbox */ + if (msg->msgflags & PQI_MI_FLAGS_PENDING) + { + mi.msgflags |= RS_MSG_PENDING; + } + if (msg->msgflags & PQI_MI_FLAGS_NEW) + { + mi.msgflags |= RS_MSG_NEW; + } + + mi.srcname = msg->p->Name(); + + mi.title = msg->title; + mi.header = msg->header; + mi.msg = msg->msg; + mi.count = 0; + mi.size = 0; + + std::list::iterator it; + for(it = msg->files.begin(); it != msg->files.end(); it++) + { + FileInfo fi; + fi.fname = RsDirUtil::getTopDir(it->name); + fi.size = it->size; + fi.hash = it->hash; + fi.path = it->name; + mi.files.push_back(fi); + mi.count++; + mi.size += fi.size; + } + mi.ts = msg->sendTime; + +#if 0 + /* hash the message (nasty to put here!) */ + std::ostringstream out; + msg->print(out); + char *data = strdup(out.str().c_str()); + unsigned int dlen = strlen(data); + unsigned int hashsize = 1024; + unsigned char hash[hashsize]; + + int hsize = sslr -> hashDigest(data, dlen, hash, hashsize); + if (hsize >= CHAN_SIGN_SIZE) + { + for(int i = 0; i < CHAN_SIGN_SIZE; i++) /* 16 Bytes XXX Must be equal! */ + mi.msgId.data[i] = hash[i]; + } + + free(data); +#else + getRsMsgId(mi.msgId, msg->sid); +#endif + +} + + /* Flagging Persons / Channels / Files in or out of a set (CheckLists) */ +int RsServer::ClearInChat() +{ + lockRsCore(); /* LOCK */ + + std::list::iterator it; + std::list &certs = sslr -> getCertList(); + + for(it = certs.begin(); it != certs.end(); it++) + { + (*it)->InChat(false); + } + + sslr->IndicateCertsChanged(); + + unlockRsCore(); /* UNLOCK */ + + return 1; +} + + + /* Flagging Persons / Channels / Files in or out of a set (CheckLists) */ +int RsServer::SetInChat(std::string id, bool in) /* friend : chat msgs */ +{ + /* so we send this.... */ + lockRsCore(); /* LOCK */ + + RsCertId rsid(id); + cert *c = intFindCert(rsid); + + if (c) + { + c->InChat(in); + sslr->IndicateCertsChanged(); + std::cerr << "Set InChat(" << id << ") to " << (in ? "True" : "False") << std::endl; + } + else + { + std::cerr << "FAILED TO Set InChat(" << id << ") to " << (in ? "True" : "False") << std::endl; + } + + unlockRsCore(); /* UNLOCK */ + + UpdateAllCerts(); + return 1; +} + + +int RsServer::ClearInMsg() +{ + lockRsCore(); /* LOCK */ + + std::list::iterator it; + std::list &certs = sslr -> getCertList(); + + for(it = certs.begin(); it != certs.end(); it++) + { + (*it)->InMessage(false); + } + sslr->IndicateCertsChanged(); + + unlockRsCore(); /* UNLOCK */ + + return 1; +} + + +int RsServer::SetInMsg(std::string id, bool in) /* friend : msgs */ +{ + /* so we send this.... */ + lockRsCore(); /* LOCK */ + + RsCertId rsid(id); + cert *c = intFindCert(rsid); + + if (c) + { + c->InMessage(in); + sslr->IndicateCertsChanged(); + std::cerr << "Set InMsg(" << id << ") to " << (in ? "True" : "False") << std::endl; + } + else + { + std::cerr << "FAILED to Set InMsg(" << id << ") to " << (in ? "True" : "False") << std::endl; + + } + unlockRsCore(); /* UNLOCK */ + + UpdateAllCerts(); + return 1; +} + + +int RsServer::ClearInBroadcast() +{ + return 1; +} + +int RsServer::ClearInSubscribe() +{ + return 1; +} + +int RsServer::SetInBroadcast(std::string id, bool in) /* channel : channel broadcast */ +{ + return 1; +} + +int RsServer::SetInSubscribe(std::string id, bool in) /* channel : subscribed channels */ +{ + return 1; +} + +int RsServer::ClearInRecommend() +{ + /* find in people ... set chat flag */ + RsIface &iface = getIface(); + iface.lockData(); /* LOCK IFACE */ + + std::list &recs = iface.mRecommendList; + std::list::iterator it; + + for(it = recs.begin(); it != recs.end(); it++) + { + it -> inRecommend = false; + } + + iface.unlockData(); /* UNLOCK IFACE */ + + return 1; +} + + +int RsServer::SetInRecommend(std::string id, bool in) /* file : recommended file */ +{ + /* find in people ... set chat flag */ + RsIface &iface = getIface(); + iface.lockData(); /* LOCK IFACE */ + + std::list &recs = iface.mRecommendList; + std::list::iterator it; + + for(it = recs.begin(); it != recs.end(); it++) + { + if (it -> fname == id) + { + /* set flag */ + it -> inRecommend = in; + std::cerr << "Set InRecommend (" << id << ") to " << (in ? "True" : "False") << std::endl; + } + } + + iface.unlockData(); /* UNLOCK IFACE */ + + return 1; +} + + + + + + diff --git a/libretroshare/src/rsserver/p3face-network.cc b/libretroshare/src/rsserver/p3face-network.cc new file mode 100644 index 000000000..1ec5ed450 --- /dev/null +++ b/libretroshare/src/rsserver/p3face-network.cc @@ -0,0 +1,435 @@ + +/* + * "$Id: p3face-people.cc,v 1.8 2007-04-15 18:45:23 rmf24 Exp $" + * + * RetroShare C++ Interface. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "dht/dhthandler.h" +#include "upnp/upnphandler.h" + +#include "rsserver/p3face.h" +#include "rsserver/pqistrings.h" + +#include +#include + +#include "pqi/pqidebug.h" + +#include +#include + + + +const int p3facenetworkzone = 4219; + +/***** +int RsServer::NetworkDHTActive(bool active); +int RsServer::NetworkUPnPActive(bool active); +int RsServer::NetworkDHTStatus(); +int RsServer::NetworkUPnPStatus(); +********/ + +/* internal */ + +/***** +int RsServer::CheckNetworking(); +int RsServer::InitNetworking(); + +int RsServer::InitDHT(); +int RsServer::CheckDHT(); + +int RsServer::InitUPnP(); +int RsServer::CheckUPnP(); +********/ + +int RsServer::NetworkDHTActive(bool active) +{ + lockRsCore(); /* LOCK */ + + server->setDHTEnabled(active); + + unlockRsCore(); /* UNLOCK */ + + return 1; +} + +int RsServer::NetworkUPnPActive(bool active) +{ + lockRsCore(); /* LOCK */ + + server->setUPnPEnabled(active); + + unlockRsCore(); /* UNLOCK */ + + return 1; +} + +int RsServer::NetworkDHTStatus() +{ + lockRsCore(); /* LOCK */ + + server->getDHTEnabled(); + + unlockRsCore(); /* UNLOCK */ + + return 1; +} + + +int RsServer::NetworkUPnPStatus() +{ + lockRsCore(); /* LOCK */ + + server->getUPnPEnabled(); + + unlockRsCore(); /* UNLOCK */ + + return 1; +} + + + +int RsServer::InitNetworking(std::string dhtfile) +{ + InitDHT(dhtfile); + InitUPnP(); + return 1; +} + + +int RsServer::CheckNetworking() +{ + CheckDHT(); + CheckUPnP(); + return 1; +} + + +dhthandler *dhtp = NULL; +upnphandler *upnpp = NULL; + +pqiAddrStore *getDHTServer() +{ + return dhtp; +} + +int RsServer::InitDHT(std::string file) +{ + /* only startup if it is supposed to be started! */ + if (server -> getDHTEnabled()) + { + dhtp = new dhthandler(file); + } + else + { + dhtp = new dhthandler(""); + } + + /* + * + */ + dhtp -> start(); + cert *c = sslr -> getOwnCert(); + + SetExternalPorts(); + + /* give it our port, and hash */ + dhtp -> setOwnHash(c->Signature()); + return 1; +} + +int RsServer::SetExternalPorts() +{ + cert *c = sslr -> getOwnCert(); + + /* decide on the most sensible port */ + + unsigned short port = ntohs(c -> serveraddr.sin_port); + if (port < 100) + { + port = ntohs(c -> localaddr.sin_port); + } + + /* set for both DHT and UPnP -> so they are the same! */ + if (upnpp) + upnpp -> setExternalPort(port); + if (dhtp) + dhtp -> setOwnPort(port); + + return 1; +} + + + + +int RsServer::CheckDHT() +{ + lockRsCore(); /* LOCK */ + + int i; + int ret = 1; + + if (server -> getDHTEnabled()) + { + /* startup if necessary */ + + } + else + { + /* shutdown if necessary */ + } + + /* for each friend */ + + /* add, and then check */ + + std::list::iterator it; + std::list &certs = sslr -> getCertList(); + + std::string emptystr(""); + //int online = 0; + + for(it = certs.begin(), i = 0; it != certs.end(); it++, i++) + { + cert *c = (*it); + + /* skip own cert */ + if (c == sslr -> getOwnCert()) + { + continue; + } + + if (c -> hasDHT()) + { + /* ignore */ + } + else + { + std::string id = c -> Signature(); + dhtp -> addFriend(id); + + struct sockaddr_in addr; + unsigned int flags; + if (dhtp -> addrFriend(id, addr, flags)) + { + c -> setDHT(addr, flags); + + /* connect attempt! */ + c -> nc_timestamp = 0; + c -> WillConnect(true); + } + } + } + + unlockRsCore(); /* UNLOCK */ + return ret; +} + + + + + +int RsServer::InitUPnP() +{ + upnpp = new upnphandler(); + /* + * + */ + + /* set our internal address to it */ + cert *c = sslr -> getOwnCert(); + upnpp -> setInternalAddress(c -> localaddr); + + SetExternalPorts(); + + upnpp -> start(); + + + return 1; +} + +int RsServer::CheckUPnP() +{ + lockRsCore(); /* LOCK */ + + int ret = 1; + + /* set our internal address to it */ + cert *c = sslr -> getOwnCert(); + upnpp -> setInternalAddress(c -> localaddr); + + /* get the state */ + upnpentry ent; + int state = upnpp -> getUPnPStatus(ent); + + if (server -> getUPnPEnabled()) + { + std::cerr << "UPnP ENABLED: "; + switch(state) + { + case RS_UPNP_S_ACTIVE: + std::cerr << "UPnP Forwarding already up"; + break; + case RS_UPNP_S_UDP_FAILED: + std::cerr << "UPnP TCP Forwarding Ok / UDP Failed"; + break; + case RS_UPNP_S_TCP_FAILED: + std::cerr << "UPnP Forwarding Failed"; + break; + case RS_UPNP_S_READY: + std::cerr << "Setting up UPnP Forwarding"; + upnpp -> setupUPnPForwarding(); + break; + case RS_UPNP_S_UNAVAILABLE: + case RS_UPNP_S_UNINITIALISED: + std::cerr << "Error UPNP not working"; + break; + } + } + else + { + std::cerr << "UPnP DISABLED: "; + /* shutdown a forward */ + switch(state) + { + case RS_UPNP_S_ACTIVE: + case RS_UPNP_S_UDP_FAILED: + case RS_UPNP_S_TCP_FAILED: + std::cerr << "Shutting down UPnP Forwarding"; + upnpp->shutdownUPnPForwarding(); + break; + case RS_UPNP_S_READY: + std::cerr << "UPnP Forwarding already down"; + break; + case RS_UPNP_S_UNAVAILABLE: + case RS_UPNP_S_UNINITIALISED: + std::cerr << "Error UPNP not working"; + break; + } + + } + std::cerr << std::endl; + + unlockRsCore(); /* UNLOCK */ + return ret; +} + +/* called from update Config (inside locks) */ +int RsServer::UpdateNetworkConfig(RsConfig &config) +{ + upnpentry ent; + int state = upnpp -> getUPnPStatus(ent); + + config.DHTActive = server -> getDHTEnabled(); + config.DHTPeers = dhtp -> dhtPeers(); + config.uPnPActive = server -> getUPnPEnabled(); + config.uPnPState = state; + + return 1; +} + +/************************/ + +int RsServer::ConfigSetLocalAddr( std::string ipAddr, int port ) +{ + /* check if this is all necessary */ + struct in_addr inaddr_local; + if (0 == inet_aton(ipAddr.c_str(), &inaddr_local)) + { + //bad address - reset. + return 0; + } + + /* fill the rsiface class */ + RsIface &iface = getIface(); + + /* lock Mutexes */ + lockRsCore(); /* LOCK */ + iface.lockData(); /* LOCK */ + + /* a little rough and ready, should be moved to the server! */ + cert *c = sslr -> getOwnCert(); + + /* always change the address (checked by sslr->checkNetAddress()) */ + c -> localaddr.sin_addr = inaddr_local; + c -> localaddr.sin_port = htons((short) port); + + sslr -> checkNetAddress(); + pqih -> restart_listener(); + sslr -> CertsChanged(); + + /* update local port address on uPnP */ + upnpp -> setInternalAddress(c -> localaddr); + + /* unlock Mutexes */ + iface.unlockData(); /* UNLOCK */ + unlockRsCore(); /* UNLOCK */ + + /* does its own locking */ + UpdateAllConfig(); + return 1; +} + + +int RsServer::ConfigSetExtAddr( std::string ipAddr, int port ) +{ + /* check if this is all necessary */ + struct in_addr inaddr; + if (0 == inet_aton(ipAddr.c_str(), &inaddr)) + { + //bad address - reset. + return 0; + } + + /* fill the rsiface class */ + RsIface &iface = getIface(); + + /* lock Mutexes */ + lockRsCore(); /* LOCK */ + iface.lockData(); /* LOCK */ + + /* a little rough and ready, should be moved to the server! */ + cert *c = sslr -> getOwnCert(); + + /* always change the address (checked by sslr->checkNetAddress()) */ + c -> serveraddr.sin_addr = inaddr; + c -> serveraddr.sin_port = htons((short) port); + + sslr -> checkNetAddress(); + sslr -> CertsChanged(); + + /* update the DHT/UPnP port (in_addr is auto found ) */ + SetExternalPorts(); + + /* unlock Mutexes */ + iface.unlockData(); /* UNLOCK */ + unlockRsCore(); /* UNLOCK */ + + /* does its own locking */ + UpdateAllConfig(); + return 1; +} + + diff --git a/libretroshare/src/rsserver/p3face-people.cc b/libretroshare/src/rsserver/p3face-people.cc new file mode 100644 index 000000000..645e51bfc --- /dev/null +++ b/libretroshare/src/rsserver/p3face-people.cc @@ -0,0 +1,1227 @@ + +/* + * "$Id: p3face-people.cc,v 1.8 2007-04-15 18:45:23 rmf24 Exp $" + * + * RetroShare C++ Interface. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "rsserver/p3face.h" +#include "rsserver/pqistrings.h" + +#include "dht/dhthandler.h" + +const int p3facepersonzone = 11451; + +/***** + * + * + * Friend Interface + * +// Basic Connect/Denied Fns +int RsServer::FriendStatus(std::string id, bool accept); +int RsServer::FriendRemove(std::string id); +int RsServer::FriendConnectAttempt(std::string id); + +// Configuration +int RsServer::FriendSetAddress(std::string id, std::string &addr, + unsigned short port); +int RsServer::FriendSaveCertificate(std::string id, std::string fname); (TODO) +int RsServer::FriendSetBandwidth(std::string id, float outkB, float inkB); + +// Trust +int RsServer::FriendSignCert(std::string id); +int RsServer::FriendTrustSignature(std::string id, bool trust); + + * + * Neighbour Interface + * + +// Not much here. +std::string RsServer::NeighGetInvite(); +int RsServer::NeighLoadPEMString(std::string pem, std::string &id); +int RsServer::NeighLoadCertificate(std::string fname, std::string &id); +int RsServer::NeighAuthFriend(std::string id, RsAuthId code); +int RsServer::NeighAddFriend(std::string id); +int RsServer::NeighGetSigners(std::string uid, char *out, int len); + + * This file implements the Above fns from the set of RsCore + * functions. Above are the public entry points. + * + * Below are the private util fns.... + * These are unique the the functions here, + * any common util fns are defined in p3face.cc + * +// Update Functions. +int RsServer::UpdateAllCerts(): +int RsServer::UpdateAllNetwork(); + + * These must be run from outside the lock + * +void intNotifyCertError(RsCertId &id, std::string str) +void intNotifyChangeCert(RsCertId &id) + * + * + */ + + +#include "rsserver/p3face.h" + +#include +#include + +#include "pqi/pqidebug.h" +const int fltksrvrzone = 25915; + +#include +#include + + +/* Internal->Ext Translation */ +void initRsNI(cert *c, NeighbourInfo &ni); + +/* so first the cert */ + +/* Public Functions */ + +/****************************************/ + /* Public Friend Operations + * will lock control/iface if needed. + * + * Notifies must be outside the lock + * (so that it can read iface really) + * + * */ + + +int RsServer::FriendStatus(std::string uid, bool accept) +{ + lockRsCore(); /* LOCK */ + + RsCertId id(uid); + + cert *c = intFindCert(id); + std::string errstr; + int err = 0; + if ((c == NULL) || (c == sslr -> getOwnCert())) + { + if (accept) + { + pqih -> cert_accept(c); + pqih -> cert_auto(c, true); + } + else + { + pqih -> cert_auto(c, false); + pqih -> cert_deny(c); + } + } + else + { + /* error */ + err = 1; + } + unlockRsCore(); /* UNLOCK */ + + if (err) + { + /* notify */ + } + else + { + /* call the repopulate fn */ + UpdateAllCerts(); + + } + return err; +} + + + +int RsServer::FriendRemove(std::string uid) +{ + lockRsCore(); /* LOCK */ + + RsCertId id(uid); + cert * c = intFindCert(id); + int err = 0; + if ((c == NULL) || (c == sslr -> getOwnCert())) + { + std::cerr << "RsServer::FriendRemove() Failed ... Bad Cert or Own." << std::endl; + err = 1; + } + else + { + std::cerr << "RsServer::FriendRemove() " << c -> Name() << std::endl; + pqih -> cert_deny(c); + err = sslr -> removeCertificate(c); + } + + unlockRsCore(); /* UNLOCK */ + + if (err) + { + /* notify */ + } + else + { + /* call the repopulate fn */ + UpdateAllCerts(); + + } + return err; +} + + + +int RsServer::FriendConnectAttempt(std::string uid) +{ + int err = 0; + + lockRsCore(); /* LOCK */ + + RsCertId id(uid); + cert *c = intFindCert(id); + c -> nc_timestamp = 0; + // set Firewall to off -> so we + // will definitely have connect attempt. + c -> Firewalled(false); + c -> WillConnect(true); + + unlockRsCore(); /* UNLOCK */ + + if (err) + { + /* notify */ + } + else + { + /* call the repopulate fn */ + UpdateAllCerts(); + + } + return err; +} + +int RsServer::FriendSignCert(std::string uid) +{ + lockRsCore(); /* LOCK */ + + RsCertId id(uid); + /* get the current cert, check that its + * in the allowed group. + */ + + /* ask sslroot to sign certificate + */ + int ret = 1; + cert *c = intFindCert(id); + + if ((c == NULL) || (c == sslr -> getOwnCert())) + { + ret = 0; + } + + if (ret) + { + ret = sslr -> signCertificate(c); + } + + unlockRsCore(); /* UNLOCK */ + + /* notify */ + UpdateAllCerts(); + + return ret; +} + + + +int RsServer::FriendTrustSignature(std::string uid, bool trust) +{ + lockRsCore(); /* LOCK */ + + RsCertId id(uid); + int ret = -1; + cert *c = intFindCert(id); + + if ((c == NULL) || (c == sslr -> getOwnCert())) + { + return -1; + } + + ret = sslr -> trustCertificate(c, !(c -> Trusted())); + + + unlockRsCore(); /* UNLOCK */ + + /* notify */ + UpdateAllCerts(); + + return ret; +} + +/* XXX This should be changed to handle + * (1) dns name + * (2) ip address. + */ +int RsServer::FriendSetFirewall(std::string uid, bool firewalled, bool forwarded) +{ + lockRsCore(); /* LOCK */ + RsCertId id(uid); + + int ret = 1; + + cert *c = intFindCert(id); + if ((c == NULL) || (c == sslr -> getOwnCert())) + { + pqioutput(PQL_ALERT, fltksrvrzone, "NULL/Own cert!"); + ret = 0; + } + + if (ret) + { + // get the server address. + c -> Firewalled(firewalled); + c -> Forwarded(forwarded); + /* tell SSL */ + getSSLRoot() -> IndicateCertsChanged(); + ret = 1; + } + unlockRsCore(); /* UNLOCK */ + + if (ret) + { + /* notify */ + UpdateAllCerts(); + } + else + { + /* error message? */ + intNotifyCertError(id, "Failed to Change Cert Address"); + } + return ret; +} + +int RsServer::FriendSetLocalAddress(std::string uid, + std::string addr_str, + unsigned short port) +{ + struct sockaddr_in addr; + + lockRsCore(); /* LOCK */ + RsCertId id(uid); + + int ret = 1; + + cert *c = intFindCert(id); + if ((c == NULL) || (c == sslr -> getOwnCert())) + { + pqioutput(PQL_ALERT, fltksrvrzone, "NULL/Own cert!"); + ret = 0; + } + +/********************************** WINDOWS/UNIX SPECIFIC PART *******************/ +#ifndef WINDOWS_SYS + if (ret && (0 != inet_aton(addr_str.c_str(), &(addr.sin_addr)))) +#else + addr.sin_addr.s_addr = inet_addr(addr_str.c_str()); + if (ret) +#endif +/********************************** WINDOWS/UNIX SPECIFIC PART *******************/ + { + // get the server address. + c -> localaddr.sin_addr = addr.sin_addr; + c -> localaddr.sin_port = htons(port); + /* tell SSL */ + getSSLRoot() -> IndicateCertsChanged(); + ret = 1; + } + unlockRsCore(); /* UNLOCK */ + + if (ret) + { + /* notify */ + UpdateAllCerts(); + } + else + { + /* error message? */ + intNotifyCertError(id, "Failed to Change Cert Address"); + } + return ret; +} + +int RsServer::FriendSetExtAddress(std::string uid, + std::string addr_str, + unsigned short port) +{ + struct sockaddr_in addr; + + lockRsCore(); /* LOCK */ + RsCertId id(uid); + + int ret = 1; + + cert *c = intFindCert(id); + if ((c == NULL) || (c == sslr -> getOwnCert())) + { + pqioutput(PQL_ALERT, fltksrvrzone, "NULL/Own cert!"); + ret = 0; + } + +/********************************** WINDOWS/UNIX SPECIFIC PART *******************/ +#ifndef WINDOWS_SYS + if (ret && (0 != inet_aton(addr_str.c_str(), &(addr.sin_addr)))) +#else + addr.sin_addr.s_addr = inet_addr(addr_str.c_str()); + if (ret) +#endif +/********************************** WINDOWS/UNIX SPECIFIC PART *******************/ + { + // get the server address. + c -> serveraddr.sin_addr = addr.sin_addr; + c -> serveraddr.sin_port = htons(port); + /* tell SSL */ + getSSLRoot() -> IndicateCertsChanged(); + ret = 1; + } + unlockRsCore(); /* UNLOCK */ + + if (ret) + { + /* notify */ + UpdateAllCerts(); + } + else + { + /* error message? */ + intNotifyCertError(id, "Failed to Change Cert Address"); + } + return ret; +} + + +int RsServer::FriendSetDNSAddress(std::string uid, std::string addr_str) +{ + lockRsCore(); /* LOCK */ + RsCertId id(uid); + + int ret = 1; + + cert *c = intFindCert(id); + if ((c == NULL) || (c == sslr -> getOwnCert())) + { + pqioutput(PQL_ALERT, fltksrvrzone, "NULL/Own cert!"); + ret = 0; + } + + if (ret) + { + // get the server address. + c -> dynDNSaddr = addr_str; + /* tell SSL */ + getSSLRoot() -> IndicateCertsChanged(); + ret = 1; + } + unlockRsCore(); /* UNLOCK */ + + if (ret) + { + /* notify */ + UpdateAllCerts(); + } + else + { + /* error message? */ + intNotifyCertError(id, "Failed to Change Cert Address"); + } + return ret; +} + + + +int RsServer::FriendSaveCertificate(std::string uid, std::string fname) +{ + lockRsCore(); /* LOCK */ + RsCertId id(uid); + + int ret = 1; + + cert *c = intFindCert(id); + if (c == NULL) + { + pqioutput(PQL_ALERT, p3facepersonzone, "FriendSaveCertificate: Invalid cert!"); + ret = 0; + } + + if (ret) + { + ensureExtension(fname, "pqi"); + + if (c -> certificate == NULL) + { + std::ostringstream out; + out << "File Export (" << fname; + out << ") Failed -> Certificate == NULL!" << std::endl; + pqioutput(PQL_DEBUG_BASIC, p3facepersonzone, out.str()); + ret = 0; + } + else + { + ret = sslr -> savecertificate(c, fname.c_str()); + } + } + + unlockRsCore(); /* UNLOCK */ + + return ret; +} + + +int RsServer::FriendSetBandwidth(std::string uid, float outkB, float inkB) +{ + lockRsCore(); /* LOCK */ + RsCertId id(uid); + + int ret = 1; + + /* don't do nothing yet */ + + unlockRsCore(); /* UNLOCK */ + + /* notify */ + UpdateAllCerts(); + + return ret; +} + +/********** INTERNAL PUBLIC ... + * a brutal but honest update. + * + */ + +int RsServer::UpdateAllCerts() +{ + /* PreNotify of the Change */ + NotifyBase &cb = getNotify(); + cb.notifyListPreChange(NOTIFY_LIST_FRIENDS, NOTIFY_TYPE_MOD); + + + lockRsCore(); /* LOCK */ + + + RsIface &iface = getIface(); + iface.lockData(); /* LOCK IFACE */ + + int i; + int ret = 1; + + //Fl_Funky_Browser *cb = ui -> cert_list; + // Get the Current Cert, by getting current item + // and extracting ref. + + // only do if + if ((sslr -> CertsChanged()) || + (sslr -> CertsMajorChanged())) + { + // clear the data. + std::map &frnds = iface.mFriendMap; + + frnds.clear(); + + std::list::iterator it; + std::list &certs = sslr -> getCertList(); + + std::string emptystr(""); + + for(it = certs.begin(), i = 0; + it != certs.end(); it++, i++) + { + cert *c = (*it); + NeighbourInfo ni; + + initRsNI(c, ni); /* same as for neighbour */ + + frnds[ni.id] = ni; + } + + /* let the GUI know */ + iface.setChanged(RsIface::Friend); + } + + iface.unlockData(); /* UNLOCK IFACE */ + unlockRsCore(); /* UNLOCK */ + + /* Now Notify of the Change */ + cb.notifyListChange(NOTIFY_LIST_FRIENDS, NOTIFY_TYPE_MOD); + + return ret; +} + + +/********* UNLOCKED INTERNAL CERT FNS.... + * These must be called from + * outside the lock + */ + + +void RsServer::intNotifyCertError(RsCertId &id, std::string str) +{ + NotifyBase &cb = getNotify(); + cb.notifyErrorMsg(NOTIFY_LIST_FRIENDS, 0, str); + return; +} + +void RsServer::intNotifyChangeCert(RsCertId &id) +{ + RsIface &iface = getIface(); + /* flag certId as modified */ + bool mods; + iface.lockData(); + + std::map &nl = iface.mNeighbourMap; + std::map::iterator it; + if (nl.end() != (it = nl.find(id))) + { + it -> second.flags = INFO_CHG; + mods = true; + + /* Flag as changed */ + iface.setChanged(RsIface::Neighbour); + } + + nl = iface.mFriendMap; + //std::map::iterator it; + if (nl.end() != (it = nl.find(id))) + { + it -> second.flags = INFO_CHG; + mods = true; + + /* Flag as changed */ + iface.setChanged(RsIface::Friend); + } + + + iface.unlockData(); + + /* send the notify message */ + if (mods) + { + NotifyBase &cb = getNotify(); + cb.notifyListChange(NOTIFY_LIST_NEIGHBOURS, NOTIFY_TYPE_MOD); + cb.notifyListChange(NOTIFY_LIST_FRIENDS, NOTIFY_TYPE_MOD); + } +} + +/********* LOCKED INTERNAL CERT FNS.... + * These must be called from within the Mutex. + */ + + + + + +/**************************** NEIGHBOUR FNS ******************* + * + * + * + */ + +/****************************************/ + /* Neighbour Operations */ + +std::string RsServer::NeighGetInvite() +{ + lockRsCore(); /* LOCK */ + + cert *own = sslr -> getOwnCert(); + std::string name = own -> Name(); + std::string certstr = sslr -> saveCertAsString(own); + + unlockRsCore(); /* UNLOCK */ + + std::ostringstream out; + out << "You have been invited to join the retroshare"; + out << " community by: " << name; + out << std::endl; + out << std::endl; + out << "Retroshare is a Friend-2-Friend network that enables you to"; + out << " communicate securely and"; + out << std::endl; + out << "privately with your friends. "; + out << "You can use it for chat, messages, "; + out << "channels, and file-sharing. "; + out << std::endl; + out << std::endl; + out << "Download it from: "; + out << "http://retroshare.sf.net"; + out << std::endl; + out << std::endl; + out << "Thanks, "; + out << " " << name << ", DrBob and the RetroShare Team!"; + out << std::endl; + out << std::endl; + out << certstr; + out << std::endl; + + return out.str(); +} + +/* same as the one below (almost) */ +int RsServer::NeighLoadPEMString(std::string pem, std::string &id) +{ + lockRsCore(); /* LOCK */ + + int ret = 1; + + std::ostringstream out; + cert *nc; + + nc = sslr -> loadCertFromString(pem); + if (nc == NULL) + { + out << "Stringe Import (" << pem; + out << ") Failed!" << std::endl; + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, out.str()); + ret = 0; + } + else if (0 > sslr -> addCollectedCertificate(nc)) + { + out << "Imported Certificate....but no"; + out << " need for addition - As it exists!"; + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, out.str()); + //ret = 0; want this case to set id (as is valid!) + } + + /* ensure it gets to p3disc */ + if (ad) + { + ad -> distillData(); + } + + unlockRsCore(); /* UNLOCK */ + + if (ret) + { + UpdateAllNetwork(); + + /* set the id. */ + RsCertId rid = intGetCertId(nc); + std::ostringstream out; + out << rid; + id = out.str(); + } + return ret; +} + + +int RsServer::NeighLoadCertificate(std::string fname, std::string &id) +{ + lockRsCore(); /* LOCK */ + + int ret = 1; + + std::ostringstream out; + std::string nullhash(""); // empty hash - as signature not correct. + + cert *nc; + + nc = sslr -> loadcertificate(fname.c_str(), nullhash); + if (nc == NULL) + { + out << "File Import (" << fname; + out << ") Failed!" << std::endl; + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, out.str()); + ret = 0; + } + else if (0 > sslr -> addCollectedCertificate(nc)) + { + out << "Imported Certificate....but no"; + out << " need for addition - As it exists!"; + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, fltksrvrzone, out.str()); + //ret = 0; want this case to set id (as is valid!) + } + + /* ensure it gets to p3disc */ + if (ad) + { + ad -> distillData(); + } + + unlockRsCore(); /* UNLOCK */ + + if (ret) + { + UpdateAllNetwork(); + + /* set the id. */ + RsCertId rid = intGetCertId(nc); + std::ostringstream out; + out << rid; + id = out.str(); + } + return ret; +} + + +int RsServer::NeighAuthFriend(std::string uid, RsAuthId code) +{ + lockRsCore(); /* LOCK */ + RsCertId id(uid); + + int ret = 1; + + cert *c = intFindCert(id); + if ((c == NULL) || (c->certificate == NULL)) + { + ret = 0; + + } + else + { + std::string real_code = getXPGPAuthCode(c->certificate); + + if (code == real_code) { + ret = 1; + } else { + ret = 0; + } + } + + /* if correct -> sign */ + if (ret) + { + if (0 < validateCertificateIsSignedByKey(c->certificate, + sslr -> getOwnCert() -> certificate)) + { + std::cerr << "RsServer::cert_add_neighbour() Signed Already"; + std::cerr << std::endl; + ret = 0; + } + else + { + /* if not signed already */ + std::cerr << "RsServer::cert_add_neighbour() Signing Cert"; + std::cerr << std::endl; + + /* sign certificate */ + sslr -> signCertificate(c); + } + } + unlockRsCore(); /* UNLOCK */ + + if (ret) + { + /* Notify of changes */ + return UpdateAllNetwork(); + + } + return (ret); +} + +int RsServer::NeighAddFriend(std::string uid) +{ + lockRsCore(); /* LOCK */ + + int ret = 1; + RsCertId id(uid); + + cert *c = intFindCert(id); + if ((c == NULL) || (c->certificate == NULL) + || (c == sslr -> getOwnCert())) + { + std::cerr << "RsServer::NeighAddFriend() Invalid Cert"; + std::cerr << std::endl; + ret = 0; + } + else + { + /* check authentication */ + sslr -> checkAuthCertificate(c); + if (c->trustLvl < TRUST_SIGN_AUTHEN) + { + /* do nothing */ + std::cerr << "RsServer::cert_add_neighbour() Not Authed"; + std::cerr << std::endl; + std::cerr << "RsServer::cert_add_neighbour() Do Nothing"; + std::cerr << std::endl; + ret = 0; + } + else + { + std::cerr << "RsServer::cert_add_neighbour() Adding Cert"; + std::cerr << std::endl; + + /* add */ + sslr -> addUntrustedCertificate(c); + + std::cerr << "RsServer::cert_add_neighbour() Auto Connecting"; + std::cerr << std::endl; + /* auto connect */ + pqih -> cert_auto(c, true); + + /* XXX: Update the Neighbour/Friends Maps */ + } + } + + unlockRsCore(); /* UNLOCK */ + + if (ret) + { + /* Changed Cert Lists -> Notify */ + return UpdateAllCerts(); + + } + return (ret); +} + + +#if 0 + +std::list RsServer::NeighGetSigners(std::string uid) +{ + lockRsCore(); /* LOCK */ + RsCertId id(uid); + std::list signers; + + int ret = 1; + + cert *c = intFindCert(id); + if ((c == NULL) || (c->certificate == NULL)) + { + ret = 0; + + } + + /* if valid, get signers */ + if (ret) + { + signers = getXPGPsigners(c->certificate); + + } + unlockRsCore(); /* UNLOCK */ + + return signers; +} + +#endif + + + +int RsServer::NeighGetSigners(std::string uid, char *out, int len) +{ + lockRsCore(); /* LOCK */ + RsCertId id(uid); + std::list signers; + std::list::iterator it; + + int ret = 1; + + cert *c = intFindCert(id); + if ((c == NULL) || (c->certificate == NULL)) + { + ret = 0; + + } + + /* if valid, get signers */ + if (ret) + { + std::string str; + signers = getXPGPsigners(c->certificate); + for(it = signers.begin(); it != signers.end(); it++) + { + str += (*it); + str += "\n"; + } + strncpy(out, str.c_str(), len); + std::cerr << "SIGNERS(1): " << str << std::endl; + std::cerr << "SIGNERS(2): " << out << std::endl; + ret = signers.size(); + } + unlockRsCore(); /* UNLOCK */ + + return ret; +} + + + + +int RsServer::UpdateAllNetwork() +{ + /* PreNotify of the Change */ + NotifyBase &cb = getNotify(); + cb.notifyListPreChange(NOTIFY_LIST_NEIGHBOURS, NOTIFY_TYPE_MOD); + + lockRsCore(); /* LOCK */ + + RsIface &iface = getIface(); + iface.lockData(); /* LOCK IFACE */ + int ret = 1; + int i; + + // clear the data. + std::map &neighs = iface.mNeighbourMap; + + neighs.clear(); + + std::list::iterator it; + std::list &certs = ad -> getDiscovered(); + + for(it = certs.begin(), i = 0; it != certs.end(); it++, i++) + { + NeighbourInfo ni; + cert *c = (*it); + initRsNI(c, ni); + + neighs[ni.id] = ni; + } + + /* let the GUI know */ + iface.setChanged(RsIface::Neighbour); + + iface.unlockData(); /* UNLOCK IFACE */ + unlockRsCore(); /* UNLOCK */ + + /* Now Notify of the Change */ + cb.notifyListChange(NOTIFY_LIST_NEIGHBOURS, NOTIFY_TYPE_MOD); + + return ret; +} + + + + + +/******************** Translation from Int -> Ext Dtype ******************* + * + * MUST BE UNDER LOCK! + * + */ + +void RsServer::initRsNI(cert *c, NeighbourInfo &ni) +{ + ni.id = intGetCertId(c); /* get Id! */ + ni.name = get_cert_name(c); + ni.org = get_cert_org(c); + ni.loc = get_cert_loc(c); + ni.country = get_cert_country(c); + ni.authCode = getXPGPAuthCode(c->certificate); + + if (c->trustLvl == TRUST_SIGN_UNKNOWN) + { + sslr -> checkAuthCertificate(c); + } + ni.trustLvl = c->trustLvl; + ni.trustString = get_trust_string(c); + ni.statusString = get_status_string(c->Status()); + ni.connectString = get_autoconnect_string(c); + ni.peerAddress = get_server_string(c); + ni.lastConnect = get_lastconnecttime_string(c); + + if (c -> Accepted()) + { + ni.acceptString = "Accept"; + } + else + { + ni.acceptString = "Deny"; + } + + std::list::iterator it; + /**** TODO **** + std::list signers = getXPGPsigners(c->certificate); + for(it = signers.begin(); it != signers.end(); it++) + { + ni.signIds = + ui -> neigh_signers -> add(it->c_str()); + std::cerr << *it << std::endl; + } + ******/ + + /* check if we have signed the certificate */ + ni.ownsign = (0 < validateCertificateIsSignedByKey(c->certificate, + sslr -> getOwnCert() -> certificate)); + + /* ports */ + ni.localAddr = inet_ntoa(c->localaddr.sin_addr); + ni.localPort = ntohs(c->localaddr.sin_port); + + ni.firewalled = c -> Firewalled(); + ni.forwardPort = c -> Forwarded(); + + if (c -> Firewalled() && !c -> Forwarded()) + { + ni.extAddr = "0.0.0.0"; + ni.extPort = 0; + ni.extName = ""; + } + else + { + ni.extAddr = inet_ntoa(c -> serveraddr.sin_addr); + ni.extPort = ntohs(c -> serveraddr.sin_port); + ni.extName = c->dynDNSaddr; + } + + /* data rates */ + ni.maxRate = (int) pqih -> getMaxIndivRate(true);/* kb */ + + ni.inChat = c -> InChat(); + ni.inMsg = c -> InMessage(); + + return; +} + +/* Add rest to neighbourItem later */ + +#if 0 + + int status = c -> Status(); + if (!isfriend) + { + status = 0; + } + + ui -> cert_status -> value((get_status_string(status)).c_str()); + + if (isfriend) + { + ui -> cert_status -> value((get_status_string(status)).c_str()); + } + else + { + ui -> cert_status -> value("Neighbour"); + } + + // SET SERVER. + if (!cert_item_ok) + { + ui->cert_server->value(inet_ntoa(c->serveraddr.sin_addr)); + ui ->cert_port->value(ntohs(c->serveraddr.sin_port)); + + /* check if we have signed the certificate */ + if (0 < validateCertificateIsSignedByKey(c->certificate, + sslr -> getOwnCert() -> certificate)) + + { + ui->cert_authcode->value( + getXPGPAuthCode(c->certificate).c_str()); + ui ->cert_authcode->deactivate(); + ui ->cert_sign_button->deactivate(); + } + else + { + ui ->cert_authcode->value(""); + ui ->cert_authcode->activate(); + ui ->cert_sign_button->deactivate(); + } + } + + if (c -> Manual() || (!isfriend)) + ui -> cert_auto -> value(0); + else + ui -> cert_auto -> value(1); + + // Finally Fill in the Text Editor. + certtext = get_cert_info(c); + + // Last Connection + // Server Address + // Status + // Hashes + + buf = ui -> cert_details -> buffer(); + buf -> text(certtext.c_str()); + + + if (status & PERSON_STATUS_ACCEPTED) + ui -> cert_allow -> value(1); + else + ui -> cert_allow -> value(0); + + if (status & PERSON_STATUS_WILL_LISTEN) + ui -> cert_listen -> value(1); + else + ui -> cert_listen -> value(0); + + if (status & PERSON_STATUS_WILL_CONNECT) + ui -> cert_connect -> value(1); + else + ui -> cert_connect -> value(0); + + if (status & PERSON_STATUS_TRUSTED) + { + ui -> cert_trust_person -> value(1); + } + else + { + ui -> cert_trust_person -> value(0); + } + + + cert_item_ok = true; + return 1; +} + +#endif + + + + + +int RsServer::ensureExtension(std::string &name, std::string def_ext) +{ + /* if it has an extension, don't change */ + int len = name.length(); + int extpos = name.find_last_of('.'); + + std::ostringstream out; + out << "ensureExtension() name: " << name << std::endl; + out << "\t\t extpos: " << extpos; + out << " len: " << len << std::endl; + + /* check that the '.' has between 1 and 4 char after it (an extension) */ + if ((extpos > 0) && (extpos < len - 1) && (extpos + 6 > len)) + { + /* extension there */ + std::string curext = name.substr(extpos, len); + out << "ensureExtension() curext: " << curext << std::endl; + std::cerr << out.str(); + return 0; + } + + if (extpos != len - 1) + { + name += "."; + } + name += def_ext; + + out << "ensureExtension() added ext: " << name << std::endl; + + std::cerr << out.str(); + return 1; +} + + diff --git a/libretroshare/src/rsserver/p3face-server.cc b/libretroshare/src/rsserver/p3face-server.cc new file mode 100644 index 000000000..b38645945 --- /dev/null +++ b/libretroshare/src/rsserver/p3face-server.cc @@ -0,0 +1,270 @@ + +/* + * "$Id: p3face-server.cc,v 1.5 2007-04-15 18:45:23 rmf24 Exp $" + * + * RetroShare C++ Interface. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "rsserver/p3face.h" + +#include +#include + +RsServer::RsServer(RsIface &i, NotifyBase &callback) + :RsControl(i, callback) +{ + return; +} + +RsServer::~RsServer() +{ + return; +} + + /* General Internal Helper Functions + ----> MUST BE LOCKED! + */ + +cert *RsServer::intFindCert(RsCertId &id) +{ + certsign cs; + for(int i = 0; i < RSCERTIDLEN; i++) + { + cs.data[i] = id.data[i]; + } + return sslr -> findcertsign(cs); +} + +RsChanId RsServer::intGetCertId(cert *c) +{ + certsign cs; + RsChanId id; + sslr -> getcertsign(c, cs); + for(int i = 0; i < RSCERTIDLEN; i++) + { + id.data[i] = cs.data[i]; + } + return id; +} + +#ifdef WINDOWS_SYS +#include +#include +#endif + +static double getCurrentTS() +{ + +#ifndef WINDOWS_SYS + struct timeval cts_tmp; + gettimeofday(&cts_tmp, NULL); + double cts = (cts_tmp.tv_sec) + ((double) cts_tmp.tv_usec) / 1000000.0; +#else + struct _timeb timebuf; + _ftime( &timebuf); + double cts = (timebuf.time) + ((double) timebuf.millitm) / 1000.0; +#endif + return cts; +} + + + /* Thread Fn: Run the Core */ +void RsServer::run() +{ + + double timeDelta = 0.25; + double minTimeDelta = 0.1; // 25; + double maxTimeDelta = 2.0; + double kickLimit = 0.5; + + double avgTickRate = timeDelta; + + double lastts, ts; + lastts = ts = getCurrentTS(); + + long lastSec = 0; /* for the slower ticked stuff */ + + int min = 0; + int loop = 0; + + while(1) + { +#ifndef WINDOWS_SYS + usleep((int) (timeDelta * 1000000)); +#else + Sleep((int) (timeDelta * 1000)); +#endif + + ts = getCurrentTS(); + double delta = ts - lastts; + + /* for the fast ticked stuff */ + if (delta > timeDelta) + { + //std::cerr << "Delta: " << delta << std::endl; + //std::cerr << "Time Delta: " << timeDelta << std::endl; + //std::cerr << "Avg Tick Rate: " << avgTickRate << std::endl; + + lastts = ts; + +/******************************** RUN SERVER *****************/ + lockRsCore(); + // std::cerr << "RsServer::run() Lock() -> Run()" << std::endl; + int moreToTick = server -> tick(); + unlockRsCore(); +/******************************** RUN SERVER *****************/ + + /* adjust tick rate depending on whether there is more. + */ + + avgTickRate = 0.2 * timeDelta + 0.8 * avgTickRate; + + if (1 == moreToTick) + { + timeDelta = 0.9 * avgTickRate; + if (timeDelta > kickLimit) + { + /* force next tick in one sec + * if we are reading data. + */ + timeDelta = kickLimit; + avgTickRate = kickLimit; + } + } + else + { + timeDelta = 1.1 * avgTickRate; + } + + /* limiter */ + if (timeDelta < minTimeDelta) + { + timeDelta = minTimeDelta; + } + else if (timeDelta > maxTimeDelta) + { + timeDelta = maxTimeDelta; + } + + /* Fast Updates */ + + + /* now we have the slow ticking stuff */ + /* stuff ticked once a second (but can be slowed down) */ + if ((int) ts > lastSec) + { + lastSec = (int) ts; + + /* Chat needs to be quick too! */ + //std::cerr << "RsServer::run() UpdateAllChat()" << std::endl; + UpdateAllChat(); + + + // every five loops (> 5 secs) + if (loop % 5 == 0) + { + // update_quick_stats(); + + // Update All Every 5 Seconds. + // These Update Functions do the locking themselves. + //std::cerr << "RsServer::run() Updates()" << std::endl; + + // These two have been completed! + //std::cerr << "RsServer::run() UpdateAllCerts()" << std::endl; + UpdateAllCerts(); + //std::cerr << "RsServer::run() UpdateAllNetwork()" << std::endl; + UpdateAllNetwork(); + + // currently Dummy Functions. + //std::cerr << "RsServer::run() UpdateAllTransfers()" << std::endl; + UpdateAllTransfers(); + + //std::cerr << "RsServer::run() UpdateAllMsgs()" << std::endl; + UpdateAllMsgs(); + //std::cerr << "RsServer::run() UpdateAllChannels()" << std::endl; + UpdateAllChannels(); + + //std::cerr << "RsServer::run() "; + //std::cerr << "UpdateRemotePeople()"< 1 min) + if (++loop >= 60) + { + loop = 0; + + // save the config every 5 minutes. + if (min % 5 == 1) + { + ConfigSave(); +#ifdef PQI_USE_CHANNELS + /* hack to update for now + * Only occassionally - cos disabled + */ + // channel_list_ok = false; + // update_channels(); +#endif + + + //std::cerr << "RsServer::run() UpdateAllFiles()" << std::endl; + //UpdateAllFiles(); + } + + /* hour loop */ + if (++min >= 60) + { + min = 0; + } + // update_dirlist(); + } + + // slow update tick as well. + // update(); + } // end of slow tick. + + } // end of only once a second. + + // update graphics.. ( but only if gui is visible ) + // This is also triggered in slow tick... + //if ((ui->main_win->shown()) || (ui->chatter_window->shown())) + { + // update(); + } + } + return; +} + + diff --git a/libretroshare/src/rsserver/p3face-startup.cc b/libretroshare/src/rsserver/p3face-startup.cc new file mode 100644 index 000000000..14e6dd6de --- /dev/null +++ b/libretroshare/src/rsserver/p3face-startup.cc @@ -0,0 +1,1260 @@ + +/* + * "$Id: p3face-startup.cc,v 1.9 2007-05-05 16:10:06 rmf24 Exp $" + * + * RetroShare C++ Interface. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 +//#include + +#include "dbase/filedex.h" +#include "server/filedexserver.h" +#include "pqi/pqipersongrp.h" +#include "pqi/pqiloopback.h" +#include "util/rsdir.h" + +#include +#include +#include + +// Includes for directory creation. +//#include +//#include +//#include +// Conflicts with FLTK def - hope they are the same. +//#include + +// for blocking signals +#include + +#include "pqi/pqidebug.h" +#include "rsserver/p3face.h" + +const int p3facestartupzone = 47238; + +// initial configuration bootstrapping... +static const std::string configInitFile = "default_cert.txt"; +static const std::string configConfFile = "config.rs"; +static const std::string configCertDir = "friends"; +static const std::string configKeyDir = "keys"; +static const std::string configCaFile = "cacerts.pem"; +static const std::string configLogFileName = "retro.log"; +static const std::string configHelpName = "retro.htm"; + + +/* Helper Functions */ +void load_check_basedir(RsInit *config); +int create_configinit(RsInit *config); + +RsControl *createRsControl(RsIface &iface, NotifyBase ¬ify) +{ + RsServer *srv = new RsServer(iface, notify); + return srv; +} + +void CleanupRsConfig(RsInit *config) +{ + delete config; +} + +static std::string getHomePath(); + + + +RsInit *InitRsConfig() +{ + RsInit *config = new RsInit(); + + config -> load_trustedpeer = false; + config -> firsttime_run = false; + config -> port = 7812; // default port. + config -> forceLocalAddr = false; + config -> haveLogFile = false; + config -> outStderr = false; + + strcpy(config->inet, "127.0.0.1"); + strcpy(config->logfname, ""); + + config -> autoLogin = false; + config -> passwd = ""; + config -> havePasswd = false; + config -> haveDebugLevel = false; + config -> debugLevel = PQL_WARNING; + config -> udpListenerOnly = false; + +#ifndef WINDOWS_SYS + config -> dirSeperator = '/'; // For unix. +#else + config -> dirSeperator = '\\'; // For windows. +#endif + + /* setup the homePath (default save location) */ + + config -> homePath = getHomePath(); + + /* Setup the Debugging */ + // setup debugging for desired zones. + setOutputLevel(PQL_WARNING); // default to Warnings. + + // For Testing purposes. + // We can adjust everything under Linux. + //setZoneLevel(PQL_DEBUG_BASIC, 38422); // pqipacket. + //setZoneLevel(PQL_DEBUG_BASIC, 96184); // pqinetwork; + //setZoneLevel(PQL_DEBUG_BASIC, 82371); // pqiperson. + //setZoneLevel(PQL_DEBUG_BASIC, 60478); // pqitunnel. + //setZoneLevel(PQL_DEBUG_BASIC, 34283); // pqihandler. + //setZoneLevel(PQL_DEBUG_BASIC, 44863); // discItems. + //setZoneLevel(PQL_DEBUG_BASIC, 2482); // p3disc + //setZoneLevel(PQL_DEBUG_BASIC, 1728); // pqi/p3proxy + //setZoneLevel(PQL_DEBUG_BASIC, 1211); // sslroot. + //setZoneLevel(PQL_DEBUG_BASIC, 37714); // pqissl. + //setZoneLevel(PQL_DEBUG_BASIC, 8221); // pqistreamer. + //setZoneLevel(PQL_DEBUG_BASIC, 9326); // pqiarchive + //setZoneLevel(PQL_DEBUG_BASIC, 3334); // p3channel. + //setZoneLevel(PQL_DEBUG_BASIC, 354); // pqipersongrp. + //setZoneLevel(PQL_DEBUG_BASIC, 6846); // pqiudpproxy + //setZoneLevel(PQL_DEBUG_BASIC, 3144); // pqissludp; + //setZoneLevel(PQL_DEBUG_BASIC, 86539); // pqifiler. + //setZoneLevel(PQL_DEBUG_BASIC, 91393); // Funky_Browser. + //setZoneLevel(PQL_DEBUG_BASIC, 25915); // fltkserver + //setZoneLevel(PQL_DEBUG_BASIC, 47659); // fldxsrvr + //setZoneLevel(PQL_DEBUG_BASIC, 49787); // pqissllistener + + return config; +} + +const char *RsConfigDirectory(RsInit *config) +{ + return (config->basedir).c_str(); +} + +//int InitRetroShare(int argc, char **argv, RsInit *config) +//{ + +/******************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS +int InitRetroShare(int argc, char **argv, RsInit *config) +{ +/******************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#else + + /* for static PThreads under windows... we need to init the library... + */ + #ifdef PTW32_STATIC_LIB + #include + #endif + +int InitRetroShare(int argcIgnored, char **argvIgnored, RsInit *config) +{ + + /* THIS IS A HACK TO ALLOW WINDOWS TO ACCEPT COMMANDLINE ARGUMENTS */ + + const int MAX_ARGS = 32; + int i,j; + + int argc; + char *argv[MAX_ARGS]; + char *wholeline = GetCommandLine(); + int cmdlen = strlen(wholeline); + // duplicate line, so we can put in spaces.. + char dupline[cmdlen+1]; + strcpy(dupline, wholeline); + + /* break wholeline down .... + * NB. This is very simplistic, and will not + * handle multiple spaces, or quotations etc, only for debugging purposes + */ + argv[0] = dupline; + for(i = 1, j = 0; (j + 1 < cmdlen) && (i < MAX_ARGS);) + { + /* find next space. */ + for(;(j + 1 < cmdlen) && (dupline[j] != ' ');j++); + if (j + 1 < cmdlen) + { + dupline[j] = '\0'; + argv[i++] = &(dupline[j+1]); + } + } + argc = i; + for( i=0; iautoLogin = true; + std::cerr << "AutoLogin Allowed"; + std::cerr << std::endl; + break; + case 'l': + strncpy(config->logfname, optarg, 1024); + std::cerr << "LogFile (" << config->logfname; + std::cerr << ") Selected" << std::endl; + config->haveLogFile = true; + break; + case 'w': + config->passwd = optarg; + std::cerr << "Password Specified(" << config->passwd; + std::cerr << ") Selected" << std::endl; + config->havePasswd = true; + break; + case 'i': + strncpy(config->inet, optarg, 256); + std::cerr << "New Inet Addr(" << config->inet; + std::cerr << ") Selected" << std::endl; + config->forceLocalAddr = true; + break; + case 'p': + config->port = atoi(optarg); + std::cerr << "New Listening Port(" << config->port; + std::cerr << ") Selected" << std::endl; + break; + case 'c': + config->basedir = optarg; + std::cerr << "New Base Config Dir("; + std::cerr << config->basedir; + std::cerr << ") Selected" << std::endl; + break; + case 's': + config->outStderr = true; + config->haveLogFile = false; + std::cerr << "Output to Stderr"; + std::cerr << std::endl; + break; + case 'd': + config->haveDebugLevel = true; + config->debugLevel = atoi(optarg); + std::cerr << "Opt for new Debug Level"; + std::cerr << std::endl; + break; + case 'u': + config->udpListenerOnly = true; + std::cerr << "Opt for only udpListener"; + std::cerr << std::endl; + break; + default: + std::cerr << "Unknown Option!"; + exit(1); + } + } + + + // set the default Debug Level... + if (config->haveDebugLevel) + { + if ((config->debugLevel > 0) && + (config->debugLevel <= PQL_DEBUG_ALL)) + { + std::cerr << "Setting Debug Level to: "; + std::cerr << config->debugLevel; + std::cerr << std::endl; + setOutputLevel(config->debugLevel); + } + else + { + std::cerr << "Ignoring Invalid Debug Level: "; + std::cerr << config->debugLevel; + std::cerr << std::endl; + } + } + + // set the debug file. + if (config->haveLogFile) + { + setDebugFile(config->logfname); + } + +/******************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#else + // Windows Networking Init. + WORD wVerReq = MAKEWORD(2,2); + WSADATA wsaData; + + if (0 != WSAStartup(wVerReq, &wsaData)) + { + std::cerr << "Failed to Startup Windows Networking"; + std::cerr << std::endl; + } + else + { + std::cerr << "Started Windows Networking"; + std::cerr << std::endl; + } + +#endif +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ + + // first check config directories, and set bootstrap values. + load_check_basedir(config); + + // SWITCH off the SIGPIPE - kills process on Linux. +/******************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS + struct sigaction sigact; + sigact.sa_handler = SIG_IGN; + sigact.sa_flags = 0; + + if (0 == sigaction(SIGPIPE, &sigact, NULL)) + { + std::cerr << "RetroShare:: Successfully Installed"; + std::cerr << "the SIGPIPE Block" << std::endl; + } + else + { + std::cerr << "RetroShare:: Failed to Install"; + std::cerr << "the SIGPIPE Block" << std::endl; + } +#endif +/******************************** WINDOWS/UNIX SPECIFIC PART ******************/ + + std::string userName; + bool existingUser = false; + if (LoadCheckXPGPandGetName(config->load_cert.c_str(), userName)) + { + std::cerr << "Existing Name: " << userName << std::endl; + existingUser = true; + } + else + { + std::cerr << "No Existing User" << std::endl; + } + + /* do a null init to allow the SSL libray to startup! */ +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + /* do a null init to allow the SSL libray to startup! */ + getSSLRoot() -> initssl(NULL, NULL, NULL); +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + getSSLRoot() -> initssl(NULL, NULL, NULL, NULL); +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + + /* if existing user, and havePasswd .... we can skip the login prompt */ + if (existingUser) + { + if (config -> havePasswd) + { + return 1; + } + if (RsTryAutoLogin(config)) + { + return 1; + } + } + return 0; +} + + +/* + * The Real RetroShare Startup Function. + */ + +int RsServer::StartupRetroShare(RsInit *config) +{ + // ssl root is setup already.... by welcome_window. + // this means that the cert/key + cacerts have been loaded. + sslr = getSSLRoot(); + +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + if (1 != sslr -> initssl(NULL, NULL, NULL)) +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + if (1 != sslr -> initssl(NULL, NULL, NULL, NULL)) +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + { + std::cerr << "main() - Fatal Error....." << std::endl; + std::cerr << "Invalid Certificate configuration!" << std::endl; + std::cerr << std::endl; + exit(1); + } + + /* set the debugging to crashMode */ + if ((!config->haveLogFile) && (!config->outStderr)) + { + std::string crashfile = config->basedir + config->dirSeperator; + crashfile += configLogFileName; + setDebugCrashMode(crashfile.c_str()); + } + + // set the directories for full configuration load. + sslr -> setConfigDirs(config->basedir.c_str(), configCertDir.c_str()); + sslr -> loadCertificates(configConfFile.c_str()); + sslr -> checkNetAddress(); + + // Create Classes. + // filedex server. + server = new filedexserver(); + server->setConfigDir(config->basedir.c_str()); + + server->setFileCallback(&(getNotify())); + + SecurityPolicy *none = secpolicy_create(); + + if (config->forceLocalAddr) + { + struct sockaddr_in laddr; + + laddr.sin_family = AF_INET; + laddr.sin_port = htons(config->port); + + // universal + laddr.sin_addr.s_addr = inet_addr(config->inet); + + cert *own = sslr -> getOwnCert(); + if (own != NULL) + { + own -> localaddr = laddr; + } + } + + /* must load the trusted_peer before setting up the pqipersongrp */ + if (config->firsttime_run) + { + /* at this point we want to load and start the trusted peer -> if selected */ + if (config->load_trustedpeer) + { + /* sslroot does further checks */ + sslr -> loadInitialTrustedPeer(config->load_trustedpeer_file); + } + + server->loadWelcomeMsg(); + + } + + unsigned long flags = 0; + if (config->udpListenerOnly) + { + flags |= PQIPERSON_NO_SSLLISTENER; + } + + pqih = new pqipersongrp(none, sslr, flags); + pqih->load_config(); + server->setSearchInterface(pqih, sslr); + +#ifdef PQI_USE_CHANNELS + server->setP3Channel(pqih->getP3Channel()); +#endif + + // create loopback device, and add to pqisslgrp. + + SearchModule *mod = new SearchModule(); + pqiloopback *ploop = new pqiloopback(); + + mod -> smi = 1; + mod -> pqi = ploop; + mod -> sp = secpolicy_create(); + + pqih->AddSearchModule(mod); + + // Set Default Save Dir. pre-load + // Load from config will overwrite... + server->setSaveDir(config->homePath.c_str()); + + server->load_config(); + + ad = pqih->getP3Disc(); + + // load up the help page + std::string helppage = config->basedir + config->dirSeperator; + helppage += configHelpName; + + /* for DHT/UPnP stuff */ + InitNetworking(config->basedir + "/kadc.ini"); + + /* Startup this thread! */ + pthread_t coreId = createThread(*this); + + return 1; +} + + + +int LoadCertificates(RsInit *config, bool autoLoginNT) +{ + if (config->load_cert == "") + { + std::cerr << "RetroShare needs a certificate" << std::endl; + return 0; + } + + if (config->load_key == "") + { + std::cerr << "RetroShare needs a key" << std::endl; + return 0; + } + + if ((!config->havePasswd) || (config->passwd == "")) + { + std::cerr << "RetroShare needs a Password" << std::endl; + return 0; + } + + std::string ca_loc = config->basedir + config->dirSeperator; + ca_loc += configCaFile; + + sslroot *sr = getSSLRoot(); + +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + if (0 < sr -> initssl(config->load_cert.c_str(), + config->load_key.c_str(), + config->passwd.c_str())) +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + if (0 < sr -> initssl(config->load_cert.c_str(), + config->load_key.c_str(), + ca_loc.c_str(), + config->passwd.c_str())) +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + + { + if (autoLoginNT) + { + std::cerr << "RetroShare will AutoLogin next time"; + std::cerr << std::endl; + + RsStoreAutoLogin(config); + } + /* wipe password */ + config->passwd = ""; + create_configinit(config); + return 1; + } + + std::cerr << "RetroShare Failed To Start!" << std::endl; + std::cerr << "Please Check File Names/Password" << std::endl; + + return 0; +} + +/* To Enter RetroShare.... must call either: + * LoadPassword, or + * RsGenerateCertificate. + * + * Then call LoadCertificate .... if it returns true.... + * its all okay. + */ + +/* Assistance for Login */ +bool ValidateCertificate(RsInit *config, std::string &userName) +{ + std::string fname = config->load_cert; + if (fname != "") + { + return LoadCheckXPGPandGetName(fname.c_str(), userName); + } + return false; +} + +bool ValidateTrustedUser(RsInit *config, std::string fname, std::string &userName) +{ + bool valid = LoadCheckXPGPandGetName(fname.c_str(), userName); + if (valid) + { + config -> load_trustedpeer = true; + config -> load_trustedpeer_file = fname; + } + else + { + config -> load_trustedpeer = false; + } + return valid; +} + +bool LoadPassword(RsInit *config, std::string passwd) +{ + config -> passwd = passwd; + config -> havePasswd = true; + return true; +} + +/* A little nasty fn.... + * (1) returns true, if successful, and updates config. + * (2) returns false if fails, with error msg to errString. + */ + +bool RsGenerateCertificate(RsInit *config, + std::string name, + std::string org, + std::string loc, + std::string country, + std::string passwd, + std::string &errString) +{ + // In the XPGP world this is easy... + // generate the private_key / certificate. + // save to file. + // + // then load as if they had entered a passwd. + + // check password. + if (passwd.length() < 4) + { + errString = "Password is Unsatisfactory (must be 4+ chars)"; + return false; + } + + if (name.length() < 3) + { + errString = "Name is too short (must be 3+ chars)"; + return false; + } + + int nbits = 2048; + + // Create the filename. + std::string basename = config->basedir + config->dirSeperator; + basename += configKeyDir + config->dirSeperator; + basename += "user"; + + std::string key_name = basename + "_pk.pem"; + std::string cert_name = basename + "_cert.pem"; + + +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + if (!generate_xpgp(cert_name.c_str(), key_name.c_str(), + passwd.c_str(), + name.c_str(), + "", //ui -> gen_email -> value(), + org.c_str(), + loc.c_str(), + "", //ui -> gen_state -> value(), + country.c_str(), + nbits)) +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + /* UNTIL THIS IS FILLED IN CANNOT GENERATE X509 REQ */ +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + { + errString = "Generation of XPGP Failed"; + return false; + } + + /* set the load passwd to the gen version + * and try to load it! + */ + + /* if we get here .... then save details to the configuration class */ + config -> load_cert = cert_name; + config -> load_key = key_name; + config -> passwd = passwd; + config -> havePasswd = true; + config -> firsttime_run = true; + + { + std::ostringstream out; + out << "RetroShare has Successfully generated"; + out << "a Certficate/Key" << std::endl; + out << "\tCert Located: " << cert_name << std::endl; + out << "\tLocated: " << key_name << std::endl; + std::cerr << out.str(); + } + return true; +} + + + +void load_check_basedir(RsInit *config) +{ + // get the default configuration location. + + if (config->basedir == "") + { + // if unix. homedir + /.pqiPGPrc +/******************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS + char *h = getenv("HOME"); + std::cerr << "retroShare::basedir() -> $HOME = "; + std::cerr << h << std::endl; + if (h == NULL) + { + std::cerr << "load_check_basedir() Fatal Error --"; + std::cerr << std::endl; + std::cerr << "\tcannot determine $HOME dir" <basedir = h; + config->basedir += "/.pqiPGPrc"; +#else + char *h = getenv("APPDATA"); + std::cerr << "retroShare::basedir() -> $APPDATA = "; + std::cerr << h << std::endl; + char *h2 = getenv("HOMEDRIVE"); + std::cerr << "retroShare::basedir() -> $HOMEDRIVE = "; + std::cerr << h2 << std::endl; + char *h3 = getenv("HOMEPATH"); + std::cerr << "retroShare::basedir() -> $HOMEPATH = "; + std::cerr << h3 << std::endl; + if (h == NULL) + { + // generating default + std::cerr << "load_check_basedir() getEnv Error --Win95/98?"; + std::cerr << std::endl; + + config->basedir="C:\\Retro"; + + } + else + { + config->basedir = h; + } + + if (!RsDirUtil::checkCreateDirectory(config->basedir)) + { + std::cerr << "Cannot Create BaseConfig Dir" << std::endl; + exit(1); + } + config->basedir += "\\RetroShare"; +#endif +/******************************** WINDOWS/UNIX SPECIFIC PART ******************/ + } + + + std::string subdir1 = config->basedir + config->dirSeperator; + std::string subdir2 = subdir1; + subdir1 += configKeyDir; + subdir2 += configCertDir; + + std::string subdir3 = config->basedir + config->dirSeperator; + subdir3 += "cache"; + + std::string subdir4 = subdir3 + config->dirSeperator; + std::string subdir5 = subdir3 + config->dirSeperator; + subdir4 += "local"; + subdir5 += "remote"; + + // fatal if cannot find/create. + std::cerr << "Checking For Directories" << std::endl; + if (!RsDirUtil::checkCreateDirectory(config->basedir)) + { + std::cerr << "Cannot Create BaseConfig Dir" << std::endl; + exit(1); + } + if (!RsDirUtil::checkCreateDirectory(subdir1)) + { + std::cerr << "Cannot Create Config/Key Dir" << std::endl; + exit(1); + } + if (!RsDirUtil::checkCreateDirectory(subdir2)) + { + std::cerr << "Cannot Create Config/Cert Dir" << std::endl; + exit(1); + } + if (!RsDirUtil::checkCreateDirectory(subdir3)) + { + std::cerr << "Cannot Create Config/Cache Dir" << std::endl; + exit(1); + } + if (!RsDirUtil::checkCreateDirectory(subdir4)) + { + std::cerr << "Cannot Create Config/Cache/local Dir" << std::endl; + exit(1); + } + if (!RsDirUtil::checkCreateDirectory(subdir5)) + { + std::cerr << "Cannot Create Config/Cache/remote Dir" << std::endl; + exit(1); + } + + // have a config directories. + + // Check for config file. + std::string initfile = config->basedir + config->dirSeperator; + initfile += configInitFile; + + // open and read in the lines. + FILE *ifd = fopen(initfile.c_str(), "r"); + char path[1024]; + int i; + + if (ifd != NULL) + { + if (NULL != fgets(path, 1024, ifd)) + { + for(i = 0; (path[i] != '\0') && (path[i] != '\n'); i++); + path[i] = '\0'; + config->load_cert = path; + } + if (NULL != fgets(path, 1024, ifd)) + { + for(i = 0; (path[i] != '\0') && (path[i] != '\n'); i++); + path[i] = '\0'; + config->load_key = path; + } + fclose(ifd); + } + + // we have now + // 1) checked or created the config dirs. + // 2) loaded the config_init file - if possible. + return; +} + +int create_configinit(RsInit *config) +{ + // Check for config file. + std::string initfile = config->basedir + config->dirSeperator; + initfile += configInitFile; + + // open and read in the lines. + FILE *ifd = fopen(initfile.c_str(), "w"); + + if (ifd != NULL) + { + fprintf(ifd, "%s\n", config->load_cert.c_str()); + fprintf(ifd, "%s\n", config->load_key.c_str()); + fclose(ifd); + + std::cerr << "Creating Init File: " << initfile << std::endl; + std::cerr << "\tLoad Cert: " << config->load_cert << std::endl; + std::cerr << "\tLoad Key: " << config->load_key << std::endl; + + return 1; + } + std::cerr << "Failed To Create Init File: " << initfile << std::endl; + return -1; +} + +#if 0 + +int check_create_directory(std::string dir) +{ + struct stat buf; + int val = stat(dir.c_str(), &buf); + if (val == -1) + { + // directory don't exist. create. +/******************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS // UNIX + if (-1 == mkdir(dir.c_str(), 0777)) +#else // WIN + if (-1 == mkdir(dir.c_str())) +#endif +/******************************** WINDOWS/UNIX SPECIFIC PART ******************/ + + { + std::cerr << "check_create_directory() Fatal Error --"; + std::cerr < $HOMEDRIVE = "; + out << h2 << std::endl; + char *h3 = getenv("HOMEPATH"); + out << "getHomePath() -> $HOMEPATH = "; + out << h3 << std::endl; + + if (h2 == NULL) + { + // Might be Win95/98 + // generate default. + home = "C:\\Retro"; + } + else + { + home = h2; + home += h3; + home += "\\Desktop"; + } + + out << "fltkserver::getHomePath() -> " << home << std::endl; + std::cerr << out; + + // convert to FLTK desired format. + home = make_path_unix(home); +#endif +/******************************** WINDOWS/UNIX SPECIFIC PART ******************/ + return home; +} + +std::string make_path_unix(std::string path) +{ + for(unsigned int i = 0; i < path.length(); i++) + { + if (path[i] == '\\') + path[i] = '/'; + } + return path; +} + +/******************************** WINDOWS/UNIX SPECIFIC PART ******************/ +/* WINDOWS STRUCTURES FOR DPAPI */ + +#ifndef WINDOWS_SYS /* UNIX */ +#else +/******************************** WINDOWS/UNIX SPECIFIC PART ******************/ + + +#include +#include +#include + +/* +class CRYPTPROTECT_PROMPTSTRUCT; +*/ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct _CRYPTPROTECT_PROMPTSTRUCT { + DWORD cbSize; + DWORD dwPromptFlags; + HWND hwndApp; + LPCWSTR szPrompt; +} CRYPTPROTECT_PROMPTSTRUCT, + *PCRYPTPROTECT_PROMPTSTRUCT; + +/* definitions for the two functions */ +__declspec (dllimport) +extern BOOL WINAPI CryptProtectData( + DATA_BLOB* pDataIn, + LPCWSTR szDataDescr, + DATA_BLOB* pOptionalEntropy, + PVOID pvReserved, + /* PVOID prompt, */ + /* CRYPTPROTECT_PROMPTSTRUCT* pPromptStruct, */ + CRYPTPROTECT_PROMPTSTRUCT* pPromptStruct, + DWORD dwFlags, + DATA_BLOB* pDataOut +); + +__declspec (dllimport) +extern BOOL WINAPI CryptUnprotectData( + DATA_BLOB* pDataIn, + LPWSTR* ppszDataDescr, + DATA_BLOB* pOptionalEntropy, + PVOID pvReserved, + /* PVOID prompt, */ + /* CRYPTPROTECT_PROMPTSTRUCT* pPromptStruct, */ + CRYPTPROTECT_PROMPTSTRUCT* pPromptStruct, + DWORD dwFlags, + DATA_BLOB* pDataOut +); + +#ifdef __cplusplus +} +#endif + +#endif +/******************************** WINDOWS/UNIX SPECIFIC PART ******************/ + + + +bool RsStoreAutoLogin(RsInit *config) +{ + std::cerr << "RsStoreAutoLogin()" << std::endl; + /* Windows only */ +/******************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS /* UNIX */ + return false; +#else + /* store password encrypted in a file */ + std::string entropy = config->load_cert; + + DATA_BLOB DataIn; + DATA_BLOB DataEnt; + DATA_BLOB DataOut; + BYTE *pbDataInput = (BYTE *) strdup(config->passwd.c_str()); + DWORD cbDataInput = strlen((char *)pbDataInput)+1; + BYTE *pbDataEnt =(BYTE *) strdup(entropy.c_str()); + DWORD cbDataEnt = strlen((char *)pbDataEnt)+1; + DataIn.pbData = pbDataInput; + DataIn.cbData = cbDataInput; + DataEnt.pbData = pbDataEnt; + DataEnt.cbData = cbDataEnt; + LPWSTR pDescrOut = NULL; + + CRYPTPROTECT_PROMPTSTRUCT prom; + + prom.cbSize = sizeof(prom); + prom.dwPromptFlags = 0; + + /********* + std::cerr << "Password (" << cbDataInput << "):"; + std::cerr << pbDataInput << std::endl; + std::cerr << "Entropy (" << cbDataEnt << "):"; + std::cerr << pbDataEnt << std::endl; + *********/ + + if(CryptProtectData( + &DataIn, + NULL, + &DataEnt, /* entropy.c_str(), */ + NULL, // Reserved. + &prom, + 0, + &DataOut)) + { + + /********** + std::cerr << "The encryption phase worked. ("; + std::cerr << DataOut.cbData << ")" << std::endl; + + for(unsigned int i = 0; i < DataOut.cbData; i++) + { + std::cerr << std::setw(2) << (int) DataOut.pbData[i]; + std::cerr << " "; + } + std::cerr << std::endl; + **********/ + + /* save the data to the file */ + std::string passwdfile = config->basedir; + passwdfile += config->dirSeperator; + passwdfile += "help.dta"; + + //std::cerr << "Save to: " << passwdfile; + //std::cerr << std::endl; + + FILE *fp = fopen(passwdfile.c_str(), "wb"); + if (fp != NULL) + { + fwrite(DataOut.pbData, 1, DataOut.cbData, fp); + fclose(fp); + + std::cerr << "AutoLogin Data saved: "; + std::cerr << std::endl; + } + } + else + { + std::cerr << "Encryption Failed"; + std::cerr << std::endl; + } + + free(pbDataInput); + free(pbDataEnt); + LocalFree(DataOut.pbData); + +#endif +/******************************** WINDOWS/UNIX SPECIFIC PART ******************/ + + return false; +} + + + +bool RsTryAutoLogin(RsInit *config) +{ + std::cerr << "RsTryAutoLogin()" << std::endl; + /* Windows only */ +/******************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS /* UNIX */ + return false; +#else + /* Require a AutoLogin flag in the config to do this */ + if (!config->autoLogin) + { + return false; + } + + /* try to load from file */ + std::string entropy = config->load_cert; + /* get the data out */ + + /* open the data to the file */ + std::string passwdfile = config->basedir; + passwdfile += config->dirSeperator; + passwdfile += "help.dta"; + + DATA_BLOB DataIn; + DATA_BLOB DataEnt; + DATA_BLOB DataOut; + + BYTE *pbDataEnt =(BYTE *) strdup(entropy.c_str()); + DWORD cbDataEnt = strlen((char *)pbDataEnt)+1; + DataEnt.pbData = pbDataEnt; + DataEnt.cbData = cbDataEnt; + + char *dataptr = NULL; + int datalen = 0; + + FILE *fp = fopen(passwdfile.c_str(), "rb"); + if (fp != NULL) + { + fseek(fp, 0, SEEK_END); + datalen = ftell(fp); + fseek(fp, 0, SEEK_SET); + dataptr = (char *) malloc(datalen); + fread(dataptr, 1, datalen, fp); + fclose(fp); + + /***** + std::cerr << "Data loaded from: " << passwdfile; + std::cerr << std::endl; + + std::cerr << "Size :"; + std::cerr << datalen << std::endl; + + for(unsigned int i = 0; i < datalen; i++) + { + std::cerr << std::setw(2) << (int) dataptr[i]; + std::cerr << " "; + } + std::cerr << std::endl; + *****/ + } + else + { + return false; + } + + BYTE *pbDataInput =(BYTE *) dataptr; + DWORD cbDataInput = datalen; + DataIn.pbData = pbDataInput; + DataIn.cbData = cbDataInput; + + + CRYPTPROTECT_PROMPTSTRUCT prom; + + prom.cbSize = sizeof(prom); + prom.dwPromptFlags = 0; + + + bool isDecrypt = CryptUnprotectData( + &DataIn, + NULL, + &DataEnt, /* entropy.c_str(), */ + NULL, // Reserved + &prom, // Opt. Prompt + 0, + &DataOut); + + if (isDecrypt) + { + //std::cerr << "Decrypted size: " << DataOut.cbData; + //std::cerr << std::endl; + if (DataOut.pbData[DataOut.cbData - 1] != '\0') + { + std::cerr << "Error: Decrypted Data not a string..."; + std::cerr << std::endl; + isDecrypt = false; + } + else + { + //std::cerr << "The decrypted data is: " << DataOut.pbData; + //std::cerr << std::endl; + config -> passwd = (char *) DataOut.pbData; + config -> havePasswd = true; + } + } + else + { + std::cerr << "Decryption error!"; + std::cerr << std::endl; + } + + /* strings to be freed */ + free(pbDataInput); + free(pbDataEnt); + + /* generated data space */ + LocalFree(DataOut.pbData); + + return isDecrypt; +#endif +/******************************** WINDOWS/UNIX SPECIFIC PART ******************/ + + return false; +} + +bool RsClearAutoLogin(std::string basedir) +{ +/******************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS /* UNIX */ + return false; +#else + std::string file = basedir; + file += "\\help.dta"; + + FILE *fp = fopen(file.c_str(), "wb"); + if (fp != NULL) + { + fwrite(" ", 1, 1, fp); + fclose(fp); + + std::cerr << "AutoLogin Data cleared! "; + std::cerr << std::endl; + return true; + } + return false; +#endif +/******************************** WINDOWS/UNIX SPECIFIC PART ******************/ + return false; +} + + + diff --git a/libretroshare/src/rsserver/p3face.h b/libretroshare/src/rsserver/p3face.h new file mode 100644 index 000000000..ab2a6ca52 --- /dev/null +++ b/libretroshare/src/rsserver/p3face.h @@ -0,0 +1,362 @@ +#ifndef MRK_P3RS_INTERFACE_H +#define MRK_P3RS_INTERFACE_H + +/* + * "$Id: p3face.h,v 1.9 2007-05-05 16:10:06 rmf24 Exp $" + * + * RetroShare C++ Interface. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "server/filedexserver.h" +#include "pqi/pqipersongrp.h" +#include "pqi/pqissl.h" + +#include "pqi/p3disc.h" + +#include "rsiface/rsiface.h" +#include "rsiface/rstypes.h" +#include "util/rsthreads.h" + +/* The Main Interface Class - for controlling the server */ + +/* The init functions are actually Defined in p3face-startup.cc + */ +RsInit *InitRsConfig(); +void CleanupRsConfig(RsInit *); +int InitRetroShare(int argc, char **argv, RsInit *config); +int LoadCertificates(RsInit *config); + +RsControl *createRsControl(RsIface &iface, NotifyBase ¬ify); + + +class PendingDirectory +{ + public: + PendingDirectory(RsCertId in_id, const DirInfo *req_dir, int depth); +void addEntry(PQFileItem *item); + + RsCertId id; + int reqDepth; + int reqTime; + DirInfo data; +}; + + +class RsServer: public RsControl, public RsThread +{ + public: +/****************************************/ + /* p3face-startup.cc: init... */ +virtual int StartupRetroShare(RsInit *config); + + public: +/****************************************/ + /* p3face.cc: main loop / util fns / locking. */ + + RsServer(RsIface &i, NotifyBase &callback); + virtual ~RsServer(); + + /* Thread Fn: Run the Core */ +virtual void run(); + + private: + /* locking stuff */ +void lockRsCore() + { + // std::cerr << "RsServer::lockRsCore()" << std::endl; + coreMutex.lock(); + } + +void unlockRsCore() + { + // std::cerr << "RsServer::unlockRsCore()" << std::endl; + coreMutex.unlock(); + } + + /* mutex */ + RsMutex coreMutex; + + /* General Internal Helper Functions + (Must be Locked) + */ + +cert *intFindCert(RsCertId &id); +RsCertId intGetCertId(cert *c); + +/****************************************/ + /* p3face-people Operations */ + + public: + + // All Public Fns, must use td::string instead of RsCertId. + // cos of windows interfacing errors... +virtual std::string NeighGetInvite(); +virtual int NeighLoadPEMString(std::string pem, std::string &id); +virtual int NeighLoadCertificate(std::string fname, std::string &id); +virtual int NeighAuthFriend(std::string id, RsAuthId code); +virtual int NeighAddFriend(std::string id); +virtual int NeighGetSigners(std::string uid, char *out, int len); + + /* Friend Operations */ +virtual int FriendStatus(std::string id, bool accept); + +virtual int FriendRemove(std::string id); +virtual int FriendConnectAttempt(std::string id); + +virtual int FriendSignCert(std::string id); +virtual int FriendTrustSignature(std::string id, bool trust); + +//virtual int FriendSetAddress(std::string, std::string &addr, unsigned short port); +virtual int FriendSaveCertificate(std::string id, std::string fname); +virtual int FriendSetBandwidth(std::string id, float outkB, float inkB); + +virtual int FriendSetLocalAddress(std::string id, std::string addr, unsigned short port); +virtual int FriendSetExtAddress(std::string id, std::string addr, unsigned short port); +virtual int FriendSetDNSAddress(std::string id, std::string addr); +virtual int FriendSetFirewall(std::string id, bool firewalled, bool forwarded); + + private: + +void intNotifyCertError(RsCertId &id, std::string errstr); +void intNotifyChangeCert(RsCertId &id); + + /* Internal Update Iface Fns */ +int UpdateAllCerts(); +int UpdateAllNetwork(); + +void initRsNI(cert *c, NeighbourInfo &ni); /* translate to Ext */ + +int ensureExtension(std::string &name, std::string def_ext); + +/****************************************/ +/****************************************/ + /* p3face-file Operations */ + + public: + + /* Directory Actions */ +virtual int RequestDirDetails(std::string uid, std::string path, + DirDetails &details); +virtual int RequestDirDetails(void *ref, DirDetails &details, uint32_t flags); +virtual int SearchKeywords(std::list keywords, std::list &results); +virtual int SearchBoolExp(Expression *exp, std::list &results); + + + /* Actions For Upload/Download */ + +// REDO these three TODO XXX . +//virtual int FileBroadcast(std::string uId, std::string src, int size); +//virtual int FileDelete(std::string, std::string); + +virtual int FileRecommend(std::string fname, std::string hash, int size); +virtual int FileRequest(std::string fname, std::string hash, uint32_t size, std::string dest); + +virtual int FileCancel(std::string fname, std::string hash, uint32_t size); +virtual int FileClearCompleted(); + + +virtual int FileSetBandwidthTotals(float outkB, float inkB); + + private: + +int UpdateAllTransfers(); + + /* send requests to people */ +int UpdateRemotePeople(); + +/****************************************/ +/****************************************/ + /* p3face-msg Operations */ + + public: + /* Message Items */ +virtual int MessageSend(MessageInfo &info); +virtual int MessageDelete(std::string id); +virtual int MessageRead(std::string id); + + + /* Channel Items */ +virtual int ChannelCreateNew(ChannelInfo &info); +virtual int ChannelSendMsg(ChannelInfo &info); + + /* Chat */ +virtual int ChatSend(ChatInfo &ci); + +/* Flagging Persons / Channels / Files in or out of a set (CheckLists) */ +virtual int SetInChat(std::string id, bool in); /* friend : chat msgs */ +virtual int SetInMsg(std::string id, bool in); /* friend : msg receipients */ +virtual int SetInBroadcast(std::string id, bool in); /* channel : channel broadcast */ +virtual int SetInSubscribe(std::string id, bool in); /* channel : subscribed channels */ +virtual int SetInRecommend(std::string id, bool in); /* file : recommended file */ +virtual int ClearInChat(); +virtual int ClearInMsg(); +virtual int ClearInBroadcast(); +virtual int ClearInSubscribe(); +virtual int ClearInRecommend(); + + + private: + + /* Internal Update Iface Fns */ +int UpdateAllChat(); +int UpdateAllMsgs(); +int UpdateAllChannels(); + +void initRsChatInfo(ChatItem *c, ChatInfo &i); + + +#ifdef PQI_USE_CHANNELS + /* Internal Helper Fns */ +RsChanId signToChanId(const channelSign &cs) const; + + +int intAddChannel(ChannelInfo &info); +int intAddChannelMsg(RsChanId id, MessageInfo &msg); + + +void initRsCI(pqichannel *in, ChannelInfo &out); +void initRsCMI(pqichannel *chan, channelMsg *cm, MessageInfo &msg); +void initRsCMFI(pqichannel *chan, chanMsgSummary *msg, + const PQChanItem::FileItem *cfdi, FileInfo &file); + +#endif + +void intCheckFileStatus(FileInfo &file); + +void initRsMI(MsgItem *msg, MessageInfo &mi); + +/****************************************/ +/****************************************/ + + public: +/****************************************/ + /* RsIface Networking */ +virtual int NetworkDHTActive(bool active); +virtual int NetworkUPnPActive(bool active); +virtual int NetworkDHTStatus(); +virtual int NetworkUPnPStatus(); + + private: +/* internal */ +int InitNetworking(std::string); +int CheckNetworking(); + +int InitDHT(std::string); +int CheckDHT(); + +int InitUPnP(); +int CheckUPnP(); + +int UpdateNetworkConfig(RsConfig &config); +int SetExternalPorts(); + + + public: +/****************************************/ + /* RsIface Config */ + /* Config */ +virtual int ConfigAddSharedDir( std::string dir ); +virtual int ConfigRemoveSharedDir( std::string dir ); +virtual int ConfigSetIncomingDir( std::string dir ); + +virtual int ConfigSetLocalAddr( std::string ipAddr, int port ); +virtual int ConfigSetExtAddr( std::string ipAddr, int port ); +virtual int ConfigSetExtName( std::string addr ); +virtual int ConfigSetLanConfig( bool fire, bool forw ); + +virtual int ConfigSetDataRates( int total, int indiv ); +virtual int ConfigSetBootPrompt( bool on ); +virtual int ConfigSave( ); + + private: +int UpdateAllConfig(); + +/****************************************/ + + + private: + + // The real Server Parts. + + filedexserver *server; + pqipersongrp *pqih; + sslroot *sslr; + p3disc *ad; + + // Worker Data..... + +}; + +/* Helper function to convert windows paths + * into unix (ie switch \ to /) for FLTK's file chooser + */ + +std::string make_path_unix(std::string winpath); + + + +/* Initialisation Class (not publicly disclosed to RsIFace) */ + +class RsInit +{ + public: + /* Commandline/Directory options */ + + /* Key Parameters that must be set before + * RetroShare will start up: + */ + std::string load_cert; + std::string load_key; + std::string passwd; + + bool havePasswd; /* for Commandline password */ + bool autoLogin; /* autoLogin allowed */ + + /* Win/Unix Differences */ + char dirSeperator; + + /* Directories */ + std::string basedir; + std::string homePath; + + /* Listening Port */ + bool forceLocalAddr; + unsigned short port; + char inet[256]; + + /* Logging */ + bool haveLogFile; + bool outStderr; + bool haveDebugLevel; + int debugLevel; + char logfname[1024]; + + bool firsttime_run; + bool load_trustedpeer; + std::string load_trustedpeer_file; + + bool udpListenerOnly; +}; + + + +#endif diff --git a/libretroshare/src/rsserver/pqistrings.cc b/libretroshare/src/rsserver/pqistrings.cc new file mode 100644 index 000000000..b79a875dd --- /dev/null +++ b/libretroshare/src/rsserver/pqistrings.cc @@ -0,0 +1,744 @@ + +/* + * "$Id: pqistrings.cc,v 1.1 2007-02-19 20:08:30 rmf24 Exp $" + * + * RetroShare C++ Interface. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "pqi/pqi.h" +#include "pqi/pqinetwork.h" + +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + +#include "pqi/xpgpcert.h" + +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + +#include "pqi/sslcert.h" + +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + +#include "rsserver/pqistrings.h" + +#include +#include +#include +#include + +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) +std::string getXPGPInfo(XPGP *cert); +#endif /* XPGP Certificates */ +/**************** PQI_USE_XPGP ******************/ + +std::string get_status_string(int status) +{ + std::string sstr(""); + if (status & PERSON_STATUS_CONNECTED) + { + sstr += "Online"; + return sstr; + } + if (!(status & PERSON_STATUS_ACCEPTED)) + { + sstr += "Denied Access"; + return sstr; + } + + if (status & PERSON_STATUS_INUSE) + { + sstr += "Connecting"; + /* + if (status & PERSON_STATUS_WILL_LISTEN) + { + sstr += "Listening"; + } + sstr += "/"; + if (status & PERSON_STATUS_WILL_CONNECT) + { + sstr += "Connecting"; + } + sstr += "]"; + */ + return sstr; + } + sstr += "Unknown"; + return sstr; +} + + +std::string get_neighbourstatus_string(Person *p) +{ + // if connected - show how long + // if !autoconnected - tick to connect. + // + // if connecting. + // show time to next connect attempt. + // else show the last connect time. + + std::ostringstream connstr; + + connstr << "Last Conn/Recv: "; + int lct = time(NULL) - p -> lc_timestamp; + int lrt = time(NULL) - p -> lr_timestamp; + if (lct < 100000000) + { + connstr << get_timeperiod_string(lct); + } + else + { + connstr << "Never"; + } + connstr << "/"; + if (lrt < 100000000) + { + connstr << get_timeperiod_string(lrt); + } + else + { + connstr << "Never"; + } + + return connstr.str(); +} + + +int get_lastconnecttime(Person *p) +{ + std::ostringstream connstr; + + int lct = time(NULL) - p -> lc_timestamp; + int lrt = time(NULL) - p -> lr_timestamp; + if (lrt < lct) + { + lct = lrt; + } + return lct; +} + +std::string get_lastconnecttime_string(Person *p) +{ + int lct = get_lastconnecttime(p); + if (lct < 32000000) + { + return get_timeperiod_string(lct); + } + else + { + return std::string("Never"); + } +} + + +std::string get_autoconnect_string(Person *p) +{ + // if connected - show how long + // if !autoconnected - tick to connect. + // + // if connecting. + // show time to next connect attempt. + // else show the last connect time. + + std::ostringstream connstr; + + Person *own = getSSLRoot() -> getOwnCert(); + if (p == own) + { + connstr << "Yourself"; + return connstr.str(); + } + + if (p -> Connected()) + { + /* + long ct = p->lc_timestamp; + if (ct < p->lr_timestamp) + ct = p->lr_timestamp; + + connstr << "Online: " << get_timeperiod_string(time(NULL) - ct); + */ + connstr << "Online"; + } + else if (p -> Manual()) + { + if (p->trustLvl < TRUST_SIGN_AUTHEN) + { + connstr << "Please Authenticate"; + } + else + { + connstr << "Tick to Connect"; + } + } + else + { + connstr << "Offline"; + } + + /* + else if (p -> WillConnect()) + { + connstr << "Connect in:"; + connstr << get_timeperiod_string(p->nc_timestamp - time(NULL)); + } + else + { + connstr << "Last Conn:"; + long ct = p->lc_timestamp; + if (ct < p->lr_timestamp) + { + ct = p->lr_timestamp; + connstr << "(I):"; + } + else + { + connstr << "(O):"; + } + connstr << get_timeperiod_string(time(NULL) - ct); + } + */ + + return connstr.str(); +} + + +std::string get_trust_string(Person *p) +{ + std::ostringstream srvstr; + + /* This is now changing to display 2 things. + * + * (1) - Proxy + * (2) - Auth Level. + */ + + Person *own = getSSLRoot() -> getOwnCert(); + if (p == own) + { + srvstr << "Yourself"; // Certificate"; + return srvstr.str(); + } + + switch(p -> trustLvl) + { + case TRUST_SIGN_OWN: + srvstr << "Auth (S)"; //Good: Own Signature"; + break; + case TRUST_SIGN_TRSTED: + srvstr << "Trusted (ST)"; //Good: Trusted Signer"; + break; + case TRUST_SIGN_AUTHEN: + srvstr << "Auth"; //Good: Authenticated"; + break; + case TRUST_SIGN_BASIC: + srvstr << "Untrusted"; // : Acquaintance "; + break; + case TRUST_SIGN_UNTRUSTED: + srvstr << "Unknown (2)"; + break; + case TRUST_SIGN_UNKNOWN: + srvstr << "Unknown (1)"; + break; + case TRUST_SIGN_NONE: + srvstr << "Unknown (0)"; + break; + case TRUST_SIGN_BAD: /* not checked yet */ + srvstr << "Not Avail"; + break; + default: + srvstr << "UNKNOWN"; + break; + } + return srvstr.str(); +} + + + +std::string get_server_string(Person *p) +{ + std::ostringstream srvstr; + + if ((0 == inaddr_cmp(p -> serveraddr, 0)) || (p -> Local())) + { + if (0 == inaddr_cmp(p -> localaddr, 0)) + { + srvstr << "Unknown Addr"; + } + else + { + srvstr << "L: " << inet_ntoa(p -> localaddr.sin_addr); + srvstr << ":" << ntohs(p -> localaddr.sin_port); + } + } + else + { + srvstr << "S: " << inet_ntoa(p -> serveraddr.sin_addr); + srvstr << ":" << ntohs(p -> serveraddr.sin_port); + } + + // need own cert! + Person *own = getSSLRoot() -> getOwnCert(); + + if ((isValidNet(&(p->serveraddr.sin_addr))) && + (!isPrivateNet(&(p->serveraddr.sin_addr))) && + (!sameNet(&(own->localaddr.sin_addr), &(p->serveraddr.sin_addr)))) + { + srvstr << " (Proxy-S) "; + } + else if ((!p->Firewalled()) && (isValidNet(&(p->localaddr.sin_addr))) && + (!isPrivateNet(&(p->localaddr.sin_addr))) && + (!sameNet(&(own->localaddr.sin_addr), &(p->localaddr.sin_addr)))) + { + srvstr << " (Proxy-L) "; + } + return srvstr.str(); +} + +const int sec_per_min = 60; +const int sec_per_hour = 3600; +const int sec_per_day = 3600 * 24; + +std::string get_timeperiod_string(int secs) +{ + + int days = secs / sec_per_day; + secs -= days * sec_per_day; + int hours = secs / sec_per_hour; + secs -= hours * sec_per_hour; + int mins = secs / sec_per_min; + secs -= mins * sec_per_min; + + std::ostringstream srvstr; + + if (days > 0) + { + srvstr << days << " days "; + } + else if (hours > 0) + { + srvstr << hours << ":" << mins << " hours"; + } + else + { + srvstr << mins << ":" << secs << " min"; + } + return srvstr.str(); +} + +std::string get_neighbour_info(cert *c) +{ + std::ostringstream ostr; + +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + ostr << getX509CNString(c -> certificate -> subject -> subject); +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + ostr << getX509CNString(c -> certificate -> cert_info -> subject); +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + + + ostr << "\t" << get_neighbourstatus_string(c); + return ostr.str(); +} + +std::string get_cert_info(cert *c) +{ + std::ostringstream ostr; + ostr << "************ Certificate **************" << std::endl; +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + ostr << getXPGPInfo(c -> certificate); +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + ostr << getX509Info(c -> certificate); +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + ostr << "********** Connection Info ************" << std::endl; + ostr << "Local Addr : " << inet_ntoa(c -> localaddr.sin_addr); + ostr << ":" << ntohs(c -> localaddr.sin_port) << std::endl; + ostr << "Server Addr : " << inet_ntoa(c -> serveraddr.sin_addr); + ostr << ":" << ntohs(c -> serveraddr.sin_port) << std::endl; + ostr << "FLAGS: "; + if (!c -> Firewalled()) + { + ostr << "Not "; + } + ostr << "Firewalled, "; + if (!c -> Forwarded()) + { + ostr << "Not "; + } + ostr << "Forwarded" << std::endl; + ostr << std::endl; + + + ostr << "Last Connect Addr: " << inet_ntoa(c -> lastaddr.sin_addr); + ostr << ":" << ntohs(c -> lastaddr.sin_port) << std::endl; + + ostr << "Last Connect Time: "; + ostr << get_timeperiod_string(time(NULL) - c -> lc_timestamp); + ostr << std::endl; + ostr << "Last Receive Time: "; + ostr << get_timeperiod_string(time(NULL) - c -> lr_timestamp); + ostr << std::endl; + ostr << std::endl; + + ostr << "Next Connect in : "; + ostr << get_timeperiod_string(c->nc_timestamp - time(NULL)); + ostr << std::endl; + + ostr << "AutoConnect: " << get_autoconnect_string(c); + ostr << std::endl; + + ostr << "***************************************" << std::endl; + + return ostr.str(); +} + + +std::string getX509Info(X509 *cert) +{ + // Details from the structure + // cert_info (X509_CINF *) + // sig_alg (X509_ALGOR *) + // signature (ASN1_BIT_STRING *) + // valid (int) + // references (int) + // name (char *) + // + // random flags + // + // skid (ASN1_OCTET_STRING *) + // akid (AUTHORITY_KEYID *) + // aux (X509_CERT_AUX *) + std::string certstr; + char numstr[1000]; + + sprintf(numstr, "%ld", ASN1_INTEGER_get(cert -> cert_info -> version)); + certstr += "Version: "; + certstr += numstr; + + sprintf(numstr, "%ld", ASN1_INTEGER_get(cert -> + cert_info -> serialNumber)); + certstr += "\nSerial Number: "; + certstr += numstr; + +// switch(cert -> cert_info -> signature) +// { +// case STANDRD: +// certstr += "\nSig Algorithm: Standard"; +// break; +// default: +// certstr += "\nSig Algorithm: Unknown"; +// break; +// } +// + + + certstr += "\nSubject:\n"; + certstr += getX509NameString(cert -> cert_info -> subject); + + // Validity in Here. cert -> cert_info -> validity; + + certstr += "\nIssuer:\n"; + certstr += getX509NameString(cert -> cert_info -> issuer); + + // Key cert -> cert_info -> key; + // + // IDS + extensions. cert -> cert_info -> issuerUID/subjectUID; + // cert -> cert_info -> extensions; + + // END OF INFO. + + // Next sigalg again? + // next sig... + certstr += "\nSignature:"; + for(int i = 0; i < cert -> signature -> length;) + { + if (i % 128 == 0) + { + certstr += "\n\t"; + } + char hbyte = 0; + for(int j = 0; (j < 4) && (i < cert -> signature -> length); + j++, i++) + { + hbyte = hbyte << 1; + if (ASN1_BIT_STRING_get_bit(cert -> signature, i) == 1) + { + hbyte++; + //std::cerr << "1"; + } + else + { + //std::cerr << "0"; + } + } + if (hbyte > 9) + { + certstr += ('a' + (hbyte - 10)); + } + else + { + certstr += ('0' + hbyte); + } + //std::cerr << " " << i << " " << (char) ('0' + hbyte); + //std::cerr << " " << (int) hbyte << std::endl; + } + + + sprintf(numstr, "%d/%d", cert -> valid, cert -> references); + certstr += "\nValid/References: "; + certstr += numstr; + certstr += "\n"; + + // That will do for now. + return certstr; +} + +/* Helper function to convert a Epoch Timestamp + * into a string. + */ + +static char *TIME_FORMAT_STR_BRIEF = "%H:%M:%S"; +static char *TIME_FORMAT_STR_OLDVAGUE_NOW = "%H:%M:%S"; +static char *TIME_FORMAT_STR_OLDVAGUE_WEEK = "%a %H:%M"; +static char *TIME_FORMAT_STR_OLDVAGUE_OLD = "%a, %d %b"; +static char *TIME_FORMAT_STR_LONG = "%c"; +static char *TIME_FORMAT_STR_NORMAL = "%a, %H:%M:%S"; + +std::string timeFormat(int epoch, int format) +{ + time_t ctime = epoch; + struct tm *stime = localtime(&ctime); + + size_t msize = 1024; + char space[msize]; + char *fmtstr = NULL; + + if (format == TIME_FORMAT_OLDVAGUE) + { + int itime = time(NULL); + int delta = abs(itime - ctime); + if (delta < 12 * 3600) + { + format = TIME_FORMAT_OLDVAGUE_NOW; + } + else if (delta < 3 * 24 * 3600) + { + format = TIME_FORMAT_OLDVAGUE_WEEK; + } + else + { + format = TIME_FORMAT_OLDVAGUE_OLD; + } + } + + switch(format) + { + case TIME_FORMAT_BRIEF: + fmtstr = TIME_FORMAT_STR_BRIEF; + break; + case TIME_FORMAT_OLDVAGUE_NOW: + fmtstr = TIME_FORMAT_STR_OLDVAGUE_NOW; + break; + case TIME_FORMAT_OLDVAGUE_WEEK: + fmtstr = TIME_FORMAT_STR_OLDVAGUE_WEEK; + break; + case TIME_FORMAT_OLDVAGUE_OLD: + fmtstr = TIME_FORMAT_STR_OLDVAGUE_OLD; + break; + case TIME_FORMAT_LONG: + fmtstr = TIME_FORMAT_STR_LONG; + break; + case TIME_FORMAT_NORMAL: + default: + fmtstr = TIME_FORMAT_STR_NORMAL; + break; + } + + if (fmtstr != NULL) // Short -> Only Time. + { + int usize = strftime(space, msize, fmtstr, stime); + if (usize > 0) + return std::string(space); + } + return std::string(""); +} + +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + + +std::string getXPGPInfo(XPGP *cert) +{ + std::stringstream out; + long l; + int i,j; + + out << "XPGP Certificate:" << std::endl; + l=XPGP_get_version(cert); + out << " Version: " << l+1 << "(0x" << l << ")" << std::endl; + out << " Subject: " << std::endl; + out << " " << getX509NameString(cert -> subject -> subject); + out << std::endl; + out << std::endl; + out << " Signatures:" << std::endl; + + for(i = 0; i < sk_XPGP_SIGNATURE_num(cert->signs); i++) + { + out << "Sign[" << i << "] -> ["; + + XPGP_SIGNATURE *sig = sk_XPGP_SIGNATURE_value(cert->signs,i); + ASN1_BIT_STRING *signature = sig->signature; + int signlen = ASN1_STRING_length(signature); + unsigned char *signdata = ASN1_STRING_data(signature); + + /* only show the first 8 bytes */ + if (signlen > 8) + signlen = 8; + for(j=0;jissuer); + out << std::endl; + out << std::endl; + } + + return out.str(); +} + + + +std::string getXPGPAuthCode(XPGP *xpgp) +{ + /* get the self signature -> the first signature */ + + std::stringstream out; + if (1 > sk_XPGP_SIGNATURE_num(xpgp->signs)) + { + out.str(); + } + + XPGP_SIGNATURE *sig = sk_XPGP_SIGNATURE_value(xpgp->signs,0); + ASN1_BIT_STRING *signature = sig->signature; + int signlen = ASN1_STRING_length(signature); + unsigned char *signdata = ASN1_STRING_data(signature); + + /* extract the authcode from the signature */ + /* convert it to a string, inverse of 2 bytes of signdata */ + if (signlen > 2) + signlen = 2; + int j; + for(j=0;j getXPGPsigners(XPGP *cert) +{ + std::list signers; + int i; + + for(i = 0; i < sk_XPGP_SIGNATURE_num(cert->signs); i++) + { + XPGP_SIGNATURE *sig = sk_XPGP_SIGNATURE_value(cert->signs,i); + std::string str = getX509CNString(sig->issuer); + signers.push_back(str); + std::cerr << "XPGPsigners(" << i << ")" << str << std::endl; + } + return signers; +} + + +#endif /* XPGP Certificates */ +/**************** PQI_USE_XPGP ******************/ + + +std::string get_cert_name(cert *c) +{ +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + return getX509CNString(c->certificate->subject -> subject); +#else + return getX509CNString(c->certificate->cert_info -> subject); +#endif /* XPGP Certificates */ +/**************** PQI_USE_XPGP ******************/ +} + +std::string get_cert_org(cert *c) +{ +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + return getX509OrgString(c->certificate->subject -> subject); +#else + return getX509OrgString(c->certificate->cert_info -> subject); +#endif /* XPGP Certificates */ +/**************** PQI_USE_XPGP ******************/ +} + +std::string get_cert_loc(cert *c) +{ +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + return getX509LocString(c->certificate->subject -> subject); +#else + return getX509LocString(c->certificate->cert_info -> subject); +#endif /* XPGP Certificates */ +/**************** PQI_USE_XPGP ******************/ +} + +std::string get_cert_country(cert *c) +{ +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + return getX509CountryString(c->certificate->subject -> subject); +#else + return getX509CountryString(c->certificate->cert_info -> subject); +#endif /* XPGP Certificates */ +/**************** PQI_USE_XPGP ******************/ +} + + + + + diff --git a/libretroshare/src/rsserver/pqistrings.h b/libretroshare/src/rsserver/pqistrings.h new file mode 100644 index 000000000..e07611966 --- /dev/null +++ b/libretroshare/src/rsserver/pqistrings.h @@ -0,0 +1,78 @@ +#ifndef PQI_STRINGS_H +#define PQI_STRINGS_H + +/* + * "$Id: pqistrings.h,v 1.1 2007-02-19 20:08:30 rmf24 Exp $" + * + * RetroShare C++ Interface. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 +#include + +class Person; +class cert; + +#include + +std::string get_cert_country(cert *c); +std::string get_cert_loc(cert *c); +std::string get_cert_org(cert *c); +std::string get_cert_name(cert *c); + +std::string get_status_string(int status); +std::string get_autoconnect_string(Person *p); +std::string get_server_string(Person *p); +std::string get_trust_string(Person *p); +std::string get_timeperiod_string(int secs); + +std::string get_cert_info(cert *c); +std::string get_neighbour_info(cert *c); + +int get_lastconnecttime(Person *p); +std::string get_lastconnecttime_string(Person *p); + +std::string getX509NameString(X509_NAME *name); +std::string getX509Info(X509 *cert); +std::string getX509CNString(X509_NAME *name); + +#define TIME_FORMAT_BRIEF 0x001 +#define TIME_FORMAT_LONG 0x002 +#define TIME_FORMAT_NORMAL 0x003 +#define TIME_FORMAT_OLDVAGUE 0x004 +#define TIME_FORMAT_OLDVAGUE_NOW 0x005 +#define TIME_FORMAT_OLDVAGUE_WEEK 0x006 +#define TIME_FORMAT_OLDVAGUE_OLD 0x007 + +std::string timeFormat(int epoch, int format); + +#if defined(PQI_USE_XPGP) + +std::string getXPGPInfo(XPGP *cert); +std::string getXPGPAuthCode(XPGP *xpgp); +std::list getXPGPsigners(XPGP *cert); + +#endif /* XPGP Certificates */ + + +#endif diff --git a/libretroshare/src/rsserver/rsiface.cc b/libretroshare/src/rsserver/rsiface.cc new file mode 100644 index 000000000..571af99f1 --- /dev/null +++ b/libretroshare/src/rsserver/rsiface.cc @@ -0,0 +1,259 @@ + +/* + * "$Id: rsiface.cc,v 1.6 2007-04-15 18:45:23 rmf24 Exp $" + * + * RetroShare C++ Interface. + * + * Copyright 2004-2007 by Robert Fernie. + * + * 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 "rsiface/rsiface.h" +#include "util/rsdir.h" + +const NeighbourInfo *RsIface::getFriend(std::string id) +{ + RsCertId cid(id); + std::map::const_iterator it; + it = mFriendMap.find(cid); + if (it == mFriendMap.end()) + { + return NULL; + } + return &(it -> second); +} + +const DirInfo *RsIface::getDirectory(std::string id, std::string path) +{ + const DirInfo *dir = getDirectoryMod(id, path); + return dir; +} + + +const PersonInfo *RsIface::getPerson(std::string id) +{ + const PersonInfo *pi = getPersonMod(id); + return pi; +} + +PersonInfo *RsIface::getPersonMod(std::string uid) +{ + RsCertId id(uid); + + /* get the Root of the Directories */ + std::list::iterator pit; + + /* check if local */ + for(pit = mLocalDirList.begin(); + (pit != mLocalDirList.end()) && (pit->id != id); pit++); + + if (pit == mLocalDirList.end()) + { + /* check the remote ones */ + for(pit = mRemoteDirList.begin(); + (pit != mRemoteDirList.end()) && (pit->id != id); pit++); + + /* bailout ...? */ + if (pit == mRemoteDirList.end()) + { + return NULL; + } + } + return &(*pit); +} + + +DirInfo *RsIface::getDirectoryMod(std::string uid, std::string path) +{ + RsCertId id(uid); + + /* get the Root of the Directories */ + std::list::iterator dit; + + std::list subdirs; + std::list::iterator sit; + + PersonInfo *pi = getPersonMod(uid); + if (!pi) + { + return NULL; + } + + /* have the correct person now */ + RsDirUtil::breakupDirList(path, subdirs); + + DirInfo *node = &(pi -> rootdir); + + for(sit = subdirs.begin(); sit != subdirs.end(); sit++) + { + for(dit = node->subdirs.begin(); + (dit != node->subdirs.end()) && + (dit->dirname != *sit); dit++); + + if (dit == node->subdirs.end()) + { + /* Directory don't exist..... */ + return NULL; + } + else + { + node = &(*dit); + } + } + return node; +} + + + + +const MessageInfo *RsIface::getMessage(std::string cid_in, std::string mid_in) +{ + /* check for this message */ + std::list::iterator it; + + RsCertId cId(cid_in); + RsMsgId mId(mid_in); + + std::cerr << "RsIface::getMessage()" << std::endl; + std::cerr << "cid: " << cid_in << " -> cId " << cId << std::endl; + std::cerr << "mid: " << mid_in << " -> mId " << mId << std::endl; + + for(it = mMessageList.begin(); it != mMessageList.end(); it++) + { + std::cerr << "VS: cid: " << it->id << std::endl; + std::cerr << "VS: mid: " << it->msgId << std::endl; + if ((it->id == cId) && (mId == it->msgId)) + { + std::cerr << "MATCH!" << std::endl; + return &(*it); + } + } + + std::cerr << "NO MATCH :(" << std::endl; + return NULL; +} + + +const MessageInfo *RsIface::getChannelMsg(std::string chid_in, std::string mid_in) +{ + RsChanId cId(chid_in); + RsMsgId mId(mid_in); + + std::map::iterator it; + it = mChannelMap.find(cId); + + if (it == mChannelMap.end()) + { + it = mChannelOwnMap.find(cId); + + if (it == mChannelOwnMap.end()) + { + return NULL; + } + } + + /* else */ + std::list::iterator it2; + std::list &msgs = (it->second).msglist; + for(it2 = msgs.begin(); it2 != msgs.end(); it2++) + { + if (mId == it2->msgId) + { + return &(*it2); + } + } + + return NULL; +} + +/* set to true */ +bool RsIface::setChanged(DataFlags set) +{ + if ((int) set < (int) NumOfFlags) + { + /* go for it */ + mChanged[(int) set ] = true; + return true; + } + return false; +} + + +/* leaves it */ +bool RsIface::getChanged(DataFlags set) +{ + if ((int) set < (int) NumOfFlags) + { + /* go for it */ + return mChanged[(int) set ]; + } + return false; +} + +/* resets it */ +bool RsIface::hasChanged(DataFlags set) +{ + if ((int) set < (int) NumOfFlags) + { + /* go for it */ + if (mChanged[(int) set ]) + { + mChanged[(int) set ] = false; + return true; + } + } + return false; +} + +/*************************** THE REAL RSIFACE (with MUTEXES) *******/ + +#include "util/rsthreads.h" + +class RsIfaceReal: public RsIface +{ +public: + RsIfaceReal(NotifyBase &callback) + :RsIface(callback) + { return; } + + virtual void lockData() + { +// std::cerr << "RsIfaceReal::lockData()" << std::endl; + return rsIfaceMutex.lock(); + } + + virtual void unlockData() + { +// std::cerr << "RsIfaceReal::unlockData()" << std::endl; + return rsIfaceMutex.unlock(); + } + +private: + RsMutex rsIfaceMutex; +}; + +RsIface *createRsIface(NotifyBase &cb) +{ + return new RsIfaceReal(cb); +} + + + diff --git a/libretroshare/src/rsserver/rstypes.cc b/libretroshare/src/rsserver/rstypes.cc new file mode 100644 index 000000000..e45ca173d --- /dev/null +++ b/libretroshare/src/rsserver/rstypes.cc @@ -0,0 +1,320 @@ + +/* + * "$Id: rstypes.cc,v 1.2 2007-04-07 08:41:00 rmf24 Exp $" + * + * RetroShare C++ Interface. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + +/* Insides of RetroShare interface. + * only prints stuff out at the moment + */ + +#include "rsiface/rstypes.h" +#include +#include +#include + + +/****************************************/ +RsCertId::RsCertId() +{ + for(int i = 0; i < RSCERTIDLEN; i++) + { + data[i] = 0; + } +} + +/********************************************************************** + * NOTE NOTE NOTE ...... XXX + * BUG in MinGW .... %hhx in sscanf overwrites 32bits, instead of 8bits. + * this means that scanf(.... &(data[15])) is running off the + * end of the buffer, and hitting data[15-18]... + * To work around this bug we are reading into proper int32s + * and then copying the data over... + * +**********************************************************************/ + +RsCertId::RsCertId(std::string idstr) +{ + unsigned int a, b, c, d; + /* scan the string and create an id */ + if (16 != sscanf(idstr.c_str(), + "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx:%hhx:%hhx:%hhx:%hhx:%hhx:%hhx:%x:%x:%x:%x", + &(data[0]), &(data[1]), &(data[2]), &(data[3]), + &(data[4]), &(data[5]), &(data[6]), &(data[7]), + &(data[8]), &(data[9]), &(data[10]), &(data[11]), + &a, &b, &c, &d)) + { + std::cerr << "RsCertId() Invalid Parsing!" << std::endl; + /* clear it */ + for(int i = 0; i < RSCERTIDLEN; i++) + { + data[i] = 0; + } + } + ((unsigned char *) data)[12] = a; + ((unsigned char *) data)[13] = b; + ((unsigned char *) data)[14] = c; + ((unsigned char *) data)[15] = d; +} + +bool RsCertId::operator<(const RsCertId &ref) const +{ + //compare the signature. + if (0 > memcmp(data, ref.data, RSCERTIDLEN)) + return true; + return false; +} + +bool RsCertId::operator==(const RsCertId &ref) const +{ + //compare the signature. + return (0 == memcmp(data, ref.data, RSCERTIDLEN)); +} + +bool RsCertId::operator!=(const RsCertId &ref) const +{ + //compare the signature. + return !(*this == ref); +} + +std::ostream &operator<<(std::ostream &out, const RsCertId &id) +{ + std::ostringstream str; + for(int i = 0; i < RSCERTIDLEN; i++) + { + if (i != 0) + { + str << ":"; + } + str << std::hex << std::setw(2) << std::setfill('0') + << std::setprecision(2); + str << (unsigned int) (((unsigned char *) (id.data))[i]); + } + out << str.str(); + return out; +} + + +/****************************************/ + /* Print Functions for Info Classes */ +std::ostream &operator<<(std::ostream &out, const NeighbourInfo &info) +{ + out << "Neighbour Name: " << info.name; + out << std::endl; + out << "TrustLvl: " << info.trustLvl; + out << std::endl; + out << "Status: " << info.status; + out << std::endl; + out << "Auth Code: " << info.authCode; + out << std::endl; + return out; +} + +std::ostream &operator<<(std::ostream &out, const PersonInfo &info) +{ + out << "Directory Listing for: " << info.name; + out << std::endl; + print(out, info.rootdir, 0); + return out; +} + +std::ostream &print(std::ostream &out, const DirInfo &info, int indentLvl) +{ + int i; + std::ostringstream indents; + for(i = 0; i < indentLvl; i++) + { + indents << " "; + } + out << indents.str() << "Dir: " << info.dirname << std::endl; + if (info.subdirs.size() > 0) + { + out << indents.str() << "subdirs:" << std::endl; + std::list::const_iterator it; + for(it = info.subdirs.begin(); it != info.subdirs.end(); it++) + { + print(out, *it, indentLvl + 1); + } + } + if (info.files.size() > 0) + { + out << indents.str() << "files:" << std::endl; + std::list::const_iterator it2; + for(it2 = info.files.begin(); it2 != info.files.end(); it2++) + { + out << indents.str() << " " << it2->fname; + out << " " << it2->size << std::endl; + } + } + return out; +} + + +std::ostream &operator<<(std::ostream &out, const MessageInfo &info) +{ + out << "MessageInfo(TODO)"; + out << std::endl; + return out; +} + +std::ostream &operator<<(std::ostream &out, const ChannelInfo &info) +{ + out << "ChannelInfo(TODO)"; + out << std::endl; + return out; +} + +std::ostream &operator<<(std::ostream &out, const ChatInfo &info) +{ + out << "ChatInfo(TODO)"; + out << std::endl; + return out; +} + + + +int DirInfo::merge(const DirInfo &udir) +{ + /* add in the data from the udir */ + if (infoAge > udir.infoAge) + { + return -1; + } + + + std::list::const_iterator it; + for(it = udir.subdirs.begin(); it != udir.subdirs.end(); it++) + { + update(*it); + } + + std::list::const_iterator it2; + for(it2 = udir.files.begin(); it2 != udir.files.end(); it2++) + { + add(*it2); + } + + infoAge = udir.infoAge; + nobytes = udir.nobytes; + + //nofiles = udir.nofiles; + nofiles = subdirs.size() + files.size(); + return 1; +} + + + +int DirInfo::update(const DirInfo &dir) +{ + /* add in the data from the udir */ + DirInfo *odir = existsPv(dir); + if (odir) + { + // leave.. dirup -> subdirs = pd.data.subdirs; + // leave.. dirup -> files = pd.data.files; + odir->infoAge = dir.infoAge; + odir->nofiles = dir.nofiles; + odir->nobytes = dir.nobytes; + } + else + { + subdirs.push_back(dir); + } + return 1; +} + +bool DirInfo::exists(const DirInfo &sdir) +{ + return (existsPv(sdir) != NULL); +} + + + +DirInfo *DirInfo::existsPv(const DirInfo &sdir) +{ + std::list::iterator it; + for(it = subdirs.begin(); it != subdirs.end(); it++) + { + if (sdir.dirname == it->dirname) + { + return &(*it); + } + } + return NULL; +} + + +bool DirInfo::exists(const FileInfo &file) +{ + return (existsPv(file) != NULL); +} + + + +FileInfo *DirInfo::existsPv(const FileInfo &file) +{ + std::list::iterator it; + for(it = files.begin(); it != files.end(); it++) + { + if (file.fname == it->fname) + { + return &(*it); + } + } + return NULL; +} + + +bool DirInfo::add(const DirInfo & sdir) +{ + DirInfo *entry = existsPv(sdir); + if (entry) + { + *entry = sdir; + return false; + } + else + { + subdirs.push_back(sdir); + return true; + } +} + + +bool DirInfo::add(const FileInfo & file) +{ + FileInfo *entry = existsPv(file); + if (entry) + { + *entry = file; + return false; + } + else + { + files.push_back(file); + return true; + } +} + + diff --git a/libretroshare/src/rsserver/testRsChanId.cc b/libretroshare/src/rsserver/testRsChanId.cc new file mode 100644 index 000000000..82c17cf69 --- /dev/null +++ b/libretroshare/src/rsserver/testRsChanId.cc @@ -0,0 +1,59 @@ + +/* + * "$Id: testRsChanId.cc,v 1.1 2007-02-19 20:08:30 rmf24 Exp $" + * + * RetroShare C++ Interface. + * + * Copyright 2004-2007 by Robert Fernie. + * + * 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 "rstypes.h" +#include +#include +#include + +int main() +{ + RsCertId id; + + int i; + for(i = 0; i < 16; i++) + { + id.data[i] = i+121; + } + + std::cerr << "Cert Id: " << id << std::endl; + + std::ostringstream out; + out << id; + std::string idstr = out.str(); + + std::cerr << "Cert Id (str): " << idstr << std::endl; + + RsCertId id2(idstr); + + std::cerr << "Cert Id2 (from str): " << id2 << std::endl; + return 1; +} + + + diff --git a/libretroshare/src/server/Makefile b/libretroshare/src/server/Makefile new file mode 100644 index 000000000..6cede1e9c --- /dev/null +++ b/libretroshare/src/server/Makefile @@ -0,0 +1,28 @@ + +RS_TOP_DIR = .. +include ../make.opt + +OBJ = filedexserver.o pqifiler.o \ + ft.o ftfiler.o hashsearch.o + +EXEC = ftcachetest + +all : $(OBJ) librs $(EXEC) + +librs: $(OBJ) + $(AR) r $(LIBRS) $(OBJ) + $(RANLIB) $(LIBRS) + +ftcachetest : ftcachetest.o $(OBJ) + $(CC) $(CFLAGS) -o ftcachetest ftcachetest.o $(OBJ) $(RSLIBS) + +.cc.o: + $(CC) $(CFLAGS) -c $< + +clean: + -/bin/rm $(OBJ) + -/bin/rm ftcachetest.o + +clobber: clean + -/bin/rm $(EXEC) + diff --git a/libretroshare/src/server/filedexserver.cc b/libretroshare/src/server/filedexserver.cc new file mode 100644 index 000000000..86b5db40f --- /dev/null +++ b/libretroshare/src/server/filedexserver.cc @@ -0,0 +1,1413 @@ +/* + * "$Id: filedexserver.cc,v 1.24 2007-05-05 16:10:06 rmf24 Exp $" + * + * Other Bits for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + + +/* So this is a test pqi server..... + * + * the idea is that this holds some + * random data....., and responds to + * requests of a pqihandler. + * + */ + +// as it is a simple test... +// don't make anything hard to do. +// + +#include "server/filedexserver.h" +#include +#include + +#include "pqi/pqibin.h" +#include "pqi/pqiarchive.h" +#include "pqi/pqidebug.h" + +#include "util/rsdir.h" +#include +#include + + +/* New FileCache Stuff */ +#include "pqi/pqimon.h" +#include "server/ftfiler.h" +#include "dbase/cachestrapper.h" +#include "dbase/fimonitor.h" +#include "dbase/fistore.h" + + +#include + +const int fldxsrvrzone = 47659; + + +/* Another little hack ..... unique message Ids + * will be handled in this class..... + * These are unique within this run of the server, + * and are not stored long term.... + * + * Only 3 entry points: + * (1) from network.... + * (2) from local send + * (3) from storage... + */ + +static unsigned int msgUniqueId = 1; +unsigned int getNewUniqueMsgId() +{ + return msgUniqueId++; +} + + + +filedexserver::filedexserver() + :pqisi(NULL), sslr(NULL), + + ftFiler(NULL), + + save_dir("."), + msgChanged(1), msgMajorChanged(1), chatChanged(1) +#ifdef PQI_USE_CHANNELS + ,channelsChanged(1) +#endif +{ +#ifdef PQI_USE_CHANNELS + p3chan = NULL; +#endif + initialiseFileStore(); + +} + +int filedexserver::setSearchInterface(P3Interface *si, sslroot *sr) +{ + pqisi = si; + sslr = sr; + return 1; +} + + +std::list filedexserver::getTransfers() +{ + return ftFiler->getStatus(); +} + + + + + + +int filedexserver::tick() +{ + pqioutput(PQL_DEBUG_BASIC, fldxsrvrzone, + "filedexserver::tick()"); + + /* the new Cache Hack() */ + FileStoreTick(); + + if (pqisi == NULL) + { + std::ostringstream out; + pqioutput(PQL_DEBUG_BASIC, fldxsrvrzone, + "filedexserver::tick() Invalid Interface()"); + + return 1; + } + + int moreToTick = 0; + + if (0 < pqisi -> tick()) + { + moreToTick = 1; + } + + if (0 < handleInputQueues()) + { + moreToTick = 1; + } + + if (0 < handleOutputQueues()) + { + moreToTick = 1; + } + + if (0 < getChat()) + { + moreToTick = 1; + } + checkOutgoingMessages(); /* don't worry about increasing tick rate! */ + + return moreToTick; +} + + +int filedexserver::status() +{ + pqioutput(PQL_DEBUG_BASIC, fldxsrvrzone, + "filedexserver::status()"); + + if (pqisi == NULL) + { + pqioutput(PQL_DEBUG_BASIC, fldxsrvrzone, + "filedexserver::status() Invalid Interface()"); + return 1; + } + + pqisi -> status(); + + return 1; +} + +std::string filedexserver::getSaveDir() +{ + return save_dir; +} + +void filedexserver::setSaveDir(std::string d) +{ + save_dir = d; + ftFiler -> setSaveBasePath(save_dir); +} + + +bool filedexserver::getSaveIncSearch() +{ + return save_inc; +} + +void filedexserver::setSaveIncSearch(bool v) +{ + save_inc = v; +} + + +/***************** Chat Stuff **********************/ + +int filedexserver::sendChat(std::string msg) +{ + // make chat item.... + ChatItem *ci = new ChatItem(); + ci -> sid = getPQIsearchId(); + ci -> p = sslr -> getOwnCert(); + ci -> flags = 0; + + pqioutput(PQL_DEBUG_BASIC, fldxsrvrzone, + "filedexserver::sendChat()"); + + ci -> msg = msg; + + /* will come back to us anyway (for now) */ + //ichat.push_back(ci -> clone()); + //chatChanged.IndicateChanged(); + + { + std::ostringstream out; + out << "Chat Item we are sending:" << std::endl; + ci -> print(out); + pqioutput(PQL_DEBUG_BASIC, fldxsrvrzone, out.str()); + } + + /* to global .... */ + pqisi -> SendGlobalMsg(ci); + return 1; +} + +int filedexserver::sendPrivateChat(ChatItem *ci) +{ + // make chat item.... + pqioutput(PQL_DEBUG_BASIC, fldxsrvrzone, + "filedexserver::sendPrivateChat()"); + + { + std::ostringstream out; + out << "Private Chat Item we are sending:" << std::endl; + ci -> print(out); + pqioutput(PQL_DEBUG_BASIC, fldxsrvrzone, out.str()); + } + + /* to global .... */ + pqisi -> SendMsg(ci); + return 1; +} + + +int filedexserver::getChat() +{ + ChatItem *ci; + int i = 0; + while((ci = pqisi -> GetMsg()) != NULL) + { + ++i; + ci -> epoch = time(NULL); + std::string mesg; + + if (ci -> subtype == PQI_MI_SUBTYPE_MSG) + { + // then a message..... push_back. + MsgItem *mi = (MsgItem *) ci; + if (mi -> p == sslr->getOwnCert()) + { + /* from the loopback device */ + mi -> msgflags = PQI_MI_FLAGS_OUTGOING; + } + else + { + /* from a peer */ + mi -> msgflags = 0; + } + + /* new as well! */ + mi -> msgflags |= PQI_MI_FLAGS_NEW; + /* STORE MsgID */ + mi -> sid = getNewUniqueMsgId(); + + imsg.push_back(mi); + //nmsg.push_back(mi); + msgChanged.IndicateChanged(); + } + else + { + // push out the chat instead. + ichat.push_back(ci); + chatChanged.IndicateChanged(); + } + } + + if (i > 0) + { + return 1; + } + return 0; +} + + +std::list filedexserver::getChatQueue() +{ + std::list ilist = ichat; + ichat.clear(); + return ilist; +} + + +std::list &filedexserver::getMsgList() +{ + return imsg; +} + +std::list &filedexserver::getMsgOutList() +{ + return msgOutgoing; +} + + + +std::list filedexserver::getNewMsgs() +{ + std::list tmplist = nmsg; + nmsg.clear(); + return tmplist; +} + +/* remove based on the unique mid (stored in sid) */ +int filedexserver::removeMsgId(unsigned long mid) +{ + std::list::iterator it; + + for(it = imsg.begin(); it != imsg.end(); it++) + { + if ((*it)->sid == mid) + { + MsgItem *mi = (*it); + imsg.erase(it); + delete mi; + msgChanged.IndicateChanged(); + msgMajorChanged.IndicateChanged(); + return 1; + } + } + + /* try with outgoing messages otherwise */ + for(it = msgOutgoing.begin(); it != msgOutgoing.end(); it++) + { + if ((*it)->sid == mid) + { + MsgItem *mi = (*it); + msgOutgoing.erase(it); + delete mi; + msgChanged.IndicateChanged(); + msgMajorChanged.IndicateChanged(); + return 1; + } + } + + return 0; +} + +int filedexserver::markMsgIdRead(unsigned long mid) +{ + std::list::iterator it; + + for(it = imsg.begin(); it != imsg.end(); it++) + { + if ((*it)->sid == mid) + { + MsgItem *mi = (*it); + mi -> msgflags &= ~(PQI_MI_FLAGS_NEW); + msgChanged.IndicateChanged(); + return 1; + } + } + return 0; +} + +int filedexserver::removeMsgItem(int itemnum) +{ + std::list::iterator it; + int i; + + for(i = 1, it = imsg.begin(); (i != itemnum) && (it != imsg.end()); it++, i++); + if (it != imsg.end()) + { + MsgItem *mi = (*it); + imsg.erase(it); + delete mi; + msgChanged.IndicateChanged(); + msgMajorChanged.IndicateChanged(); + return 1; + } + return 0; +} + + +int filedexserver::removeMsgItem(MsgItem *mi) +{ + std::list::iterator it; + for(it = imsg.begin(); (mi != *it) && (it != imsg.end()); it++); + if (it != imsg.end()) + { + imsg.erase(it); + delete mi; + msgChanged.IndicateChanged(); + msgMajorChanged.IndicateChanged(); + return 1; + } + return 0; +} + +/* This is the old fltkgui send recommend.... + * can only handle one single file.... + * will maintain this fn.... but it is deprecated. + */ + +int filedexserver::sendRecommend(PQFileItem *fi, std::string msg) +{ + // make chat item.... + MsgItem *mi = new MsgItem(); + mi -> sid = getPQIsearchId(); + + pqioutput(PQL_DEBUG_BASIC, fldxsrvrzone, + "filedexserver::sendRecommend()"); + + mi -> msg = msg; + + if (fi != NULL) + { + MsgFileItem mfi; + mfi.name = fi -> name; + mfi.hash = fi -> hash; + mfi.size = fi -> size; + + mi -> files.push_back(mfi); + } + else + { + /* nuffink */ + } + + pqisi -> SendMsg(mi); + return 1; +} + + +int filedexserver::sendMessage(MsgItem *item) +{ + item -> sid = getPQIsearchId(); + + pqioutput(PQL_DEBUG_BASIC, fldxsrvrzone, + "filedexserver::sendMessage()"); + + if (item -> p) + { + /* add pending flag */ + item->msgflags |= + (PQI_MI_FLAGS_OUTGOING | + PQI_MI_FLAGS_PENDING); + /* STORE MsgID */ + item -> sid = getNewUniqueMsgId(); + msgOutgoing.push_back(item); + } + else + { + delete item; + } + return 1; +} + +int filedexserver::checkOutgoingMessages() +{ + /* iterate through the outgoing queue + * + * if online, send + */ + + std::list::iterator it; + for(it = msgOutgoing.begin(); it != msgOutgoing.end();) + { + /* if online, send it */ + if (((*it) -> p -> Status() & PERSON_STATUS_CONNECTED) + || ((*it) -> p == sslr->getOwnCert())) + { + /* send msg */ + pqioutput(PQL_ALERT, fldxsrvrzone, + "filedexserver::checkOutGoingMessages() Sending out message"); + /* remove the pending flag */ + (*it)->msgflags &= ~PQI_MI_FLAGS_PENDING; + + pqisi -> SendMsg(*it); + it = msgOutgoing.erase(it); + } + else + { + pqioutput(PQL_ALERT, fldxsrvrzone, + "filedexserver::checkOutGoingMessages() Delaying until available..."); + it++; + } + } + return 0; +} + + +int filedexserver::addSearchDirectory(std::string dir) +{ + dbase_dirs.push_back(dir); + reScanDirs(); + return 1; +} + +int filedexserver::removeSearchDirectory(std::string dir) +{ + std::list::iterator it; + for(it = dbase_dirs.begin(); (it != dbase_dirs.end()) + && (dir != *it); it++); + if (it != dbase_dirs.end()) + { + dbase_dirs.erase(it); + } + + reScanDirs(); + return 1; +} + +std::list &filedexserver::getSearchDirectories() +{ + return dbase_dirs; +} + + +int filedexserver::reScanDirs() +{ + fimon->setSharedDirectories(dbase_dirs); + + return 1; +} + +static const std::string fdex_dir("FDEX_DIR"); +static const std::string save_dir_ss("SAVE_DIR"); +static const std::string save_inc_ss("SAVE_INC"); +static const std::string NETWORK_ss("NET_PARAM"); + +int filedexserver::save_config() +{ + std::list::iterator it; + std::string empty(""); + + pqioutput(PQL_DEBUG_BASIC, fldxsrvrzone, + "fildexserver::save_config()"); + + /* basic control parameters */ + { + std::ostringstream out; + out << getDHTEnabled() << " " << getUPnPEnabled(); + sslr -> setSetting(NETWORK_ss, out.str()); + } + + + sslr -> setSetting(save_dir_ss, getSaveDir()); + if (getSaveIncSearch()) + { + sslr -> setSetting(save_inc_ss, "true"); + } + else + { + sslr -> setSetting(save_inc_ss, "false"); + } + + int i; + for(it = dbase_dirs.begin(), i = 0; (it != dbase_dirs.end()) + && (i < 1000); it++, i++) + { + std::string name = fdex_dir; + int d1, d2, d3; + d1 = i / 100; + d2 = (i - d1 * 100) / 10; + d3 = i - d1 * 100 - d2 * 10; + + name += '0'+d1; + name += '0'+d2; + name += '0'+d3; + + sslr -> setSetting(name, (*it)); + } + // blank other ones. + bool done = false; + for(; (i < 1000) && (!done); i++) + { + std::string name = fdex_dir; + int d1, d2, d3; + d1 = i / 100; + d2 = (i - d1 * 100) / 10; + d3 = i - d1 * 100 - d2 * 10; + + name += '0'+d1; + name += '0'+d2; + name += '0'+d3; + + if (empty == sslr -> getSetting(name)) + { + done = true; + } + else + { + sslr -> setSetting(name, empty); + + std::ostringstream out; + out << "Blanking Setting(" << name; + out << ")" << std::endl; + pqioutput(PQL_DEBUG_BASIC, fldxsrvrzone, out.str()); + } + } + + + /* save the local cache file name */ + FileCacheSave(); + + /* now we create a pqiarchive, and stream all the msgs/fts + * into it + */ + + std::string statelog = config_dir + "/state.rst"; + + BinFileInterface *out = new BinFileInterface((char *) statelog.c_str(), BIN_FLAGS_WRITEABLE); + pqiarchive *pa_out = new pqiarchive(out, BIN_FLAGS_WRITEABLE, sslr); + bool written = false; + + std::list::iterator mit; + for(mit = imsg.begin(); mit != imsg.end(); mit++) + { + MsgItem *mi = (*mit)->clone(); + if (pa_out -> SendItem(mi)) + { + written = true; + } + + } + + for(mit = msgOutgoing.begin(); mit != msgOutgoing.end(); mit++) + { + MsgItem *mi = (*mit)->clone(); + mi -> msgflags |= PQI_MI_FLAGS_PENDING; + if (pa_out -> SendItem(mi)) + { + written = true; + } + + } + + std::list::iterator fit; + std::list ftlist = ftFiler -> getStatus(); + for(fit = ftlist.begin(); fit != ftlist.end(); fit++) + { + /* only write out the okay/uncompleted (with hash) files */ + if (((*fit)->state != FT_STATE_OKAY) || ((*fit)->hash == "")) + { + delete(*fit); + } + else if (pa_out -> SendItem(*fit)) + { + written = true; + } + } + + if (!written) + { + /* need to push something out to overwrite old data! (For WINDOWS ONLY) */ + } + + delete pa_out; + return 1; +} + +int filedexserver::load_config() +{ + std::list::iterator it; + + int i; + std::string empty(""); + std::string dir("notempty"); + std::string str_true("true"); + + std::string snet = sslr -> getSetting(NETWORK_ss); + { + int a, b; + + // on by default + setDHTEnabled(true); + setUPnPEnabled(true); /* UPnP false -> until its totally happy */ + + if (2 == sscanf(snet.c_str(), "%d %d", &a, &b)) + { + setDHTEnabled(a); + setUPnPEnabled(b); + } + } + + + std::string sdir = sslr -> getSetting(save_dir_ss); + if (sdir != empty) + { + setSaveDir(sdir); + } + + std::string sinc = sslr -> getSetting(save_inc_ss); + if (sdir != empty) + { + setSaveIncSearch(sdir == str_true); + } + + dbase_dirs.clear(); + + for(i = 0; (i < 1000) && (dir != empty); i++) + { + std::string name = fdex_dir; + int d1, d2, d3; + d1 = i / 100; + d2 = (i - d1 * 100) / 10; + d3 = i - d1 * 100 - d2 * 10; + + name += '0'+d1; + name += '0'+d2; + name += '0'+d3; + + dir = sslr -> getSetting(name); + if (dir != empty) + { + dbase_dirs.push_back(dir); + } + } + if (dbase_dirs.size() > 0) + { + std::ostringstream out; + out << "Loading " << dbase_dirs.size(); + out << " Directories" << std::endl; + pqioutput(PQL_DEBUG_BASIC, fldxsrvrzone, out.str()); + + reScanDirs(); + } + + /* load msg/ft */ + std::string statelog = config_dir + "/state.rst"; + + // XXX Fix Interface! + BinFileInterface *in = new BinFileInterface((char *) statelog.c_str(), BIN_FLAGS_READABLE); + pqiarchive *pa_in = new pqiarchive(in, BIN_FLAGS_READABLE, sslr); + PQItem *item; + MsgItem *mitem; + PQFileItem *fitem; + + while((item = pa_in -> GetItem())) + { + switch(item->type) + { + case PQI_ITEM_TYPE_FILEITEM: + /* add to ft queue */ + if (NULL != (fitem = dynamic_cast(item))) + { + /* only add in ones which have a hash (filters old versions) */ + if (fitem->hash != "") + { + ftFiler -> getFile(fitem->name, fitem->hash, + fitem->size, ""); + } + } + delete item; + break; + case PQI_ITEM_TYPE_CHATITEM: + if (NULL != (mitem = dynamic_cast(item))) + { + /* switch depending on the PENDING + * flags + */ + /* STORE MsgID */ + mitem->sid = getNewUniqueMsgId(); + if (mitem -> msgflags & PQI_MI_FLAGS_PENDING) + { + std::cerr << "MSG_PENDING"; + std::cerr << std::endl; + mitem->print(std::cerr); + msgOutgoing.push_back(mitem); + } + else + { + imsg.push_back(mitem); + } + } + else + { + delete item; + } + /* add to chat queue */ + break; + default: + /* unexpected */ + break; + } + } + + delete pa_in; + + return 1; +} + + +#ifdef PQI_USE_CHANNELS + + // Channel stuff. +void filedexserver::setP3Channel(p3channel *p3c) +{ + p3chan = p3c; + return; +} + +int filedexserver::getAvailableChannels(std::list &chans) +{ + if (!p3chan) + { + pqioutput(PQL_ALERT, fldxsrvrzone, + "fildexserver::getAvailableChannels() p3chan == NULL"); + return 0; + } + return p3chan->getChannelList(chans); +} + + +int filedexserver::getChannelMsgList(channelSign s, std::list &summary) +{ + if (!p3chan) + { + pqioutput(PQL_ALERT, fldxsrvrzone, + "fildexserver::getChannelMsgList() p3chan == NULL"); + return 0; + } + pqichannel *chan = p3chan -> findChannel(s); + if (!chan) + { + pqioutput(PQL_ALERT, fldxsrvrzone, + "fildexserver::getChannelMsgList() Channel don't exist!"); + return 0; + } + return chan -> getMsgSummary(summary); +} + + +channelMsg *filedexserver::getChannelMsg(channelSign s, MsgHash mh) +{ + if (!p3chan) + { + pqioutput(PQL_ALERT, fldxsrvrzone, + "fildexserver::getChannelMsg() p3chan == NULL"); + return NULL; + } + pqichannel *chan = p3chan -> findChannel(s); + if (!chan) + { + pqioutput(PQL_ALERT, fldxsrvrzone, + "fildexserver::getChannelMsg() Channel don't exist!"); + return NULL; + } + channelMsg *msg = chan -> findMsg(mh); + if (!msg) + { + pqioutput(PQL_ALERT, fldxsrvrzone, + "fildexserver::getChannelMsg() Msg don't exist!"); + return NULL; + } + return msg; +} + + + +#endif + + +void filedexserver::loadWelcomeMsg() +{ + /* Load Welcome Message */ + MsgItem *msg = new MsgItem(); + + msg -> p = getSSLRoot() -> getOwnCert(); + + msg -> title = "Welcome to Retroshare"; + msg -> header = "Basic Instructions"; + msg -> sendTime = 0; + + msg -> msg = "Send and receive messages\n"; + msg -> msg += "with your friends...\n\n"; + + msg -> msg += "These can hold recommendations\n"; + msg -> msg += "from your local shared files\n\n"; + + msg -> msg += "Add recommendations through\n"; + msg -> msg += "the Local Files Dialog\n\n"; + + msg -> msg += "Enjoy.\n"; + + imsg.push_back(msg); +} + +/*************************************** NEW File Cache Stuff ****************************/ + +void filedexserver::initialiseFileStore() +{ + +} + +const std::string LOCAL_CACHE_FILE_KEY = "LCF_NAME"; +const std::string LOCAL_CACHE_HASH_KEY = "LCF_HASH"; +const std::string LOCAL_CACHE_SIZE_KEY = "LCF_SIZE"; + +void filedexserver::setFileCallback(NotifyBase *cb) +{ + /* work out our id! */ + cert *own = getSSLRoot()->getOwnCert(); + certsign sign; + getSSLRoot()->getcertsign(own, sign); + RsPeerId ownId = convert_to_str(sign); + + uint32_t queryPeriod = 60; /* query every 1 minutes -> change later to 600+ */ + + /* setup the pqimonitor */ + peerMonitor = new pqimonitor(); + + cacheStrapper = new CacheStrapper(ownId, queryPeriod); + /* fiFiler is also CacheTransfer */ + ftFiler = new ftfiler(cacheStrapper); + + /* setup FiStore/Monitor */ + std::string localcachedir = config_dir + "/cache/local"; + std::string remotecachedir = config_dir + "/cache/remote"; + fiStore = new FileIndexStore(ftFiler, cb, ownId, remotecachedir); + + /* now setup the FiMon */ + fimon = new FileIndexMonitor(localcachedir, ownId); + + /* setup ftFiler + * to find peer info / savedir + */ + FileHashSearch *fhs = new FileHashSearch(fiStore, fimon); + ftFiler -> setFileHashSearch(fhs); + ftFiler -> setSaveBasePath(save_dir); + + /* now add the set to the cachestrapper */ + + CachePair cp(fimon, fiStore, CacheId(CACHE_TYPE_FILE_INDEX, 0)); + cacheStrapper -> addCachePair(cp); + + /* add to peermonitor */ + peerMonitor -> addClient(cacheStrapper); + + + /* now we can load the cache configuration */ + //std::string cacheconfig = config_dir + "/caches.cfg"; + //cacheStrapper -> loadCaches(cacheconfig); + + /************ TMP HACK LOAD until new serialiser is finished */ + /* get filename and hash from configuration */ + std::string localCacheFile = getSSLRoot()->getSetting(LOCAL_CACHE_FILE_KEY); + std::string localCacheHash = getSSLRoot()->getSetting(LOCAL_CACHE_HASH_KEY); + std::string localCacheSize = getSSLRoot()->getSetting(LOCAL_CACHE_SIZE_KEY); + + std::list saveLocalCaches; + std::list saveRemoteCaches; + + if ((localCacheFile != "") && + (localCacheHash != "") && + (localCacheSize != "")) + { + /* load it up! */ + std::string loadCacheFile = localcachedir + "/" + localCacheFile; + CacheData cd; + cd.pid = ownId; + cd.cid = CacheId(CACHE_TYPE_FILE_INDEX, 0); + cd.name = localCacheFile; + cd.path = localcachedir; + cd.hash = localCacheHash; + cd.size = atoi(localCacheSize.c_str()); + fimon -> loadCache(cd); + + saveLocalCaches.push_back(cd.name); + } + + /* cleanup cache directories */ + RsDirUtil::cleanupDirectory(localcachedir, saveLocalCaches); + RsDirUtil::cleanupDirectory(remotecachedir, saveRemoteCaches); /* clean up all */ + + /************ TMP HACK LOAD until new serialiser is finished */ + + + /* startup the FileMonitor (after cache load) */ + fimon->setPeriod(600); /* 10 minutes */ + /* start it up */ + fimon->setSharedDirectories(dbase_dirs); + fimon->start(); + +} + +int filedexserver::FileCacheSave() +{ + /************ TMP HACK SAVE until new serialiser is finished */ + + RsPeerId pid; + std::map ids; + std::map::iterator it; + + std::cerr << "filedexserver::FileCacheSave() listCaches:" << std::endl; + fimon->listCaches(std::cerr); + fimon->cachesAvailable(pid, ids); + + std::string localCacheFile; + std::string localCacheHash; + std::string localCacheSize; + + if (ids.size() == 1) + { + it = ids.begin(); + localCacheFile = (it->second).name; + localCacheHash = (it->second).hash; + std::ostringstream out; + out << (it->second).size; + localCacheSize = out.str(); + } + + /* extract the details of the local cache */ + getSSLRoot()->setSetting(LOCAL_CACHE_FILE_KEY, localCacheFile); + getSSLRoot()->setSetting(LOCAL_CACHE_HASH_KEY, localCacheHash); + getSSLRoot()->setSetting(LOCAL_CACHE_SIZE_KEY, localCacheSize); + + /************ TMP HACK SAVE until new serialiser is finished */ + return 1; +} + + +// Transfer control. +int filedexserver::getFile(std::string fname, std::string hash, + uint32_t size, std::string dest) + +{ + // send to filer. + return ftFiler -> getFile(fname, hash, size, dest); +} + +void filedexserver::clear_old_transfers() +{ + ftFiler -> clearFailedTransfers(); +} + +void filedexserver::cancelTransfer(std::string fname, std::string hash, uint32_t size) +{ + ftFiler -> cancelFile(hash); +} + + +int filedexserver::RequestDirDetails(std::string uid, std::string path, + DirDetails &details) +{ + return fiStore->RequestDirDetails(uid, path, details); +} + +int filedexserver::RequestDirDetails(void *ref, DirDetails &details, uint32_t flags) +{ + return fiStore->RequestDirDetails(ref, details, flags); +} + +int filedexserver::SearchKeywords(std::list keywords, + std::list &results) +{ + return fiStore->SearchKeywords(keywords, results); +} + +int filedexserver::SearchBoolExp(Expression * exp, std::list &results) +{ + return fiStore->searchBoolExp(exp, results); +} + + +int filedexserver::FileStoreTick() +{ + peerMonitor -> tick(); + ftFiler -> tick(); + return 1; +} + + +// This function needs to be divided up. +int filedexserver::handleInputQueues() +{ + // get all the incoming results.. and print to the screen. + SearchItem *si; + PQFileItem *fi; + PQFileItem *pfi; + // Loop through Search Results. + int i = 0; + int i_init = 0; + + //std::cerr << "filedexserver::handleInputQueues()" << std::endl; + while((fi = pqisi -> GetSearchResult()) != NULL) + { + //std::cerr << "filedexserver::handleInputQueues() Recvd SearchResult (CacheResponse!)" << std::endl; + std::ostringstream out; + if (i++ == i_init) + { + out << "Recieved Search Results:" << std::endl; + } + fi -> print(out); + pqioutput(PQL_DEBUG_BASIC, fldxsrvrzone, out.str()); + + /* these go to the CacheStrapper! */ + CacheData data; + data.cid = CacheId(fi->fileoffset, fi->chunksize); + data.hash = fi->hash; + data.size = fi->size; + data.name = fi->name; + data.path = fi->path; + + certsign sign; + + if (getSSLRoot() -> getcertsign((cert *) fi->p, sign)) + { + data.pid = convert_to_str(sign); + data.pname = fi->p->Name(); + cacheStrapper->recvCacheResponse(data, time(NULL)); + } + else + { + std::cerr << "ERROR"; + exit(1); + } + + delete fi; + } + + // now requested Searches. + i_init = i; + while((si = pqisi -> RequestedSearch()) != NULL) + { + //std::cerr << "filedexserver::handleInputQueues() Recvd RequestedSearch (CacheQuery!)" << std::endl; + std::ostringstream out; + if (i++ == i_init) + { + out << "Requested Search:" << std::endl; + } + si -> print(out); + pqioutput(PQL_DEBUG_BASIC, fldxsrvrzone, out.str()); + + /* these go to the CacheStrapper (handled immediately) */ + std::map::iterator it; + std::map answer; + RsPeerId id; + + cacheStrapper->handleCacheQuery(id, answer); + for(it = answer.begin(); it != answer.end(); it++) + { + //std::cerr << "filedexserver::handleInputQueues() Sending (CacheAnswer!)" << std::endl; + /* construct reply */ + PQFileItem *fi = new PQFileItem(); + + /* PQItem ones (from incoming) */ + fi -> p = si -> p; + fi -> cid = si -> cid; + /* type/subtype already done, flags/search id ignored */ + + fi -> hash = (it->second).hash; + fi -> name = (it->second).name; + fi -> path = ""; // (it->second).path; + fi -> size = (it->second).size; + fi -> fileoffset = (it->second).cid.type; + fi -> chunksize = (it->second).cid.subid; + + std::ostringstream out2; + out2 << "Outgoing CacheStrapper reply -> PQFileItem:" << std::endl; + fi -> print(out2); + pqioutput(PQL_DEBUG_BASIC, fldxsrvrzone, out2.str()); + pqisi -> SendFileItem(fi); + } + + delete si; + } + + // now Cancelled Searches. + i_init = i; + while((si = pqisi -> CancelledSearch()) != NULL) + { + std::ostringstream out; + if (i++ == i_init) + { + out << "Deleting Cancelled Search:" << std::endl; + } + si -> print(out); + pqioutput(PQL_DEBUG_BASIC, fldxsrvrzone, out.str()); + delete si; + } + + // now File Input. + i_init = i; + while((pfi = pqisi -> GetFileItem()) != NULL ) + { + //std::cerr << "filedexserver::handleInputQueues() Recvd ftFiler Data" << std::endl; + std::ostringstream out; + if (i++ == i_init) + { + out << "Incoming(Net) File Item:" << std::endl; + } + pfi -> print(out); + pqioutput(PQL_DEBUG_BASIC, fldxsrvrzone, out.str()); + certsign sign; + if (!getSSLRoot() -> getcertsign((cert *) pfi->p, sign)) + { + std::cerr << "ERROR FFR"; + exit(1); + } + std::string id = convert_to_str(sign); + + PQFileData *pfd = dynamic_cast(pfi); + if (pfd) + { + /* incoming data */ + ftFileData *ffd = new ftFileData(id, pfd->hash, pfd->size, + pfd->fileoffset, pfd->chunksize, pfd->data); + pfd -> data = NULL; + ftFiler->recvFileInfo(ffd); + } + else + { + /* request */ + + ftFileRequest *ffr = new ftFileRequest(id, pfi->hash, + pfi->size, pfi->fileoffset, pfi->chunksize); + ftFiler->recvFileInfo(ffr); + } + delete pfi; + } + + if (i > 0) + { + return 1; + } + return 0; +} + + +// This function needs to be divided up. +int filedexserver::handleOutputQueues() +{ + // get all the incoming results.. and print to the screen. + //std::cerr << "filedexserver::handleOutputQueues()" << std::endl; + int i = 0; + + std::list ids; + std::list::iterator pit; + + cacheStrapper->sendCacheQuery(ids, time(NULL)); + + for(pit = ids.begin(); pit != ids.end(); pit++) + { + //std::cerr << "filedexserver::handleOutputQueues() Cache Query for: " << (*pit) << std::endl; + + /* now create one! */ + SearchItem *si = new SearchItem(); + + /* set it up */ + certsign sign; + if (!convert_to_certsign(*pit, sign)) + { + std::cerr << "CERTSIGN error!" << std::endl; + exit(1); + } + + /* look it up */ + cert *c = getSSLRoot() -> findcertsign(sign); + if (c == NULL) + { + std::cerr << "CERTSIGN error! 2" << std::endl; + exit(1); + } + + si->p = c; + si->cid = c->cid; + + std::ostringstream out; + if (i++ == 0) + { + out << "Outgoing CacheStrapper -> SearchItem:" << std::endl; + } + si -> print(out); + pqioutput(PQL_DEBUG_BASIC, fldxsrvrzone, out.str()); + + /* send it off */ + pqisi -> SearchSpecific(si); + } + + /* now see if the filer has any data */ + ftFileRequest *ftr; + while((ftr = ftFiler -> sendFileInfo()) != NULL) + { + //std::cerr << "filedexserver::handleOutputQueues() ftFiler Data for: " << ftr->id << std::endl; + + /* work out who its going to */ + certsign sign; + if (!convert_to_certsign(ftr->id, sign)) + { + std::cerr << "CERTSIGN error! 3" << std::endl; + exit(1); + } + + /* look it up */ + cert *c = getSSLRoot() -> findcertsign(sign); + if (c == NULL) + { + std::cerr << "CERTSIGN error! 4" << std::endl; + exit(1); + } + + /* decide if its data or request */ + ftFileData *ftd = dynamic_cast(ftr); + if (ftd) + { + SendFileData(ftd, c); + } + else + { + SendFileRequest(ftr, c); + } + + std::ostringstream out; + if (i++ == 0) + { + out << "Outgoing filer -> PQFileItem:" << std::endl; + } + pqioutput(PQL_DEBUG_BASIC, fldxsrvrzone, out.str()); + + /* clean up */ + delete ftr; + } + + + + if (i > 0) + { + return 1; + } + return 0; +} + +void filedexserver::SendFileRequest(ftFileRequest *ftr, cert *peer) +{ + /* send request */ + PQFileItem *fi = new PQFileItem(); + fi -> subtype = PQI_FI_SUBTYPE_REQUEST; + + fi -> p = peer; + fi -> cid = peer->cid; + /* type/subtype already done, flags/search id ignored */ + + fi -> hash = ftr -> hash; + /* name, path, ext are ignored */ + fi -> size = ftr -> size; + fi -> fileoffset = ftr->offset; + fi -> chunksize = ftr->chunk; + + pqisi -> SendFileItem(fi); +} + +#define MAX_FT_CHUNK 4096 + +void filedexserver::SendFileData(ftFileData *ftd, cert *peer) +{ + uint32_t tosend = ftd->chunk; + uint32_t baseoffset = ftd->offset; + uint32_t offset = 0; + uint32_t chunk; + + + while(tosend > 0) + { + /* workout size */ + chunk = MAX_FT_CHUNK; + if (chunk > tosend) + { + chunk = tosend; + } + + /* send data! */ + PQFileData *fid = new PQFileData(); + + fid -> p = peer; + fid -> cid = peer->cid; + fid -> hash = ftd -> hash; + fid -> size = ftd -> size; + + fid -> data = malloc(chunk); + memcpy(fid->data, &(((uint8_t *) ftd->data)[offset]), chunk); + fid -> datalen = chunk; + fid -> chunksize = chunk; + fid -> fileoffset = baseoffset + offset; + + pqisi -> SendFileItem(fid); + + offset += chunk; + tosend -= chunk; + } +} + + diff --git a/libretroshare/src/server/filedexserver.h b/libretroshare/src/server/filedexserver.h new file mode 100644 index 000000000..8be24beee --- /dev/null +++ b/libretroshare/src/server/filedexserver.h @@ -0,0 +1,232 @@ +/* + * "$Id: filedexserver.h,v 1.18 2007-05-05 16:10:06 rmf24 Exp $" + * + * Other Bits for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + +#ifndef MRK_PQI_FILEDEX_SERVER_HEADER +#define MRK_PQI_FILEDEX_SERVER_HEADER + +/* + * Slightly more complete server.... + * has a filedex pointer, which manages the local indexing/searching. + * + */ + +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + +#include "pqi/xpgpcert.h" + +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + +#include "pqi/sslcert.h" + +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + +#include "pqi/pqi.h" +#include "pqi/pqiindic.h" +#include +#include +#include +#include +#include + +#include "rsiface/rsiface.h" +class pqimonitor; +class CacheStrapper; +class ftfiler; +class FileIndexStore; +class FileIndexMonitor; + +class ftFileRequest; +class ftFileData; + + +#ifdef PQI_USE_CHANNELS + #include "pqi/pqichannel.h" + #include "pqi/p3channel.h" +#endif + +#define MAX_RESULTS 100 // nice balance between results and traffic. + + +class filedexserver +{ + public: + filedexserver(); + +void loadWelcomeMsg(); /* startup message */ + +int setSearchInterface(P3Interface *si, sslroot *sr); +int additem(SearchItem *item, char *fname); + +int sendChat(std::string msg); +int sendPrivateChat(ChatItem *ci); + +int sendRecommend(PQFileItem *fi, std::string msg); +int sendMessage(MsgItem *item); +int checkOutgoingMessages(); + +int getChat(); +/* std::deque &getChatQueue(); */ +std::list getChatQueue(); + +std::list &getMsgList(); +std::list &getMsgOutList(); +std::list getNewMsgs(); +std::list getTransfers(); + + // get files (obsolete?) +int getFile(std::string fname, std::string hash, + uint32_t size, std::string dest); +void clear_old_transfers(); +void cancelTransfer(std::string fname, std::string hash, uint32_t size); + + // cleaning up.... +int removeMsgItem(int itemnum); + // alternative versions. +int removeMsgItem(MsgItem *mi); + // third versions. +int removeMsgId(unsigned long mid); /* id stored in sid */ +int markMsgIdRead(unsigned long mid); + +// access to search info is also required. + +std::list &getSearchDirectories(); +int addSearchDirectory(std::string dir); +int removeSearchDirectory(std::string dir); +int reScanDirs(); +int check_dBUpdate(); + +int load_config(); +int save_config(); + +std::string getSaveDir(); +void setSaveDir(std::string d); +void setConfigDir(std::string d) { config_dir = d; } +bool getSaveIncSearch(); +void setSaveIncSearch(bool v); + +int tick(); +int status(); + + private: + +int handleInputQueues(); +int handleOutputQueues(); + +std::list ichat; +std::list imsg; +std::list nmsg; +std::list msgOutgoing; /* ones that haven't made it out yet! */ + +std::list dbase_dirs; + +P3Interface *pqisi; +sslroot *sslr; + +std::string config_dir; +std::string save_dir; +bool save_inc; // is savedir include in share list. + +// bool state flags. + public: + Indicator msgChanged; + Indicator msgMajorChanged; + Indicator chatChanged; + +#ifdef PQI_USE_CHANNELS + + public: + // Channel stuff. +void setP3Channel(p3channel *p3c); +int getAvailableChannels(std::list &chans); +int getChannelMsgList(channelSign s, std::list &summary); +channelMsg *getChannelMsg(channelSign s, MsgHash mh); + + Indicator channelsChanged; // everything! + + private: +p3channel *p3chan; + +#endif + + public: + /* some more switches (here for uniform saving) */ +int getDHTEnabled() + { + return DHTState; + } + +int getUPnPEnabled() + { + return UPnPState; + } + +void setDHTEnabled(int i) + { + DHTState = i; + } + +void setUPnPEnabled(int i) + { + UPnPState = i; + } + + private: + int DHTState; + int UPnPState; + + + /* new FileCache stuff */ + public: + +int FileStoreTick(); +int FileCacheSave(); + +void initialiseFileStore(); +void setFileCallback(NotifyBase *cb); + +int RequestDirDetails(std::string uid, std::string path, DirDetails &details); +int RequestDirDetails(void *ref, DirDetails &details, uint32_t flags); + +int SearchKeywords(std::list keywords, std::list &results); +int SearchBoolExp(Expression * exp, std::list &results); + + private: + +void SendFileRequest(ftFileRequest *ftr, cert *peer); +void SendFileData(ftFileData *ftd, cert *peer); + + pqimonitor *peerMonitor; + CacheStrapper *cacheStrapper; + ftfiler *ftFiler; + FileIndexStore *fiStore; + FileIndexMonitor *fimon; +}; + +#endif // MRK_PQI_FILEDEX_SERVER_HEADER diff --git a/libretroshare/src/server/ft.cc b/libretroshare/src/server/ft.cc new file mode 100644 index 000000000..2266a4397 --- /dev/null +++ b/libretroshare/src/server/ft.cc @@ -0,0 +1,97 @@ +/* + * "$Id: pqifiler.cc,v 1.13 2007-02-19 20:08:30 rmf24 Exp $" + * + * Other Bits for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "server/ft.h" + +bool ftManager::lookupLocalHash(std::string hash, std::string &path, uint32_t &size) +{ + std::list details; + + std::cerr << "ftManager::lookupLocalHash() hash: " << hash << std::endl; + + if (FindCacheFile(hash, path, size)) + { + /* got it from the CacheTransfer() */ + std::cerr << "ftManager::lookupLocalHash() Found in CacheStrapper:"; + std::cerr << path << " size: " << size << std::endl; + + return true; + } + + bool ok = false; + if (fhs) + { + ok = (0 != fhs -> searchLocalHash(hash, path, size)); + } + else + { + std::cerr << "Warning FileHashSearch is Invalid" << std::endl; + } + + if (ok) + { + std::cerr << "ftManager::lookupLocalHash() Found in FileHashSearch:"; + std::cerr << path << " size: " << size << std::endl; + return true; + } + return ok; + +} + + + +bool ftManager::lookupRemoteHash(std::string hash, std::list &ids) +{ + std::list details; + std::list::iterator it; + + std::cerr << "ftManager::lookupRemoteHash() hash: " << hash << std::endl; + + if (fhs) + { + fhs -> searchRemoteHash(hash, details); + } + else + { + std::cerr << "Warning FileHashSearch is Invalid" << std::endl; + } + + if (details.size() == 0) + { + std::cerr << "ftManager::lookupRemoteHash() Not Found!" << std::endl; + return false; + } + + for(it = details.begin(); it != details.end(); it++) + { + std::cerr << "ftManager::lookupRemoteHash() Found in FileHashSearch:"; + std::cerr << " id: " << it->id << std::endl; + ids.push_back(it->id); + } + return true; +} + + diff --git a/libretroshare/src/server/ft.h b/libretroshare/src/server/ft.h new file mode 100644 index 000000000..4f5f4b617 --- /dev/null +++ b/libretroshare/src/server/ft.h @@ -0,0 +1,144 @@ +/* + * "$Id: ftManager.h,v 1.13 2007-02-19 20:08:30 rmf24 Exp $" + * + * Other Bits for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + +#ifndef MRK_FT_MANAGER_HEADER +#define MRK_FT_MANAGER_HEADER + +/* + * ftManager - virtual base class for FileTransfer + */ + + +#include "pqi/pqi.h" +#include +#include +#include + +#include "dbase/cachestrapper.h" +#include "server/hashsearch.h" + +class ftFileManager; /* stores files */ + + +class ftFileRequest +{ + public: + ftFileRequest(std::string id_in, std::string hash_in, + uint32_t size_in, uint32_t offset_in, + uint32_t chunk_in) + :id(id_in), hash(hash_in), size(size_in), + offset(offset_in), chunk(chunk_in) + { + return; + } + +virtual ~ftFileRequest() { return; } + + std::string id; + std::string hash; + uint32_t size; + uint32_t offset; + uint32_t chunk; +}; + + +class ftFileData: public ftFileRequest +{ + public: + ftFileData(std::string id_in, std::string hash_in, + uint32_t size_in, uint32_t offset_in, + uint32_t chunk_in, void *data_in) + :ftFileRequest(id_in, hash_in, size_in, + offset_in, chunk_in), data(data_in) + { + return; + } + +virtual ~ftFileData() + { + if (data) + { + free(data); + } + } + + void *data; +}; + + +class ftManager: public CacheTransfer +{ + public: + ftManager(CacheStrapper *cs) + :CacheTransfer(cs), fhs(NULL) { return; } +virtual ~ftManager() { return; } + +void setFileHashSearch(FileHashSearch *hs) { fhs = hs; } + +/****************** PART to be IMPLEMENTE******************/ + /* Functions to implement */ + +/*********** overloaded from CacheTransfer ***************/ +/* Must callback after this fn - using utility functions */ +//virtual bool RequestCacheFile(RsPeerId id, std::string path, +// std::string hash, uint32_t size); +/******************* GUI Interface ************************/ +virtual int getFile(std::string name, std::string hash, + uint32_t size, std::string destpath) = 0; + +virtual int cancelFile(std::string hash) = 0; +virtual int clearFailedTransfers() = 0; + +virtual int tick() = 0; +virtual std::list getStatus() = 0; + +/************* Network Interface****************************/ + + public: +virtual void setSaveBasePath(std::string s) = 0; +virtual int recvFileInfo(ftFileRequest *in) = 0; +virtual ftFileRequest * sendFileInfo() = 0; + + protected: + + /****************** UTILITY FUNCTIONS ********************/ + + /* combines two lookup functions */ +bool lookupLocalHash(std::string hash, std::string &path, uint32_t &size); +bool lookupRemoteHash(std::string hash, std::list &ids); + + /*********** callback from CacheTransfer ***************/ + //bool CompletedCache(std::string hash); /* internal completion -> does cb */ + //bool FailedCache(std::string hash); /* internal completion -> does cb */ + /*********** available from CacheTransfer ***************/ + /* upload side of things .... searches through CacheStrapper(Sources) for a cache. */ + //bool FindCacheFile(std::string id, std::string hash, std::string &path); + /*********** available from CacheTransfer ***************/ + + private: + FileHashSearch *fhs; +}; + +#endif diff --git a/libretroshare/src/server/ftcachetest.cc b/libretroshare/src/server/ftcachetest.cc new file mode 100644 index 000000000..bf709c9cc --- /dev/null +++ b/libretroshare/src/server/ftcachetest.cc @@ -0,0 +1,346 @@ +/* + * RetroShare FileCache Module: ficachetest.cc + * + * Copyright 2004-2007 by Robert Fernie. + * + * 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 "dbase/cachestrapper.h" +#include "dbase/cachetest.h" +#include "server/ftfiler.h" +#include "util/rsdir.h" + +#include "pqi/pqidebug.h" + +#include +#include + +void handleQuery(CacheStrapper *csp, RsPeerId pid, + std::map &strappers); + +/* A simple test of the CacheStrapper Code. + * + * create 3 different CacheStrappers, each with a Source/Store Pair and Transfer Class. + * pass queries and responses between the CacheStrappers, + * and ensure that the hashes in the Caches are updated. + * + */ + +int main(int argc, char **argv) +{ + /* setup test */ + std::string tmppath1 = "/tmp/ct1"; + std::string tmppath2 = "/tmp/ct2"; + std::string tmppath3 = "/tmp/ct3"; + std::string tmppathpart1 = tmppath1 + "/partials"; + std::string tmppathpart2 = tmppath2 + "/partials"; + std::string tmppathpart3 = tmppath3 + "/partials"; + std::string tmppathcompleted1 = tmppath1 + "/completed"; + std::string tmppathcompleted2 = tmppath2 + "/completed"; + std::string tmppathcompleted3 = tmppath3 + "/completed"; + + std::string tmppathcache2 = tmppath2 + "/cache"; + std::string cachefile = "cachefile.txt"; + std::string tmppathcachefile2 = tmppathcache2 + "/" + cachefile; + + RsDirUtil::checkCreateDirectory(tmppath1.c_str()); + RsDirUtil::checkCreateDirectory(tmppath2.c_str()); + RsDirUtil::checkCreateDirectory(tmppath3.c_str()); + RsDirUtil::checkCreateDirectory(tmppathpart1.c_str()); + RsDirUtil::checkCreateDirectory(tmppathpart2.c_str()); + RsDirUtil::checkCreateDirectory(tmppathpart3.c_str()); + RsDirUtil::checkCreateDirectory(tmppathcompleted1.c_str()); + RsDirUtil::checkCreateDirectory(tmppathcompleted2.c_str()); + RsDirUtil::checkCreateDirectory(tmppathcompleted3.c_str()); + + RsDirUtil::checkCreateDirectory(tmppathcache2.c_str()); + + + /* now create a file */ + std::ofstream out(tmppathcachefile2.c_str()); + out << "Hello this is a cache file!" << std::endl; + out.close(); + + + setOutputLevel(10); + time_t period = 11; + RsPeerId pid1("0x0101"); + RsPeerId pid2("0x0102"); + RsPeerId pid3("0x0103"); + + CacheStrapper sc1(pid1, period); + CacheStrapper sc2(pid2, period); + CacheStrapper sc3(pid3, period); + + //CacheTransfer ctt1(&sc1); + //CacheTransfer ctt2(&sc2); + //CacheTransfer ctt3(&sc3); + + /* setup of the FileTransfer should wait until + * the CacheSource + CacheStrapper are created + */ + + FileHashSearch *fhs1 = NULL; + FileHashSearch *fhs2 = NULL; + FileHashSearch *fhs3 = NULL; + ftfiler ff1(&sc1); + ftfiler ff2(&sc2); + ftfiler ff3(&sc3); + + ff1.setSaveBasePath(tmppath1); + ff2.setSaveBasePath(tmppath2); + ff3.setSaveBasePath(tmppath3); + + ff1.setFileHashSearch(fhs1); + ff2.setFileHashSearch(fhs2); + ff3.setFileHashSearch(fhs3); + + std::map strappers; + strappers[pid1] = &sc1; + strappers[pid2] = &sc2; + strappers[pid3] = &sc3; + + + std::string nulldir = ""; + + CacheSource *csrc1 = new CacheTestSource(nulldir); + //CacheStore *cstore1 = new CacheTestStore(&ctt1, nulldir); + CacheStore *cstore1 = new CacheTestStore(&ff1, nulldir); + CacheId cid1(TESTID, 0); + + CacheSource *csrc2 = new CacheTestSource(nulldir); + //CacheStore *cstore2 = new CacheTestStore(&ctt2, nulldir); + CacheStore *cstore2 = new CacheTestStore(&ff2, nulldir); + CacheId cid2(TESTID, 0); + + CacheSource *csrc3 = new CacheTestSource(nulldir); + //CacheStore *cstore3 = new CacheTestStore(&ctt3, nulldir); + CacheStore *cstore3 = new CacheTestStore(&ff3, nulldir); + CacheId cid3(TESTID, 0); + + CachePair cp1(csrc1, cstore1, cid1); + CachePair cp2(csrc2, cstore2, cid2); + CachePair cp3(csrc3, cstore3, cid3); + + sc1.addCachePair(cp1); + sc2.addCachePair(cp2); + sc3.addCachePair(cp3); + + + sc1.addPeerId(pid2); + sc2.addPeerId(pid1); + sc2.addPeerId(pid3); + sc3.addPeerId(pid2); + + /* add in a cache to sc2 */ + CacheData cdata; + + cdata.pid = pid1; + cdata.cid = cid1; + cdata.name = cachefile; //"Perm Cache"; + cdata.path = tmppathcache2; //"./"; + cdata.hash = "GHJKI"; + cdata.size = 28; + + csrc1->refreshCache(cdata); + + /* The file we created */ + cdata.pid = pid2; + cdata.cid = cid2; + cdata.name = "Funny Cache"; + cdata.path = "./"; + cdata.size = 1023; + cdata.hash = "ABCDEF"; + + csrc2->refreshCache(cdata); + + /* now exercise it */ + + for(int i = 0; 1 ; i++) + { + RsPeerId src(""); + CacheStrapper *csp = NULL; + + if (i % 5 == 1) + { + src = pid1; + csp = &sc1; + } + else if (i % 5 == 2) + { + src = pid2; + csp = &sc2; + } + else if (i % 5 == 3) + { + src = pid3; + csp = &sc3; + } + std::cerr << std::endl; + std::cerr << "Cache Iteraton: " << time(NULL) << std::endl; + std::cerr << std::endl; + + if (src != "") + { + handleQuery(csp, src, strappers); + } + + + if (i % 21 == 0) + { + /* print out the resources */ + sc1.listCaches(std::cerr); + sc2.listCaches(std::cerr); + sc3.listCaches(std::cerr); + } + + /* every once in a while change the cache on 2 */ + if (i % 31 == 25) + { + cdata.hash += "X"; + csrc2->refreshCache(cdata); + } +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS + sleep(1); +#else + Sleep(1000); +#endif +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ + + /* tick the systems */ + ff1.tick(); + ff2.tick(); + ff3.tick(); + + /* exchange packets! */ + ftFileRequest *ftPkt = NULL; + while(NULL != (ftPkt = ff1.sendFileInfo())) + { + std::cerr << "Outgoing ftPkt from ff1"; + std::cerr << std::endl; + + if (ftPkt->id == pid2) + { + std::cerr << "ftPkt for ff2" << std::endl; + ftPkt->id = pid1; /* set source correctly */ + ff2.recvFileInfo(ftPkt); + } + else if (ftPkt->id == pid3) + { + std::cerr << "ftPkt for ff3" << std::endl; + ftPkt->id = pid1; /* set source correctly */ + ff3.recvFileInfo(ftPkt); + } + else + { + std::cerr << "ERROR unknown ftPkt destination!: " << ftPkt->id; + std::cerr << std::endl; + delete ftPkt; + } + } + + while(NULL != (ftPkt = ff2.sendFileInfo())) + { + std::cerr << "Outgoing ftPkt from ff2"; + std::cerr << std::endl; + + if (ftPkt->id == pid1) + { + std::cerr << "ftPkt for ff1" << std::endl; + ftPkt->id = pid2; /* set source correctly */ + ff1.recvFileInfo(ftPkt); + } + else if (ftPkt->id == pid3) + { + std::cerr << "ftPkt for ff3" << std::endl; + ftPkt->id = pid2; /* set source correctly */ + ff3.recvFileInfo(ftPkt); + } + else + { + std::cerr << "ERROR unknown ftPkt destination!: " << ftPkt->id; + std::cerr << std::endl; + delete ftPkt; + } + } + + + while(NULL != (ftPkt = ff3.sendFileInfo())) + { + std::cerr << "Outgoing ftPkt from ff3"; + std::cerr << std::endl; + + if (ftPkt->id == pid1) + { + std::cerr << "ftPkt for ff1" << std::endl; + ftPkt->id = pid3; /* set source correctly */ + ff1.recvFileInfo(ftPkt); + } + else if (ftPkt->id == pid2) + { + std::cerr << "ftPkt for ff2" << std::endl; + ftPkt->id = pid3; /* set source correctly */ + ff2.recvFileInfo(ftPkt); + } + else + { + std::cerr << "ERROR unknown ftPkt destination!: " << ftPkt->id; + std::cerr << std::endl; + delete ftPkt; + } + } + } + + /* Cleanup - TODO */ + + return 1; +} + +void handleQuery(CacheStrapper *csp, RsPeerId pid, + std::map &strappers) +{ + /* query */ + std::list ids; + std::list::iterator pit; + + std::cerr << "Cache Query from: " << pid << std::endl; + + csp -> sendCacheQuery(ids, time(NULL)); + for(pit = ids.begin(); pit != ids.end(); pit++) + { + std::cerr << "Cache Query for: " << (*pit) << std::endl; + std::map::iterator sit; + if (strappers.end() != (sit = strappers.find(*pit))) + { + std::map hashs; + std::map::iterator hit; + (sit -> second) -> handleCacheQuery(pid, hashs); + for(hit = hashs.begin(); hit != hashs.end(); hit++) + { + csp -> recvCacheResponse(hit->second, time(NULL)); + } + } + else + { + std::cerr << "Unknown Query Destination!" << std::endl; + } + } +} + diff --git a/libretroshare/src/server/ftfiler.cc b/libretroshare/src/server/ftfiler.cc new file mode 100644 index 000000000..1ee4f75a9 --- /dev/null +++ b/libretroshare/src/server/ftfiler.cc @@ -0,0 +1,1396 @@ +/* + * "$Id: ftfiler.cc,v 1.13 2007-02-19 20:08:30 rmf24 Exp $" + * + * Other Bits for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "server/ftfiler.h" +#include "util/rsdir.h" + +#include "pqi/pqidebug.h" + +/**** SHOULDN@T HAVE THIS DEPENDANCY ****/ +/**************** PQI_USE_XPGP ******************/ +#if defined(PQI_USE_XPGP) + +#include "pqi/xpgpcert.h" + +#else /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + +#include "pqi/sslcert.h" + +#endif /* X509 Certificates */ +/**************** PQI_USE_XPGP ******************/ + +#include + +#include + +const int ftfilerzone = 86539; + +/* + * PQI Filer + * + * This managers the file transfers. + * + * + * TODO: add trickle transfers. + * + */ + +const int PQIFILE_OFFLINE_CHECK = 120; /* check every 2 minutes */ +const int PQIFILE_DOWNLOAD_TIMEOUT = 60; /* time it out, -> offline after 60 secs */ +const int PQIFILE_DOWNLOAD_CHECK = 10; /* desired delta = 10 secs */ +const int PQIFILE_DOWNLOAD_TOO_FAST = 8; /* 8 secs */ +const int PQIFILE_DOWNLOAD_TOO_SLOW = 12; /* 12 secs */ +const int PQIFILE_DOWNLOAD_MIN_DELTA = 5; /* 5 secs */ + +const float TRANSFER_MODE_TRICKLE_RATE = 1000; /* 1 kbyte limit */ +const float TRANSFER_MODE_NORMAL_RATE = 500000; /* 500 kbyte limit - everyone uses this one for now */ +const float TRANSFER_MODE_FAST_RATE = 500000; /* 500 kbyte limit */ + +const int TRANSFER_START_MIN = 500; /* 500 byte min limit */ +const int TRANSFER_START_MAX = 10000; /* 10000 byte max limit */ + +void printFtFileStatus(ftFileStatus *s, std::ostream &out); + +/************* Local File Interface **************************** + * + * virtual bool getCacheFile(std::string id, std::string path, std::string hash) = 0; + * virtual int getFile(std::string name, std::string hash, + * int size, std::string destpath) = 0; + * + * virtual int cancelFile(std::string hash) = 0; + * + * int ftfiler::clearFailedTransfers(); + * + * * Worker Fns. + * ftFileStatus *ftfiler::findRecvFileItem(PQFileItem *in); + */ + + +int ftfiler::getFile(std::string name, std::string hash, + uint32_t size, std::string destpath) +{ + /* add to local queue */ + { + std::ostringstream out; + out << "ftfiler::getFile(): "; + out << " name: " << name << " hash: " << hash; + out << " path: " << destpath << " size: " << size; + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, out.str()); + } + + /* check for duplicates */ + ftFileStatus *state = findRecvFileItem(hash); + if (state) + { + std::ostringstream out; + out << "ftfiler::getFile() - duplicate, giving push!"; + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, out.str()); + + /* if duplicate - give download a push! */ + /* do this by flagging last transfer at 0. + */ + /* and also set the request stuff, so it'll + * generate a new request + * - we might lose the current transfer - but + * that's the idiots fault for redownloading. + */ + + resetFileTransfer(state); + return 1; + } + + // HANDLE destpath - TODO! + // state = new ftFileStatus(name, hash, size, destpath, FT_MODE_STD); + state = new ftFileStatus(name, hash, size, "", FT_MODE_STD); + if (initiateFileTransfer(state)) + { + std::ostringstream out; + out << "ftfiler::getFile() "; + out << "adding to recvFiles queue"; + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, out.str()); + + recvFiles.push_back(state); + } + return 1; +} + +bool ftfiler::RequestCacheFile(std::string id, std::string destpath, std::string hash, uint32_t size) +{ + /* add to local queue */ + { + std::ostringstream out; + out << "ftfiler::getCacheFile(): "; + out << " id: " << id << " hash: " << hash; + out << " path: " << destpath; + out << " size: " << size; + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, out.str()); + } + + /* check for duplicates */ + ftFileStatus *state = findRecvFileItem(hash); + if (state) + { + std::ostringstream out; + out << "ftfiler::getFile() - duplicate, giving push!"; + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, out.str()); + + /* if duplicate - give download a push! */ + /* do this by flagging last transfer at 0. + */ + /* and also set the request stuff, so it'll + * generate a new request + * - we might lose the current transfer - but + * that's the idiots fault for redownloading. + */ + + resetFileTransfer(state); + return 1; + } + + state = new ftFileStatus(id, hash, hash, size, destpath, FT_MODE_CACHE); + if (initiateFileTransfer(state)) + { + std::ostringstream out; + out << "ftfiler::getFile() "; + out << "adding to recvFiles queue"; + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, out.str()); + + recvFiles.push_back(state); + } + return 1; +} + + + +ftFileStatus *ftfiler::findRecvFileItem(std::string hash) +{ + { + std::ostringstream out; + out << "ftfiler::findRecvFileItem() Looking for: " << hash; + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, out.str()); + } + + /* iterate through fileItems and check for this one */ + std::list::iterator it; + for(it = recvFiles.begin(); it != recvFiles.end(); it++) + { + if (hash==(*it)->hash) + { + std::ostringstream out; + out << "ftfiler::findRecvFileItem() "; + out << "Match ftFileStatus: " << hash; + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, out.str()); + /* same */ + return (*it); + } + } + return NULL; +} + + + + +int ftfiler::cancelFile(std::string hash) +{ + /* flag as cancelled */ + /* iterate through fileItems and check for this one */ + { + std::ostringstream out; + out << "ftfiler::cancelFile() hash: " << hash << std::endl; + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, out.str()); + } + + std::list::iterator it; + for(it = recvFiles.begin(); it != recvFiles.end(); it++) + { + if (hash==(*it)->hash) + { + std::ostringstream out; + out << "ftfiler::cancelFile() "; + out << "Found file: " << hash; + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, out.str()); + + /* same */ + (*it)->status = (PQIFILE_FAIL | PQIFILE_FAIL_CANCEL); + return 1; + } + } + + { + std::ostringstream out; + out << "ftfiler::cancelFile() "; + out << "couldn't match ftFileStatus!"; + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, out.str()); + } + return 0; +} + +int ftfiler::clearFailedTransfers() +{ + /* remove all the failed items */ + /* iterate through fileItems and check for this one */ + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, + "ftfiler::clearFailedTransfers()"); + + std::list::iterator it; + int cleared = 0; + for(it = recvFiles.begin(); it != recvFiles.end(); /* done in loop */) + { + if ((*it)->status & PQIFILE_FAIL) + { + std::ostringstream out; + out << "ftfiler::clearFailedTransfers() "; + out << "removing item: " << (*it) -> name; + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, out.str()); + + /* same */ + ftFileStatus *cfile = (*it); + it = recvFiles.erase(it); + delete cfile; + cleared++; + } + else if ((*it)->status & PQIFILE_COMPLETE) + { + std::ostringstream out; + out << "ftfiler::clearFailedTransfers() "; + out << "removing Completed item: "; + out << (*it) -> name; + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, out.str()); + + /* same */ + ftFileStatus *cfile = (*it); + it = recvFiles.erase(it); + delete cfile; + cleared++; + } + else + { + it++; + } + } + + { + std::ostringstream out; + out << "ftfiler::clearFailedTransfers() cleared: "; + out << cleared; + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, out.str()); + } + + return 1; +} + +std::list ftfiler::getStatus() +{ + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, + "ftfiler::getTransferStatus()"); + std::list stateList; + + /* iterate through all files to recv */ + std::list::iterator it; + for(it = recvFiles.begin(); it != recvFiles.end(); it++) + { + FileTransferItem *fti = new FileTransferItem(); + + /* fill in the basics + * HACK - note - current system cannot save without a cert! + * - so use ours! + */ + fti -> p = getSSLRoot()->getOwnCert(); + + fti -> name = (*it)->name; + + /* hack to only store 'Real' Transfers (Cache have blank hash value)*/ + if ((*it)->ftMode != FT_MODE_CACHE) + { + fti -> hash = (*it)->hash; + } + fti -> size = (*it)->size; + + /* Fill in rate and State */ + fti -> transferred = (*it)->recv_size; + fti -> crate = (*it)->rate / 1000.0; // kbytes. + fti -> trate = (*it)->rate / 1000.0; // kbytes. + fti -> lrate = (*it)->rate / 1000.0; // kbytes. + fti -> ltransfer = (*it)->req_size; + fti -> in = true; + + /* get inactive period */ + if ((*it) -> status == PQIFILE_NOT_ONLINE) + { + fti -> crate = 0; + fti -> trate = 0; + fti -> lrate = 0; + fti -> ltransfer = 0; + fti -> state = FT_STATE_OKAY; + } + else if ((*it) -> status & PQIFILE_FAIL) + { + fti -> crate = 0; + fti -> trate = 0; + fti -> lrate = 0; + fti -> ltransfer = 0; + fti -> state = FT_STATE_FAILED; + + } + else if ((*it) -> status == PQIFILE_COMPLETE) + { + fti -> state = FT_STATE_COMPLETE; + } + else if ((*it) -> status == PQIFILE_DOWNLOADING) + { + fti -> state = FT_STATE_OKAY; + } + else + { + fti -> state = FT_STATE_FAILED; + } + stateList.push_back(fti); + } + return stateList; +} + + +/************* Incoming FileItems ****************************** + * + * PQFileItem *ftfiler::sendPQFileItem() + * int ftfiler::recvPQFileItem(PQFileItem *in) + * + * * Worker Fns. + * int ftfiler::handleFileNotOnline(PQFileItem *in) + * int ftfiler::handleFileNotOnline(PQFileItem *in) + * int ftfiler::handleFileNotAvailable(PQFileItem *in) + * int ftfiler::handleFileData(PQFileItem *in) + * int ftfiler::handleFileRequest(PQFileItem *in) + * int ftfiler::handleFileCacheRequest(PQFileItem *req) + * + */ + +ftFileRequest *ftfiler::sendFileInfo() +{ + if (out_queue.size() < 1) + { + return NULL; + } + ftFileRequest *i = out_queue.front(); + out_queue.pop_front(); + return i; +} + +int ftfiler::recvFileInfo(ftFileRequest *in) +{ + + /* decide if it is a fileData or Request */ + ftFileData *dta = dynamic_cast(in); + if (dta) + { + handleFileData(dta->hash, dta->offset, dta->data, dta->chunk); + } + else + { + handleFileRequest(in->id, in->hash, in->offset, in->chunk); + } + /* cleanup */ + delete in; + + return 1; +} + + +int ftfiler::handleFileError(std::string hash, uint32_t err) +{ + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, + "ftfiler::handleFileError()"); + /* get out the error */ + if (err & PQIFILE_NOT_ONLINE) + { + return handleFileNotOnline(hash); + } + if (err & PQIFILE_FAIL) + { + return handleFileNotAvailable(hash); + } + return 0; +} + +int ftfiler::handleFileNotOnline(std::string hash) +{ + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, + "ftfiler::handleFileNotOnline()"); + /* flag recvFile item as not Online */ + ftFileStatus *s = findRecvFileItem(hash); + if ((!s) || (s -> status & PQIFILE_FAIL)) + { + return 0; + } + + s -> status = PQIFILE_NOT_ONLINE; + + return 1; +} + + +int ftfiler::handleFileNotAvailable(std::string hash) +{ + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, + "ftfiler::handleFileNotAvailable()"); + /* error - flag recvFile item with FAILED */ + ftFileStatus *s = findRecvFileItem(hash); + if (!s) + { + return 0; + } + + s->status = (PQIFILE_FAIL | PQIFILE_FAIL_NOT_AVAIL); + return 1; +} + + +int ftfiler::handleFileData(std::string hash, uint32_t offset, + void *data, uint32_t datalen) +{ + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, + "ftfiler::handleFileData()"); + /* find the right ftFileStatus */ + ftFileStatus *recv = findRecvFileItem(hash); + if (!recv) + { + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, + "ftfiler::handleFileData() no matching ftFileStatus (current download)"); + return 0; + } + + if(recv->status & PQIFILE_FAIL) + { + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, + "ftfiler::handleFileData() marked as FAIL"); + return 0; + } + + /* add to file */ + addFileData(recv, offset, data, datalen); + + if (recv->status == PQIFILE_NOT_ONLINE) + { + /* switch to active */ + recv->status = PQIFILE_DOWNLOADING; + } + + /* if we have recieved all data - request some more */ + if ((recv->recv_size == recv->req_loc + recv->req_size) && + (recv->status != PQIFILE_COMPLETE)) + { + requestData(recv); + } + return 1; +} + +int ftfiler::handleFileRequest(std::string id, std::string hash, uint32_t offset, uint32_t chunk) +{ + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, + "ftfiler::handleFileRequest()"); + /* see if in cache */ + /* if yes send out chunk */ + if (handleFileCacheRequest(id, hash, offset, chunk)) + { + return 1; + } + + /* if not in cache - find file */ + ftFileStatus *new_file = createFileCache(hash); + if (!new_file) + { + /* bad file */ + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, + "ftfiler::handleFileRequest() Failed to Load File-sendNotAvail"); + return 0; + //sendFileNotAvail(in); + } + + fileCache.push_back(new_file); + + return handleFileCacheRequest(id, hash, offset, chunk); +} + +int ftfiler::handleFileCacheRequest(std::string id, std::string hash, uint32_t offset, uint32_t chunk) +{ + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, + "ftfiler::handleFileCacheRequest()"); + /* check if in cache */ + bool found = false; + ftFileStatus *s; + std::list::iterator it; + for(it = fileCache.begin(); it != fileCache.end(); it++) + { + if (hash==(*it)->hash) + { + found = true; + s = (*it); + break; + } + } + if (!found) + return 0; + + /* push to out queue */ + return generateFileData(s, id, offset, chunk); +} + +/************* Outgoing FileItems ****************************** + * + * PQFileItem *ftfiler::sendPQFileItem() + * + * * Worker Fns. + * int ftfiler::tick(); + * void ftfiler::queryInactive() + * + */ + + +int ftfiler::tick() +{ + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, + "ftfiler::tick()"); + /* check the status of recved files */ + queryInactive(); + + /* this doesn't matter much how often it's ticked... + * if it generates Items, they will be detected other places. + * so we can return 0 (waiting) + */ + return 0; +} + + +void ftfiler::queryInactive() +{ + std::ostringstream out; + + out << "ftfiler::queryInactive()"; + out << std::endl; + + + + /* iterate through all files to recv */ + int ts = time(NULL); + std::list::iterator it; + for(it = recvFiles.begin(); it != recvFiles.end();) /* increment at end of loop */ + { + /* get inactive period */ + switch((*it) -> status) + { + case PQIFILE_NOT_ONLINE: + out << "File: " << (*it)->name << " Not Online: "; + out << "Delta: " << (ts - (*it)->lastTS) << std::endl; + out << " LDelta: " << (*it)->lastDelta; + out << " Recved: " << (*it)->recv_size; + out << " Total: " << (*it)->total_size; + out << " LChunk: " << (*it)->req_size; + out << std::endl; + + if (ts - ((*it)->lastTS) > PQIFILE_OFFLINE_CHECK) + { + resetFileTransfer(*it); + requestData(*it); + } + break; + case PQIFILE_DOWNLOADING: + out << "File: " << (*it)->name << " Downloading: "; + out << " Delta: " << (ts - (*it)->lastTS) << std::endl; + out << " LDelta: " << (*it)->lastDelta; + out << " Recved: " << (*it)->recv_size; + out << " Total: " << (*it)->total_size; + out << " LChunk: " << (*it)->req_size; + out << std::endl; + + if (ts - ((*it)->lastTS) > PQIFILE_DOWNLOAD_CHECK) + { + requestData(*it); /* give it a push */ + } + break; + default: + out << "File: " << (*it)->name << " Other mode: " << (*it)->status; + out << " Delta: " << (ts - (*it)->lastTS) << std::endl; + out << " LDelta: " << (*it)->lastDelta; + out << " Recved: " << (*it)->recv_size; + out << " Total: " << (*it)->total_size; + out << " LChunk: " << (*it)->req_size; + out << std::endl; + /* nothing */ + break; + } + + /* remove/increment */ + if (((*it) -> status == PQIFILE_COMPLETE) && ((*it)->ftMode == FT_MODE_CACHE)) + { + std::cerr << "Clearing Completed Cache File: " << (*it)->name; + std::cerr << std::endl; + delete (*it); + it = recvFiles.erase(it); + } + else + { + it++; + } + + } + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, out.str()); +} + + +int ftfiler::requestData(ftFileStatus *item) +{ + + /* formulate a request for the next desired data chunk */ + /* this handles the key throttling. This algorithm can + * be quite crude, as the tcp / and pqistreamer throttle as + * well. + */ + + std::ostringstream out; + out << "ftfiler::requestData()" << std::endl; + + /* get the time since last request */ + int tm = time(NULL); + float delta = tm - item -> lastTS; + + if (item->id == "") /* no possible source */ + { + /* flag as handled for now so it doesn't repeat to fast */ + item->lastTS = tm; + return 0; + } + + /* decide on transfer mode */ + float max_rate = TRANSFER_MODE_NORMAL_RATE; + switch(item->mode) + { + case TRANSFER_MODE_TRICKLE: + max_rate = TRANSFER_MODE_TRICKLE_RATE; + break; + case TRANSFER_MODE_NORMAL: + max_rate = TRANSFER_MODE_NORMAL_RATE; + break; + case TRANSFER_MODE_FAST: + max_rate = TRANSFER_MODE_FAST_RATE; + break; + default: + break; + } + out << "max rate: " << max_rate; + out << std::endl; + + /* not finished */ + if (item->recv_size < item->req_loc + item->req_size) + { + if (delta > PQIFILE_DOWNLOAD_TIMEOUT) + { + /* we have timed out ... switch to + * offline + */ + /* start again slowly */ + item->req_size = (int) (0.1 * max_rate); + out << "Timeout: switching to Offline."; + out << std::endl; + item->status = PQIFILE_NOT_ONLINE; + } + else + { + out << "Pause: Not Finished"; + out << std::endl; + /* pause */ + } + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, out.str()); + return 0; + } + + + if (delta <= PQIFILE_DOWNLOAD_MIN_DELTA) + { + /* pause */ + out << "Small Delta -> Pause"; + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, out.str()); + return 0; + } + + /* From this point - we will continue ... so handle rate now! */ + /* calc rate */ + float bytes_psec = item -> req_size / delta; + item -> rate = 0.7 * item -> rate + 0.3 * bytes_psec; + out << "delta: " << delta << " bytes: " << bytes_psec << " rate: " << item -> rate; + out << std::endl; + + if (item->lastDelta <= PQIFILE_DOWNLOAD_TOO_FAST) + { + /* increase 0.75 of the calculated extra that could be transmitted + * in the timeframe + */ + + float data_tf = item -> req_size; + float ldelta_f = item->lastDelta + 0.5; // 0.5 for extra space (+ dont / 0.0) + float tf_p_sec = data_tf / ldelta_f; + float extra_tf = tf_p_sec * (PQIFILE_DOWNLOAD_CHECK - ldelta_f); + + item -> req_size = item->req_size + (int) (0.75 * extra_tf); + + if (item->req_size > max_rate * PQIFILE_DOWNLOAD_CHECK) + item->req_size = (int) (max_rate * PQIFILE_DOWNLOAD_CHECK); + + out << "Small Delta: " << ldelta_f << " (sec), rate: " << tf_p_sec; + out << std::endl; + out << "Small Delta Incrementing req_size from: " << data_tf; + out << " to :" << item->req_size; + out << std::endl; + + } + else if (item->lastDelta > PQIFILE_DOWNLOAD_TOO_SLOW) + { + /* similarly decrease rate by 1.5 of extra time */ + + float data_tf = item -> req_size; + float ldelta_f = item->lastDelta + 0.5; // 0.5 for extra space (+ dont / 0.0) + float tf_p_sec = data_tf / ldelta_f; + float extra_tf = tf_p_sec * (ldelta_f - PQIFILE_DOWNLOAD_CHECK); + + item -> req_size -= (int) (1.25 * extra_tf); + + out << "Long Delta: " << ldelta_f << " (sec), rate: " << tf_p_sec; + out << std::endl; + out << "Long Delta Decrementing req_size from: " << data_tf; + out << " to :" << item->req_size; + out << std::endl; + } + + /* make the packet */ + + item->req_loc = item->recv_size; + /* req_size already calculated (unless NULL) */ + if (item->req_size < TRANSFER_START_MIN) + { + /* start again slowly + * added an extra limiter. + * - make this dependent on number of transfers ... */ + item->req_size = (int) (max_rate * (0.01 + 0.10 / recvFiles.size())); + if (item->req_size < TRANSFER_START_MIN) + { + item->req_size = TRANSFER_START_MIN; + } + else if (item->req_size > TRANSFER_START_MAX) + { + item->req_size = TRANSFER_START_MAX; + } + } + + out << "Making Packet: offset: " << item->req_loc << " size: " << item->req_size; + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, out.str()); + + ftFileRequest *req = generateFileRequest(item); + out_queue.push_back(req); + + return 1; +} + +/************* PQIFILEITEM Generator *************************** + * + * PQFileItem *ftfiler::generatePQFileRequest(ftFileStatus *s); + * int ftfiler::generateFileData(ftFileStatus *s, PQFileItem *req); + * int ftfiler::sendFileNotAvail(PQFileItem *req) + * + */ + + +int ftfiler::generateFileData(ftFileStatus *s, std::string id, uint32_t offset, uint32_t chunk) +{ + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, + "ftfiler::generateFileData()"); + + if ((!s) || (!s->fd) || (s->status & PQIFILE_FAIL)) + { + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, + "ftfiler::generateFileData() Bad Status"); + if (!s) + { + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, + "ftfiler::generateFileData() Bad Status (!s)"); + } + if (!s->fd) + { + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, + "ftfiler::generateFileData() Bad Status (!s->fd)"); + } + if (s->status & PQIFILE_FAIL) + { + std::ostringstream out; + out << "ftfiler::generateFileData() Bad Status (s->status): " << s->status; + pqioutput(PQL_DEBUG_BASIC, ftfilerzone,out.str()); + } + + /* return an error */ + return 0; + //sendFileNotAvail(req); + } + + /* make the packets */ + int tosend = chunk; + long base_loc = offset; + + if (base_loc + tosend > s -> total_size) + { + tosend = s -> total_size - base_loc; + } + + { + std::ostringstream out; + out << "ftfiler::generateFileData() Sending " << tosend; + out << " bytes from offset: " << base_loc << std::endl; + out << "\tFrom File:" << s -> name; + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, out.str()); + } + + if (tosend > 0) + { + /* seek for base_loc */ + fseek(s->fd, base_loc, SEEK_SET); + + void *data = malloc(tosend); + /* read the data */ + if (1 != fread(data, tosend, 1, s->fd)) + { + std::ostringstream out; + + out << "ftfiler::generateFileData() Failed to get data!"; + + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, out.str()); + + free(data); + return 0; + } + + // make a FileData type. + ftFileData *fd = new ftFileData(id, s->hash, s->size, offset, tosend, data); + + /* send off the packet */ + out_queue.push_back(fd); + } + return 1; +} + + +ftFileRequest *ftfiler::generateFileRequest(ftFileStatus *s) +{ + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, + "ftfiler::generatePQFileRequest()"); + + ftFileRequest *fr = new ftFileRequest(s->id, s->hash, + s->size, s->req_loc, s->req_size); + + std::ostringstream out; + + out << "ftfiler::generateFileRequest() for: " << s->name << std::endl; + out << "ftfiler::generateFileRequest() offset: " << fr->offset << " chunksize: "; + out << fr->chunk << std::endl; + + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, out.str()); + + // timestamp request. + s->lastTS = time(NULL); + + return fr; +} + +/************* FILE DATA HANDLING ****************************** + * + * std::string ftfiler::determineTmpFilePath(ftFileStatus *s); + * std::string ftfiler::determineDestFilePath(ftFileStatus *s) + * int ftfiler::initiateFileTransfer(ftFileStatus *s); + * int ftfiler::resetFileTransfer(ftFileStatus *s); + * int ftfiler::addFileData(ftFileStatus *s, long idx, void *data, int size); + * + */ + +const std::string PARTIAL_DIR = "partials"; + +std::string ftfiler::determineTmpFilePath(ftFileStatus *s) +{ + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, + "ftfiler::determineTmpFilePath()"); + + /* get the download path */ + // savePath = "."; + std::string filePath = saveBasePath; + filePath += "/"; + filePath += PARTIAL_DIR; + filePath += "/"; + filePath += s->hash; + + return filePath; + + +} + +std::string ftfiler::determineDestFilePath(ftFileStatus *s) +{ + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, + "ftfiler::determineDestFilePath()"); + + /* should be three different options here: + * (1) relative to baseSavePath (default) + * (2) Abs (for Cache Files) + * (3) relative to shared dirs (TODO) + * + * XXX TODO. + */ + + std::string filePath; + + if (s->destpath == "") + { + filePath = saveBasePath; + } + else + { + filePath = s->destpath; + } + + /* get the download path */ + filePath += "/"; + filePath += s->name; + + return filePath; + + +} + +/****** + * NOTES: + * + * This is called to start the Transfer - from GetFile() or GetCacheFile() + * + * we need to determine the destination. + * + * + * + */ + +int ftfiler::initiateFileTransfer(ftFileStatus *s) +{ + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, + "ftfiler::initiateFileTransfer()"); + + + std::string partialpath = saveBasePath + "/"; + partialpath += PARTIAL_DIR; + if (!RsDirUtil::checkCreateDirectory(partialpath)) + { + std::ostringstream out; + out << "ftfiler::initiateFileTransfer() Cannot create partial directory: " << partialpath; + pqioutput(PQL_ALERT, ftfilerzone, out.str()); + exit(1); + } + + /* check if the file exists */ + s->file_name = determineTmpFilePath(s); + + { + std::ostringstream out; + out << "ftfiler::initiateFileTransfer() Filename: "; + out << s->file_name; + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, out.str()); + } + + /* attempt to open file */ + FILE *fd = fopen(s->file_name.c_str(), "r+b"); + if (!fd) + { + { + std::ostringstream out; + out << "ftfiler::initiateFileTransfer() Failed to open (r+b): "; + out << s->file_name << " Error: " << errno; + out << " Will try to create file"; + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, out.str()); + } + + /* open in writing mode */ + fd = fopen(s->file_name.c_str(), "w+b"); + if (!fd) + { + std::ostringstream out; + out << "ftfiler::initiateFileTransfer() Failed to open (w+b): "; + out << s->file_name << " Error:" << errno; + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, out.str()); + + /* failed to open the file */ + s->status = (PQIFILE_FAIL | PQIFILE_FAIL_NOT_OPEN); + return 0; + } + + } + + + /* if it opened, find it's length */ + /* move to the end */ + if (0 != fseek(fd, 0L, SEEK_END)) + { + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, + "ftfiler::initiateFileTransfer() Seek Failed"); + s->status = (PQIFILE_FAIL | PQIFILE_FAIL_NOT_SEEK); + return 0; + } + + s->recv_size = ftell(fd); /* get the file length */ + s->total_size = s->size; /* save the total length */ + s->fd = fd; + + /* now determine the sources */ + if (s->ftMode != FT_MODE_CACHE) + { + } + + resetFileTransfer(s); + return 1; +} + +int ftfiler::resetFileTransfer(ftFileStatus *state) +{ + // reset all the basic items ... so the transfer will continue. + state->req_loc = 0; + state->req_size = 0; + state->lastTS = 0; + state->lastDelta = 0; + state->status = PQIFILE_NOT_ONLINE; + state->mode = TRANSFER_MODE_NORMAL; + state->rate = 0; + if (state->recv_size == state->total_size) + { + state->status = PQIFILE_COMPLETE; + /* if we're kicking it again for some reason? */ + completeFileTransfer(state); + } + else if (state->ftMode != FT_MODE_CACHE) + { + /* lookup options */ + state->sources.clear(); + if (!lookupRemoteHash(state->hash, state->sources)) + { + pqioutput(PQL_WARNING, ftfilerzone, + "ftfiler::resetFileTransfer() Failed to locate Peers"); + } + if (state->sources.size() == 0) + { + state->id = ""; + return 0; + } + + /* select a new source if possible */ + int idno = state->resetCount % state->sources.size(); + int i = 0; + std::list::const_iterator it; + for(it = state->sources.begin(); (it != state->sources.end()) + && (i < idno); it++, i++); + + if (it != state->sources.end()) + { + state->id = (*it); + } + } + state->resetCount++; + return 1; +} + + + +int ftfiler::addFileData(ftFileStatus *s, long idx, void *data, int size) +{ + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, + "ftfiler::addFileData()"); + + //std::cerr << "ftfiler::addFileData() PreStatus" << std::endl; + //printFtFileStatus(s, std::cerr); + + /* check the status */ + if ((!s) || (!s->fd) || (s->status & PQIFILE_FAIL)) + { + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, + "ftfiler::addFileData() Bad Status"); + return 0; + } + + /* check its at the correct location */ + if ((idx != s->recv_size) || (s->recv_size + size > s->total_size)) + { + std::ostringstream out; + out << "ftfiler::addFileData() Bad Data Location" << std::endl; + out << " recv_size: " << s->recv_size << " offset: " << idx; + out << " total_size: " << s->total_size << " size: " << size; + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, out.str()); + return 0; + } + + /* go to the end of the file */ + if (0 != fseek(s->fd, 0L, SEEK_END)) + { + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, + "ftfiler::addFileData() Bad fseek"); + s->status = (PQIFILE_FAIL | PQIFILE_FAIL_NOT_SEEK); + return 0; + } + + /* add the data */ + if (1 != fwrite(data, size, 1, s->fd)) + { + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, + "ftfiler::addFileData() Bad fwrite"); + s->status = (PQIFILE_FAIL | PQIFILE_FAIL_NOT_WRITE); + return 0; + } + + s->recv_size += size; + + + /* if we've completed the request this time */ + if (s->req_loc + s->req_size == s->recv_size) + { + s->lastDelta = time(NULL) - s->lastTS; + } + + if (s->recv_size == s->total_size) + { + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, + "ftfiler::addFileData() File Complete!"); + s->status = PQIFILE_COMPLETE; + + /* HANDLE COMPLETION HERE */ + completeFileTransfer(s); + } + + return 1; +} + + +int ftfiler::completeFileTransfer(ftFileStatus *s) +{ + /* cleanup transfer */ + if (s->fd) + { + fclose(s->fd); + s->fd = 0; + + // re-open in read mode (for transfers?) + // don't bother .... + // s->fd = fopen(s->file_name.c_str(), "r+b"); + + } + + /* so now we move it to the expected destination */ + /* determine where it should go! */ + bool ok = true; + + std::string dest = determineDestFilePath(s); + if (0 == rename(s->file_name.c_str(), dest.c_str())) + { + /* correct the file_name */ + s->file_name = dest; + } + else + { + ok = false; + } + + /* do callback if CACHE */ + if (s->ftMode == FT_MODE_CACHE) + { + if (ok) + { + CompletedCache(s->hash); + } + else + { + FailedCache(s->hash); + } + } + return 1; +} + + +/*********************** + * Notes + * + * createFileCache is called: int ftfiler::handleFileRequest(PQFileItem *in) only. + * + * it should + * (1) create a ftFileStatus + * (2) find it in the indices. + * (3) load up the details. + */ + + +ftFileStatus *ftfiler::createFileCache(std::string hash) +{ + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, + "ftfiler::createFileCache()"); + + ftFileStatus *s = new ftFileStatus(hash, hash, 0, "", FT_MODE_UPLOAD); + + /* request from fileindex */ + bool found = false; + + /* so look it up! */ + std::string srcpath; + uint32_t size; + if (lookupLocalHash(s->hash, srcpath, size)) + { + found = true; + s->file_name = srcpath; + s->size = size; + } + + if ((!found) || (s->file_name.length() < 1)) + { + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, + "ftfiler::createFileCache() Failed to Find File"); + /* failed to open the file */ + s->status = (PQIFILE_FAIL | PQIFILE_FAIL_BAD_PATH); + delete s; + return NULL; + } + + + /* attempt to open file (readonly) */ + FILE *fd = fopen(s->file_name.c_str(), "rb"); + if (!fd) + { + std::stringstream out; + out << "ftfiler::createFileCache() Failed to Open the File" << std::endl; + out << "\tFull Path:" << s->file_name.c_str() << std::endl; + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, out.str()); + /* failed to open the file */ + s->status = (PQIFILE_FAIL | PQIFILE_FAIL_NOT_OPEN); + delete s; + return NULL; + } + + /* if it opened, find it's length */ + /* move to the end */ + if (0 != fseek(fd, 0L, SEEK_END)) + { + pqioutput(PQL_DEBUG_BASIC, ftfilerzone, + "ftfiler::createFileCache() Fseek Failed"); + + s->status = (PQIFILE_FAIL | PQIFILE_FAIL_NOT_OPEN); + delete s; + return NULL; + } + + s->recv_size = ftell(fd); /* get the file length */ + s->total_size = s->size; /* save the total length */ + s->req_loc = 0; /* no request */ + s->req_size = 0; + + /* we are now ready for transfers */ + s->fd = fd; + s->lastTS = 0; + s->status = PQIFILE_DOWNLOADING; + return s; +} + + + + +/**** + * NOTE this should move all temporary and cache files. + * TODO! + */ + +void ftfiler::setSaveBasePath(std::string s) +{ + saveBasePath = s; + return; +} + + + +/*********************** + * Notes + * + * debugging functions. + * + */ + + +void printFtFileStatus(ftFileStatus *s, std::ostream &out) +{ + /* main details */ + out << "FtFileStatus::Internals:" << std::endl; + out << "name: " << s->name << std::endl; + out << "hash: " << s->hash << std::endl; + out << "destpath " << s->destpath << std::endl; + // + + out << "Source: " << s->id << std::endl; + out << "Alt Srcs: "; + std::list::iterator it; + for(it = s->sources.begin(); it != s->sources.end(); it++) + { + out << " " << (*it); + } + + out << std::endl; + out << " mode: " << s->mode; + out << " ftMode: " << s->ftMode; + out << " status: " << s->status; + out << " resetCount: " << s->resetCount; + out << std::endl; + + if (s->fd) + { + out << "FD Valid: "; + } + else + { + out << "FD Invalid: "; + } + out << "file_name " << s->file_name << std::endl; + + out << " size " << s->size; + out << " total_size " << s->total_size; + out << " recv_size " << s->recv_size; + out << " rate: " << s->rate; + out << std::endl; + out << " Req loc: " << s->req_loc; + out << " Req size: " << s->req_size; + out << std::endl; + out << " last Delta: " << s->lastDelta; + out << " last TS: " << s->lastTS; + out << std::endl; +} + + diff --git a/libretroshare/src/server/ftfiler.h b/libretroshare/src/server/ftfiler.h new file mode 100644 index 000000000..d259d7753 --- /dev/null +++ b/libretroshare/src/server/ftfiler.h @@ -0,0 +1,228 @@ +/* + * "$Id: ftfiler.h,v 1.5 2007-02-19 20:08:30 rmf24 Exp $" + * + * Other Bits for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + +#ifndef MRK_FT_FILER_HEADER +#define MRK_FT_FILER_HEADER + +/* + * PQI Filer + * + * This managers the file transfers. + * + */ + +#include "server/ft.h" +#include "pqi/pqi.h" +#include +#include +#include + +const int PQIFILE_INIT = 0x0000; +const int PQIFILE_NOT_ONLINE = 0x0001; +const int PQIFILE_DOWNLOADING = 0x0002; +const int PQIFILE_COMPLETE = 0x0004; +const int PQIFILE_FAIL = 0x0010; +/* reasons for DOWNLOAD FAILURE (2nd byte) */ +const int PQIFILE_FAIL_CANCEL = 0x0100; +const int PQIFILE_FAIL_NOT_AVAIL = 0x0200; +const int PQIFILE_FAIL_NOT_OPEN = 0x0400; +const int PQIFILE_FAIL_NOT_SEEK = 0x0800; +const int PQIFILE_FAIL_NOT_WRITE = 0x1000; +const int PQIFILE_FAIL_NOT_READ = 0x2000; +const int PQIFILE_FAIL_BAD_PATH = 0x4000; + + +const int TRANSFER_MODE_TRICKLE = 1; +const int TRANSFER_MODE_NORMAL = 2; +const int TRANSFER_MODE_FAST = 3; + + +const uint32_t FT_MODE_STD = 1; +const uint32_t FT_MODE_CACHE = 2; +const uint32_t FT_MODE_UPLOAD = 4; + +class ftFileStatus +{ +public: +/**** + ftFileStatus(PQFileItem *in) + :fileItem(in), status(PQIFILE_INIT), fd(NULL), + total_size(0), recv_size(0), + req_loc(0), req_size(0), lastTS(0) + { + return; + } +****/ + + ftFileStatus(std::string name_in, std::string hash_in, uint32_t size_in, + std::string destpath_in, uint32_t mode_in) + :name(name_in), hash(hash_in), destpath(destpath_in), size(size_in), ftMode(mode_in), + status(PQIFILE_INIT), mode(0), rate(0), fd(NULL), total_size(0), recv_size(0), + req_loc(0), req_size(0), lastTS(0), lastDelta(0) + { + /* not set ... + * id, + * filename, + * sources + */ + return; + } + + ftFileStatus(std::string id_in, std::string name_in, std::string hash_in, uint32_t size_in, + std::string destpath_in, uint32_t mode_in) + :id(id_in), name(name_in), hash(hash_in), destpath(destpath_in), size(size_in), ftMode(mode_in), + status(PQIFILE_INIT), mode(0), rate(0), fd(NULL), total_size(0), recv_size(0), + req_loc(0), req_size(0), lastTS(0), lastDelta(0) + { + /* not set ... + * id, + * filename, + * sources + */ + return; + } + + + ~ftFileStatus() + { + if (fd) + fclose(fd); + } + + + /* data */ + std::string id; /* current source */ + std::string name; + std::string hash; + std::string destpath; + uint32_t size; + + /* new stuff */ + uint32_t ftMode; + std::list sources; + uint32_t resetCount; + + /* transfer inprogress or not */ + int status; + int mode; + float rate; + + std::string file_name; + FILE *fd; + long total_size; + /* this is the simplistic case where only inorder data + * otherwise - need much more status info */ + long recv_size; + + /* current file data request */ + long req_loc; + int req_size; + + /* timestamp */ + long lastTS; + int lastDelta; /* send til all recved */ +}; + + +class ftfiler: public ftManager +{ +public: + + ftfiler(CacheStrapper *cs) + :ftManager(cs) { return; } + +virtual ~ftfiler() { return; } + +virtual bool RequestCacheFile(std::string id, std::string path, + std::string hash, uint32_t size); +virtual int getFile(std::string name, std::string hash, + uint32_t size, std::string destpath); + +virtual int cancelFile(std::string hash); +virtual int clearFailedTransfers(); + +int tick(); +std::list getStatus(); + +virtual void setSaveBasePath(std::string s); + +/************* Network Interface****************************/ +virtual int recvFileInfo(ftFileRequest *in); +virtual ftFileRequest *sendFileInfo(); + +private: + +virtual int handleFileError(std::string hash, uint32_t err); +virtual int handleFileNotOnline(std::string hash); +virtual int handleFileNotAvailable(std::string hash); +virtual int handleFileData(std::string hash, uint32_t offset, + void *data, uint32_t size); + +virtual int handleFileRequest( std::string id, std::string hash, + uint32_t offset, uint32_t chunk); +virtual int handleFileCacheRequest(std::string id, std::string hash, + uint32_t offset, uint32_t chunk); + +ftFileStatus *findRecvFileItem(std::string hash); +void queryInactive(); + + +/**************** End of Interface *************************/ +int requestData(ftFileStatus *item); + +/************* PQIFILEITEM Generator *************************** + */ + +ftFileStatus * createFileCache(std::string hash); +ftFileRequest * generateFileRequest(ftFileStatus *); +int generateFileData(ftFileStatus *s, std::string id, uint32_t offset, uint32_t size); +//int sendFileNotAvail(PQFileItem *req); + +/************* FILE DATA HANDLING ****************************** + */ + +std::string determineTmpFilePath(ftFileStatus *s); +std::string determineDestFilePath(ftFileStatus *s); + +int initiateFileTransfer(ftFileStatus *s); +int resetFileTransfer(ftFileStatus *s); +int addFileData(ftFileStatus *s, long idx, void *data, int size); +int completeFileTransfer(ftFileStatus *s); + + + // Data. +private: + std::list recvFiles; + std::list fileCache; + std::list out_queue; + + std::string saveBasePath; +}; + + + +#endif // MRK_PQI_FILER_HEADER diff --git a/libretroshare/src/server/hashsearch.cc b/libretroshare/src/server/hashsearch.cc new file mode 100644 index 000000000..e8f68e83c --- /dev/null +++ b/libretroshare/src/server/hashsearch.cc @@ -0,0 +1,51 @@ +/* + * "$Id: hashsearch.cc,v 1.5 2007-02-19 20:08:30 rmf24 Exp $" + * + * Other Bits for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + +/********** + * SearchInterface for the FileTransfer + */ + +#include "server/hashsearch.h" +#include "dbase/fistore.h" +#include "dbase/fimonitor.h" + + /* Search Interface - For FileTransfer Lookup */ +int FileHashSearch::searchLocalHash(std::string hash, std::string &path, uint32_t &size) +{ + if (monitor) + { + return monitor->findLocalFile(hash, path, size); + } + return 0; +} + +int FileHashSearch::searchRemoteHash(std::string hash, std::list &results) +{ + if (store) + store->SearchHash(hash, results); + return results.size(); +} + + diff --git a/libretroshare/src/server/hashsearch.h b/libretroshare/src/server/hashsearch.h new file mode 100644 index 000000000..13992be12 --- /dev/null +++ b/libretroshare/src/server/hashsearch.h @@ -0,0 +1,61 @@ +/* + * "$Id: hashsearch.h,v 1.5 2007-02-19 20:08:30 rmf24 Exp $" + * + * Other Bits for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + + +#ifndef MRK_FILE_HASH_SEARCH_H +#define MRK_FILE_HASH_SEARCH_H + +/********** + * SearchInterface for the FileTransfer + */ + +#include "rsiface/rstypes.h" +class FileIndexStore; +class FileIndexMonitor; +#include "dbase/fistore.h" +#include "dbase/fimonitor.h" + +class FileHashSearch +{ + public: + FileHashSearch(FileIndexStore *s, FileIndexMonitor *m) + :store(s), monitor(m) { return; } + + ~FileHashSearch() { return; } + + /* Search Interface - For FileTransfer Lookup */ + int searchLocalHash(std::string hash, std::string &path, uint32_t &size); + + int searchRemoteHash(std::string hash, std::list &results); + + private: + + FileIndexStore *store; + FileIndexMonitor *monitor; +}; + +#endif diff --git a/libretroshare/src/server/pqifiler.cc b/libretroshare/src/server/pqifiler.cc new file mode 100644 index 000000000..236251e1a --- /dev/null +++ b/libretroshare/src/server/pqifiler.cc @@ -0,0 +1,1220 @@ +/* + * "$Id: pqifiler.cc,v 1.13 2007-02-19 20:08:30 rmf24 Exp $" + * + * Other Bits for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "server/pqifiler.h" + +#include "pqi/pqidebug.h" +#include + +#include + +const int pqifilerzone = 86539; + +/* + * PQI Filer + * + * This managers the file transfers. + * + * + * TODO: add trickle transfers. + * + */ + +const int PQIFILE_OFFLINE_CHECK = 120; /* check every 2 minutes */ +const int PQIFILE_DOWNLOAD_TIMEOUT = 60; /* time it out, -> offline after 60 secs */ +const int PQIFILE_DOWNLOAD_CHECK = 10; /* desired delta = 10 secs */ +const int PQIFILE_DOWNLOAD_TOO_FAST = 8; /* 8 secs */ +const int PQIFILE_DOWNLOAD_TOO_SLOW = 12; /* 12 secs */ +const int PQIFILE_DOWNLOAD_MIN_DELTA = 5; /* 5 secs */ + +const float TRANSFER_MODE_TRICKLE_RATE = 1000; /* 1 kbyte limit */ +const float TRANSFER_MODE_NORMAL_RATE = 500000; /* 500 kbyte limit - everyone uses this one for now */ +const float TRANSFER_MODE_FAST_RATE = 500000; /* 500 kbyte limit */ + +const int TRANSFER_START_MIN = 500; /* 500 byte min limit */ +const int TRANSFER_START_MAX = 2000; /* 2000 byte max limit */ + +#ifdef USE_FILELOOK +pqifiler::pqifiler(fileLook *fd) + :fileIndex(fd) { return; } +#else +pqifiler::pqifiler(filedex *fd) + :fileIndex(fd) { return; } +#endif + + +/************* Local File Interface **************************** + * + * int pqifiler::getFile(PQFileItem *in); + * int pqifiler::cancelFile(PQFileItem *i); + * int pqifiler::clearFailedTransfers(); + * + * * Worker Fns. + * PQFileStatus *pqifiler::findRecvFileItem(PQFileItem *in); + */ + +int pqifiler::getFile(PQFileItem *in) +{ + /* add to local queue */ + { + std::ostringstream out; + out << "pqifiler::getFile(): " << std::endl; + in -> print(out); + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, out.str()); + } + + + + /* check for duplicates */ + PQFileStatus *state = findRecvFileItem(in); + if (state) + { + std::ostringstream out; + out << "pqifiler::getFile() - duplicate, giving push!"; + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, out.str()); + + /* if duplicate - give download a push! */ + /* do this by flagging last transfer at 0. + */ + /* and also set the request stuff, so it'll + * generate a new request + * - we might lose the current transfer - but + * that's the idiots fault for redownloading. + */ + + resetFileTransfer(state); + return 1; + } + + state = new PQFileStatus(in); + if (initiateFileTransfer(state)) + { + std::ostringstream out; + out << "pqifiler::getFile() "; + out << "adding to recvFiles queue"; + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, out.str()); + + recvFiles.push_back(state); + } + return 1; +} + +PQFileStatus *pqifiler::findRecvFileItem(PQFileItem *in) +{ + { + std::ostringstream out; + out << "pqifiler::findRecvFileItem() Looking for: " << in->name; + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, out.str()); + } + + /* iterate through fileItems and check for this one */ + std::list::iterator it; + for(it = recvFiles.begin(); it != recvFiles.end(); it++) + { + if ((in->name==(*it)->fileItem->name) && + (in->hash==(*it)->fileItem->hash)) + { + std::ostringstream out; + out << "pqifiler::findRecvFileItem() "; + out << "Match PQFileStatus: " << in -> name; + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, out.str()); + /* same */ + return (*it); + } + } + return NULL; +} + + + + +int pqifiler::cancelFile(PQFileItem *i) +{ + /* flag as cancelled */ + /* iterate through fileItems and check for this one */ + { + std::ostringstream out; + out << "pqifiler::cancelFile(): " << std::endl; + i -> print(out); + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, out.str()); + } + + std::list::iterator it; + for(it = recvFiles.begin(); it != recvFiles.end(); it++) + { + if ((i->name==(*it)->fileItem->name) && + (i->hash==(*it)->fileItem->hash)) + { + std::ostringstream out; + out << "pqifiler::cancelFile() "; + out << "Found file: " << i -> name; + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, out.str()); + + /* same */ + (*it)->status = (PQIFILE_FAIL | PQIFILE_FAIL_CANCEL); + return 1; + } + } + + { + std::ostringstream out; + out << "pqifiler::cancelFile() "; + out << "couldn't match PQFileStatus!"; + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, out.str()); + } + return 0; +} + +int pqifiler::clearFailedTransfers() +{ + /* remove all the failed items */ + /* iterate through fileItems and check for this one */ + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, + "pqifiler::clearFailedTransfers()"); + + std::list::iterator it; + int cleared = 0; + for(it = recvFiles.begin(); it != recvFiles.end(); /* done in loop */) + { + if ((*it)->status & PQIFILE_FAIL) + { + std::ostringstream out; + out << "pqifiler::clearFailedTransfers() "; + out << "removing item: " << (*it) -> fileItem -> name; + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, out.str()); + + /* same */ + PQFileStatus *cfile = (*it); + it = recvFiles.erase(it); + delete cfile; + cleared++; + } + else if ((*it)->status & PQIFILE_COMPLETE) + { + std::ostringstream out; + out << "pqifiler::clearFailedTransfers() "; + out << "removing Completed item: "; + out << (*it) -> fileItem -> name; + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, out.str()); + + /* same */ + PQFileStatus *cfile = (*it); + it = recvFiles.erase(it); + delete cfile; + cleared++; + } + else + { + it++; + } + } + + { + std::ostringstream out; + out << "pqifiler::clearFailedTransfers() cleared: "; + out << cleared; + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, out.str()); + } + + return 1; +} + + +std::list pqifiler::getStatus() +{ + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, + "pqifiler::getTransferStatus()"); + std::list stateList; + + /* iterate through all files to recv */ + std::list::iterator it; + for(it = recvFiles.begin(); it != recvFiles.end(); it++) + { + FileTransferItem *fti = new FileTransferItem(); + fti -> PQFileItem::copy((*it)->fileItem); + + /* Fill in rate and State */ + fti -> transferred = (*it)->recv_size; + fti -> crate = (*it)->rate / 1000.0; // kbytes. + fti -> trate = (*it)->rate / 1000.0; // kbytes. + fti -> lrate = (*it)->rate / 1000.0; // kbytes. + fti -> ltransfer = (*it)->req_size; + fti -> in = true; + + /* get inactive period */ + if ((*it) -> status == PQIFILE_NOT_ONLINE) + { + fti -> crate = 0; + fti -> trate = 0; + fti -> lrate = 0; + fti -> ltransfer = 0; + fti -> state = FT_STATE_OKAY; + } + else if ((*it) -> status & PQIFILE_FAIL) + { + fti -> crate = 0; + fti -> trate = 0; + fti -> lrate = 0; + fti -> ltransfer = 0; + fti -> state = FT_STATE_FAILED; + + } + else if ((*it) -> status == PQIFILE_COMPLETE) + { + fti -> state = FT_STATE_COMPLETE; + } + else if ((*it) -> status == PQIFILE_DOWNLOADING) + { + fti -> state = FT_STATE_OKAY; + } + else + { + fti -> state = FT_STATE_FAILED; + } + stateList.push_back(fti); + } + return stateList; +} + + +/************* Incoming FileItems ****************************** + * + * PQFileItem *pqifiler::sendPQFileItem() + * int pqifiler::recvPQFileItem(PQFileItem *in) + * + * * Worker Fns. + * int pqifiler::handleFileNotOnline(PQFileItem *in) + * int pqifiler::handleFileNotOnline(PQFileItem *in) + * int pqifiler::handleFileNotAvailable(PQFileItem *in) + * int pqifiler::handleFileData(PQFileItem *in) + * int pqifiler::handleFileRequest(PQFileItem *in) + * int pqifiler::handleFileCacheRequest(PQFileItem *req) + * + */ + +PQItem *pqifiler::sendPQFileItem() +{ + if (out_queue.size() < 1) + { + return NULL; + } + PQItem *i = out_queue.front(); + out_queue.pop_front(); + { + std::ostringstream out; + out << "pqifiler::sendPQFileItem() "; + out << "returning: " << std::endl; + i -> print(out); + pqioutput(PQL_DEBUG_ALL, pqifilerzone, out.str()); + } + return i; +} + +int pqifiler::recvPQFileItem(PQItem *item) +{ + /* check what type */ + PQFileItem *in; + + { + std::ostringstream out; + out << "pqifiler::recvPQFileItem() "; + out << "input: " << std::endl; + item -> print(out); + pqioutput(PQL_DEBUG_ALL, pqifilerzone, out.str()); + } + + if (NULL == (in = dynamic_cast(item))) + { + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, + "pqifiler::recvPQFileItem() Error Not PQFileItem"); + delete item; + return 0; + } + + + switch(in -> subtype) + { + case PQI_FI_SUBTYPE_ERROR: /* not currently connected */ + handleFileError(in); + break; + case PQI_FI_SUBTYPE_DATA: /* received some data */ + handleFileData(in); + break; + case PQI_FI_SUBTYPE_REQUEST: + handleFileRequest(in); + break; + default: + /* what ? */ + break; + } + + /* clean up */ + delete in; + return 1; +} + + + +int pqifiler::handleFileError(PQFileItem *in) +{ + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, + "pqifiler::handleFileError()"); + /* get out the error */ + if (in->fileoffset | PQIFILE_NOT_ONLINE) + { + return handleFileNotOnline(in); + } + if (in->fileoffset & PQIFILE_FAIL) + { + return handleFileNotAvailable(in); + } + return 0; +} + +int pqifiler::handleFileNotOnline(PQFileItem *in) +{ + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, + "pqifiler::handleFileNotOnline()"); + /* flag recvFile item as not Online */ + PQFileStatus *s = findRecvFileItem(in); + if ((!s) || (s -> status & PQIFILE_FAIL)) + { + return 0; + } + + s -> status = PQIFILE_NOT_ONLINE; + + return 1; +} + + +int pqifiler::handleFileNotAvailable(PQFileItem *in) +{ + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, + "pqifiler::handleFileNotAvailable()"); + /* error - flag recvFile item with FAILED */ + PQFileStatus *s = findRecvFileItem(in); + if (!s) + { + return 0; + } + + s->status = (PQIFILE_FAIL | PQIFILE_FAIL_NOT_AVAIL); + return 1; +} + + +int pqifiler::handleFileData(PQFileItem *in) +{ + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, + "pqifiler::handleFileData()"); + /* find the right PQFileStatus */ + PQFileStatus *recv = findRecvFileItem(in); + if (!recv) + { + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, + "pqifiler::handleFileData() no matching PQFileStatus (current download)"); + return 0; + } + + if(recv->status & PQIFILE_FAIL) + { + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, + "pqifiler::handleFileData() marked as FAIL"); + return 0; + } + + PQFileData *dta; + if (NULL == (dta = dynamic_cast(in))) + { + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, + "pqifiler::handleFileData() not PQFileData"); + return 0; + } + + /* first check the cid matches, so we can get it right for later */ + if (0 != pqicid_cmp(&(in->cid), &(recv->fileItem->cid))) + { + /* not matched */ + pqioutput(PQL_WARNING, pqifilerzone, + "pqifiler::handleFileData() correcting fileItem->cid"); + pqicid_copy(&(in->cid), &(recv->fileItem->cid)); + + std::ostringstream out; + out << "pqifiler::handleFileData() in->cid != recv->fileItem->cid"; + out << std::endl; + out << "in -> CID [" << in->cid.route[0]; + for(int i = 0; i < 10; i++) + { + out << ":" << in->cid.route[i]; + } + out << "]" << std::endl; + + out << "recv -> CID [" << recv->fileItem->cid.route[0]; + for(int i = 0; i < 10; i++) + { + out << ":" << recv->fileItem->cid.route[i]; + } + out << "]" << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqifilerzone,out.str()); + } + + + /* add to file */ + addFileData(recv, dta->fileoffset, dta->data, dta->datalen); + + if (recv->status == PQIFILE_NOT_ONLINE) + { + /* switch to active */ + recv->status = PQIFILE_DOWNLOADING; + } + + /* if we have recieved all data - request some more */ + if ((recv->recv_size == recv->req_loc + recv->req_size) && + (recv->status != PQIFILE_COMPLETE)) + { + requestData(recv); + } + return 1; +} + +int pqifiler::handleFileRequest(PQFileItem *in) +{ + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, + "pqifiler::handleFileRequest()"); + /* see if in cache */ + /* if yes send out chunk */ + if (handleFileCacheRequest(in)) + { + return 1; + } + + /* if not in cache - find file */ + PQFileStatus *new_file = createFileCache(in); + if (!new_file) + { + /* bad file */ + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, + "pqifiler::handleFileRequest() Failed to Load File-sendNotAvail"); + return sendFileNotAvail(in); + } + + fileCache.push_back(new_file); + + return handleFileCacheRequest(in); +} + +int pqifiler::handleFileCacheRequest(PQFileItem *req) +{ + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, + "pqifiler::handleFileCacheRequest()"); + /* check if in cache */ + bool found = false; + PQFileStatus *s; + std::list::iterator it; + for(it = fileCache.begin(); (!found) && (it != fileCache.end()); it++) + { + if ((req->name==(*it)->fileItem->name) && + (req->hash==(*it)->fileItem->hash)) + { + found = true; + s = (*it); + } + } + if (!found) + return 0; + + /* push to out queue */ + return generateFileData(s, req); +} + +/************* Outgoing FileItems ****************************** + * + * PQFileItem *pqifiler::sendPQFileItem() + * + * * Worker Fns. + * int pqifiler::tick(); + * void pqifiler::queryInactive() + * + */ + + +int pqifiler::tick() +{ + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, + "pqifiler::tick()"); + /* check the status of recved files */ + queryInactive(); + + /* this doesn't matter much how often it's ticked... + * if it generates Items, they will be detected other places. + * so we can return 0 (waiting) + */ + return 0; +} + + +void pqifiler::queryInactive() +{ + std::ostringstream out; + + out << "pqifiler::queryInactive()"; + out << std::endl; + + + + /* iterate through all files to recv */ + int ts = time(NULL); + std::list::iterator it; + for(it = recvFiles.begin(); it != recvFiles.end(); it++) + { + /* get inactive period */ + switch((*it) -> status) + { + case PQIFILE_NOT_ONLINE: + out << "File: " << (*it)->fileItem->name << " Not Online: "; + out << "Delta: " << (ts - (*it)->lastTS) << std::endl; + out << " LDelta: " << (*it)->lastDelta; + out << " Recved: " << (*it)->recv_size; + out << " Total: " << (*it)->total_size; + out << " LChunk: " << (*it)->req_size; + out << std::endl; + + if (ts - ((*it)->lastTS) > PQIFILE_OFFLINE_CHECK) + { + resetFileTransfer(*it); + requestData(*it); + } + break; + case PQIFILE_DOWNLOADING: + out << "File: " << (*it)->fileItem->name << " Downloading: "; + out << " Delta: " << (ts - (*it)->lastTS) << std::endl; + out << " LDelta: " << (*it)->lastDelta; + out << " Recved: " << (*it)->recv_size; + out << " Total: " << (*it)->total_size; + out << " LChunk: " << (*it)->req_size; + out << std::endl; + + if (ts - ((*it)->lastTS) > PQIFILE_DOWNLOAD_CHECK) + { + requestData(*it); /* give it a push */ + } + break; + default: + out << "File: " << (*it)->fileItem->name << " Other mode: " << (*it)->status; + out << " Delta: " << (ts - (*it)->lastTS) << std::endl; + out << " LDelta: " << (*it)->lastDelta; + out << " Recved: " << (*it)->recv_size; + out << " Total: " << (*it)->total_size; + out << " LChunk: " << (*it)->req_size; + out << std::endl; + /* nothing */ + break; + } + } + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, out.str()); +} + + +int pqifiler::requestData(PQFileStatus *item) +{ + + /* formulate a request for the next desired data chunk */ + /* this handles the key throttling. This algorithm can + * be quite crude, as the tcp / and pqistreamer throttle as + * well. + */ + + std::ostringstream out; + out << "pqifiler::requestData()" << std::endl; + + /* get the time since last request */ + int tm = time(NULL); + float delta = tm - item -> lastTS; + + + + + /* decide on transfer mode */ + float max_rate; + switch(item->mode) + { + case TRANSFER_MODE_TRICKLE: + max_rate = TRANSFER_MODE_TRICKLE_RATE; + break; + case TRANSFER_MODE_NORMAL: + max_rate = TRANSFER_MODE_NORMAL_RATE; + break; + case TRANSFER_MODE_FAST: + max_rate = TRANSFER_MODE_FAST_RATE; + break; + default: + max_rate = TRANSFER_MODE_NORMAL_RATE; + break; + } + out << "max rate: " << max_rate; + out << std::endl; + + /* not finished */ + if (item->recv_size < item->req_loc + item->req_size) + { + if (delta > PQIFILE_DOWNLOAD_TIMEOUT) + { + /* we have timed out ... switch to + * offline + */ + /* start again slowly */ + item->req_size = (int) (0.1 * max_rate); + out << "Timeout: switching to Offline."; + out << std::endl; + item->status = PQIFILE_NOT_ONLINE; + } + else + { + out << "Pause: Not Finished"; + out << std::endl; + /* pause */ + } + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, out.str()); + return 0; + } + + + if (delta <= PQIFILE_DOWNLOAD_MIN_DELTA) + { + /* pause */ + out << "Small Delta -> Pause"; + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, out.str()); + return 0; + } + + /* From this point - we will continue ... so handle rate now! */ + /* calc rate */ + float bytes_psec = item -> req_size / delta; + item -> rate = 0.9 * item -> rate + 0.1 * bytes_psec; + out << "delta: " << delta << " bytes: " << bytes_psec << " rate: " << item -> rate; + out << std::endl; + + if (item->lastDelta <= PQIFILE_DOWNLOAD_TOO_FAST) + { + /* increase 0.75 of the calculated extra that could be transmitted + * in the timeframe + */ + + float data_tf = item -> req_size; + float ldelta_f = item->lastDelta + 0.5; // 0.5 for extra space (+ dont / 0.0) + float tf_p_sec = data_tf / ldelta_f; + float extra_tf = tf_p_sec * (PQIFILE_DOWNLOAD_CHECK - ldelta_f); + + item -> req_size = item->req_size + (int) (0.75 * extra_tf); + + if (item->req_size > max_rate * PQIFILE_DOWNLOAD_CHECK) + item->req_size = (int) (max_rate * PQIFILE_DOWNLOAD_CHECK); + + out << "Small Delta: " << ldelta_f << " (sec), rate: " << tf_p_sec; + out << std::endl; + out << "Small Delta Incrementing req_size from: " << data_tf; + out << " to :" << item->req_size; + out << std::endl; + + } + else if (item->lastDelta > PQIFILE_DOWNLOAD_TOO_SLOW) + { + /* similarly decrease rate by 1.5 of extra time */ + + float data_tf = item -> req_size; + float ldelta_f = item->lastDelta + 0.5; // 0.5 for extra space (+ dont / 0.0) + float tf_p_sec = data_tf / ldelta_f; + float extra_tf = tf_p_sec * (ldelta_f - PQIFILE_DOWNLOAD_CHECK); + + item -> req_size -= (int) (1.25 * extra_tf); + + out << "Long Delta: " << ldelta_f << " (sec), rate: " << tf_p_sec; + out << std::endl; + out << "Long Delta Decrementing req_size from: " << data_tf; + out << " to :" << item->req_size; + out << std::endl; + } + + /* make the packet */ + + item->req_loc = item->recv_size; + /* req_size already calculated (unless NULL) */ + if (item->req_size < TRANSFER_START_MIN) + { + /* start again slowly + * added an extra limiter. */ + item->req_size = (int) (0.01 * max_rate); + if (item->req_size < TRANSFER_START_MIN) + { + item->req_size = TRANSFER_START_MIN; + } + else if (item->req_size > TRANSFER_START_MAX) + { + item->req_size = TRANSFER_START_MAX; + } + } + + out << "Making Packet: offset: " << item->req_loc << " size: " << item->req_size; + out << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, out.str()); + + PQFileItem *req = generatePQFileRequest(item); + out_queue.push_back(req); + + return 1; +} + +/************* PQIFILEITEM Generator *************************** + * + * PQFileItem *pqifiler::generatePQFileRequest(PQFileStatus *s); + * int pqifiler::generateFileData(PQFileStatus *s, PQFileItem *req); + * int pqifiler::sendFileNotAvail(PQFileItem *req) + * + */ + + +int pqifiler::generateFileData(PQFileStatus *s, PQFileItem *req) +{ + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, + "pqifiler::generateFileData()"); + + if ((!s) || (!s->fd) || (s->status & PQIFILE_FAIL)) + { + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, + "pqifiler::generateFileData() Bad Status"); + if (!s) + { + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, + "pqifiler::generateFileData() Bad Status (!s)"); + } + if (!s->fd) + { + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, + "pqifiler::generateFileData() Bad Status (!s->fd)"); + } + if (s->status & PQIFILE_FAIL) + { + std::ostringstream out; + out << "pqifiler::generateFileData() Bad Status (s->status): " << s->status; + pqioutput(PQL_DEBUG_BASIC, pqifilerzone,out.str()); + } + + /* return an error */ + return sendFileNotAvail(req); + } + + /* make the packets */ + int tosend = req -> chunksize; + long base_loc = req -> fileoffset; + + if (base_loc + tosend > s -> total_size) + { + tosend = s -> total_size - base_loc; + } + + { + std::ostringstream out; + out << "pqifiler::generateFileData() Sending " << tosend; + out << " bytes from offset: " << base_loc << std::endl; + out << "\tFrom File:" << req -> name; + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, out.str()); + } + + + while(tosend > 0) + { + int pktsize = 5 * 1024; + if (pktsize > tosend) + pktsize = tosend; + + /* seek for base_loc */ + fseek(s->fd, base_loc, SEEK_SET); + + // make a FileData type. + PQFileData *fd = new PQFileData(); + + // Copy details from the Request. + fd -> PQFileItem::copy(req); + + // PQItem + fd -> sid = req -> sid; + fd -> type = PQI_ITEM_TYPE_FILEITEM; + fd -> subtype = PQI_FI_SUBTYPE_DATA; + + // PQFileITem + fd -> size = s->fileItem->size; // total size of file. + fd -> fileoffset = base_loc; + fd -> chunksize = pktsize; + + // data + fd -> datalen = pktsize; + fd -> data = malloc(fd -> datalen); + fd -> fileflags = 0; + { + std::ostringstream out; + out << "pqifiler::generateFileData() pkt:" << std::endl; + //fd -> print(out); + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, out.str()); + } + + /* read the data */ + if (1 != fread(fd -> data, fd -> datalen, 1, s->fd)) + { + std::ostringstream out; + + out << "pqifiler::generateFileData() Read only: "; + out << fd->datalen << "/" << pktsize << " bytes of data - Discarding"; + + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, out.str()); + + //free(fd->data); + //fd->data = NULL; + delete fd; + return 0; + } + + /* decrement sizes */ + base_loc += pktsize; + tosend -= pktsize; + + /* send off the packet */ + out_queue.push_back(fd); + } + return 1; +} + + +PQFileItem *pqifiler::generatePQFileRequest(PQFileStatus *s) +{ + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, + "pqifiler::generatePQFileRequest()"); + + PQFileItem *fi = s->fileItem->clone(); + + /* set req_loc, and req_size */ + + // PQItem + fi -> sid = getPQIsearchId(); + fi -> type = PQI_ITEM_TYPE_FILEITEM; + fi -> subtype = PQI_FI_SUBTYPE_REQUEST; + + // PQFileITem + fi -> size = s->fileItem->size; // total size of file. + fi -> fileoffset = s->req_loc; + fi -> chunksize = s->req_size; + + std::ostringstream out; + + out << "pqifiler::generatePQFileRequest() for: " << s->fileItem->name << std::endl; + out << "pqifiler::generatePQFileRequest() offset: " << fi->fileoffset << " chunksize: "; + out << fi->chunksize << std::endl; + + //out << "s->fileItem:" << std::endl; + //s->fileItem->print(out); + //out << "DataRequest:" << std::endl; + //fi->print(out); + + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, out.str()); + + // timestamp request. + s->lastTS = time(NULL); + + return fi; +} + +int pqifiler::sendFileNotAvail(PQFileItem *req) +{ + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, + "pqifiler::sendFileNotAvail()"); + PQFileItem *fi = req -> clone(); + + /* set error code */ + fi -> subtype = PQI_FI_SUBTYPE_ERROR; + fi -> fileoffset = (PQIFILE_FAIL | PQIFILE_FAIL_NOT_AVAIL); + + /* send out */ + out_queue.push_back(fi); + return 1; +} + + +/************* FILE DATA HANDLING ****************************** + * + * std::string pqifiler::determineFilePath(PQFileItem *item); + * int pqifiler::initiateFileTransfer(PQFileStatus *s); + * int pqifiler::resetFileTransfer(PQFileStatus *s); + * int pqifiler::addFileData(PQFileStatus *s, long idx, void *data, int size); + * + */ + +std::string pqifiler::determineFilePath(PQFileItem *item) +{ + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, + "pqifiler::determineFilePath()"); + + /* get the download path */ + // savePath = "."; + std::string filePath = savePath; + filePath += "/"; + filePath += item->name; + return filePath; +} + +int pqifiler::initiateFileTransfer(PQFileStatus *s) +{ + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, + "pqifiler::initiateFileTransfer()"); + + /* check if the file exists */ + if (s->file_name.length() < 1) + { + s->file_name = determineFilePath(s->fileItem); + } + + { + std::ostringstream out; + out << "pqifiler::initiateFileTransfer() Filename: "; + out << s->file_name; + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, out.str()); + } + + /* attempt to open file */ + FILE *fd = fopen(s->file_name.c_str(), "r+b"); + if (!fd) + { + { + std::ostringstream out; + out << "pqifiler::initiateFileTransfer() Failed to open: "; + out << s->file_name << " Error:" << errno; + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, out.str()); + } + + /* open in writing mode */ + fd = fopen(s->file_name.c_str(), "w+b"); + if (!fd) + { + std::ostringstream out; + out << "pqifiler::initiateFileTransfer() Failed to open: "; + out << s->file_name << " Error:" << errno; + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, out.str()); + + /* failed to open the file */ + s->status = (PQIFILE_FAIL | PQIFILE_FAIL_NOT_OPEN); + return 0; + } + + } + + + /* if it opened, find it's length */ + /* move to the end */ + if (0 != fseek(fd, 0L, SEEK_END)) + { + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, + "pqifiler::initiateFileTransfer() Seek Failed"); + s->status = (PQIFILE_FAIL | PQIFILE_FAIL_NOT_SEEK); + return 0; + } + + s->recv_size = ftell(fd); /* get the file length */ + s->total_size = s->fileItem->size; /* save the total length */ + s->fd = fd; + + resetFileTransfer(s); + return 1; +} + + +int pqifiler::resetFileTransfer(PQFileStatus *state) +{ + // reset all the basic items ... so the transfer will continue. + state->req_loc = 0; + state->req_size = 0; + state->lastTS = 0; + state->lastDelta = 0; + state->status = PQIFILE_NOT_ONLINE; + state->mode = TRANSFER_MODE_NORMAL; + state->rate = 0; + if (state->recv_size == state->total_size) + { + state->status = PQIFILE_COMPLETE; + } + + return 1; +} + + + +int pqifiler::addFileData(PQFileStatus *s, long idx, void *data, int size) +{ + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, + "pqifiler::addFileData()"); + + /* check the status */ + if ((!s) || (!s->fd) || (s->status & PQIFILE_FAIL)) + { + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, + "pqifiler::addFileData() Bad Status"); + return 0; + } + + /* check its at the correct location */ + if ((idx != s->recv_size) || (s->recv_size + size > s->total_size)) + { + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, + "pqifiler::addFileData() Bad Data Location"); + return 0; + } + + /* go to the end of the file */ + if (0 != fseek(s->fd, 0L, SEEK_END)) + { + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, + "pqifiler::addFileData() Bad fseek"); + s->status = (PQIFILE_FAIL | PQIFILE_FAIL_NOT_SEEK); + return 0; + } + + /* add the data */ + if (1 != fwrite(data, size, 1, s->fd)) + { + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, + "pqifiler::addFileData() Bad fwrite"); + s->status = (PQIFILE_FAIL | PQIFILE_FAIL_NOT_WRITE); + return 0; + } + + s->recv_size += size; + + + /* if we've completed the request this time */ + if (s->req_loc + s->req_size == s->recv_size) + { + s->lastDelta = time(NULL) - s->lastTS; + } + + if (s->recv_size == s->total_size) + { + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, + "pqifiler::addFileData() File Complete!"); + s->status = PQIFILE_COMPLETE; + fclose(s->fd); + // re-open in read mode (for transfers?) + s->fd = fopen(s->file_name.c_str(), "r+b"); + } + + return 1; +} + + +PQFileStatus *pqifiler::createFileCache(PQFileItem *in) +{ + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, + "pqifiler::createFileCache()"); + + PQFileStatus *s = new PQFileStatus(in->clone()); + + /* request from fileindex */ + bool found = false; + + /* so here we will work with + */ + +#ifdef USE_FILELOOK + PQFileItem *real = fileIndex -> findFileEntry(in); + if (real) + { + s->file_name = real -> path + "/" + real -> name; + found = true; + } + +#else /*************************************************************************/ + std::list flist = fileIndex -> findfilename(in->name); + std::list::iterator it; + for(it = flist.begin(); (!found) && (it != flist.end()); it++) + { + if (in -> size == (*it) -> len) + { + found = true; + s->file_name = (*it) -> path; + } + } +#endif + + if ((!found) || (s->file_name.length() < 1)) + { + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, + "pqifiler::createFileCache() Failed to Find File"); + /* failed to open the file */ + s->status = (PQIFILE_FAIL | PQIFILE_FAIL_BAD_PATH); + delete s; + return NULL; + } + + + /* attempt to open file (readonly) */ + FILE *fd = fopen(s->file_name.c_str(), "rb"); + if (!fd) + { + std::stringstream out; + out << "pqifiler::createFileCache() Failed to Open the File" << std::endl; + out << "\tFull Path:" << s->file_name.c_str() << std::endl; + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, out.str()); + /* failed to open the file */ + s->status = (PQIFILE_FAIL | PQIFILE_FAIL_NOT_OPEN); + delete s; + return NULL; + } + + /* if it opened, find it's length */ + /* move to the end */ + if (0 != fseek(fd, 0L, SEEK_END)) + { + pqioutput(PQL_DEBUG_BASIC, pqifilerzone, + "pqifiler::createFileCache() Fseek Failed"); + + s->status = (PQIFILE_FAIL | PQIFILE_FAIL_NOT_OPEN); + delete s; + return NULL; + } + + s->recv_size = ftell(fd); /* get the file length */ + s->total_size = s->fileItem->size; /* save the total length */ + s->req_loc = 0; /* no request */ + s->req_size = 0; + + /* we are now ready for transfers */ + s->fd = fd; + s->lastTS = 0; + s->status = PQIFILE_DOWNLOADING; + return s; +} diff --git a/libretroshare/src/server/pqifiler.h b/libretroshare/src/server/pqifiler.h new file mode 100644 index 000000000..7f6169a2b --- /dev/null +++ b/libretroshare/src/server/pqifiler.h @@ -0,0 +1,187 @@ +/* + * "$Id: pqifiler.h,v 1.5 2007-02-19 20:08:30 rmf24 Exp $" + * + * Other Bits for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + +#ifndef MRK_PQI_FILER_HEADER +#define MRK_PQI_FILER_HEADER + +/* + * PQI Filer + * + * This managers the file transfers. + * + */ + +#include "pqi/pqi.h" +#include "dbase/filelook.h" +#include "dbase/filedex.h" +#include +#include +#include + +const int PQIFILE_INIT = 0x0000; +const int PQIFILE_NOT_ONLINE = 0x0001; +const int PQIFILE_DOWNLOADING = 0x0002; +const int PQIFILE_COMPLETE = 0x0004; +const int PQIFILE_FAIL = 0x0010; +/* reasons for DOWNLOAD FAILURE (2nd byte) */ +const int PQIFILE_FAIL_CANCEL = 0x0100; +const int PQIFILE_FAIL_NOT_AVAIL = 0x0200; +const int PQIFILE_FAIL_NOT_OPEN = 0x0400; +const int PQIFILE_FAIL_NOT_SEEK = 0x0800; +const int PQIFILE_FAIL_NOT_WRITE = 0x1000; +const int PQIFILE_FAIL_NOT_READ = 0x2000; +const int PQIFILE_FAIL_BAD_PATH = 0x4000; + + +const int TRANSFER_MODE_TRICKLE = 1; +const int TRANSFER_MODE_NORMAL = 2; +const int TRANSFER_MODE_FAST = 3; + +class PQFileStatus +{ +public: + PQFileStatus(PQFileItem *in) + :fileItem(in), status(PQIFILE_INIT), fd(NULL), + total_size(0), recv_size(0), + req_loc(0), req_size(0), lastTS(0) + { + return; + } + + ~PQFileStatus() + { + if (fileItem) + delete fileItem; + if (fd) + fclose(fd); + } + + +/* data */ + PQFileItem *fileItem; + /* transfer inprogress or not */ + int status; + int mode; + float rate; + + std::string file_name; + FILE *fd; + long total_size; + /* this is the simplistic case where only inorder data + * otherwise - need much more status info */ + long recv_size; + + /* current file data request */ + long req_loc; + int req_size; + + /* timestamp */ + long lastTS; + int lastDelta; /* send til all recved */ +}; + + +class pqifiler +{ +public: + +#ifdef USE_FILELOOK + pqifiler(fileLook*); +#else + pqifiler(filedex*); +#endif + +virtual ~pqifiler() { return; } + +/******************* GUI Interface ************************* + */ + +int getFile(PQFileItem *in); +int cancelFile(PQFileItem *i); +int clearFailedTransfers(); + + +int tick(); +std::list getStatus(); + +/************* Network Interface**************************** + */ + +PQItem * sendPQFileItem(); +int recvPQFileItem(PQItem *in); + +void setSavePath(std::string s) { savePath = s;} + +private: + +PQFileStatus *findRecvFileItem(PQFileItem *in); +void queryInactive(); + +int handleFileError(PQFileItem *in); +int handleFileNotOnline(PQFileItem *in); +int handleFileNotAvailable(PQFileItem *in); +int handleFileData(PQFileItem *in); +int handleFileRequest(PQFileItem *in); +int handleFileCacheRequest(PQFileItem *req); + + +int requestData(PQFileStatus *item); + +/************* PQIFILEITEM Generator *************************** + */ + +PQFileStatus * createFileCache(PQFileItem *in); +PQFileItem * generatePQFileRequest(PQFileStatus *); +int generateFileData(PQFileStatus *s, PQFileItem *req); +int sendFileNotAvail(PQFileItem *req); + +/************* FILE DATA HANDLING ****************************** + */ + +std::string determineFilePath(PQFileItem *item); +int initiateFileTransfer(PQFileStatus *s); +int resetFileTransfer(PQFileStatus *s); +int addFileData(PQFileStatus *s, long idx, void *data, int size); + + // Data. +private: + std::list recvFiles; + std::list fileCache; + std::list out_queue; + +#ifdef USE_FILELOOK + fileLook *fileIndex; +#else + filedex *fileIndex; +#endif + + std::string savePath; +}; + + + +#endif // MRK_PQI_FILER_HEADER diff --git a/libretroshare/src/tcponudp/Makefile b/libretroshare/src/tcponudp/Makefile new file mode 100644 index 000000000..6f6a63cf8 --- /dev/null +++ b/libretroshare/src/tcponudp/Makefile @@ -0,0 +1,60 @@ + +RS_TOP_DIR=.. + +include $(RS_TOP_DIR)/make.opt + +EXECS = librs udp_server test_tou pair_tou reset_tou internal_tou largefile_tou + +OBJ = tcpstream.o tcppacket.o udplayer.o tou_net.o tou.o + +all : $(OBJ) $(EXECS) + +.cc.o: + $(CC) $(CFLAGS) -c $< + +udp_server: $(OBJ) udp_server.o + $(CC) $(CFLAGS) -o udp_server $(OBJ) udp_server.o $(LIBS) + +clean: + -$(RM) $(OBJ) $(BIOOBJ) test_tou.o pair_tou.o udp_server.o reset_tou.o internal_tou.o largefile_tou.o + +clobber: clean + -$(RM) udp_server test_tou pair_tou reset_tou internal_tou largefile_tou libtou.so ../lib/libtou.a + +test_tou : $(OBJ) test_tou.o + $(CC) $(CFLAGS) -o test_tou $(OBJ) test_tou.o $(LIBS) + +pair_tou : $(OBJ) pair_tou.o + $(CC) $(CFLAGS) -o pair_tou $(OBJ) pair_tou.o $(LIBS) + +reset_tou : $(OBJ) reset_tou.o + $(CC) $(CFLAGS) -o reset_tou $(OBJ) reset_tou.o $(LIBS) + +internal_tou : $(OBJ) internal_tou.o + $(CC) $(CFLAGS) -o internal_tou $(OBJ) internal_tou.o $(LIBS) + +largefile_tou : $(OBJ) largefile_tou.o + $(CC) $(CFLAGS) -o largefile_tou $(OBJ) largefile_tou.o $(LIBS) + + + +# For BIO Compilation.... SSL Interface. +# + + +BIOOBJ = bss_tou.o +BIOCC = gcc +BIOCFLAGS = -I $(SSL_DIR)/include -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DOPENSSL_NO_KRB5 -DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -m486 -Wall -DSHA1_ASM -DMD5_ASM -DRMD160_ASM + + +libtou.a: $(BIOOBJ) $(OBJ) + ar rc ../lib/libtou.a $(BIOOBJ) $(OBJ) + +libtou.so: $(BIOOBJ) $(OBJ) + $(CC) -o libtou.so -shared $(BIOOBJ) $(OBJ) + +librs: $(BIOOBJ) $(OBJ) + ar r ../lib/libretroshare.a $(BIOOBJ) $(OBJ) + +.c.o: + $(BIOCC) $(BIOCFLAGS) -c $< diff --git a/libretroshare/src/tcponudp/bio_tou.h b/libretroshare/src/tcponudp/bio_tou.h new file mode 100644 index 000000000..cf02825e1 --- /dev/null +++ b/libretroshare/src/tcponudp/bio_tou.h @@ -0,0 +1,46 @@ +/* + * "$Id: bio_tou.h,v 1.2 2007-02-18 21:46:50 rmf24 Exp $" + * + * TCP-on-UDP (tou) network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + +#ifndef BIO_TCPONUDP_H +#define BIO_TCPONUDP_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +int BIO_tou_socket_should_retry(int s, int e); +int BIO_tou_socket_non_fatal_error(int error); + +#define BIO_TYPE_TOU_SOCKET (30|0x0400|0x0100) /* NEW rmfern type */ + +BIO_METHOD *BIO_s_tou_socket(void); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/libretroshare/src/tcponudp/bss_tou.c b/libretroshare/src/tcponudp/bss_tou.c new file mode 100644 index 000000000..f96abb19d --- /dev/null +++ b/libretroshare/src/tcponudp/bss_tou.c @@ -0,0 +1,392 @@ +/* + * bss_tou.c Based on bss_*.c from OpenSSL Library.... + * Therefore - released under their licence. + * Copyright 2004-2006 by Robert Fernie. (retroshare@lunamutt.com) + */ + +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef OPENSSL_NO_SOCK + +#include "bio_tou.h" + +// STUFF defined in the header....... +//int BIO_tou_socket_should_retry(int s, int e); +//int BIO_tou_socket_non_fatal_error(int error); +//#define BIO_TYPE_TOU_SOCKET (30|0x0400|0x0100) /* NEW rmfern type */ +//BIO_METHOD *BIO_s_tou_socket(void); + +#include +#include +#define USE_SOCKETS +//#include "cryptlib.h" +#include +#include /* for strlen() */ + + +static int tou_socket_write(BIO *h, const char *buf, int num); +static int tou_socket_read(BIO *h, char *buf, int size); +static int tou_socket_puts(BIO *h, const char *str); +static long tou_socket_ctrl(BIO *h, int cmd, long arg1, void *arg2); +static int tou_socket_new(BIO *h); +static int tou_socket_free(BIO *data); +static int get_last_tou_socket_error(int s); +static int clear_tou_socket_error(int s); + +#include "tou.h" + + + +static BIO_METHOD methods_tou_sockp= + { + BIO_TYPE_TOU_SOCKET, + "tou_socket", + tou_socket_write, + tou_socket_read, + tou_socket_puts, + NULL, /* tou_gets, */ + tou_socket_ctrl, + tou_socket_new, + tou_socket_free, + NULL, + }; + +BIO_METHOD *BIO_s_tou_socket(void) + { +#ifdef DEBUG_TOU_BIO + fprintf(stderr, "BIO_s_tou_socket(void)\n"); +#endif + return(&methods_tou_sockp); + } + +BIO *BIO_new_tou_socket(int fd, int close_flag) + { + BIO *ret; +#ifdef DEBUG_TOU_BIO + fprintf(stderr, "BIO_new_tou_socket(%d)\n", fd); +#endif + + ret=BIO_new(BIO_s_tou_socket()); + if (ret == NULL) return(NULL); + BIO_set_fd(ret,fd,close_flag); + return(ret); + } + +static int tou_socket_new(BIO *bi) + { +#ifdef DEBUG_TOU_BIO + fprintf(stderr, "tou_socket_new()\n"); +#endif + bi->init=0; + bi->num=0; + bi->ptr=NULL; + bi->flags=0; + return(1); + } + +static int tou_socket_free(BIO *a) + { +#ifdef DEBUG_TOU_BIO + fprintf(stderr, "tou_socket_free()\n"); +#endif + if (a == NULL) return(0); + if (a->shutdown) + { + if (a->init) + { + tou_close(a->num); + } + a->init=0; + a->flags=0; + } + return(1); + } + +static int tou_socket_read(BIO *b, char *out, int outl) + { + int ret=0; +#ifdef DEBUG_TOU_BIO + fprintf(stderr, "tou_socket_read(%p,%p,%d)\n",b,out,outl); +#endif + + if (out != NULL) + { + clear_tou_socket_error(b->num); + /* call tou library */ + ret=tou_read(b->num,out,outl); + BIO_clear_retry_flags(b); + if (ret <= 0) + { + if (BIO_tou_socket_should_retry(b->num, ret)) + BIO_set_retry_read(b); + } + } +#ifdef DEBUG_TOU_BIO + fprintf(stderr, "tou_socket_read() = %d\n", ret); +#endif + return(ret); + } + +static int tou_socket_write(BIO *b, const char *in, int inl) + { + int ret; +#ifdef DEBUG_TOU_BIO + fprintf(stderr, "tou_socket_write(%p,%p,%d)\n",b,in,inl); +#endif + + clear_tou_socket_error(b->num); + /* call tou library */ + ret=tou_write(b->num,in,inl); + BIO_clear_retry_flags(b); + if (ret <= 0) + { + if (BIO_tou_socket_should_retry(b->num,ret)) + { + BIO_set_retry_write(b); +#ifdef DEBUG_TOU_BIO + fprintf(stderr, "tou_socket_write() setting retry flag\n"); +#endif + } + } +#ifdef DEBUG_TOU_BIO + fprintf(stderr, "tou_socket_write() = %d\n", ret); +#endif + return(ret); + } + +static long tou_socket_ctrl(BIO *b, int cmd, long num, void *ptr) + { + long ret=1; + int *ip; +#ifdef DEBUG_TOU_BIO + fprintf(stderr, "tou_socket_ctrl(%p,%d,%ld)\n", b, cmd, num); +#endif + + switch (cmd) + { + case BIO_CTRL_RESET: + num=0; + case BIO_C_FILE_SEEK: + ret=0; + break; + case BIO_C_FILE_TELL: + case BIO_CTRL_INFO: + ret=0; + break; + case BIO_C_SET_FD: + tou_socket_free(b); + b->num= *((int *)ptr); + b->shutdown=(int)num; + b->init=1; + break; + case BIO_C_GET_FD: + if (b->init) + { + ip=(int *)ptr; + if (ip != NULL) *ip=b->num; + ret=b->num; + } + else + ret= -1; + break; + case BIO_CTRL_GET_CLOSE: + ret=b->shutdown; + break; + case BIO_CTRL_SET_CLOSE: + b->shutdown=(int)num; + break; + case BIO_CTRL_PENDING: + ret = tou_maxread(b->num); +#ifdef DEBUG_TOU_BIO + fprintf(stderr, "tou_pending = %ld\n", ret); +#endif + break; + case BIO_CTRL_WPENDING: + ret = tou_maxwrite(b->num); +#ifdef DEBUG_TOU_BIO + fprintf(stderr, "tou_wpending = %ld\n", ret); +#endif + break; + case BIO_CTRL_DUP: + case BIO_CTRL_FLUSH: + ret=1; + break; + default: + ret=0; + break; + } + return(ret); + } + +static int tou_socket_puts(BIO *bp, const char *str) + { + int n,ret; + +#ifdef DEBUG_TOU_BIO + fprintf(stderr, "tou_socket_puts()\n"); +#endif + + n=strlen(str); + ret=tou_socket_write(bp,str,n); + return(ret); + } + +static int clear_tou_socket_error(int fd) +{ +#ifdef DEBUG_TOU_BIO + fprintf(stderr, "clear_tou_socket_error()\n"); +#endif + return tou_clear_error(fd); +} + +static int get_last_tou_socket_error(int s) +{ +#ifdef DEBUG_TOU_BIO + fprintf(stderr, "get_last_tou_socket_error()\n"); +#endif + return tou_errno(s); +} + +int BIO_tou_socket_should_retry(int s, int i) + { + int err; +#ifdef DEBUG_TOU_BIO + fprintf(stderr, "BIO_tou_socket_should_retry()\n"); +#endif + + if ((i == 0) || (i == -1)) + { + err=get_last_tou_socket_error(s); + +#if defined(OPENSSL_SYS_WINDOWS) && 0 /* more microsoft stupidity? perhaps not? Ben 4/1/99 */ + if ((i == -1) && (err == 0)) + return(1); +#endif + + return(BIO_tou_socket_non_fatal_error(err)); + } + return(0); + } + +int BIO_tou_socket_non_fatal_error(int err) + { + switch (err) + { +#if defined(OPENSSL_SYS_WINDOWS) +# if defined(WSAEWOULDBLOCK) + case WSAEWOULDBLOCK: +# endif + +# if 0 /* This appears to always be an error */ +# if defined(WSAENOTCONN) + case WSAENOTCONN: +# endif +# endif +#endif + +#ifdef EWOULDBLOCK +# ifdef WSAEWOULDBLOCK +# if WSAEWOULDBLOCK != EWOULDBLOCK + case EWOULDBLOCK: +# endif +# else + case EWOULDBLOCK: +# endif +#endif + +#if defined(ENOTCONN) + case ENOTCONN: +#endif + +#ifdef EINTR + case EINTR: +#endif + +#ifdef EAGAIN +#if EWOULDBLOCK != EAGAIN + case EAGAIN: +# endif +#endif + +#ifdef EPROTO + case EPROTO: +#endif + +#ifdef EINPROGRESS + case EINPROGRESS: +#endif + +#ifdef EALREADY + case EALREADY: +#endif + + +#ifdef DEBUG_TOU_BIO + fprintf(stderr, "BIO_tou_socket_non_fatal_error(%d) = 1\n", err); +#endif + return(1); + /* break; */ + default: + break; + } +#ifdef DEBUG_TOU_BIO + fprintf(stderr, "BIO_tou_socket_non_fatal_error(%d) = 0\n", err); +#endif + return(0); + } +#endif diff --git a/libretroshare/src/tcponudp/internal_tou.cc b/libretroshare/src/tcponudp/internal_tou.cc new file mode 100644 index 000000000..353fecedc --- /dev/null +++ b/libretroshare/src/tcponudp/internal_tou.cc @@ -0,0 +1,632 @@ +/* + * "$Id: internal_tou.cc,v 1.2 2007-02-18 21:46:50 rmf24 Exp $" + * + * TCP-on-UDP (tou) network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + +/********************************************************** + * There appears (was) to be an elusive bug in the tou internals. + * most likely to be in the packing and unpacking of the + * data queues. + * + * This test is designed to load the queues up and then + * transfer the data, repeatly with different size packets. + * + * to do this effectively we need to access the TcpStream + * objects, instead of the tou.h interface. + * + */ + +#include + +// for printing sockaddr +#include "udplayer.h" +#include "tcpstream.h" + +#include "tou.h" +#include "tou_net.h" + +#include +#include +#include + + +/* This is a simple test to ensure that the tou behaviour + * is almost identical to a standard tcp socket. + * + * In this version we open 2 sockets, and attempt to + * communicate with ourselves.... + * + */ + +int setup_socket(struct sockaddr_in addr); +int connect_socket_pair(int fd1, int fd2, + struct sockaddr_in addr1, struct sockaddr_in addr2); +int send_data_via_pair(int sockfd1, int sockfd2, char *data, int size); + +void usage(char *name) +{ + std::cerr << "Usage: " << name; + std::cerr << " [-pco] "; + std::cerr << " "; + std::cerr << std::endl; + exit(1); + return; +} + +int main(int argc, char **argv) +{ + int c; + bool isProxy = false; + bool toConnect = false; + bool stayOpen = false; + int i,j; + + while(-1 != (c = getopt(argc, argv, "pco"))) + { + switch (c) + { + case 'p': + isProxy = true; + break; + case 'c': + toConnect = true; + break; + case 'o': + stayOpen = true; + break; + default: + usage(argv[0]); + break; + } + } + + if (argc-optind < 4) + { + usage(argv[0]); + return 1; + } + + // tounet_init(); + + + /* setup the local/remote addresses. + */ + struct sockaddr_in laddr; + struct sockaddr_in raddr; + + laddr.sin_family = AF_INET; + raddr.sin_family = AF_INET; + + if ((!tounet_inet_aton(argv[optind], &(laddr.sin_addr))) || + (!tounet_inet_aton(argv[optind+2], &(raddr.sin_addr)))) + { + std::cerr << "Invalid addresses!" << std::endl; + usage(argv[0]); + } + + unsigned short laddr_port = atoi(argv[optind+1]); + unsigned short raddr_port = atoi(argv[optind+3]); + + laddr.sin_port = htons(laddr_port); + raddr.sin_port = htons(raddr_port); + + /* so create the Udp/Tcp components */ + //UdpLayer udp1(laddr); + //UdpLayer udp2(raddr); + LossyUdpLayer udp1(laddr, 0.10); + LossyUdpLayer udp2(raddr, 0.10); + + /* check that they are okay */ + if ((!udp1.okay()) || (!udp2.okay())) + { + std::cerr << "Trouble opening udp ports!"; + std::cerr << std::endl; + return 1; + } + + TcpStream tcp1(&udp1); + TcpStream tcp2(&udp2); + + udp1.setRemoteAddr(raddr); + udp2.setRemoteAddr(laddr); + tcp1.connect(); // start the connection. + + /* now connect them */ + while ((!tcp1.isConnected()) || (!tcp2.isConnected())) + { + usleep(10000); /* 10 ms */ + tcp1.tick(); + tcp2.tick(); + } + + std::cerr << "Connection Established!" << std::endl; + + for(i = 0; i < 10; i++) + { + + int size = 1024000; + char rnddata1[size]; + char rnddata2[size]; + + for(j = 0; j < size; j++) + { + rnddata1[j] = (unsigned char) (255.0 * + rand() / (RAND_MAX + 1.0)); + + rnddata2[j] = (unsigned char) (255.0 * + rand() / (RAND_MAX + 1.0)); + } + + /* for each iteration, we want to + * (1) fill up the outgoing buffers with stuff + */ + + int sent1 = 0; + int sent2 = 0; + int fill1, fill2; + int MaxSend = 1000000; + + while((fill1 = tcp1.write_allowed()) && (sent1 < MaxSend)) + { + /* fill with a random little bit more */ + int psize = (int) ((i + 1.0) * 255.0 * + rand() / (RAND_MAX + 1.0)); + + /* don't overload */ + if (psize > fill1) + { + std::cerr << "LAST FILL1" << std::endl; + psize = fill1; + } + + int ret = tcp1.write(&(rnddata1[sent1]), psize); + + if (ret) + { + sent1 += ret; + std::cerr << "Filled tcp1 with " << ret << " more bytes, total:"; + std::cerr << sent1 << " was allowed: " << fill1; + std::cerr << std::endl; + } + + //tcp1.status(std::cerr); + + } + std::cerr << "Tcp1 full with " << sent1 << " bytes "; + std::cerr << std::endl; + + while((fill2 = tcp2.write_allowed()) && (sent2 < MaxSend)) + { + /* fill with a random little bit more */ + /* slightly larger sizes */ + int psize = (int) ((i + 1.0) * 1255.0 * + rand() / (RAND_MAX + 1.0)); + + /* don't overload */ + if (psize > fill2) + { + std::cerr << "LAST FILL2" << std::endl; + psize = fill2; + } + + int ret = tcp2.write(&(rnddata2[sent2]), psize); + + if (ret) + { + sent2 += ret; + std::cerr << "Filled tcp2 with " << ret << " more bytes, total:"; + std::cerr << sent2 << " was allowed: " << fill2; + std::cerr << std::endl; + } + + //tcp2.status(std::cerr); + + } + std::cerr << "Tcp2 full with " << sent2 << " bytes "; + std::cerr << std::endl; + + /* for every second iteration, fill up the read buffer before starting */ + if (i % 2 == 0) + { + for(j = 0; j < 100; j++) + { + tcp1.tick(); + tcp2.tick(); + } + } + + /* now we read/tick and empty */ + int read1 = 0; + int read2 = 0; + + while(read1 < sent2) + { + tcp1.tick(); + tcp2.tick(); + + /* fill with a random little bit more */ + /* This one has a small read, while tcp2 has a large read */ + int psize = (int) ((i + 1.0) * 100.0 * + rand() / (RAND_MAX + 1.0)); + + /* limit to what we have! */ + if (psize > sent2 - read1) + { + std::cerr << "LAST READ1" << std::endl; + psize = sent2 - read1; + } + + char rbuf[psize]; + int rsize = psize; + + int ret = tcp1.read(rbuf, rsize); + if (0 < ret) + { + /* check the data */ + for(j = 0; j < ret; j++) + { + if (rnddata2[read1 + j] != rbuf[j]) + { + std::cerr << "Error Data Mismatch @ read1:" << read1; + std::cerr << " + j:" << j << " rsize: " << rsize; + std::cerr << " Index: " << read1 + j; + std::cerr << std::endl; + + int badoffset = read1 + j; + for(int k = -10; k < 10; k++) + { + printf("Orig: %02x, Trans: %02x\n", + (unsigned char) rnddata2[badoffset+k], + (unsigned char) rbuf[j + k]); + } + + + exit(1); + } + } + read1 += ret; + } + else + { + std::cerr << "Read Error: " << ret << std::endl; + } + std::cerr << "Requested " << psize << ", got " << ret << " bytes" << std::endl; + std::cerr << "Read " << read1 << " of " << sent2 << " bytes" << std::endl; + } + + sleep(2); + + + while(read2 < sent1) + { + tcp1.tick(); + tcp2.tick(); + + /* fill with a random little bit more */ + int psize = (int) ((i + 1.0) * 10000.0 * + rand() / (RAND_MAX + 1.0)); + + /* limit to what we have! */ + if (psize > sent1 - read2) + { + std::cerr << "LAST READ2" << std::endl; + psize = sent1 - read2; + } + + char rbuf[psize]; + int rsize = psize; + + int ret = tcp2.read(rbuf, rsize); + if (0 < ret) + { + /* check the data */ + for(j = 0; j < ret; j++) + { + if (rnddata1[read2 + j] != rbuf[j]) + { + std::cerr << "Error Data Mismatch @ read2:" << read2; + std::cerr << " + j:" << j << " rsize: " << rsize; + std::cerr << " Index: " << read2 + j; + std::cerr << std::endl; + exit(1); + } + } + read2 += ret; + } + else + { + std::cerr << "Read Error: " << ret << std::endl; + } + std::cerr << "Requested " << psize << ", got " << ret << " bytes" << std::endl; + std::cerr << "Read " << read2 << " of " << sent1 << " bytes" << std::endl; + } + + std::cerr << "Iteration " << i + 1 << " finished correctly!" << std::endl; + sleep(5); + + } + return 1; +} + +int setup_socket(struct sockaddr_in addr) +{ + int sockfd = tou_socket(PF_INET, SOCK_STREAM, 0); + + if (sockfd <= 0) + { + std::cerr << "Failed to open socket!: "; + std::cerr << "Socket Error:" << tou_errno(sockfd) << std::endl; + return -1; + } + + std::cerr << "Socket Created: " << sockfd << std::endl; + + int err = tou_bind(sockfd, (struct sockaddr *) &addr, sizeof(addr)); + + if (err < 0) + { + std::cerr << "Error: Cannot bind socket: "; + std::cerr << err << std::endl; + return -1; + } + + std::cerr << "Socket1 Bound to: " << addr << std::endl; + return sockfd; +} + +int connect_socket_pair(int fd1, int fd2, + struct sockaddr_in addr1, struct sockaddr_in addr2) +{ + std::cerr << "Socket2 Listening " << std::endl; + /* listen */ + int err = tou_listenfor(fd2, (struct sockaddr *) &addr1, sizeof(addr1)); + int err_num; + + if (err < 0) + { + err_num = tou_errno(fd2); + if (err_num != EINPROGRESS) + { + std::cerr << "Cannot Listen!: " << err_num << std::endl; + return -1; + } + } + + + std::cerr << "Socket1 Connecting to: " << addr2 << std::endl; + err = tou_connect(fd1, (struct sockaddr *) &addr2, sizeof(addr2)); + if (err < 0) + { + err_num = tou_errno(fd1); + if (err_num != EINPROGRESS) + { + std::cerr << "Cannot Connect!: " << err_num << std::endl; + return -1; + } + } + + bool sock1Connected = false; + bool sock2Connected = false; + + while((!sock1Connected) || (!sock2Connected)) + { + sleep(1); + + /* sock1 */ + if((!sock1Connected) && (0 == (err = tou_connected(fd1)))) + { + std::cerr << "Waiting for Connect (Sock1)!" << std::endl; + } + + if ((!sock1Connected) && (err < 0)) + { + std::cerr << "Connect Failed" << std::endl; + return 1; + } + else if (!sock1Connected) + { + // else connected! + sock1Connected = true; + } + + /* accept - sock2 */ + struct sockaddr_in inaddr; + socklen_t addrlen = sizeof(inaddr); + int nsock = -1; + + if ((!sock2Connected) && (0 > (nsock = tou_accept(fd2, + (struct sockaddr *) &inaddr, &addrlen)))) + { + errno = tou_errno(fd2); + if (errno != EAGAIN) + { + std::cerr << "Cannot Connect!: " << errno << std::endl; + return 1; + } + else + { + std::cerr << "Waiting for Connect (Sock2)!" << std::endl; + } + } + else if (nsock > 0) + { + /* connected */ + sock2Connected = true; + fd2 = nsock; + std::cerr << "Socket Accepted from: " << inaddr << std::endl; + } + } + + std::cerr << "Socket Connected" << std::endl; + + return 1; +} + + +/* This transmits into sockfd1, and check to see that we recv + * it back from sockfd2 + */ + +int send_data_via_pair(int sockfd1, int sockfd2, char *data, int size) +{ + /* what we recvd */ + char *recvd = (char *) malloc(size * 2); + int recvdsize = 0; + int sent = 0; + int sendsize = 0; + + int ts_start = time(NULL); + + int minsends = 100; /* min of 100 sends to complete all data */ + /* ensure we don't end up sending nothing */ + if (minsends * 10 > size) + { + minsends = size / 10; + } + + bool doneWrite = false; + bool doneRead = false; + while((!doneWrite) || (!doneRead)) + { + /* have a little break */ + //usleep(10000); /* 0.01 sec */ + //usleep(250000); /* 0.25 sec */ + usleep(500000); /* 0.50 sec */ + /* decide how much to send */ + sendsize = (int) (((float) (size / minsends)) * + (rand() / (RAND_MAX + 1.0))); + + /* limit send */ + if (sent + sendsize > size) + { + sendsize = size - sent; + } + /* if we've finished */ + if (sent == size) + { + /* eof */ + std::cerr << "Write Done!" << std::endl; + doneWrite = true; + sendsize = 0; + } + + /* now we write */ + if ((sendsize > 0)&&(-1==tou_write(sockfd1,&(data[sent]),sendsize))) + { + std::cerr << "Write Error: " << tou_errno(sockfd1) << std::endl; + if (tou_errno(sockfd1) != EAGAIN) + { + std::cerr << "FATAL ERROR ending transfer" << std::endl; + doneRead = true; + doneWrite = true; + } + + } + else + { + sent += sendsize; + } + + int ret = 0; + int readsize = (int) (((float) (size / minsends)) * + (rand() / (RAND_MAX + 1.0))); + + if (readsize > size - recvdsize) + readsize = size - recvdsize; + + if (0 < (ret = tou_read(sockfd2, &(recvd[recvdsize]), readsize))) + { + std::cerr << "TF(" << ret << ")" << std::endl; + recvdsize += ret; + } + else if (ret == 0) + { + doneRead = true; + std::cerr << "Read Done! (ret:0)" << std::endl; + } + else + { + std::cerr << "Read Error: " << tou_errno(sockfd2) << std::endl; + std::cerr << "Read " << recvdsize << "/" << size; + std::cerr << " attempted: " << readsize << std::endl; + if (tou_errno(sockfd2) != EAGAIN) + { + std::cerr << "FATAL ERROR ending transfer" << std::endl; + doneRead = true; + doneWrite = true; + } + + } + + if (recvdsize == size) + { + doneRead = true; + std::cerr << "Read Done!" << std::endl; + } + + } + + /* we have transmitted it all, so + * check the data + */ + + int i; + int diffCount = 0; + for(i = 0; i < size; i++) + { + if (recvd[i] != data[i]) + { + diffCount++; + if (diffCount < 10) + { + std::cerr << "Error Byte:" << i << " is different"; + std::cerr << std::endl; + } + } + } + if (diffCount) + { + std::cerr << "Errors (" << diffCount << "/" << size << ") in tranmission ... Exiting!"; + std::cerr << std::endl; + exit(1); + } + + int ts_end = time(NULL); + double rough_rate = size / (double) (ts_end - ts_start); + + std::cerr << "Successful Data Tranmission: " << size << " in " << ts_end-ts_start << " secs"; + std::cerr << std::endl; + std::cerr << "Approximate Rate: " << rough_rate / 1000.0 << " kbytes/sec"; + std::cerr << std::endl; + + return 1; +} + + + + + + + + diff --git a/libretroshare/src/tcponudp/largefile_tou.cc b/libretroshare/src/tcponudp/largefile_tou.cc new file mode 100644 index 000000000..f80f4fbf3 --- /dev/null +++ b/libretroshare/src/tcponudp/largefile_tou.cc @@ -0,0 +1,502 @@ +/* + * "$Id: largefile_tou.cc,v 1.2 2007-02-18 21:46:50 rmf24 Exp $" + * + * TCP-on-UDP (tou) network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + + +/********************************************************** + * This test is designed to test large data blocks/files + * running to tou. Currently we see occasional errors + * every 1/2 -> 1 MB of transfer.... + * + * This test will continually fill the output buffer, + * and then empty the receive one. To ensure the + * whole system gets a good workout. + * + */ + +#include + +// for printing sockaddr +#include "udplayer.h" + +#include "tou.h" +#include "tou_net.h" + +#include +#include +#include + +int setup_socket(struct sockaddr_in addr); +int connect_socket_pair(int fd1, int fd2, + struct sockaddr_in addr1, struct sockaddr_in addr2); +int send_data_via_pair(int sockfd1, int sockfd2, char *data, int size); + +void usage(char *name) +{ + std::cerr << "Usage: " << name; + std::cerr << " [-pco] "; + std::cerr << " "; + std::cerr << std::endl; + exit(1); + return; +} + +int main(int argc, char **argv) +{ + int c; + bool isProxy = false; + bool toConnect = false; + bool stayOpen = false; + int i,j; + + while(-1 != (c = getopt(argc, argv, "pco"))) + { + switch (c) + { + case 'p': + isProxy = true; + break; + case 'c': + toConnect = true; + break; + case 'o': + stayOpen = true; + break; + default: + usage(argv[0]); + break; + } + } + + if (argc-optind < 4) + { + usage(argv[0]); + return 1; + } + + tounet_init(); + + + /* setup the local/remote addresses. + */ + struct sockaddr_in laddr; + struct sockaddr_in raddr; + + laddr.sin_family = AF_INET; + raddr.sin_family = AF_INET; + + if ((!tounet_inet_aton(argv[optind], &(laddr.sin_addr))) || + (!tounet_inet_aton(argv[optind+2], &(raddr.sin_addr)))) + { + std::cerr << "Invalid addresses!" << std::endl; + usage(argv[0]); + } + + unsigned short laddr_port = atoi(argv[optind+1]); + unsigned short raddr_port = atoi(argv[optind+3]); + + for(i = 0; i < 10; i++) + { + laddr.sin_port = htons(laddr_port); + raddr.sin_port = htons(raddr_port); + //laddr.sin_port = htons(laddr_port + i); + //raddr.sin_port = htons(raddr_port + i); + + std::cerr << "Interation: " << i << std::endl; + + + /* setup the sockets */ + int sockfd1 = setup_socket(laddr); + int sockfd2 = setup_socket(raddr); + + if ((sockfd1 < 0) || (sockfd2 < 0)) + { + std::cerr << "Failed to setup sockets!"; + std::cerr << std::endl; + return -1; + } + + std::cerr << "Local Address: " << laddr; + std::cerr << " fd: " << sockfd1 << std::endl; + std::cerr << "Remote Address: " << raddr; + std::cerr << " fd: " << sockfd2 << std::endl; + + /* connect */ + int err = connect_socket_pair(sockfd1, sockfd2, laddr, raddr); + if (err < 0) + { + std::cerr << "Failed to connect sockets!"; + std::cerr << std::endl; + return -1; + } + + /* send the data */ + int size = 3093237; + char rnddata[size]; + + int data_loops = (i+1) * (i+1); + for(int k = 0; k < data_loops; k++) + { + std::cerr << "Send Iteration: " << k+1 << " of " << data_loops << std::endl; + for(j = 0; j < size; j++) + { + rnddata[j] = (unsigned char) (255.0 * + rand() / (RAND_MAX + 1.0)); + } + send_data_via_pair(sockfd1, sockfd2, rnddata, size); + std::cerr << "Send Iteration: " << k+1 << " of " << data_loops << std::endl; + sleep(2); + } + + std::cerr << "Completed Successful transfer of " << size * data_loops << " bytes"; + std::cerr << std::endl; + + sleep(10); + std::cerr << "closing sockfd1: " << sockfd1 << std::endl; + tou_close(sockfd1); + + std::cerr << "closing sockfd2: " << sockfd2 << std::endl; + tou_close(sockfd2); + + + } + return 1; +} + +int setup_socket(struct sockaddr_in addr) +{ + int sockfd = tou_socket(PF_INET, SOCK_STREAM, 0); + + if (sockfd <= 0) + { + std::cerr << "Failed to open socket!: "; + std::cerr << "Socket Error:" << tou_errno(sockfd) << std::endl; + return -1; + } + + std::cerr << "Socket Created: " << sockfd << std::endl; + + int err = tou_bind(sockfd, (struct sockaddr *) &addr, sizeof(addr)); + + if (err < 0) + { + std::cerr << "Error: Cannot bind socket: "; + std::cerr << err << std::endl; + return -1; + } + + std::cerr << "Socket1 Bound to: " << addr << std::endl; + return sockfd; +} + +int connect_socket_pair(int fd1, int fd2, + struct sockaddr_in addr1, struct sockaddr_in addr2) +{ + std::cerr << "Socket2 Listening " << std::endl; + /* listen */ + int err = tou_listenfor(fd2, (struct sockaddr *) &addr1, sizeof(addr1)); + int err_num; + + if (err < 0) + { + err_num = tou_errno(fd2); + if (err_num != EINPROGRESS) + { + std::cerr << "Cannot Listen!: " << err_num << std::endl; + return -1; + } + } + + + std::cerr << "Socket1 Connecting to: " << addr2 << std::endl; + err = tou_connect(fd1, (struct sockaddr *) &addr2, sizeof(addr2)); + if (err < 0) + { + err_num = tou_errno(fd1); + if (err_num != EINPROGRESS) + { + std::cerr << "Cannot Connect!: " << err_num << std::endl; + return -1; + } + } + + bool sock1Connected = false; + bool sock2Connected = false; + + while((!sock1Connected) || (!sock2Connected)) + { + sleep(1); + + /* sock1 */ + if((!sock1Connected) && (0 == (err = tou_connected(fd1)))) + { + std::cerr << "Waiting for Connect (Sock1)!" << std::endl; + } + + if ((!sock1Connected) && (err < 0)) + { + std::cerr << "Connect Failed" << std::endl; + return 1; + } + else if (!sock1Connected) + { + // else connected! + sock1Connected = true; + } + + /* accept - sock2 */ + struct sockaddr_in inaddr; + socklen_t addrlen = sizeof(inaddr); + int nsock = -1; + + if ((!sock2Connected) && (0 > (nsock = tou_accept(fd2, + (struct sockaddr *) &inaddr, &addrlen)))) + { + errno = tou_errno(fd2); + if (errno != EAGAIN) + { + std::cerr << "Cannot Connect!: " << errno << std::endl; + return 1; + } + else + { + std::cerr << "Waiting for Connect (Sock2)!" << std::endl; + } + } + else if (nsock > 0) + { + /* connected */ + sock2Connected = true; + fd2 = nsock; + std::cerr << "Socket Accepted from: " << inaddr << std::endl; + } + } + + std::cerr << "Socket Connected" << std::endl; + + return 1; +} + + +/* This transmits into sockfd1, and check to see that we recv + * it back from sockfd2 + */ + +int send_data_via_pair(int sockfd1, int sockfd2, char *data, int size) +{ + /* what we recvd */ + char *recvd = (char *) malloc(size * 2); + int recvdsize = 0; + int sent = 0; + int sendsize = 0; + + int ts_start = time(NULL); + + int minsends = 100; /* min of 100 sends to complete all data */ + /* ensure we don't end up sending nothing */ + if (minsends * 10 > size) + { + minsends = size / 10; + } + + bool doneWrite = false; + bool doneRead = false; + + int maxtransfer = (int) (size / minsends) + (int) (((float) (size / minsends)) * + (rand() / (RAND_MAX + 1.0))); + /* allow the transfer ratio read/write to vary between 0.4->1,5. */ + double tf_ratio = 0.4 + 1.1 * (rand() / (RAND_MAX + 1.0)); + + while((!doneWrite) || (!doneRead)) + { + /* have a little break */ + //usleep(10000); /* 0.01 sec */ + usleep(20000); /* 0.02 sec */ + //usleep(250000); /* 0.25 sec */ + //usleep(500000); /* 0.50 sec */ + /* decide how much to send */ + sendsize = (int) (((float) (maxtransfer)) * + (rand() / (RAND_MAX + 1.0))); + + /* limit send */ + if (sent + sendsize > size) + { + std::cerr << "Last WRITE!" << std::endl; + sendsize = size - sent; + } + /* if we've finished */ + if (sent == size) + { + /* eof */ + std::cerr << "Write Done!" << std::endl; + doneWrite = true; + sendsize = 0; + } + + /* now we write */ + if ((sendsize > 0)&&(-1==tou_write(sockfd1,&(data[sent]),sendsize))) + { + std::cerr << "Write Error: " << tou_errno(sockfd1) << std::endl; + if (tou_errno(sockfd1) != EAGAIN) + { + std::cerr << "FATAL ERROR ending transfer" << std::endl; + doneRead = true; + doneWrite = true; + } + + } + else + { + sent += sendsize; + } + + int ret = 0; + + // read size about 1/4 of write to exercise the buffers. + int readsize = (int) (((float) (maxtransfer)) * tf_ratio * + (rand() / (RAND_MAX + 1.0))); + + if (readsize > size - recvdsize) + { + std::cerr << "Last READ!" << std::endl; + readsize = size - recvdsize; + } + + if (0 < (ret = tou_read(sockfd2, &(recvd[recvdsize]), readsize))) + { + std::cerr << "TF(" << ret << ")" << std::endl; + + /* check the data at this point */ + + int i; + int diffCount = 0; + int init_err = 0; + for(i = 0; i < ret; i++) + { + if (recvd[recvdsize + i] != data[recvdsize + i]) + { + if (!diffCount) + { + init_err = i; + } + diffCount++; + if (diffCount < 10) + { + std::cerr << "Error Byte:" << recvdsize + i << " is different"; + std::cerr << std::endl; + } + } + } + if (diffCount) + { + std::cerr << "Errors (" << diffCount << "/" << ret << ") in read, "; + std::cerr << std::endl; + std::cerr << " At Blk Start: " << recvdsize << " offset: " << init_err; + std::cerr << " ==> At index: " << recvdsize + init_err << "... Exiting!"; + std::cerr << std::endl; + exit(1); + } + else + { + std::cerr << "Checked (" << recvdsize << "+ 0 => " << ret << ") Okay" << std::endl; + } + + recvdsize += ret; + } + else if (ret == 0) + { + //doneRead = true; + std::cerr << "Read Done? (ret:0)" << std::endl; + } + else + { + std::cerr << "Read Error: " << tou_errno(sockfd2) << std::endl; + std::cerr << "Read " << recvdsize << "/" << size; + std::cerr << " attempted: " << readsize << std::endl; + if (tou_errno(sockfd2) != EAGAIN) + { + std::cerr << "FATAL ERROR ending transfer" << std::endl; + doneRead = true; + doneWrite = true; + } + + } + + if (recvdsize == size) + { + doneRead = true; + std::cerr << "Read Done!" << std::endl; + } + + } + + /* we have transmitted it all, so + * check the data + */ + + int i; + int diffCount = 0; + for(i = 0; i < size; i++) + { + if (recvd[i] != data[i]) + { + diffCount++; + if (diffCount < 10) + { + std::cerr << "Error Byte:" << i << " is different"; + std::cerr << std::endl; + } + } + } + if (diffCount) + { + std::cerr << "Errors (" << diffCount << "/" << size << ") in tranmission ... Exiting!"; + std::cerr << std::endl; + exit(1); + } + + int ts_end = time(NULL); + double rough_rate = size / (double) (ts_end - ts_start); + + std::cerr << "Successful Data Tranmission: " << size << " in " << ts_end-ts_start << " secs"; + std::cerr << std::endl; + std::cerr << "Approximate Rate: " << rough_rate / 1000.0 << " kbytes/sec"; + std::cerr << std::endl; + std::cerr << "Transfer Ratio: " << tf_ratio; + std::cerr << std::endl; + + free(recvd); + + return 1; +} + + + + + + + + diff --git a/libretroshare/src/tcponudp/pair_tou.cc b/libretroshare/src/tcponudp/pair_tou.cc new file mode 100644 index 000000000..abdc8a658 --- /dev/null +++ b/libretroshare/src/tcponudp/pair_tou.cc @@ -0,0 +1,491 @@ +/* + * "$Id: pair_tou.cc,v 1.3 2007-02-18 21:46:50 rmf24 Exp $" + * + * TCP-on-UDP (tou) network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 + +//#define USE_TCP_SOCKET + +// for printing sockaddr +#include "udplayer.h" + +#ifndef USE_TCP_SOCKET + #include "tou.h" +#endif + +#include "tou_net.h" + +#include +#include +#include + + +/* This is a simple test to ensure that the tou behaviour + * is almost identical to a standard tcp socket. + * + * In this version we open 2 sockets, and attempt to + * communicate with ourselves.... + * + */ + +int Check_Socket(int fd); + +void usage(char *name) +{ + std::cerr << "Usage: " << name; + std::cerr << " [-pco] "; + std::cerr << " "; + std::cerr << std::endl; + exit(1); + return; +} + +int main(int argc, char **argv) +{ + int c; + bool isProxy = false; + bool toConnect = false; + bool stayOpen = false; + + int totalwbytes = 0; + int totalrbytes = 0; + + while(-1 != (c = getopt(argc, argv, "pco"))) + { + switch (c) + { + case 'p': + isProxy = true; + break; + case 'c': + toConnect = true; + break; + case 'o': + stayOpen = true; + break; + default: + usage(argv[0]); + break; + } + } + + if (argc-optind < 4) + { + usage(argv[0]); + return 1; + } + + tounet_init(); + + /* setup the local/remote addresses. + */ + struct sockaddr_in laddr; + struct sockaddr_in raddr; + + laddr.sin_family = AF_INET; + raddr.sin_family = AF_INET; + + if ((!tounet_inet_aton(argv[optind], &(laddr.sin_addr))) || + (!tounet_inet_aton(argv[optind+2], &(raddr.sin_addr)))) + { + std::cerr << "Invalid addresses!" << std::endl; + usage(argv[0]); + } + + laddr.sin_port = htons(atoi(argv[optind+1])); + raddr.sin_port = htons(atoi(argv[optind+3])); + + std::cerr << "Local Address: " << laddr << std::endl; + std::cerr << "Remote Address: " << raddr << std::endl; + + +#ifdef USE_TCP_SOCKET + int sockfd = socket(PF_INET, SOCK_STREAM, 0); + int sockfd2 = socket(PF_INET, SOCK_STREAM, 0); +#else + int sockfd = tou_socket(PF_INET, SOCK_STREAM, 0); + int sockfd2 = tou_socket(PF_INET, SOCK_STREAM, 0); +#endif + if ((sockfd <= 0) || (sockfd2 <= 0)) + { + std::cerr << "Failed to open socket!: "; +#ifdef USE_TCP_SOCKET + std::cerr << "Socket Error:" << errno << std::endl; +#else + std::cerr << "Socket Error:" << tou_errno(sockfd) << std::endl; + std::cerr << "Socket Error:" << tou_errno(sockfd2) << std::endl; +#endif + return -1; + } + std::cerr << "Sockets Created: " << sockfd << " & " << sockfd2 << std::endl; + + + /* make nonblocking */ +#ifdef USE_TCP_SOCKET + int err = fcntl(sockfd,F_SETFD,O_NONBLOCK); + int err2 = fcntl(sockfd2,F_SETFD,O_NONBLOCK); +#else + int err = 0; + int err2 = 0; +#endif + if ((err < 0) || (err2 < 0)) + { + std::cerr << "Error: Cannot make socket NON-Blocking: "; + std::cerr << err << std::endl; + return -1; + } + + std::cerr << "Socket Non-Blocking" << std::endl; + +#ifdef USE_TCP_SOCKET + err = bind(sockfd, (struct sockaddr *) &laddr, sizeof(laddr)); + err2 = bind(sockfd2, (struct sockaddr *) &raddr, sizeof(raddr)); +#else + err = tou_bind(sockfd, (struct sockaddr *) &laddr, sizeof(laddr)); + err2 = tou_bind(sockfd2, (struct sockaddr *) &raddr, sizeof(raddr)); +#endif + if ((err < 0) || (err2 < 0)) + { + std::cerr << "Error: Cannot bind socket: "; + std::cerr << err << std::endl; + return -1; + } + + std::cerr << "Socket1 Bound to: " << laddr << std::endl; + std::cerr << "Socket2 Bound to: " << raddr << std::endl; + + // listening. + if (1) // socket2. + { + std::cerr << "Socket2 Listening " << std::endl; + /* listen */ +#ifdef USE_TCP_SOCKET + err = listen(sockfd2, 1); +#else + err = tou_listenfor(sockfd2, + (struct sockaddr *) &laddr, sizeof(laddr)); +#endif + } + + + if (1) // only one program. + { + std::cerr << "Socket1 Connecting to: " << raddr << std::endl; +#ifdef USE_TCP_SOCKET + err = connect(sockfd, (struct sockaddr *) &raddr, sizeof(raddr)); +#else + err = tou_connect(sockfd, (struct sockaddr *) &raddr, sizeof(raddr)); +#endif + if (err < 0) + { +#ifndef USE_TCP_SOCKET + errno = tou_errno(sockfd); +#endif + if (errno != EINPROGRESS) + { + std::cerr << "Cannot Connect!: " << errno << std::endl; + return 1; + } + } + } + + bool sock1Connected = false; + bool sock2Connected = false; + + while((!sock1Connected) || (!sock2Connected)) + { + sleep(1); + + + /* sock1 */ +#ifdef USE_TCP_SOCKET + if((!sock1Connected) && (0 == (err = Check_Socket(sockfd)))) +#else + if((!sock1Connected) && (0 == (err = tou_connected(sockfd)))) +#endif + { + std::cerr << "Waiting for Connect (Sock1)!" << std::endl; + } + if ((!sock1Connected) && (err < 0)) + { + std::cerr << "Connect Failed" << std::endl; + return 1; + } + else if (!sock1Connected) + { + // else connected! + sock1Connected = true; + } + + /* accept - sock2 */ + struct sockaddr_in inaddr; + socklen_t addrlen = sizeof(inaddr); + int nsock = -1; + +#ifdef USE_TCP_SOCKET + if ((!sock2Connected) && (0 > (nsock = accept(sockfd2, + (struct sockaddr *) &inaddr, &addrlen)))) +#else + if ((!sock2Connected) && (0 > (nsock = tou_accept(sockfd2, + (struct sockaddr *) &inaddr, &addrlen)))) +#endif + { +#ifndef USE_TCP_SOCKET + errno = tou_errno(sockfd2); +#endif + if (errno != EAGAIN) + { + std::cerr << "Cannot Connect!: " << errno << std::endl; + return 1; + } + else + { + std::cerr << "Waiting for Connect (Sock2)!" << std::endl; + } + } + else if (nsock > 0) + { + /* connected */ + sock2Connected = true; + sockfd2 = nsock; + std::cerr << "Socket Accepted from: " << inaddr << std::endl; + } + } + + std::cerr << "Socket Connected" << std::endl; + + /* send data */ + int bufsize = 1511; + char buffer[bufsize]; + char data[bufsize]; + int readsize = 0; + + tounet_fcntl(0, F_SETFL, O_NONBLOCK); + tounet_fcntl(1,F_SETFL,O_NONBLOCK); + + bool doneWrite = false; + bool doneRead = false; + bool blockread = false; + while((!doneWrite) || (!doneRead)) + { + /* read -> write_socket... */ + sleep(1); + if (blockread != true) + { + readsize = read(0, buffer, bufsize); + } + if (readsize == 0) + { + /* eof */ + doneWrite = true; + } + /* now we write */ +#ifdef USE_TCP_SOCKET + if ((readsize > 0) && (-1 == write(sockfd, buffer, readsize))) +#else + if ((readsize > 0) && (-1 == tou_write(sockfd, buffer, readsize))) +#endif + { + //std::cerr << "Blocked Write!" << std::endl; +#ifndef USE_TCP_SOCKET + //std::cerr << "Error: " << tou_errno(sockfd) << std::endl; +#endif + blockread = true; + } + else + { + blockread = false; + totalwbytes += readsize; + } + + int ret = 0; +#ifdef USE_TCP_SOCKET + if (0 < (ret = read(sockfd2, data, bufsize))) +#else + if (0 < (ret = tou_read(sockfd2, data, bufsize))) +#endif + + { + std::cerr << "TF(" << ret << ")" << std::endl; + write(1, data, ret); + totalrbytes += ret; + } + else if (ret == 0) + { + doneRead = true; + } + else + { + //std::cerr << "Blocked Read!" << std::endl; +#ifndef USE_TCP_SOCKET + //std::cerr << "Error: " << tou_errno(sockfd) << std::endl; +#endif + } + + + } + +#ifdef USE_TCP_SOCKET + close(sockfd); + close(sockfd2); +#else + /* this is blocking??? */ + tou_close(sockfd); + tou_close(sockfd2); +#endif + + std::cerr << "Transfer Complete: " << totalwbytes << " bytes"; + std::cerr << std::endl; + return 1; +} + +#ifdef USE_TCP_SOCKET + + +int Check_Socket(int fd) +{ + std::cerr << "Check_Socket()" << std::endl; + + std::cerr << "1) Checking with Select()" << std::endl; + + fd_set ReadFDs, WriteFDs, ExceptFDs; + FD_ZERO(&ReadFDs); + FD_ZERO(&WriteFDs); + FD_ZERO(&ExceptFDs); + + FD_SET(fd, &ReadFDs); + FD_SET(fd, &WriteFDs); + FD_SET(fd, &ExceptFDs); + + struct timeval timeout; + timeout.tv_sec = 0; + timeout.tv_usec = 0; + + int sr = 0; + if (0 > (sr = select(fd + 1, + &ReadFDs, &WriteFDs, &ExceptFDs, &timeout))) + { + std::cerr << "Check_Socket() Select ERROR: " << sr << std::endl; + return -1; + } + + if (FD_ISSET(fd, &ExceptFDs)) + { + std::cerr << "Check_Socket() Exception on socket!" << std::endl; + return -1; + } + + if (FD_ISSET(fd, &WriteFDs)) + { + std::cerr << "Check_Socket() Can Write!" << std::endl; + } + else + { + // not ready return 0; + std::cerr << "Check_Socket() Cannot Write!" << std::endl; + std::cerr << "Check_Socket() Socket Not Ready!" << std::endl; + return 0; + } + + if (FD_ISSET(fd, &ReadFDs)) + { + std::cerr << "Check_Socket() Can Read!" << std::endl; + } + else + { + std::cerr << "Check_Socket() Cannot Read!" << std::endl; + std::cerr << "Check_Socket() Socket Not Ready!" << std::endl; + return 0; + } + + std::cerr << "Select() Tests indicate Socket Good!" << std::endl; + std::cerr << "2) Checking with getsockopt()" << std::endl; + + int err = 1; + socklen_t optlen = 4; + if (0==getsockopt(fd, SOL_SOCKET, SO_ERROR, &err, &optlen)) + { + std::cerr << "Check_Socket() getsockopt returned :" << err; + std::cerr << ", optlen:" << optlen; + std::cerr << std::endl; + + if (err == 0) + { + std::cerr << "Check_Socket() getsockopt"; + std::cerr << " Indicates TCP Connection Complete:"; + std::cerr << std::endl; + return 1; + } + else if (err == EINPROGRESS) + { + std::cerr << "Check_Socket() getsockopt"; + std::cerr << " Indicates TCP Connection INPROGRESS"; + std::cerr << std::endl; + return 0; + } + else if ((err == ENETUNREACH) || (err == ETIMEDOUT)) + { + std::cerr << "Check_Socket() getsockopt"; + std::cerr << " Indicates TCP Connection ENETUNREACH/ETIMEDOUT"; + std::cerr << std::endl; + return -1; + } + else if ((err == EHOSTUNREACH) || (err == EHOSTDOWN)) + { + std::cerr << "Check_Socket() getsockopt"; + std::cerr << " Indicates TCP Connection ENETUNREACH/ETIMEDOUT"; + std::cerr << std::endl; + return -1; + } + else + { + std::cerr << "Check_Socket() getsockopt"; + std::cerr << " Indicates Other Error: " << err; + std::cerr << std::endl; + return -1; + } + + + } + else + { + std::cerr << "Check_Socket() getsockopt"; + std::cerr << " FAILED "; + std::cerr << std::endl; + return -1; + } +} + + +#else + +int Check_Socket(int fd) +{ + return 0; +} + +#endif diff --git a/libretroshare/src/tcponudp/reset_tou.cc b/libretroshare/src/tcponudp/reset_tou.cc new file mode 100644 index 000000000..5bfb1ee8d --- /dev/null +++ b/libretroshare/src/tcponudp/reset_tou.cc @@ -0,0 +1,453 @@ +/* + * "$Id: reset_tou.cc,v 1.4 2007-02-18 21:46:50 rmf24 Exp $" + * + * TCP-on-UDP (tou) network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + + +/********************************************************** + * This test is designed to ensure that tou networking + * can be reset, and restarted. + * + */ + +#include + +// for printing sockaddr +#include "udplayer.h" + +#include "tou.h" +#include "tou_net.h" + +#include +#include +#include + + +/* This is a simple test to ensure that the tou behaviour + * is almost identical to a standard tcp socket. + * + * In this version we open 2 sockets, and attempt to + * communicate with ourselves.... + * + */ + +int setup_socket(struct sockaddr_in addr); +int connect_socket_pair(int fd1, int fd2, + struct sockaddr_in addr1, struct sockaddr_in addr2); +int send_data_via_pair(int sockfd1, int sockfd2, char *data, int size); + +void usage(char *name) +{ + std::cerr << "Usage: " << name; + std::cerr << " [-pco] "; + std::cerr << " "; + std::cerr << std::endl; + exit(1); + return; +} + +int main(int argc, char **argv) +{ + int c; + bool isProxy = false; + bool toConnect = false; + bool stayOpen = false; + int i,j; + + while(-1 != (c = getopt(argc, argv, "pco"))) + { + switch (c) + { + case 'p': + isProxy = true; + break; + case 'c': + toConnect = true; + break; + case 'o': + stayOpen = true; + break; + default: + usage(argv[0]); + break; + } + } + + if (argc-optind < 4) + { + usage(argv[0]); + return 1; + } + + tounet_init(); + + + /* setup the local/remote addresses. + */ + struct sockaddr_in laddr; + struct sockaddr_in raddr; + + laddr.sin_family = AF_INET; + raddr.sin_family = AF_INET; + + if ((!tounet_inet_aton(argv[optind], &(laddr.sin_addr))) || + (!tounet_inet_aton(argv[optind+2], &(raddr.sin_addr)))) + { + std::cerr << "Invalid addresses!" << std::endl; + usage(argv[0]); + } + + unsigned short laddr_port = atoi(argv[optind+1]); + unsigned short raddr_port = atoi(argv[optind+3]); + + for(i = 0; i < 10; i++) + { + laddr.sin_port = htons(laddr_port); + raddr.sin_port = htons(raddr_port); + //laddr.sin_port = htons(laddr_port + i); + //raddr.sin_port = htons(raddr_port + i); + + std::cerr << "Interation: " << i << std::endl; + + + /* setup the sockets */ + int sockfd1 = setup_socket(laddr); + int sockfd2 = setup_socket(raddr); + + if ((sockfd1 < 0) || (sockfd2 < 0)) + { + std::cerr << "Failed to setup sockets!"; + std::cerr << std::endl; + return -1; + } + + std::cerr << "Local Address: " << laddr; + std::cerr << " fd: " << sockfd1 << std::endl; + std::cerr << "Remote Address: " << raddr; + std::cerr << " fd: " << sockfd2 << std::endl; + + /* connect */ + int err = connect_socket_pair(sockfd1, sockfd2, laddr, raddr); + if (err < 0) + { + std::cerr << "Failed to connect sockets!"; + std::cerr << std::endl; + return -1; + } + + /* send the data */ + int size = 102400; + char rnddata[size]; + + int data_loops = (i+1) * (i+1); + for(int k = 0; k < data_loops; k++) + { + std::cerr << "Send Iteration: " << k+1 << " of " << data_loops << std::endl; + for(j = 0; j < size; j++) + { + rnddata[j] = (unsigned char) (255.0 * + rand() / (RAND_MAX + 1.0)); + } + send_data_via_pair(sockfd1, sockfd2, rnddata, size); + std::cerr << "Send Iteration: " << k+1 << " of " << data_loops << std::endl; + sleep(2); + } + + std::cerr << "Completed Successful transfer of " << size * data_loops << " bytes"; + std::cerr << std::endl; + + sleep(10); + std::cerr << "closing sockfd1: " << sockfd1 << std::endl; + tou_close(sockfd1); + + std::cerr << "closing sockfd2: " << sockfd2 << std::endl; + tou_close(sockfd2); + + + } + return 1; +} + +int setup_socket(struct sockaddr_in addr) +{ + int sockfd = tou_socket(PF_INET, SOCK_STREAM, 0); + + if (sockfd <= 0) + { + std::cerr << "Failed to open socket!: "; + std::cerr << "Socket Error:" << tou_errno(sockfd) << std::endl; + return -1; + } + + std::cerr << "Socket Created: " << sockfd << std::endl; + + int err = tou_bind(sockfd, (struct sockaddr *) &addr, sizeof(addr)); + + if (err < 0) + { + std::cerr << "Error: Cannot bind socket: "; + std::cerr << err << std::endl; + return -1; + } + + std::cerr << "Socket1 Bound to: " << addr << std::endl; + return sockfd; +} + +int connect_socket_pair(int fd1, int fd2, + struct sockaddr_in addr1, struct sockaddr_in addr2) +{ + std::cerr << "Socket2 Listening " << std::endl; + /* listen */ + int err = tou_listenfor(fd2, (struct sockaddr *) &addr1, sizeof(addr1)); + int err_num; + + if (err < 0) + { + err_num = tou_errno(fd2); + if (err_num != EINPROGRESS) + { + std::cerr << "Cannot Listen!: " << err_num << std::endl; + return -1; + } + } + + + std::cerr << "Socket1 Connecting to: " << addr2 << std::endl; + err = tou_connect(fd1, (struct sockaddr *) &addr2, sizeof(addr2)); + if (err < 0) + { + err_num = tou_errno(fd1); + if (err_num != EINPROGRESS) + { + std::cerr << "Cannot Connect!: " << err_num << std::endl; + return -1; + } + } + + bool sock1Connected = false; + bool sock2Connected = false; + + while((!sock1Connected) || (!sock2Connected)) + { + sleep(1); + + /* sock1 */ + if((!sock1Connected) && (0 == (err = tou_connected(fd1)))) + { + std::cerr << "Waiting for Connect (Sock1)!" << std::endl; + } + + if ((!sock1Connected) && (err < 0)) + { + std::cerr << "Connect Failed" << std::endl; + return 1; + } + else if (!sock1Connected) + { + // else connected! + sock1Connected = true; + } + + /* accept - sock2 */ + struct sockaddr_in inaddr; + socklen_t addrlen = sizeof(inaddr); + int nsock = -1; + + if ((!sock2Connected) && (0 > (nsock = tou_accept(fd2, + (struct sockaddr *) &inaddr, &addrlen)))) + { + errno = tou_errno(fd2); + if (errno != EAGAIN) + { + std::cerr << "Cannot Connect!: " << errno << std::endl; + return 1; + } + else + { + std::cerr << "Waiting for Connect (Sock2)!" << std::endl; + } + } + else if (nsock > 0) + { + /* connected */ + sock2Connected = true; + fd2 = nsock; + std::cerr << "Socket Accepted from: " << inaddr << std::endl; + } + } + + std::cerr << "Socket Connected" << std::endl; + + return 1; +} + + +/* This transmits into sockfd1, and check to see that we recv + * it back from sockfd2 + */ + +int send_data_via_pair(int sockfd1, int sockfd2, char *data, int size) +{ + /* what we recvd */ + char *recvd = (char *) malloc(size * 2); + int recvdsize = 0; + int sent = 0; + int sendsize = 0; + + int ts_start = time(NULL); + + int minsends = 100; /* min of 100 sends to complete all data */ + /* ensure we don't end up sending nothing */ + if (minsends * 10 > size) + { + minsends = size / 10; + } + + bool doneWrite = false; + bool doneRead = false; + while((!doneWrite) || (!doneRead)) + { + /* have a little break */ + //usleep(10000); /* 0.01 sec */ + //usleep(250000); /* 0.25 sec */ + usleep(500000); /* 0.50 sec */ + /* decide how much to send */ + sendsize = (int) (((float) (size / minsends)) * + (rand() / (RAND_MAX + 1.0))); + + /* limit send */ + if (sent + sendsize > size) + { + sendsize = size - sent; + } + /* if we've finished */ + if (sent == size) + { + /* eof */ + std::cerr << "Write Done!" << std::endl; + doneWrite = true; + sendsize = 0; + } + + /* now we write */ + if ((sendsize > 0)&&(-1==tou_write(sockfd1,&(data[sent]),sendsize))) + { + std::cerr << "Write Error: " << tou_errno(sockfd1) << std::endl; + if (tou_errno(sockfd1) != EAGAIN) + { + std::cerr << "FATAL ERROR ending transfer" << std::endl; + doneRead = true; + doneWrite = true; + } + + } + else + { + sent += sendsize; + } + + int ret = 0; + int readsize = (int) (((float) (size / minsends)) * + (rand() / (RAND_MAX + 1.0))); + + if (readsize > size - recvdsize) + readsize = size - recvdsize; + + if (0 < (ret = tou_read(sockfd2, &(recvd[recvdsize]), readsize))) + { + std::cerr << "TF(" << ret << ")" << std::endl; + recvdsize += ret; + } + else if (ret == 0) + { + doneRead = true; + std::cerr << "Read Done! (ret:0)" << std::endl; + } + else + { + std::cerr << "Read Error: " << tou_errno(sockfd2) << std::endl; + std::cerr << "Read " << recvdsize << "/" << size; + std::cerr << " attempted: " << readsize << std::endl; + if (tou_errno(sockfd2) != EAGAIN) + { + std::cerr << "FATAL ERROR ending transfer" << std::endl; + doneRead = true; + doneWrite = true; + } + + } + + if (recvdsize == size) + { + doneRead = true; + std::cerr << "Read Done!" << std::endl; + } + + } + + /* we have transmitted it all, so + * check the data + */ + + int i; + int diffCount = 0; + for(i = 0; i < size; i++) + { + if (recvd[i] != data[i]) + { + diffCount++; + if (diffCount < 10) + { + std::cerr << "Error Byte:" << i << " is different"; + std::cerr << std::endl; + } + } + } + if (diffCount) + { + std::cerr << "Errors (" << diffCount << "/" << size << ") in tranmission ... Exiting!"; + std::cerr << std::endl; + exit(1); + } + + int ts_end = time(NULL); + double rough_rate = size / (double) (ts_end - ts_start); + + std::cerr << "Successful Data Tranmission: " << size << " in " << ts_end-ts_start << " secs"; + std::cerr << std::endl; + std::cerr << "Approximate Rate: " << rough_rate / 1000.0 << " kbytes/sec"; + std::cerr << std::endl; + + return 1; +} + + + + + + + + diff --git a/libretroshare/src/tcponudp/tcppacket.cc b/libretroshare/src/tcponudp/tcppacket.cc new file mode 100644 index 000000000..c0729c643 --- /dev/null +++ b/libretroshare/src/tcponudp/tcppacket.cc @@ -0,0 +1,249 @@ +/* + * "$Id: tcppacket.cc,v 1.3 2007-02-18 21:46:50 rmf24 Exp $" + * + * TCP-on-UDP (tou) network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "tcppacket.h" + +/* + * #include + */ + +#include "tou_net.h" /* for winsock.h -> htons etc */ + +#include +#include + +#include + +/* NOTE That these BIT #defines will only + * work on little endian machines.... + * due to the ntohs ... + */ + +/* flags 16bit is: + * + * || 0 1 2 3 | 4 5 6 7 || 8 9 | 10 11 12 13 14 15 || + * <- HLen -> <--- unused ---> <---- flags -------> + * URG PSH SYN + * ACK RST FIN + * + * + * So in little endian world. + * 0 & 1 -> unused... + * URG -> bit 2 => 0x0004 + * ACK -> bit 3 => 0x0008 + * PSH -> bit 4 => 0x0010 + * RST -> bit 5 => 0x0020 + * SYN -> bit 6 => 0x0040 + * FIN -> bit 7 => 0x0080 + * + * and second byte 0-3 -> hlen, 4-7 unused. + */ + +#define TCP_URG_BIT 0x0004 +#define TCP_ACK_BIT 0x0008 +#define TCP_PSH_BIT 0x0010 +#define TCP_RST_BIT 0x0020 +#define TCP_SYN_BIT 0x0040 +#define TCP_FIN_BIT 0x0080 + + +TcpPacket::TcpPacket(uint8 *ptr, int size) + :data(0), datasize(0), seqno(0), ackno(0), hlen_flags(0), + winsize(0), ts(0), retrans(0) + { + if (size > 0) + { + datasize = size; + data = (uint8 *) malloc(datasize); + memcpy(data, (void *) ptr, size); + } + return; + } + +TcpPacket::TcpPacket() /* likely control packet */ + :data(0), datasize(0), seqno(0), ackno(0), hlen_flags(0), + winsize(0), ts(0), retrans(0) + { + return; + } + + +TcpPacket::~TcpPacket() + { + if (data) + free(data); + } + + +int TcpPacket::writePacket(void *buf, int &size) +{ + if (size < TCP_PSEUDO_HDR_SIZE + datasize) + { + size = 0; + return -1; + } + + /* byte: 0 => uint16 srcport = 0 */ + *((uint16 *) &(((uint8 *) buf)[0])) = htons(0); + + /* byte: 2 => uint16 destport = 0 */ + *((uint16 *) &(((uint8 *) buf)[2])) = htons(0); + + /* byte: 4 => uint32 seqno */ + *((uint32 *) &(((uint8 *) buf)[4])) = htonl(seqno); + + /* byte: 8 => uint32 ackno */ + *((uint32 *) &(((uint8 *) buf)[8])) = htonl(ackno); + + /* byte: 12 => uint16 len + flags */ + *((uint16 *) &(((uint8 *) buf)[12])) = htons(hlen_flags); + + /* byte: 14 => uint16 winsize */ + *((uint16 *) &(((uint8 *) buf)[14])) = htons(winsize); + + /* byte: 16 => uint16 chksum */ + *((uint16 *) &(((uint8 *) buf)[16])) = htons(0); + + /* byte: 18 => uint16 urgptr */ + *((uint16 *) &(((uint8 *) buf)[18])) = htons(0); + + /* total 20 bytes */ + + /* now the data */ + memcpy((void *) &(((uint8 *) buf)[20]), data, datasize); + + return size = TCP_PSEUDO_HDR_SIZE + datasize; +} + + +int TcpPacket::readPacket(void *buf, int size) +{ + if (size < TCP_PSEUDO_HDR_SIZE) + { + std::cerr << "TcpPacket::readPacket() Failed Too Small!"; + std::cerr << std::endl; + return -1; + } + + /* byte: 0 => uint16 srcport = 0 ******************* + *((uint16 *) &(((uint8 *) buf)[0])) = htons(0); + ***********/ + + /* byte: 2 => uint16 destport = 0 ****************** + *((uint16 *) &(((uint8 *) buf)[2])) = htons(0); + ***********/ + + /* byte: 4 => uint32 seqno */ + seqno = ntohl( *((uint32 *) &(((uint8 *) buf)[4])) ); + + /* byte: 8 => uint32 ackno */ + ackno = ntohl( *((uint32 *) &(((uint8 *) buf)[8])) ); + + /* byte: 12 => uint16 len + flags */ + hlen_flags = ntohs( *((uint16 *) &(((uint8 *) buf)[12])) ); + + /* byte: 14 => uint16 winsize */ + winsize = ntohs( *((uint16 *) &(((uint8 *) buf)[14])) ); + + /* byte: 16 => uint16 chksum ************************* + *((uint16 *) &(((uint8 *) buf)[16])) = htons(0); + ***********/ + + /* byte: 18 => uint16 urgptr ************************* + *((uint16 *) &(((uint8 *) buf)[18])) = htons(0); + ***********/ + + /* total 20 bytes */ + + if (data) + { + free(data); + } + datasize = size - TCP_PSEUDO_HDR_SIZE; + data = (uint8 *) malloc(datasize); + + /* now the data */ + memcpy(data, (void *) &(((uint8 *) buf)[20]), datasize); + + return size; +} + + /* flags */ +bool TcpPacket::hasSyn() +{ + return (hlen_flags & TCP_SYN_BIT); +} + +bool TcpPacket::hasFin() +{ + return (hlen_flags & TCP_FIN_BIT); +} + +bool TcpPacket::hasAck() +{ + return (hlen_flags & TCP_ACK_BIT); +} + +bool TcpPacket::hasRst() +{ + return (hlen_flags & TCP_RST_BIT); +} + + +void TcpPacket::setSyn() +{ + hlen_flags |= TCP_SYN_BIT; +} + +void TcpPacket::setFin() +{ + hlen_flags |= TCP_FIN_BIT; +} + +void TcpPacket::setRst() +{ + hlen_flags |= TCP_RST_BIT; +} + +void TcpPacket::setAckFlag() +{ + hlen_flags |= TCP_ACK_BIT; +} + +void TcpPacket::setAck(uint32 val) +{ + setAckFlag(); + ackno = val; +} + +uint32 TcpPacket::getAck() +{ + return ackno; +} + + diff --git a/libretroshare/src/tcponudp/tcppacket.h b/libretroshare/src/tcponudp/tcppacket.h new file mode 100644 index 000000000..7851c6ad1 --- /dev/null +++ b/libretroshare/src/tcponudp/tcppacket.h @@ -0,0 +1,97 @@ +/* + * "$Id: tcppacket.h,v 1.3 2007-02-18 21:46:50 rmf24 Exp $" + * + * TCP-on-UDP (tou) network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + +#ifndef TOU_TCP_PACKET_H +#define TOU_TCP_PACKET_H + +#include + + +typedef unsigned int uint32; +typedef unsigned short uint16; +typedef unsigned char uint8; + +#define TCP_PSEUDO_HDR_SIZE 20 + +class TcpPacket +{ + public: + + uint8 *data; + int datasize; + + + /* ports aren't needed -> in udp + * uint16 srcport, destport + **************************/ + uint32 seqno, ackno; + uint16 hlen_flags; + uint16 winsize; + /* don't need these -> in udp + not supported + uint16 chksum, urgptr; + **************************/ + /* no options. + **************************/ + + + /* other variables */ + double ts; /* transmit time */ + uint8 retrans; /* retransmit counter */ + + TcpPacket(uint8 *ptr, int size); + TcpPacket(); /* likely control packet */ + ~TcpPacket(); + +int writePacket(void *buf, int &size); +int readPacket(void *buf, int size); + +void *getData(); +void *releaseData(); + +void *setData(void *data, int size); +int getDataSize(); + + /* flags */ +bool hasSyn(); +bool hasFin(); +bool hasAck(); +bool hasRst(); + +void setSyn(); +void setFin(); +void setRst(); +void setAckFlag(); + +void setAck(uint32 val); +uint32 getAck(); + + +}; + + +#endif + diff --git a/libretroshare/src/tcponudp/tcpstream.cc b/libretroshare/src/tcponudp/tcpstream.cc new file mode 100644 index 000000000..a2d4a53b7 --- /dev/null +++ b/libretroshare/src/tcponudp/tcpstream.cc @@ -0,0 +1,2133 @@ +/* + * "$Id: tcpstream.cc,v 1.11 2007-03-01 01:09:39 rmf24 Exp $" + * + * TCP-on-UDP (tou) network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "tcpstream.h" +#include +#include +#include +#include + +#include +#include + + +/* + * #define DEBUG_TCP_STREAM 1 + */ + +/* + *#define DEBUG_TCP_STREAM_EXTRA 1 + */ + +/* + * #define TCP_NO_PARTIAL_READ 1 + */ + +#ifdef DEBUG_TCP_STREAM +int checkData(uint8 *data, int size, int idx); +int setupBinaryCheck(std::string fname); +#endif + +static const uint32 kMaxQueueSize = 100; +static const uint32 kMaxPktRetransmit = 20; +static const uint32 kMaxSynPktRetransmit = 200; // max TTL of 40? +static const int TCP_STD_TTL = 64; +static const int TCP_STARTUP_COUNT_PER_TTL = 2; + +static const double RTT_ALPHA = 0.875; + +// platform independent fractional timestamp. +static double getCurrentTS(); + + +TcpStream::TcpStream(UdpLayer *lyr) + :inSize(0), outSizeRead(0), outSizeNet(0), + state(TCP_CLOSED), + inStreamActive(false), + outStreamActive(false), + outSeqno(0), outAcked(0), outWinSize(0), + inAckno(0), inWinSize(0), + maxWinSize(TCP_MAX_WIN), + keepAliveTimeout(TCP_ALIVE_TIMEOUT), + retransTimeout(TCP_RETRANS_TIMEOUT), + lastWriteTF(0),lastReadTF(0), + wcount(0), rcount(0), + errorState(0), + /* retranmission variables - init to large */ + rtt_est(TCP_RETRANS_TIMEOUT), + rtt_dev(0), + congestThreshold(TCP_MAX_WIN), + congestWinSize(MAX_SEG), + congestUpdate(0), + udp(lyr) +{ + return; +} + +/* Stream Control! */ +int TcpStream::connect() +{ + /* check state */ + if (state != TCP_CLOSED) + { + if (state == TCP_ESTABLISHED) + { + return 0; + } + else if (state < TCP_ESTABLISHED) + { + errorState = EAGAIN; + } + else + { + // major issues! + errorState = EFAULT; + } + return -1; + } + + + /* setup Seqnos */ + outSeqno = genSequenceNo(); + initOurSeqno = outSeqno; + + outAcked = outSeqno; /* min - 1 expected */ + inWinSize = maxWinSize; + + congestThreshold = TCP_MAX_WIN; + congestWinSize = MAX_SEG; + congestUpdate = outAcked + congestWinSize; + + /* Init Connection */ + /* send syn packet */ + TcpPacket *pkt = new TcpPacket(); + pkt -> setSyn(); + +#ifdef DEBUG_TCP_STREAM + std::cerr << "TcpStream::connect() Send Init Pkt" << std::endl; +#endif + + + /* ********* SLOW START ************* + * As this is the only place where a syn + * is sent ..... we switch the ttl to 0, + * and increment it as we retransmit the packet.... + * This should help the firewalls along. + */ + + udp -> setTTL(1); + + toSend(pkt); + /* change state */ + state = TCP_SYN_SENT; + std::cerr << "TcpStream STATE -> TCP_SYN_SENT" << std::endl; + errorState = EAGAIN; + return -1; +} + +/* Stream Control! */ +int TcpStream::close() +{ + cleanup(); + return 0; +} + +int TcpStream::closeWrite() +{ + /* check state */ + /* will always close socket.... */ + /* if in TCP_ESTABLISHED.... + * -> to state: TCP_FIN_WAIT_1 + * and shutdown outward stream. + */ + + /* if in CLOSE_WAIT.... + * -> to state: TCP_LAST_ACK + * and shutdown outward stream. + * do this one first!. + */ + + outStreamActive = false; + + if (state == TCP_CLOSE_WAIT) + { + /* don't think we need to be + * graceful at this point... + * connection already closed by other end. + * XXX might fix later with scheme + * + * flag stream closed, and when outqueue + * emptied then fin will be sent. + */ + + /* do nothing */ + } + + if (state == TCP_ESTABLISHED) + { + /* fire off the damned thing. */ + /* by changing state */ + + /* again this is handled by internals + * the flag however indicates that + * no more data can be send, + * and once the queue empties + * the FIN will be sent. + */ + + } + if (state == TCP_CLOSED) + { +#ifdef DEBUG_TCP_STREAM + std::cerr << "TcpStream::close() Flag Set" << std::endl; +#endif + return 0; + } + +#ifdef DEBUG_TCP_STREAM + std::cerr << "TcpStream::close() pending" << std::endl; +#endif + errorState = EAGAIN; + return -1; +} + +int TcpStream::cleanup() +{ + // This shuts it all down! no matter what. + + outStreamActive = false; + inStreamActive = false; + state = TCP_CLOSED; + std::cerr << "TcpStream STATE -> TCP_CLOSED" << std::endl; + + /* Ensure that TTL -> STD for further STUN ATTEMPTS */ + if (udp) + { + udp -> setTTL(TCP_STD_TTL); + } + + // clear arrays. + inSize = 0; + while(inQueue.size() > 0) + { + dataBuffer *db = inQueue.front(); + inQueue.pop_front(); + delete db; + } + + while(outPkt.size() > 0) + { + TcpPacket *pkt = outPkt.front(); + outPkt.pop_front(); + delete pkt; + } + + + // clear arrays. + outSizeRead = 0; + outSizeNet = 0; + while(outQueue.size() > 0) + { + dataBuffer *db = outQueue.front(); + outQueue.pop_front(); + delete db; + } + + while(inPkt.size() > 0) + { + TcpPacket *pkt = inPkt.front(); + inPkt.pop_front(); + delete pkt; + } + return 1; +} + +bool TcpStream::isConnected() +{ + return (state == TCP_ESTABLISHED); +} + +int TcpStream::status(std::ostream &out) +{ + // can leave the timestamp here as time()... rough but okay. + out << "TcpStream::status @ (" << time(NULL) << ")" << std::endl; + out << "TcpStream::state = " << (int) state << std::endl; + out << std::endl; + out << "writeBuffer: " << inSize << " + 1500 * " << inQueue.size(); + out << " bytes Queued for transmission" << std::endl; + out << "readBuffer: " << outSizeRead << " + 1500 * "; + out << outQueue.size() << " + " << outSizeNet; + out << " incoming bytes waiting" << std::endl; + out << std::endl; + out << "inPkts: " << inPkt.size() << " packets waiting for processing"; + out << std::endl; + out << "outPkts: " << outPkt.size() << " packets waiting for acks"; + out << std::endl; + out << "us -> peer: nextSeqno: " << outSeqno << " lastAcked: " << outAcked; + out << " winsize: " << outWinSize; + out << std::endl; + out << "peer -> us: Expected SeqNo: " << inAckno; + out << " winsize: " << inWinSize; + out << std::endl; + out << std::endl; + return state; +} + +int TcpStream::write_allowed() +{ + if (state == TCP_CLOSED) + { + errorState = EBADF; + return -1; + } + else if (state < TCP_ESTABLISHED) + { + errorState = EAGAIN; + return -1; + } + else if (!outStreamActive) + { + errorState = EBADF; + return -1; + } + + int maxwrite = (kMaxQueueSize - inQueue.size()) * MAX_SEG; + return maxwrite; +} + + +int TcpStream::read_pending() +{ + /* error should be detected next time */ + int maxread = outSizeRead + outQueue.size() * MAX_SEG + outSizeNet; + if (state == TCP_CLOSED) + { + errorState = EBADF; + return -1; + } + else if (state < TCP_ESTABLISHED) + { + errorState = EAGAIN; + return -1; + } + return maxread; +} + + + /* stream Interface */ +int TcpStream::write(char *dta, int size) /* write -> pkt -> net */ +{ + +#ifdef DEBUG_TCP_STREAM_EXTRA +static uint32 TMPtotalwrite = 0; +#endif + + if (state == TCP_CLOSED) + { +#ifdef DEBUG_TCP_STREAM + std::cerr << "TcpStream::write() Error TCP_CLOSED" << std::endl; +#endif + errorState = EBADF; + return -1; + } + else if (state < TCP_ESTABLISHED) + { +#ifdef DEBUG_TCP_STREAM + std::cerr << "TcpStream::write() Error TCP Not Established" << std::endl; +#endif + errorState = EAGAIN; + return -1; + } + else if (inQueue.size() > kMaxQueueSize) + { +#ifdef DEBUG_TCP_STREAM + std::cerr << "TcpStream::write() Error EAGAIN" << std::endl; +#endif + errorState = EAGAIN; + return -1; + } + else if (!outStreamActive) + { +#ifdef DEBUG_TCP_STREAM + std::cerr << "TcpStream::write() Error TCP_CLOSED" << std::endl; +#endif + errorState = EBADF; + return -1; + } + +#ifdef DEBUG_TCP_STREAM_EXTRA + std::cerr << "TcpStream::write() = Will Succeed " << size << std::endl; + std::cerr << "TcpStream::write() Write Start: " << TMPtotalwrite << std::endl; + std::cerr << printPktOffset(TMPtotalwrite, dta, size) << std::endl; + TMPtotalwrite += size; +#endif + + + if (size + inSize < MAX_SEG) + { +#ifdef DEBUG_TCP_STREAM_EXTRA + std::cerr << "TcpStream::write() Add Itty Bit" << std::endl; + std::cerr << "TcpStream::write() inData: " << (void *) inData; + std::cerr << " inSize: " << inSize << " dta: " << (void *) dta; + std::cerr << " size: " << size << " dest: " << (void *) &(inData[inSize]); + std::cerr << std::endl; +#endif +#ifdef DEBUG_TCP_STREAM + std::cerr << "TcpStream::write() = " << size << std::endl; +#endif + memcpy((void *) &(inData[inSize]), dta, size); + inSize += size; + //std::cerr << "Small Packet - write to net:" << std::endl; + //std::cerr << printPkt(dta, size) << std::endl; + return size; + } + + /* otherwise must construct a dataBuffer. + */ + +#ifdef DEBUG_TCP_STREAM_EXTRA + std::cerr << "TcpStream::write() filling 1 dataBuffer" << std::endl; + std::cerr << "TcpStream::write() from inData(" << inSize << ")" << std::endl; + std::cerr << "TcpStream::write() + dta(" << MAX_SEG - inSize; + std::cerr << "/" << size << ")" << std::endl; +#endif + + /* first create 1. */ + dataBuffer *db = new dataBuffer; + memcpy((void *) db->data, (void *) inData, inSize); + + + int remSize = size; + memcpy((void *) &(db->data[inSize]), dta, MAX_SEG - inSize); + + inQueue.push_back(db); + remSize -= (MAX_SEG - inSize); + +#ifdef DEBUG_TCP_STREAM_EXTRA + std::cerr << "TcpStream::write() remaining " << remSize << " bytes to load" << std::endl; +#endif + + while(remSize >= MAX_SEG) + { +#ifdef DEBUG_TCP_STREAM_EXTRA + std::cerr << "TcpStream::write() filling whole dataBuffer" << std::endl; + std::cerr << "TcpStream::write() from dta[" << size-remSize << "]" << std::endl; +#endif + db = new dataBuffer; + memcpy((void *) db->data, (void *) &(dta[size-remSize]), MAX_SEG); + + inQueue.push_back(db); + remSize -= MAX_SEG; + } + +#ifdef DEBUG_TCP_STREAM + std::cerr << "TcpStream::write() = " << size << std::endl; +#endif + + if (remSize > 0) + { + +#ifdef DEBUG_TCP_STREAM_EXTRA + std::cerr << "TcpStream::write() putting last bit in inData" << std::endl; + std::cerr << "TcpStream::write() from dta[" << size-remSize << "] size: "; + std::cerr << remSize << std::endl; +#endif + memcpy((void *) inData, (void *) &(dta[size-remSize]), remSize); + inSize = remSize; + return size; + } + else + { + +#ifdef DEBUG_TCP_STREAM_EXTRA + std::cerr << "TcpStream::write() Data fitted exactly in dataBuffer!" << std::endl; +#endif + inSize = 0; + } + + return size; +} + +int TcpStream::read(char *dta, int size) /* net -> pkt -> read */ +{ +#ifdef DEBUG_TCP_STREAM_EXTRA +static uint32 TMPtotalread = 0; +#endif + /* max available data is + * outDataRead + outQueue + outDataNet + */ + + int maxread = outSizeRead + outQueue.size() * MAX_SEG + outSizeNet; + + if (state == TCP_CLOSED) + { + errorState = EBADF; + return -1; + } + else if (state < TCP_ESTABLISHED) + { + errorState = EAGAIN; + return -1; + } + else if ((!inStreamActive) && (maxread == 0)) + { + // finished stream. + return 0; + } + + if (maxread == 0) + { + /* must wait for more data */ + errorState = EAGAIN; + return -1; + } + + if (maxread < size) + { +#ifdef TCP_NO_PARTIAL_READ + if (inStreamActive) + { + +#ifdef DEBUG_TCP_STREAM + std::cerr << "TcpStream::read() No Partial Read! "; + std::cerr << "Can only supply " << maxread << " of "; + std::cerr << size; + std::cerr << std::endl; +#endif + errorState = EAGAIN; + return -1; + } +#endif /* TCP_NO_PARTIAL_READ */ + size = maxread; + } + + /* if less than outDataRead size */ + if (((unsigned) (size) < outSizeRead) && (outSizeRead)) + { +#ifdef DEBUG_TCP_STREAM_EXTRA + std::cerr << "TcpStream::read() Add Itty Bit" << std::endl; + std::cerr << "TcpStream::read() outSizeRead: " << outSizeRead; + std::cerr << " size: " << size << " remaining: " << outSizeRead - size; + std::cerr << std::endl; +#endif + memcpy(dta,(void *) outDataRead, size); + memmove((void *) outDataRead, + (void *) &(outDataRead[size]), outSizeRead - (size)); + outSizeRead -= size; + + +#ifdef DEBUG_TCP_STREAM_EXTRA + std::cerr << "TcpStream::read() = Succeeded " << size << std::endl; + std::cerr << "TcpStream::read() Read Start: " << TMPtotalread << std::endl; + std::cerr << printPktOffset(TMPtotalread, dta, size) << std::endl; +#endif + +#ifdef DEBUG_TCP_STREAM_EXTRA + checkData((uint8 *) dta, size, TMPtotalread); + TMPtotalread += size; +#endif + + /* can allow more in! - update inWinSize */ + UpdateInWinSize(); + + return size; + } + + /* move the whole of outDataRead. */ + if (outSizeRead) + { +#ifdef DEBUG_TCP_STREAM_EXTRA + std::cerr << "TcpStream::read() Move All outSizeRead" << std::endl; + std::cerr << "TcpStream::read() outSizeRead: " << outSizeRead; + std::cerr << " size: " << size; + std::cerr << std::endl; +#endif + memcpy(dta,(void *) outDataRead, outSizeRead); + + } + + int remSize = size - outSizeRead; + outSizeRead = 0; + +#ifdef DEBUG_TCP_STREAM_EXTRA + std::cerr << "TcpStream::read() remaining size: " << remSize << std::endl; +#endif + + while((outQueue.size() > 0) && (remSize > 0)) + { + dataBuffer *db = outQueue.front(); + outQueue.pop_front(); /* remove */ + +#ifdef DEBUG_TCP_STREAM_EXTRA + std::cerr << "TcpStream::read() Taking Data from outQueue" << std::endl; +#endif + + /* load into outDataRead */ + if (remSize < MAX_SEG) + { +#ifdef DEBUG_TCP_STREAM_EXTRA + std::cerr << "TcpStream::read() Partially using Segment" << std::endl; + std::cerr << "TcpStream::read() moving: " << remSize << " to dta @: " << size-remSize; + std::cerr << std::endl; + std::cerr << "TcpStream::read() rest to outDataRead: " << MAX_SEG - remSize; + std::cerr << std::endl; +#endif + memcpy((void *) &(dta[(size)-remSize]), (void *) db->data, remSize); + memcpy((void *) outDataRead, (void *) &(db->data[remSize]), MAX_SEG - remSize); + outSizeRead = MAX_SEG - remSize; + + delete db; + + +#ifdef DEBUG_TCP_STREAM_EXTRA + std::cerr << "TcpStream::read() = Succeeded " << size << std::endl; + std::cerr << "TcpStream::read() Read Start: " << TMPtotalread << std::endl; + std::cerr << printPktOffset(TMPtotalread, dta, size) << std::endl; +#endif + +#ifdef DEBUG_TCP_STREAM_EXTRA + checkData((uint8 *) dta, size, TMPtotalread); + TMPtotalread += size; +#endif + + /* can allow more in! - update inWinSize */ + UpdateInWinSize(); + + return size; + } +#ifdef DEBUG_TCP_STREAM_EXTRA + std::cerr << "TcpStream::read() Move Whole Segment to dta @ " << size-remSize << std::endl; +#endif + + /* else copy whole segment */ + memcpy((void *) &(dta[(size)-remSize]), (void *) db->data, MAX_SEG); + remSize -= MAX_SEG; + delete db; + } + + /* assumes that outSizeNet >= remSize due to initial + * constraint + */ + if ((remSize > 0)) + { +#ifdef DEBUG_TCP_STREAM_EXTRA + std::cerr << "TcpStream::read() Using up : " << remSize; + std::cerr << " last Bytes, leaving: " << outSizeNet - remSize << std::endl; +#endif + + + memcpy((void *) &(dta[(size)-remSize]),(void *) outDataNet, remSize); + outSizeNet -= remSize; + if (outSizeNet > 0) + { + /* move to the outDataRead */ + memcpy((void *) outDataRead,(void *) &(outDataNet[remSize]), outSizeNet); + outSizeRead = outSizeNet; + outSizeNet = 0; +#ifdef DEBUG_TCP_STREAM_EXTRA + std::cerr << "TcpStream::read() moving last of outSizeNet to outSizeRead: " << outSizeRead; + std::cerr << std::endl; +#endif + + } + + +#ifdef DEBUG_TCP_STREAM_EXTRA + std::cerr << "TcpStream::read() = Succeeded " << size << std::endl; + std::cerr << "TcpStream::read() Read Start: " << TMPtotalread << std::endl; + std::cerr << printPktOffset(TMPtotalread, dta, size) << std::endl; +#endif + +#ifdef DEBUG_TCP_STREAM_EXTRA + checkData((uint8 *) dta, size, TMPtotalread); + TMPtotalread += size; +#endif + + /* can allow more in! - update inWinSize */ + UpdateInWinSize(); + + + return size; + } + +#ifdef DEBUG_TCP_STREAM_EXTRA + std::cerr << "TcpStream::read() = Succeeded " << size << std::endl; + std::cerr << "TcpStream::read() Read Start: " << TMPtotalread << std::endl; + std::cerr << printPktOffset(TMPtotalread, dta, size) << std::endl; +#endif + +#ifdef DEBUG_TCP_STREAM_EXTRA + checkData((uint8 *) dta, size, TMPtotalread); + TMPtotalread += size; +#endif + + /* can allow more in! - update inWinSize */ + UpdateInWinSize(); + + return size; +} + + +int TcpStream::recv() +{ + int maxsize = MAX_SEG + TCP_PSEUDO_HDR_SIZE; + int size = maxsize; + uint8 input[maxsize]; + double cts = getCurrentTS(); // fractional seconds. + + +#ifdef DEBUG_TCP_STREAM + if (state > TCP_SYN_RCVD) + { + int availRead = outSizeRead + outQueue.size() * MAX_SEG + outSizeNet; + std::cerr << "TcpStream::recv() CC: "; + std::cerr << " iWS: " << inWinSize; + std::cerr << " aRead: " << availRead; + std::cerr << " iAck: " << inAckno; + std::cerr << std::endl; + } + else + { + std::cerr << "TcpStream::recv() Not Connected"; + std::cerr << std::endl; + } +#endif + + + for(;0 < udp -> readPkt(input, &size); size = maxsize) + { +#ifdef DEBUG_TCP_STREAM + std::cerr << "TcpStream::recv() ReadPkt(" << size << ")" << std::endl; + //std::cerr << printPkt(input, size); + //std::cerr << std::endl; +#endif + TcpPacket *pkt = new TcpPacket(); + if (0 < pkt -> readPacket(input, size)) + { + lastIncomingPkt = cts; + handleIncoming(pkt); + } + else + { +#ifdef DEBUG_TCP_STREAM + std::cerr << "TcpStream::recv() Bad Packet Deleting!"; + std::cerr << std::endl; +#endif + delete pkt; + } + } + + // make sure we've rcvd something! + if ((state > TCP_SYN_RCVD) && + (cts - lastIncomingPkt > kNoPktTimeout)) + { + /* shut it all down */ + /* this period should be equivalent + * to the firewall timeouts ??? + * + * for max efficiency + */ + + outStreamActive = false; + inStreamActive = false; + state = TCP_CLOSED; + cleanup(); + } + return 1; +} + +int TcpStream::handleIncoming(TcpPacket *pkt) +{ +#ifdef DEBUG_TCP_STREAM + std::cerr << "TcpStream::handleIncoming()" << std::endl; +#endif + switch(state) + { + case TCP_CLOSED: + case TCP_LISTEN: + /* if receive SYN + * -> respond SYN/ACK + * To State: SYN_RCVD + * + * else Discard. + */ + return incoming_Closed(pkt); + break; + case TCP_SYN_SENT: + /* if receive SYN + * -> respond SYN/ACK + * To State: SYN_RCVD + * + * if receive SYN+ACK + * -> respond ACK + * To State: TCP_ESTABLISHED + * + * else Discard. + */ + return incoming_SynSent(pkt); + break; + case TCP_SYN_RCVD: + /* if receive ACK + * To State: TCP_ESTABLISHED + */ + return incoming_SynRcvd(pkt); + break; + case TCP_ESTABLISHED: + /* if receive FIN + * -> respond ACK + * To State: TCP_CLOSE_WAIT + * else Discard. + */ + return incoming_Established(pkt); + break; + case TCP_FIN_WAIT_1: + /* state entered by close() call. + * if receive FIN + * -> respond ACK + * To State: TCP_CLOSING + * + * if receive ACK + * -> no response + * To State: TCP_FIN_WAIT_2 + * + * if receive FIN+ACK + * -> respond ACK + * To State: TCP_TIMED_WAIT + * + */ + return incoming_Established(pkt); + //return incoming_FinWait1(pkt); + break; + case TCP_FIN_WAIT_2: + /* if receive FIN + * -> respond ACK + * To State: TCP_TIMED_WAIT + */ + return incoming_Established(pkt); + //return incoming_FinWait2(pkt); + break; + case TCP_CLOSING: + /* if receive ACK + * To State: TCP_TIMED_WAIT + */ + /* all handled in Established */ + return incoming_Established(pkt); + //return incoming_Closing(pkt); + break; + case TCP_CLOSE_WAIT: + /* + * wait for our close to be called. + */ + /* all handled in Established */ + return incoming_Established(pkt); + //return incoming_CloseWait(pkt); + break; + case TCP_LAST_ACK: + /* entered by the local close() after sending FIN. + * if receive ACK + * To State: TCP_CLOSED + */ + /* all handled in Established */ + return incoming_Established(pkt); + /* + return incoming_LastAck(pkt); + */ + + break; + /* this is actually the only + * final state where packets not expected! + */ + case TCP_TIMED_WAIT: + /* State: TCP_TIMED_WAIT + * + * discard all -> both connections FINed + * timeout of this state. + * + */ + state = TCP_CLOSED; + // return incoming_TimedWait(pkt); + break; + } + delete pkt; + return 1; +} + + +int TcpStream::incoming_Closed(TcpPacket *pkt) +{ + /* if receive SYN + * -> respond SYN/ACK + * To State: SYN_RCVD + * + * else Discard. + */ + + std::cerr << "TcpStream::incoming_Closed()" << std::endl; + if ((pkt -> hasSyn()) && (!pkt -> hasAck())) + { + /* Init Connection */ + + /* save seqno */ + initPeerSeqno = pkt -> seqno; + inAckno = initPeerSeqno + 1; + outWinSize = pkt -> winsize; + + + inWinSize = maxWinSize; + + /* we can get from SynSent as well, + * but only send one SYN packet + */ + + /* start packet */ + TcpPacket *rsp = new TcpPacket(); + + if (state == TCP_CLOSED) + { + outSeqno = genSequenceNo(); + initOurSeqno = outSeqno; + outAcked = outSeqno; /* min - 1 expected */ + + /* setup Congestion Charging */ + congestThreshold = TCP_MAX_WIN; + congestWinSize = MAX_SEG; + congestUpdate = outAcked + congestWinSize; + + rsp -> setSyn(); + } + + rsp -> setAck(inAckno); + /* seq + winsize set in toSend() */ + + /* as we have received something ... we can up the TTL */ + udp -> setTTL(TCP_STD_TTL); + +#ifdef DEBUG_TCP_STREAM + std::cerr << "TcpStream::incoming_Closed() Sending reply" << std::endl; + std::cerr << "SeqNo: " << rsp->seqno << " Ack: " << rsp->ackno; + std::cerr << std::endl; +#endif + + toSend(rsp); + /* change state */ + state = TCP_SYN_RCVD; + std::cerr << "TcpStream STATE -> TCP_SYN_RCVD" << std::endl; + } + + delete pkt; + return 1; +} + + +int TcpStream::incoming_SynSent(TcpPacket *pkt) +{ + /* if receive SYN + * -> respond SYN/ACK + * To State: SYN_RCVD + * + * if receive SYN+ACK + * -> respond ACK + * To State: TCP_ESTABLISHED + * + * else Discard. + */ + + std::cerr << "TcpStream::incoming_SynSent()" << std::endl; + + if ((pkt -> hasSyn()) && (pkt -> hasAck())) + { + /* check stuff */ + if (pkt -> getAck() != outSeqno) + { + std::cerr << "TcpStream::incoming_SynSent() Bad Ack - Deleting " << std::endl; + /* bad ignore */ + delete pkt; + return -1; + } + + /* Complete Connection */ + + /* save seqno */ + initPeerSeqno = pkt -> seqno; + inAckno = initPeerSeqno + 1; + + outWinSize = pkt -> winsize; + + outAcked = pkt -> getAck(); + + /* before ACK, reset the TTL + * As they have sent something, and we have received + * through the firewall, set to STD. + */ + udp -> setTTL(TCP_STD_TTL); + + /* ack the Syn Packet */ + sendAck(); + + /* change state */ + state = TCP_ESTABLISHED; + outStreamActive = true; + inStreamActive = true; + + std::cerr << "TcpStream STATE -> TCP_ESTABLISHED" << std::endl; + + delete pkt; + } + else /* same as if closed! (simultaneous open) */ + { + return incoming_Closed(pkt); + } + return 1; +} + + +int TcpStream::incoming_SynRcvd(TcpPacket *pkt) +{ + /* if receive ACK + * To State: TCP_ESTABLISHED + */ + if (pkt -> hasRst()) + { + /* trouble */ + state = TCP_CLOSED; + std::cerr << "TcpStream STATE -> TCP_CLOSED" << std::endl; + delete pkt; + return 1; + } + + bool ackWithData = false; + + if (pkt -> hasAck()) + { + if (pkt -> hasSyn()) + { + /* has resent syn -> check it matches */ + std::cerr << "incoming_SynRcvd -> Pkt with ACK + SYN" << std::endl; + } + + /* check stuff */ + if (pkt -> getAck() != outSeqno) + { + /* bad ignore */ + std::cerr << "incoming_SynRcvd -> Ignoring Pkt with bad ACK" << std::endl; + delete pkt; + return -1; + } + + /* Complete Connection */ + + /* save seqno */ + if (pkt -> datasize > 0) + { + std::cerr << "TcpStream::incoming_SynRcvd() ACK with Data!" << std::endl; + std::cerr << "TcpStream::incoming_SynRcvd() Shoudn't recv ... unless initACK lost!" << std::endl; + // managed to trigger this under windows... + // perhaps the initial Ack was lost, + // believe we should just pass this packet + // directly to the incoming_Established... once + // the following has been done. + // and it should all work! + //exit(1); + ackWithData = true; + } + + inAckno = pkt -> seqno; /* + pkt -> datasize; */ + outWinSize = pkt -> winsize; + + outAcked = pkt -> getAck(); + + + /* As they have sent something, and we have received + * through the firewall, set to STD. + */ + udp -> setTTL(TCP_STD_TTL); + + /* change state */ + state = TCP_ESTABLISHED; + outStreamActive = true; + inStreamActive = true; + std::cerr << "TcpStream STATE -> TCP_ESTABLISHED" << std::endl; + + } + + if (ackWithData) + { + /* connection Established -> handle normally */ + std::cerr << "incoming_SynRcvd -> Handling Data with Ack Pkt!"; + std::cerr << std::endl; + incoming_Established(pkt); + } + else + { + std::cerr << "incoming_SynRcvd -> Ignoring Pkt!" << std::endl; + /* else nothing */ + delete pkt; + } + return 1; +} + +int TcpStream::incoming_Established(TcpPacket *pkt) +{ + /* first handle the Ack ... + * this must be done before the queue, + * to keep the values as up-to-date as possible. + * + * must sanity check ..... + * make sure that the sequence number is within the correct range. + */ + + if ((!isOldSequence(pkt->seqno, inAckno)) && // seq >= inAckno + isOldSequence(pkt->seqno, inAckno + maxWinSize)) // seq < inAckno + maxWinSize. + { +#ifdef DEBUG_TCP_STREAM + std::cerr << "TcpStream::incoming_Established() valid Packet Seqno."; + std::cerr << std::endl; +#endif + if (pkt->hasAck()) + { + outAcked = pkt->ackno; +#ifdef DEBUG_TCP_STREAM + std::cerr << "\tUpdating OutAcked to: " << outAcked; + std::cerr << std::endl; +#endif + } + + outWinSize = pkt->winsize; + +#ifdef DEBUG_TCP_STREAM + std::cerr << "\tUpdating OutWinSize to: " << outWinSize; + std::cerr << std::endl; +#endif + } + else + { + /* what we do! */ +#ifdef DEBUG_TCP_STREAM + std::cerr << "TcpStream::incoming_Established() ERROR out-of-range Packet Seqno."; + std::cerr << std::endl; + std::cerr << "TcpStream::incoming_Established() Sending Ack to update Peer"; + std::cerr << std::endl; +#endif + + sendAck(); + } + + + /* add to queue */ + inPkt.push_back(pkt); + + if (inPkt.size() > kMaxQueueSize) + { + TcpPacket *pkt = inPkt.front(); + inPkt.pop_front(); + delete pkt; + +#ifdef DEBUG_TCP_STREAM + std::cerr << "TcpStream::incoming_Established() inPkt reached max size...Discarding Oldest Pkt"; + std::cerr << std::endl; +#endif + + } + + /* use as many packets as possible */ + return check_InPkts(); +} + +int TcpStream::check_InPkts() +{ + bool found = true; + TcpPacket *pkt; + std::list::iterator it; + while(found) + { + found = false; + for(it = inPkt.begin(); (!found) && (it != inPkt.end());) + { +#ifdef DEBUG_TCP_STREAM + std::cerr << "Checking expInAck: " << inAckno << " vs: " << (*it)->seqno << std::endl; +#endif + pkt = *it; + if ((*it)->seqno == inAckno) + { + found = true; + inPkt.erase(it); + + } + + /* see if we can discard it */ + /* if smaller seqno, and not wrapping around */ + else if (isOldSequence((*it)->seqno, inAckno)) + { +#ifdef DEBUG_TCP_STREAM + std::cerr << "Discarding Old Packet expAck: " << inAckno; + std::cerr << " seqno: " << (*it)->seqno << std::endl; +#endif + + /* discard */ + it = inPkt.erase(it); + delete pkt; + + } + else + { + it++; + } + } + if (found) + { + +#ifdef DEBUG_TCP_STREAM_EXTRA + if (pkt->datasize) + { + checkData(pkt->data, pkt->datasize, pkt->seqno-initPeerSeqno-1); + } +#endif + + /* update ack number - let it rollover */ + inAckno = pkt->seqno + pkt->datasize; + + /* XXX This shouldn't be here, as it prevents + * the Ack being used until the packet is. + * This means that a dropped packet will stop traffic in both + * directions.... + * + * Moved it to incoming_Established .... but extra + * check here to be sure! + */ + + if (pkt->hasAck()) + { + if (isOldSequence(outAcked, pkt->ackno)) + { +#ifdef DEBUG_TCP_STREAM + std::cerr << "TcpStream::check_inPkts() ERROR Ack Not Already Used!"; + std::cerr << std::endl; +#endif + outAcked = pkt->ackno; + outWinSize = pkt->winsize; + +#ifdef DEBUG_TCP_STREAM + std::cerr << "\tUpdating OutAcked to: " << outAcked; + std::cerr << std::endl; + std::cerr << "\tUpdating OutWinSize to: " << outWinSize; + std::cerr << std::endl; +#endif + + } + else + { +#ifdef DEBUG_TCP_STREAM + std::cerr << "TcpStream::check_inPkts() GOOD Ack Already Used!"; + std::cerr << std::endl; +#endif + } + } + + /* push onto queue */ + + if (outSizeNet + pkt->datasize < MAX_SEG) + { + /* move onto outSizeNet */ + if (pkt->datasize) + { + memcpy((void *) &(outDataNet[outSizeNet]), pkt->data, pkt->datasize); + outSizeNet += pkt->datasize; + } + } + else + { + /* if it'll overflow the buffer. */ + dataBuffer *db = new dataBuffer(); + + /* move outDatNet -> buffer */ + memcpy((void *) db->data, (void *) outDataNet, outSizeNet); + + /* fill rest of space */ + int remSpace = MAX_SEG - outSizeNet; + memcpy((void *) &(db->data[outSizeNet]), (void *) pkt->data, remSpace); + + /* remove any remaining to outDataNet */ + outSizeNet = pkt->datasize - remSpace; + if (outSizeNet > 0) + { + memcpy((void *) outDataNet, (void *) &(pkt->data[remSpace]), outSizeNet); + } + + /* push packet onto queue */ + outQueue.push_back(db); + } + + /* can allow more in! - update inWinSize */ + UpdateInWinSize(); + + /* if pkt is FIN */ + /* these must be here -> at the end of the reliable stream */ + /* if the fin is set, ack it specially close stream */ + if (pkt->hasFin()) + { + /* send final ack */ + sendAck(); + + /* closedown stream */ + inStreamActive = false; + + if (state == TCP_ESTABLISHED) + { + state = TCP_CLOSE_WAIT; + std::cerr << "TcpStream::state = TCP_CLOSE_WAIT"; + std::cerr << std::endl; + } + else if (state == TCP_FIN_WAIT_1) + { + state = TCP_CLOSING; + std::cerr << "TcpStream::state = TCP_CLOSING"; + std::cerr << std::endl; + } + else if (state == TCP_FIN_WAIT_2) + { + state = TCP_TIMED_WAIT; + std::cerr << "TcpStream::state = TCP_TIMED_WAIT"; + std::cerr << std::endl; + cleanup(); + } + } + + /* if ack for our FIN */ + if ((pkt->hasAck()) && (!outStreamActive) + && (pkt->ackno == outSeqno)) + { + if (state == TCP_FIN_WAIT_1) + { + state = TCP_FIN_WAIT_2; + std::cerr << "TcpStream::state = TCP_FIN_WAIT_2"; + std::cerr << std::endl; + } + else if (state == TCP_LAST_ACK) + { + state = TCP_CLOSED; + std::cerr << "TcpStream::state = TCP_CLOSED"; + std::cerr << std::endl; + cleanup(); + } + else if (state == TCP_CLOSING) + { + state = TCP_TIMED_WAIT; + std::cerr << "TcpStream::state = TCP_TIMED_WAIT"; + std::cerr << std::endl; + cleanup(); + } + } + + delete pkt; + + } /* end of found */ + } /* while(found) */ + return 1; +} + +/* This Fn should be called after each read, or recvd data (thats added to the buffer) + */ +int TcpStream::UpdateInWinSize() +{ + /* InWinSize = maxWinSze - QueuedData, + * actually we can allow a lot more to queue up... + * inWinSize = 65536, unless QueuedData > 65536. + * inWinSize = 2 * maxWinSize - QueuedData; + * + */ + + uint32 queuedData = read_pending(); + if (queuedData < maxWinSize) + { + inWinSize = maxWinSize; + } + else if (queuedData < 2 * maxWinSize) + { + inWinSize = 2 * maxWinSize - queuedData; + } + else + { + inWinSize = 0; + } + return inWinSize; +} + +int TcpStream::sendAck() +{ + /* simple -> toSend fills in ack/winsize + * and the rest is history + */ +#ifdef DEBUG_TCP_STREAM + std::cerr << "TcpStream::sendAck()"; + std::cerr << std::endl; +#endif + + return toSend(new TcpPacket(), false); +} + + +int TcpStream::toSend(TcpPacket *pkt, bool retrans) +{ + int outPktSize = MAX_SEG + TCP_PSEUDO_HDR_SIZE; + char tmpOutPkt[outPktSize]; + + /* get accurate timestamp */ + double cts = getCurrentTS(); + + pkt -> winsize = inWinSize; + pkt -> seqno = outSeqno; + + /* increment seq no */ + if (pkt->datasize) + { +#ifdef DEBUG_TCP_STREAM_EXTRA + checkData(pkt->data, pkt->datasize, outSeqno-initOurSeqno-1); +#endif + outSeqno += pkt->datasize; + } + + if (pkt->hasSyn()) + { + /* should not have data! */ + if (pkt->datasize) + { +#ifdef DEBUG_TCP_STREAM + std::cerr << "SYN Packet shouldn't contain data!" << std::endl; +#endif + } + outSeqno++; + } + else + { + /* cannot auto Ack SynPackets */ + pkt -> setAck(inAckno); + } + + pkt -> winsize = inWinSize; + + /* store old info */ + lastSentAck = pkt -> ackno; + lastSentWinSize = pkt -> winsize; + keepAliveTimer = cts; + + pkt -> writePacket(tmpOutPkt, outPktSize); + +#ifdef DEBUG_TCP_STREAM + std::cerr << "TcpStream::toSend() Seqno: "; + std::cerr << pkt->seqno << " size: " << pkt->datasize; + std::cerr << " Ackno: "; + std::cerr << pkt->ackno << " winsize: " << pkt->winsize; + std::cerr << std::endl; + //std::cerr << printPkt(tmpOutPkt, outPktSize) << std::endl; +#endif + + udp -> sendPkt(tmpOutPkt, outPktSize); + + if (retrans) + { + /* restart timers */ + pkt -> ts = cts; + pkt -> retrans = 0; +#ifdef DEBUG_TCP_STREAM + std::cerr << "TcpStream::toSend() Adding to outPkt --> Seqno: "; + std::cerr << pkt->seqno << " size: " << pkt->datasize; + std::cerr << std::endl; +#endif + + outPkt.push_back(pkt); + } + else + { + delete pkt; + } + return 1; +} + + + +int TcpStream::retrans() +{ + int outPktSize = MAX_SEG + TCP_PSEUDO_HDR_SIZE; + char tmpOutPkt[outPktSize]; + bool updateCongestion = true; + + /* now retrans */ + double cts = getCurrentTS(); + std::list::iterator it; + for(it = outPkt.begin(); (it != outPkt.end()); it++) + { + outPktSize = MAX_SEG + TCP_PSEUDO_HDR_SIZE; + TcpPacket *pkt = (*it); + if (cts - pkt->ts > retransTimeout) + { + + /* retransmission -> adjust the congestWinSize and congestThreshold + * but only once per cycle + */ + if (updateCongestion) + { + congestThreshold = congestWinSize / 2; + congestWinSize = MAX_SEG; + congestUpdate = outAcked + congestWinSize; // point when we can up the winSize. + updateCongestion = false; + +#ifdef DEBUG_TCP_STREAM + std::cerr << "TcpStream::retrans() Adjusting Congestion Parameters: "; + std::cerr << std::endl; + std::cerr << "\tcongestWinSize: " << congestWinSize; + std::cerr << " congestThreshold: " << congestThreshold; + std::cerr << " congestUpdate: " << congestUpdate; + std::cerr << std::endl; +#endif + + } + + /* before we can retranmit, + * we need to check that its within the congestWinSize + * -> actually only checking that the start (seqno) is within window! + */ + + + if (isOldSequence(outAcked + congestWinSize, pkt->seqno)) + { + /* cannot send .... */ +#ifdef DEBUG_TCP_STREAM + std::cerr << "TcpStream::retrans() Retranmission Delayed by CongestionWindow"; + std::cerr << std::endl; + + std::cerr << "\toutAcked: " << outAcked; + std::cerr << " CongestWinSize:" << congestWinSize; + std::cerr << std::endl; + + std::cerr << "\tAttempted Packet: Seqno: "; + std::cerr << pkt->seqno << " size: " << pkt->datasize; + std::cerr << " retrans: " << (int) pkt->retrans; + std::cerr << " timeout: " << retransTimeout; + std::cerr << std::endl; +#endif + /* as packets in order, can drop out of the fn now */ + return 0; + } + + +#ifdef DEBUG_TCP_STREAM + std::cerr << "TcpStream::retrans() Seqno: "; + std::cerr << pkt->seqno << " size: " << pkt->datasize; + std::cerr << " retrans: " << (int) pkt->retrans; + std::cerr << " timeout: " << retransTimeout; + std::cerr << std::endl; +#endif + + /* update ackno and winsize */ + if (!(pkt->hasSyn())) + { + pkt->setAck(inAckno); + lastSentAck = pkt -> ackno; + } + + pkt->winsize = inWinSize; + lastSentWinSize = pkt -> winsize; + + keepAliveTimer = cts; + + (*it) -> writePacket(tmpOutPkt, outPktSize); + +#ifdef DEBUG_TCP_STREAM + std::cerr << "TcpStream::retrans() ReSending Pkt" << std::endl; + std::cerr << "TcpStream::retrans Seqno: "; + std::cerr << (*it)->seqno << " size: " << (*it)->datasize; + std::cerr << " Ackno: "; + std::cerr << (*it)->ackno << " winsize: " << (*it)->winsize; + std::cerr << std::endl; + //std::cerr << printPkt(tmpOutPkt, outPktSize) << std::endl; +#endif + /* if its a syn packet ** thats been + * transmitting for a while, maybe + * we should increase the ttl. + */ + + if ((pkt->hasSyn()) && (udp -> getTTL() < TCP_STD_TTL)) + { + udp -> setTTL(1 + pkt->retrans / + TCP_STARTUP_COUNT_PER_TTL); + + std::cerr << "TcpStream::retrans() Startup SYNs"; + std::cerr << std::endl; + std::cerr << "TcpStream::retrans() retransTimeout: "; + std::cerr << retransTimeout << std::endl; + + std::cerr << "TcpStream::retrans() Setting TTL to: "; + std::cerr << (int) (1 + pkt->retrans / + TCP_STARTUP_COUNT_PER_TTL) << std::endl; + } + + /* catch excessive retransmits + * (Allow Syn case more.... ) + */ + + if ((pkt->hasSyn() && (pkt->retrans > kMaxSynPktRetransmit)) || + (pkt->retrans > kMaxPktRetransmit)) + { + /* too many attempts close stream */ +#ifdef DEBUG_TCP_STREAM + std::cerr << "TcpStream::retrans() Too many Retransmission Attempts ("; + std::cerr << (int) pkt->retrans << ") for Pkt" << std::endl; + std::cerr << "TcpStream::retrans() Closing Socket Connection"; + std::cerr << std::endl; +#endif + + outStreamActive = false; + inStreamActive = false; + state = TCP_CLOSED; + cleanup(); + return 0; + } + + + udp -> sendPkt(tmpOutPkt, outPktSize); + + /* restart timers */ + (*it) -> ts = cts; + (*it) -> retrans++; + + /* finally - double the retransTimeout ... (Karn's Algorithm) + * this ensures we don't retransmit all the packets that + * following a dropped packet! + * + * but if we have lots of dropped this ain't going to help much! + * + * not doubling retransTimeout, that is can go manic and result + * in excessive timeouts, and no data flow. + */ + retransTimeout = 2.0 * (rtt_est + 4.0 * rtt_dev); +#ifdef DEBUG_TCP_STREAM + std::cerr << "TcpStream::retrans() Doubling std retranTimeout to:"; + std::cerr << retransTimeout; + std::cerr << std::endl; +#endif + } + } + return 1; +} + + +void TcpStream::acknowledge() +{ + /* cleans up acknowledge packets */ + /* packets are pushed back in order */ + std::list::iterator it; + double cts = getCurrentTS(); + bool updateRTT = true; + + for(it = outPkt.begin(); (it != outPkt.end()) && + (isOldSequence((*it)->seqno, outAcked)); + it = outPkt.erase(it)) + { + TcpPacket *pkt = (*it); + + + /* adjust the congestWinSize and congestThreshold + * congestUpdate <= outAcked + * + ***/ + + if (!isOldSequence(outAcked, congestUpdate)) + { + if (congestWinSize < congestThreshold) + { + /* double it baby! */ + congestWinSize *= 2; + } + else + { + /* linear increase */ + congestWinSize += MAX_SEG; + } + + if (congestWinSize > maxWinSize) + { + congestWinSize = maxWinSize; + } + + congestUpdate = outAcked + congestWinSize; // point when we can up the winSize. + +#ifdef DEBUG_TCP_STREAM + std::cerr << "TcpStream::acknowledge() Adjusting Congestion Parameters: "; + std::cerr << std::endl; + std::cerr << "\tcongestWinSize: " << congestWinSize; + std::cerr << " congestThreshold: " << congestThreshold; + std::cerr << " congestUpdate: " << congestUpdate; + std::cerr << std::endl; +#endif + } + + + /* update the RoundTripTime, + * using Jacobson's values. + * RTT = a RTT + (1-a) M + * where + * RTT is RoundTripTime estimate. + * a = 7/8, + * M = time for ack. + * + * D = a D + (1 - a) | RTT - M | + * where + * D is approx Deviation. + * a,RTT & M are the same as above. + * + * Timeout = RTT + 4 * D. + * + * And Karn's Algorithm... + * which says + * (1) do not update RTT or D for retransmitted packets. + * + the ones that follow .... (the ones whos ack was + * delayed by the retranmission) + * (2) double timeout, when packets fail. (done in retrans). + */ + + if (pkt->retrans) + { + updateRTT = false; + } + + if (updateRTT) /* can use for RTT calc */ + { + double ack_time = cts - pkt->ts; + rtt_est = RTT_ALPHA * rtt_est + (1.0 - RTT_ALPHA) * ack_time; + rtt_dev = RTT_ALPHA * rtt_dev + (1.0 - RTT_ALPHA) * fabs(rtt_est - ack_time); + retransTimeout = rtt_est + 4.0 * rtt_dev; +#ifdef DEBUG_TCP_STREAM + std::cerr << "TcpStream::acknowledge() Updating RTT: "; + std::cerr << std::endl; + std::cerr << "\tAckTime: " << ack_time; + std::cerr << std::endl; + std::cerr << "\tRRT_est: " << rtt_est; + std::cerr << std::endl; + std::cerr << "\tRTT_dev: " << rtt_dev; + std::cerr << std::endl; + std::cerr << "\tTimeout: " << retransTimeout; + std::cerr << std::endl; +#endif + } + +#ifdef DEBUG_TCP_STREAM + else + { + std::cerr << "TcpStream::acknowledge() Not Updating RTT for retransmitted Pkt Sequence"; + std::cerr << std::endl; + } +#endif + +#ifdef DEBUG_TCP_STREAM + std::cerr << "TcpStream::acknowledge() Removing Seqno: "; + std::cerr << pkt->seqno << " size: " << pkt->datasize; + std::cerr << std::endl; +#endif + delete pkt; + } + + /* This is triggered if we have recieved acks for retransmitted packets.... + * In this case we want to reset the timeout, and remove the doubling. + * + * If we don't do this, and there have been more dropped packets, + * the the timeout gets continually doubled. which will virtually stop + * all communication. + * + * This will effectively trigger the retransmission of the next dropped packet. + */ + + if (!updateRTT) + { + retransTimeout = rtt_est + 4.0 * rtt_dev; + } + + return; +} + + +/* somehow managed to delete everything.... second time lucky */ + +int TcpStream::send() +{ + /* handle network interface always */ + /* clean up as much as possible */ + acknowledge(); + /* send any old packets */ + retrans(); + + + if (state < TCP_ESTABLISHED) + { + return -1; + } + + /* get the inQueue, can send */ + + + /* determine exactly how much we can send */ + uint32 maxsend = congestWinSize; + uint32 inTransit; + + if (outWinSize < congestWinSize) + { + maxsend = outWinSize; + } + + if (outSeqno < outAcked) + { + inTransit = (TCP_MAX_SEQ - outAcked) + outSeqno; + } + else + { + inTransit = outSeqno - outAcked; + } + + if (maxsend > inTransit) + { + maxsend -= inTransit; + } + else + { + maxsend = 0; + } + +#ifdef DEBUG_TCP_STREAM + int availSend = inQueue.size() * MAX_SEG + inSize; + std::cerr << "TcpStream::send() CC: "; + std::cerr << "oWS: " << outWinSize; + std::cerr << " cWS: " << congestWinSize; + std::cerr << " | inT: " << inTransit; + std::cerr << " mSnd: " << maxsend; + std::cerr << " aSnd: " << availSend; + std::cerr << " | oSeq: " << outSeqno; + std::cerr << " oAck: " << outAcked; + std::cerr << " cUpd: " << congestUpdate; + std::cerr << std::endl; +#endif + + int sent = 0; + while((inQueue.size() > 0) && (maxsend >= MAX_SEG)) + { + dataBuffer *db = inQueue.front(); + inQueue.pop_front(); + + TcpPacket *pkt = new TcpPacket(db->data, MAX_SEG); +#ifdef DEBUG_TCP_STREAM + std::cerr << "TcpStream::send() Segment ===> Seqno: "; + std::cerr << pkt->seqno << " size: " << pkt->datasize; + std::cerr << std::endl; +#endif + sent++; + maxsend -= MAX_SEG; + toSend(pkt); + delete db; + } + + /* if inqueue empty, and enough window space, send partial stuff */ + if ((!sent) && (inQueue.size() == 0) && (maxsend >= inSize) && (inSize)) + { + TcpPacket *pkt = new TcpPacket(inData, inSize); +#ifdef DEBUG_TCP_STREAM + std::cerr << "TcpStream::send() Remaining ===>"; + std::cerr << std::endl; +#endif + inSize = 0; + sent++; + maxsend -= inSize; + toSend(pkt); + } + + /* if send nothing */ + bool needsAck = false; + + if (!sent) + { + double cts = getCurrentTS(); + /* if needs ack */ + if (isOldSequence(lastSentAck,inAckno)) + { +#ifdef DEBUG_TCP_STREAM + std::cerr << "TcpStream::send() Ack Triggered (Ackno)"; + std::cerr << std::endl; +#endif + needsAck = true; + } + + /* if needs window + * if added enough space for packet, or + * (this case is equivalent to persistence timer) + * haven't sent anything for a while, and the + * window size has drastically increased. + * */ + if (((lastSentWinSize < MAX_SEG) && (inWinSize > MAX_SEG)) || + ((cts - keepAliveTimer > retransTimeout * 4) && + (inWinSize > lastSentWinSize + 4 * MAX_SEG))) + { +#ifdef DEBUG_TCP_STREAM + std::cerr << "TcpStream::send() Ack Triggered (Window)"; + std::cerr << std::endl; +#endif + needsAck = true; + } + + /* if needs keepalive */ + if (cts - keepAliveTimer > keepAliveTimeout) + { +#ifdef DEBUG_TCP_STREAM + std::cerr << "TcpStream::send() Ack Triggered (KAlive)"; + std::cerr << std::endl; +#endif + needsAck = true; + } + + + /* if end of stream -> switch mode -> send fin (with ack) */ + if ((!outStreamActive) && (inQueue.size() + inSize == 0) && + ((state == TCP_ESTABLISHED) || (state == TCP_CLOSE_WAIT))) + { + /* finish the stream */ + TcpPacket *pkt = new TcpPacket(); + pkt -> setFin(); + + needsAck = false; + toSend(pkt, false); + +#ifdef DEBUG_TCP_STREAM + std::cerr << "TcpStream::send() Fin Triggered"; + std::cerr << std::endl; +#endif + + if (state == TCP_ESTABLISHED) + { + state = TCP_FIN_WAIT_1; +#ifdef DEBUG_TCP_STREAM + std::cerr << "TcpStream::state = TCP_FIN_WAIT_1"; + std::cerr << std::endl; +#endif + } + else if (state == TCP_CLOSE_WAIT) + { + state = TCP_LAST_ACK; +#ifdef DEBUG_TCP_STREAM + std::cerr << "TcpStream::state = TCP_LAST_ACK"; + std::cerr << std::endl; +#endif + } + + } + + if (needsAck) + { + sendAck(); + } + } + return 1; +} + + + + + + + +int TcpStream::tick() +{ + //std::cerr << "TcpStream::tick()" << std::endl; + recv(); + send(); + return 1; +} + +uint32 TcpStream::genSequenceNo() +{ + //return 1000; // TCP_MAX_SEQ - 1000; //1000; //(rand() - 100000) + time(NULL) % 100000; + return (rand() - 100000) + time(NULL) % 100000; +} + + +bool TcpStream::isOldSequence(uint32 tst, uint32 curr) +{ + return ((int)((tst)-(curr)) < 0); + + std::cerr << "TcpStream::isOldSequence(): Case "; + /* if tst < curr */ + if ((int)((tst)-(curr)) < 0) + { + if (curr - tst < TCP_MAX_SEQ/2) /* diff less than half span -> old */ + { + std::cerr << "1T" << std::endl; + return true; + } + std::cerr << "2F" << std::endl; + return false; + } + else if ((tst - curr) > TCP_MAX_SEQ/2) + { + std::cerr << "3T: tst-curr:" << (tst-curr) << std::endl; + return true; + } + std::cerr << "4F: tst-curr:" << (tst-curr) << std::endl; + return false; +} + +#ifdef WINDOWS_SYS +#include +#include +#endif + +// Little fn to get current timestamp in an independent manner. +static double getCurrentTS() +{ + +#ifndef WINDOWS_SYS + struct timeval cts_tmp; + gettimeofday(&cts_tmp, NULL); + double cts = (cts_tmp.tv_sec) + ((double) cts_tmp.tv_usec) / 1000000.0; +#else + struct _timeb timebuf; + _ftime( &timebuf); + double cts = (timebuf.time) + ((double) timebuf.millitm) / 1000.0; +#endif + return cts; +} + + + + + +static int ilevel = 100; + +bool TcpStream::widle() +{ + /* init */ + if (!lastWriteTF) + { + lastWriteTF = wbytes(); + return false; + } + + if ((lastWriteTF == wbytes()) && (inSize + inQueue.size() == 0)) + { + wcount++; + if (wcount > ilevel) + return true; + return false; + } + wcount = 0; + lastWriteTF = wbytes(); + return false; +} + + +bool TcpStream::ridle() +{ + /* init */ + if (!lastReadTF) + { + lastReadTF = rbytes(); + return false; + } + + if ((lastReadTF == rbytes()) && (outSizeRead + outQueue.size() + outSizeNet== 0)) + { + rcount++; + if (rcount > ilevel) + return true; + return false; + } + rcount = 0; + lastReadTF = rbytes(); + return false; +} + +uint32 TcpStream::wbytes() +{ + return outSeqno - initOurSeqno - 1; +} + +uint32 TcpStream::rbytes() +{ + return inAckno - initPeerSeqno - 1; +} + + + +/********* Special debugging stuff *****/ + +#ifdef DEBUG_TCP_STREAM_EXTRA + +#include + +static FILE *bc_fd = 0; +int setupBinaryCheck(std::string fname) +{ + bc_fd = fopen(fname.c_str(), "r"); + return 1; +} + +/* uses seq number to track position -> ensure no rollover */ +int checkData(uint8 *data, int size, int idx) +{ + if (bc_fd <= 0) + { + return -1; + } + std::cerr << "checkData(" << idx << "+" << size << ")"; + + int tmpsize = size; + uint8 tmpdata[tmpsize]; + if (-1 == fseek(bc_fd, idx, SEEK_SET)) + { + std::cerr << "Fseek Issues!" << std::endl; + exit(1); + return -1; + } + + if (1 != fread(tmpdata, tmpsize, 1, bc_fd)) + { + std::cerr << "Length Difference!" << std::endl; + exit(1); + return -1; + } + + for(int i = 0; i < size; i++) + { + if (data[i] != tmpdata[i]) + { + std::cerr << "Byte Difference!" << std::endl; + exit(1); + return -1; + } + } + std::cerr << "OK" << std::endl; + return 1; +} + +#endif + + diff --git a/libretroshare/src/tcponudp/tcpstream.h b/libretroshare/src/tcponudp/tcpstream.h new file mode 100644 index 000000000..4463f3fec --- /dev/null +++ b/libretroshare/src/tcponudp/tcpstream.h @@ -0,0 +1,213 @@ +/* + * "$Id: tcpstream.h,v 1.5 2007-02-18 21:46:50 rmf24 Exp $" + * + * TCP-on-UDP (tou) network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + +#ifndef TOU_TCP_PROTO_H +#define TOU_TCP_PROTO_H + + +/* so the packet will contain + * a tcp header + data. + * + * This is done simplistically for speed. + */ + +#include "tcppacket.h" +#include "udplayer.h" + +#define MAX_SEG 1500 +#define TCP_MAX_SEQ UINT_MAX +#define TCP_MAX_WIN 65500 +#define TCP_ALIVE_TIMEOUT 20 /* 20 sec */ +#define TCP_RETRANS_TIMEOUT 1 /* 1 sec (Initial value) */ +#define kNoPktTimeout 60 /* 1 min */ + + +#define TCP_CLOSED 0 +#define TCP_LISTEN 1 +#define TCP_SYN_SENT 2 +#define TCP_SYN_RCVD 3 +#define TCP_ESTABLISHED 4 +#define TCP_FIN_WAIT_1 5 +#define TCP_FIN_WAIT_2 6 +#define TCP_TIMED_WAIT 7 +#define TCP_CLOSING 8 +#define TCP_CLOSE_WAIT 9 +#define TCP_LAST_ACK 10 + +class dataBuffer +{ + public: + uint8 data[MAX_SEG]; +}; + +#include +#include + + +class TcpStream +{ + public: + + TcpStream(UdpLayer *lyr); + + /* user interface */ +int status(std::ostream &out); +int connect(); +bool isConnected(); + +bool widle(); /* write idle */ +bool ridle(); /* read idle */ +uint32 wbytes(); +uint32 rbytes(); + + /* network interface (unreliable) */ +int receivePkt(void *dta, int size); +int sendPkt(void *dta, int *size); + + /* stream Interface */ +int write(char *dta, int size); /* write -> pkt -> net */ +int read(char *dta, int size); /* net -> pkt -> read */ + + /* check ahead for allowed bytes */ +int write_allowed(); +int read_pending(); + +int closeWrite(); /* non-standard, but for clean exit */ +int close(); /* standard unix behaviour */ + +int tick(); /* check iface etc */ + /* internal */ + +int cleanup(); + +/* incoming data */ +int recv(); +int handleIncoming(TcpPacket *pkt); +int incoming_Closed(TcpPacket *pkt); +int incoming_SynSent(TcpPacket *pkt); +int incoming_SynRcvd(TcpPacket *pkt); +int incoming_Established(TcpPacket *pkt); +int incoming_FinWait1(TcpPacket *pkt); +int incoming_FinWait2(TcpPacket *pkt); +int incoming_TimedWait(TcpPacket *pkt); +int incoming_Closing(TcpPacket *pkt); +int incoming_CloseWait(TcpPacket *pkt); +int incoming_LastAck(TcpPacket *pkt); + +int check_InPkts(); +int UpdateInWinSize(); + +/* outgoing data */ +int toSend(TcpPacket *pkt, bool retrans = true); +void acknowledge(); +void calcWinSize(); +int send(); +int retrans(); + +int sendAck(); + + +uint32 genSequenceNo(); +bool isOldSequence(uint32 tst, uint32 curr); + + /* data (in -> pkts) && (pkts -> out) */ + + /* for small amounts of data */ + uint8 inData[MAX_SEG]; + uint32 inSize; + + + /* two variable sized buffers required here */ + uint8 outDataRead[MAX_SEG]; + uint32 outSizeRead; + uint8 outDataNet[MAX_SEG]; + uint32 outSizeNet; + + /* get packed into here as size increases */ + std::deque inQueue, outQueue; + + /* packets waiting for acks */ + std::list inPkt, outPkt; + + + uint8 state; /* stream state */ + bool inStreamActive; + bool outStreamActive; + + uint32 outSeqno; /* next out */ + uint32 outAcked; /* other size has received */ + uint32 outWinSize; /* we allowed to send */ + + uint32 inAckno; /* next expected */ + uint32 inWinSize; /* allowing other to send */ + uint32 rrt; + + /* some (initially) consts */ + uint32 maxWinSize; + uint32 keepAliveTimeout; + double retransTimeout; + + /* some timers */ + double keepAliveTimer; + double lastIncomingPkt; + + /* tracking */ + uint32 lastSentAck; + uint32 lastSentWinSize; + uint32 initOurSeqno; + uint32 initPeerSeqno; + + uint32 lastWriteTF,lastReadTF; + uint16 wcount, rcount; + + int errorState; + + /* RoundTripTime estimations */ + double rtt_est; + double rtt_dev; + + /* congestion limits */ + uint32 congestThreshold; + uint32 congestWinSize; + uint32 congestUpdate; + + + /* UdpLayer */ + UdpLayer *udp; +}; + + +/* for debugging */ + +#ifdef TCP_DEBUG_STREAM_EXTRA /* for extra checking! */ +int setupBinaryCheck(std::string fname); +#endif + + + +#endif + diff --git a/libretroshare/src/tcponudp/test_tou.cc b/libretroshare/src/tcponudp/test_tou.cc new file mode 100644 index 000000000..bed85df56 --- /dev/null +++ b/libretroshare/src/tcponudp/test_tou.cc @@ -0,0 +1,500 @@ +/* + * "$Id: test_tou.cc,v 1.3 2007-02-18 21:46:50 rmf24 Exp $" + * + * TCP-on-UDP (tou) network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 + +//#define USE_TCP_SOCKET + +// for printing sockaddr +#include "udplayer.h" + +#ifndef USE_TCP_SOCKET + #include "tou.h" +#endif + +/* shouldn't do this - but for convenience + * using tou_net.h for universal fns + * generally this should be only internal to libtou.h + * + * This includes the whole networking interface + */ + +#include "tou_net.h" + +/* These three includes appear to work in both W & L. + * and they shouldn't!!!! maybe cygwin is allowing it... + * will only use them for tou test fns. + * + * they appear to provide getopt + read/write in windows. + */ + +#include +#include +#include + +/* This is a simple test to ensure that the tou behaviour + * is almost identical to a standard tcp socket. + * + */ + +int Check_Socket(int fd); + +void usage(char *name) +{ + std::cerr << "Usage: " << name; + std::cerr << " [-pco] "; + std::cerr << " "; + std::cerr << std::endl; + exit(1); + return; +} + +int main(int argc, char **argv) +{ + int c; + bool isProxy = false; + bool toConnect = false; + bool stayOpen = false; + + int totalwbytes = 0; + int totalrbytes = 0; + + while(-1 != (c = getopt(argc, argv, "pco"))) + { + switch (c) + { + case 'p': + isProxy = true; + break; + case 'c': + toConnect = true; + break; + case 'o': + stayOpen = true; + break; + default: + usage(argv[0]); + break; + } + } + + if (argc-optind < 4) + { + usage(argv[0]); + return 1; + } + + tounet_init(); + + /* setup the local/remote addresses. + */ + struct sockaddr_in laddr; + struct sockaddr_in raddr; + + laddr.sin_family = AF_INET; + raddr.sin_family = AF_INET; + + if ((!tounet_inet_aton(argv[optind], &(laddr.sin_addr))) || + (!tounet_inet_aton(argv[optind+2], &(raddr.sin_addr)))) + { + std::cerr << "Invalid addresses!" << std::endl; + usage(argv[0]); + } + + laddr.sin_port = htons(atoi(argv[optind+1])); + raddr.sin_port = htons(atoi(argv[optind+3])); + + std::cerr << "Local Address: " << laddr << std::endl; + std::cerr << "Remote Address: " << raddr << std::endl; + + +#ifdef USE_TCP_SOCKET + int sockfd = socket(PF_INET, SOCK_STREAM, 0); +#else + int sockfd = tou_socket(PF_INET, SOCK_STREAM, 0); +#endif + if (sockfd < 0) + { + std::cerr << "Failed to open socket!: "; +#ifdef USE_TCP_SOCKET + std::cerr << "Socket Error:" << errno << std::endl; +#else + std::cerr << "Socket Error:" << tou_errno(sockfd) << std::endl; +#endif + return -1; + } + std::cerr << "Socket Created" << std::endl; + + + /* make nonblocking */ +#ifdef USE_TCP_SOCKET + int err = tounet_fcntl(sockfd,F_SETFL,O_NONBLOCK); +#else + int err = 0; +#endif + if (err < 0) + { + std::cerr << "Error: Cannot make socket NON-Blocking: "; + std::cerr << err << std::endl; + return -1; + } + + std::cerr << "Socket Non-Blocking" << std::endl; + +#ifdef USE_TCP_SOCKET + err = bind(sockfd, (struct sockaddr *) &laddr, sizeof(laddr)); +#else + err = tou_bind(sockfd, (struct sockaddr *) &laddr, sizeof(laddr)); +#endif + if (err < 0) + { + std::cerr << "Error: Cannot bind socket: "; + std::cerr << err << std::endl; + return -1; + } + + std::cerr << "Socket Bound to: " << laddr << std::endl; + + if (toConnect) + { + std::cerr << "Socket Connecting to: " << raddr << std::endl; +#ifdef USE_TCP_SOCKET + err = connect(sockfd, (struct sockaddr *) &raddr, sizeof(raddr)); +#else + err = tou_connect(sockfd, (struct sockaddr *) &raddr, sizeof(raddr)); +#endif + if (err < 0) + { +#ifndef USE_TCP_SOCKET + errno = tou_errno(sockfd); +#endif + if (errno != EINPROGRESS) + { + std::cerr << "Cannot Connect!" << std::endl; + return 1; + } +#ifdef USE_TCP_SOCKET + while(0 == (err = Check_Socket(sockfd))) +#else + while(0 == (err = tou_connected(sockfd))) +#endif + { + std::cerr << "Waiting for Connect!" << std::endl; + sleep(1); + } + if (err < 0) + { + std::cerr << "Connect Failed" << std::endl; + return 1; + } + // else connected! + } + } + else + { + std::cerr << "Socket Listening " << std::endl; + /* listen */ +#ifdef USE_TCP_SOCKET + err = listen(sockfd, 1); +#else + //err = tou_listen(sockfd, 1); + err = tou_listenfor(sockfd, + (struct sockaddr *) &raddr, sizeof(raddr)); +#endif + + /* accept */ + struct sockaddr_in inaddr; + socklen_t addrlen = sizeof(inaddr); + int nsock; + +#ifdef USE_TCP_SOCKET + while(0 > (nsock = accept(sockfd, + (struct sockaddr *) &inaddr, &addrlen))) +#else + while(0 > (nsock = tou_accept(sockfd, + (struct sockaddr *) &inaddr, &addrlen))) +#endif + { +#ifndef USE_TCP_SOCKET + errno = tou_errno(sockfd); +#endif + if (errno != EAGAIN) + { + std::cerr << "Cannot Connect!" << std::endl; + return 1; + } + sleep(1); + } + /* changed sockfd */ + sockfd = nsock; + std::cerr << "Socket Accepted from: " << inaddr << std::endl; + } + + std::cerr << "Socket Connected" << std::endl; + + if (toConnect) + { + /* send data */ + int bufsize = 15011; + char buffer[bufsize]; + int readsize = 0; + + tounet_fcntl(0, F_SETFL, O_NONBLOCK); + + bool done = false; + bool blockread = false; + while(!done) + { + sleep(1); + //usleep(10000); + //usleep(1000); + if (blockread != true) + { + readsize = read(0, buffer, bufsize); + } + if (readsize == 0) + { + /* eof */ + done = true; + } + else if ((readsize == -1) && ( EAGAIN == errno )) + { + continue; + } + + + /* now we write */ +#ifdef USE_TCP_SOCKET + if (-1 == write(sockfd, buffer, readsize)) +#else + if (-1 == tou_write(sockfd, buffer, readsize)) +#endif + { + //std::cerr << "Blocked Write!" << std::endl; +#ifndef USE_TCP_SOCKET + //std::cerr << "Error: " << tou_errno(sockfd) << std::endl; +#endif + blockread = true; + } + else + { + blockread = false; + totalwbytes += readsize; + } + } + +#ifdef USE_TCP_SOCKET + close(sockfd); +#else + /* this is blocking??? */ + tou_close(sockfd); +#endif + + std::cerr << "Transfer Complete: " << totalwbytes << " bytes"; + std::cerr << std::endl; + return 1; + } + + /* recv data */ + int bufsize = 1523; + char data[bufsize]; + tounet_fcntl(1,F_SETFL,O_NONBLOCK); + while(1) + { + sleep(1); + //usleep(10000); + //usleep(1000); + int writesize = bufsize; + int ret; + +#ifdef USE_TCP_SOCKET + if (0 < (ret = read(sockfd, data, writesize))) +#else + if (0 < (ret = tou_read(sockfd, data, writesize))) +#endif + + { + std::cerr << "TF(" << ret << ")" << std::endl; + write(1, data, ret); + totalrbytes += ret; + } + else if (ret == 0) + { + break; + } + else + { + //std::cerr << "Blocked Read!" << std::endl; +#ifndef USE_TCP_SOCKET + //std::cerr << "Error: " << tou_errno(sockfd) << std::endl; +#endif + + } + } + +#ifdef USE_TCP_SOCKET + close(sockfd); +#else + tou_close(sockfd); +#endif + + std::cerr << "Transfer complete :" << totalrbytes; + std::cerr << " bytes" << std::endl; + close(1); + + return 1; +} + + + +#ifdef USE_TCP_SOCKET + + +int Check_Socket(int fd) +{ + std::cerr << "Check_Socket()" << std::endl; + + std::cerr << "1) Checking with Select()" << std::endl; + + fd_set ReadFDs, WriteFDs, ExceptFDs; + FD_ZERO(&ReadFDs); + FD_ZERO(&WriteFDs); + FD_ZERO(&ExceptFDs); + + FD_SET(fd, &ReadFDs); + FD_SET(fd, &WriteFDs); + FD_SET(fd, &ExceptFDs); + + struct timeval timeout; + timeout.tv_sec = 0; + timeout.tv_usec = 0; + + int sr = 0; + if (0 > (sr = select(fd + 1, + &ReadFDs, &WriteFDs, &ExceptFDs, &timeout))) + { + std::cerr << "Check_Socket() Select ERROR: " << sr << std::endl; + return -1; + } + + if (FD_ISSET(fd, &ExceptFDs)) + { + std::cerr << "Check_Socket() Exception on socket!" << std::endl; + return -1; + } + + if (FD_ISSET(fd, &WriteFDs)) + { + std::cerr << "Check_Socket() Can Write!" << std::endl; + } + else + { + // not ready return 0; + std::cerr << "Check_Socket() Cannot Write!" << std::endl; + std::cerr << "Check_Socket() Socket Not Ready!" << std::endl; + return 0; + } + + if (FD_ISSET(fd, &ReadFDs)) + { + std::cerr << "Check_Socket() Can Read!" << std::endl; + } + else + { + std::cerr << "Check_Socket() Cannot Read!" << std::endl; + std::cerr << "Check_Socket() Socket Not Ready!" << std::endl; + return 0; + } + + std::cerr << "Select() Tests indicate Socket Good!" << std::endl; + std::cerr << "2) Checking with getsockopt()" << std::endl; + + int err = 1; + socklen_t optlen = 4; + if (0==getsockopt(fd, SOL_SOCKET, SO_ERROR, &err, &optlen)) + { + std::cerr << "Check_Socket() getsockopt returned :" << err; + std::cerr << ", optlen:" << optlen; + std::cerr << std::endl; + + if (err == 0) + { + std::cerr << "Check_Socket() getsockopt"; + std::cerr << " Indicates TCP Connection Complete:"; + std::cerr << std::endl; + return 1; + } + else if (err == EINPROGRESS) + { + std::cerr << "Check_Socket() getsockopt"; + std::cerr << " Indicates TCP Connection INPROGRESS"; + std::cerr << std::endl; + return 0; + } + else if ((err == ENETUNREACH) || (err == ETIMEDOUT)) + { + std::cerr << "Check_Socket() getsockopt"; + std::cerr << " Indicates TCP Connection ENETUNREACH/ETIMEDOUT"; + std::cerr << std::endl; + return -1; + } + else if ((err == EHOSTUNREACH) || (err == EHOSTDOWN)) + { + std::cerr << "Check_Socket() getsockopt"; + std::cerr << " Indicates TCP Connection ENETUNREACH/ETIMEDOUT"; + std::cerr << std::endl; + return -1; + } + else + { + std::cerr << "Check_Socket() getsockopt"; + std::cerr << " Indicates Other Error: " << err; + std::cerr << std::endl; + return -1; + } + + + } + else + { + std::cerr << "Check_Socket() getsockopt"; + std::cerr << " FAILED "; + std::cerr << std::endl; + return -1; + } +} + + +#else + +int Check_Socket(int fd) +{ + return 0; +} + +#endif diff --git a/libretroshare/src/tcponudp/tou.cc b/libretroshare/src/tcponudp/tou.cc new file mode 100644 index 000000000..278c0460f --- /dev/null +++ b/libretroshare/src/tcponudp/tou.cc @@ -0,0 +1,601 @@ +/* + * "$Id: tou.cc,v 1.7 2007-02-18 21:46:50 rmf24 Exp $" + * + * TCP-on-UDP (tou) network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "tou.h" + +static const int kInitStreamTable = 5; + +#include "udplayer.h" +#include "tcpstream.h" +#include +#include + +#include + +#define DEBUG_TOU_INTERFACE 1 + +struct TcpOnUdp_t +{ + int tou_fd; + int lasterrno; + UdpLayer *udp; + TcpStream *tcp; + bool know_eaddr; + struct sockaddr_in extaddr; + bool idle; +}; + +typedef struct TcpOnUdp_t TcpOnUdp; + +static std::vector tou_streams; + +static int tou_inited = 0; + +static int tou_tick_all(); +static int tou_init() +{ + if (tou_inited) + return 1; + + tou_streams.resize(kInitStreamTable); + + tou_inited = 1; + return 1; +} + + +/* open - which does nothing */ +int tou_socket(int /*domain*/, int /*type*/, int /*protocol*/) +{ + tou_init(); + for(unsigned int i = 1; i < tou_streams.size(); i++) + { + if (tou_streams[i] == NULL) + { + tou_streams[i] = new TcpOnUdp(); + tou_streams[i] -> tou_fd = i; + tou_streams[i] -> know_eaddr = false; + tou_streams[i] -> udp = NULL; + tou_streams[i] -> tcp = NULL; + return i; + } + } + + TcpOnUdp *tou = new TcpOnUdp(); + + tou_streams.push_back(tou); + + if (tou == tou_streams[tou_streams.size() -1]) + { + tou -> tou_fd = tou_streams.size() -1; + tou -> know_eaddr = false; + tou -> udp = NULL; + tou -> tcp = NULL; + return tou->tou_fd; + } + + tou -> lasterrno = EUSERS; + + return -1; + +#ifdef DEBUG_TOU_INTERFACE + std::cerr << "tou_socket() FAILED" << std::endl; + exit(1); +#endif +} + + + + + +/* bind - opens the udp port */ +int tou_bind(int sockfd, const struct sockaddr *my_addr, + socklen_t addrlen) +{ + if (tou_streams[sockfd] == NULL) + { + return -1; + } + TcpOnUdp *tous = tou_streams[sockfd]; + + if (tous->udp) + { + tous -> lasterrno = EADDRINUSE; + return -1; + } + + if (tous->tcp) + { + tous -> lasterrno = EADDRINUSE; + return -1; + } + + if (addrlen != sizeof(struct sockaddr_in)) + { + tous -> lasterrno = EADDRNOTAVAIL; + return -1; + } + + /* + * tous->udp = new UdpLayer( *((struct sockaddr_in *) my_addr)); + */ + // for testing - drop 5% of packets... */ + //tous->udp = new LossyUdpLayer( *((struct sockaddr_in *) my_addr), 0.05); + tous->udp = new UdpLayer( *((struct sockaddr_in *) my_addr)); + /* check the bind succeeded */ + if (!(tous->udp->okay())) + { + delete (tous->udp); + tous->udp = NULL; + tous -> lasterrno = EADDRINUSE; + return -1; + } + + tous->tcp = new TcpStream(tous->udp); + + tous->tcp->tick(); + tou_tick_all(); + + return 0; +} + +/* records peers address, and sends syn pkt + * the timeout is very slow initially - to give + * the peer a chance to startup + * + * - like a tcp/ip connection, the connect + * will return -1 EAGAIN, until connection complete. + * - always non blocking. + */ +int tou_connect(int sockfd, const struct sockaddr *serv_addr, + socklen_t addrlen) +{ + if (tou_streams[sockfd] == NULL) + { + return -1; + } + TcpOnUdp *tous = tou_streams[sockfd]; + + + if (addrlen != sizeof(struct sockaddr_in)) + { + tous -> lasterrno = EINVAL; + return -1; + } + + if (tous->tcp->state == 0) + { + tous->udp->setRemoteAddr(*((struct sockaddr_in *) serv_addr)); + } + + tous->tcp->connect(); + tous->tcp->tick(); + tou_tick_all(); + if (tous->tcp->isConnected()) + { + return 0; + } + + tous -> lasterrno = EINPROGRESS; + return -1; +} + +int tou_listen(int sockfd, int backlog) +{ + tou_tick_all(); + return 1; +} + + + /* slightly different - returns sockfd on connection */ +int tou_accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen) +{ + if (tou_streams[sockfd] == NULL) + { + return -1; + } + TcpOnUdp *tous = tou_streams[sockfd]; + + if (*addrlen != sizeof(struct sockaddr_in)) + { + tous -> lasterrno = EINVAL; + return -1; + } + + //tous->tcp->connect(); + tous->tcp->tick(); + tou_tick_all(); + if (tous->tcp->isConnected()) + { + // should get remote address + tous->udp->getRemoteAddr(*((struct sockaddr_in *) addr)); + return sockfd; + } + + tous -> lasterrno = EAGAIN; + return -1; +} + +int tou_listenfor(int sockfd, const struct sockaddr *serv_addr, + socklen_t addrlen) +{ + if (tou_streams[sockfd] == NULL) + { + return -1; + } + TcpOnUdp *tous = tou_streams[sockfd]; + + if (addrlen != sizeof(struct sockaddr_in)) + { + tous -> lasterrno = EINVAL; + return -1; + } + + if (tous->tcp->state == 0) + { + tous->udp->setRemoteAddr(*((struct sockaddr_in *) serv_addr)); + } + + tous->tcp->tick(); + tou_tick_all(); + + return 0; +} + +/* This is a udp socket - after all + * independent operation from all of the + * stream stuff. + */ +int tou_extudp(const struct sockaddr *ext, socklen_t tolen) +{ + /* request a udp to listen on, in a leachy kinda way */ + std::vector::iterator it; + for(it = tou_streams.begin(); it != tou_streams.end(); it++) + { + if ((*it) && ((*it)->udp)) + { + if ((*it)->know_eaddr) + { + *((struct sockaddr_in *) ext) = (*it)->extaddr; + return (*it)->tou_fd; + } + } + } + return -1; +} + +int tou_extaddr(int sockfd, const struct sockaddr *ext, socklen_t tolen) +{ + if (tou_streams[sockfd] == NULL) + { + return -1; + } + TcpOnUdp *tous = tou_streams[sockfd]; + tous -> know_eaddr = true; + tous -> extaddr = *((struct sockaddr_in *) ext); + return 0; +} + + +ssize_t tou_recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen) +{ + if (tou_streams[sockfd] == NULL) + { + std::cerr << "tou_recvfrom() Invalid sockfd:" << sockfd; + std::cerr << std::endl; + return -1; + } + TcpOnUdp *tous = tou_streams[sockfd]; + + if (*fromlen != sizeof(struct sockaddr_in)) + { + std::cerr << "tou_recvfrom() Invalid addr size"; + std::cerr << std::endl; + tous -> lasterrno = EINVAL; + return -1; + } + + /* extra checks */ + if ((!tous->tcp) || (!tous->udp)) + { + std::cerr << "tou_recvfrom() Bad sockfd (!udp) || (!tcp) :" << sockfd; + std::cerr << std::endl; + return -1; + } + + if (tous->tcp->state == 0) + { + //std::cerr << "tou_recvfrom() State = 0 .... Allow??"; + //std::cerr << std::endl; + } + + + if (tous->udp->okay()) + { + int ret = tous->udp->recvRndPktfrom(buf,len,flags, from, fromlen); + if (ret < 0) + { + //std::cerr << "tou_recvfrom() Sock Ok, Try Again later"; + //std::cerr << std::endl; + tous -> lasterrno = EAGAIN; + return -1; + } + std::cerr << "tou_recvfrom() Got a Packet on: " << sockfd; + std::cerr << std::endl; + tous -> lasterrno = 0; + return ret; + } + std::cerr << "tou_recvfrom() Socket Not Okay:" << sockfd; + std::cerr << std::endl; + + tous -> lasterrno = EAGAIN; + return -1; +} + + +ssize_t tou_sendto(int sockfd, const void *buf, size_t len, int flags, const struct + sockaddr *to, socklen_t tolen) +{ + if (tou_streams[sockfd] == NULL) + { + return -1; + } + TcpOnUdp *tous = tou_streams[sockfd]; + + if (tolen != sizeof(struct sockaddr_in)) + { + tous -> lasterrno = EINVAL; + return -1; + } + + if (tous->tcp->state == 0) + { + } + + + if (tous->udp->okay()) + { + tous->udp->sendToProxy(*((struct sockaddr_in *) to), + buf, len); + return len; + } + + tous -> lasterrno = EAGAIN; + return -1; +} + + +int tou_connected(int sockfd) +{ + if (tou_streams[sockfd] == NULL) + { + return -1; + } + TcpOnUdp *tous = tou_streams[sockfd]; + + tous->tcp->tick(); + tou_tick_all(); + + return (tous->tcp->state == 4); +} + + +/* standard stream read/write non-blocking of course + */ + +ssize_t tou_read(int sockfd, void *buf, size_t count) +{ + if (tou_streams[sockfd] == NULL) + { + return -1; + } + TcpOnUdp *tous = tou_streams[sockfd]; + + tous->tcp->tick(); + tou_tick_all(); + + int err = tous->tcp->read((char *) buf, count); + if (err < 0) + { + tous->lasterrno = tous->tcp->errorState; + return -1; + } + return err; +} + +ssize_t tou_write(int sockfd, const void *buf, size_t count) +{ + if (tou_streams[sockfd] == NULL) + { + return -1; + } + TcpOnUdp *tous = tou_streams[sockfd]; + + + int err = tous->tcp->write((char *) buf, count); + if (err < 0) + { + tous->lasterrno = tous->tcp->errorState; + tous->tcp->tick(); + tou_tick_all(); + return -1; + } + tous->tcp->tick(); + tou_tick_all(); + return err; +} + + /* check stream */ +int tou_maxread(int sockfd) +{ + if (tou_streams[sockfd] == NULL) + { + return -1; + } + TcpOnUdp *tous = tou_streams[sockfd]; + tous->tcp->tick(); + tou_tick_all(); + + int ret = tous->tcp->read_pending(); + if (ret < 0) + { + tous->lasterrno = tous->tcp->errorState; + return 0; // error detected next time. + } + return ret; +} + +int tou_maxwrite(int sockfd) +{ + if (tou_streams[sockfd] == NULL) + { + return -1; + } + TcpOnUdp *tous = tou_streams[sockfd]; + tous->tcp->tick(); + tou_tick_all(); + + int ret = tous->tcp->write_allowed(); + if (ret < 0) + { + tous->lasterrno = tous->tcp->errorState; + return 0; // error detected next time? + } + return ret; +} + + +/* close down the tcp over udp connection */ +int tou_close(int sockfd) +{ + if (tou_streams[sockfd] == NULL) + { + return -1; + } + TcpOnUdp *tous = tou_streams[sockfd]; + + tous->tcp->tick(); + tou_tick_all(); + + /* shut it down */ + tous->tcp->close(); + tous->udp->close(); + delete tous->tcp; + delete tous->udp; + delete tous; + tou_streams[sockfd] = NULL; + return 1; +} + + +/* get an error number */ +int tou_errno(int sockfd) +{ + if (tou_streams[sockfd] == NULL) + { + return ENOTSOCK; + } + TcpOnUdp *tous = tou_streams[sockfd]; + return tous->lasterrno; +} + +int tou_clear_error(int sockfd) +{ + if (tou_streams[sockfd] == NULL) + { + return -1; + } + TcpOnUdp *tous = tou_streams[sockfd]; + tous->lasterrno = 0; + return 0; +} + + +/* unfortuately the library needs to be ticked. (not running a thread) + * you can put it in a thread! + */ + + +/* + * Some helper functions for stuff. + * + */ + +static int tou_passall(); +static int tou_active_rw(); + +static int nextActiveCycle; +static int nextIdleCheck; +static const int kActiveCycleStep = 1; +static const int kIdleCheckStep = 5; + +static int tou_tick_all() +{ + tou_passall(); + return 1; + + /* check timer */ + int ts = time(NULL); + if (ts > nextActiveCycle) + { + tou_active_rw(); + nextActiveCycle += kActiveCycleStep; + } + if (ts > nextIdleCheck) + { + tou_passall(); + nextIdleCheck += kIdleCheckStep; + } + return 0; +} + + +static int tou_passall() +{ + /* iterate through all and clean up old sockets. + * check if idle are still idle. + */ + std::vector::iterator it; + for(it = tou_streams.begin(); it != tou_streams.end(); it++) + { + if ((*it) && ((*it)->tcp)) + { + (*it)->tcp->tick(); + } + } + return 1; +} + +static int tou_active_rw() +{ + /* iterate through actives and tick + */ + return 1; +} + + diff --git a/libretroshare/src/tcponudp/tou.h b/libretroshare/src/tcponudp/tou.h new file mode 100644 index 000000000..73ee86525 --- /dev/null +++ b/libretroshare/src/tcponudp/tou.h @@ -0,0 +1,94 @@ +/* + * "$Id: tou.h,v 1.4 2007-02-18 21:46:50 rmf24 Exp $" + * + * TCP-on-UDP (tou) network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + +#ifndef TOU_C_HEADER_H +#define TOU_C_HEADER_H + + +/* get OS-specific definitions for: + * struct sockaddr, socklen_t, ssize_t + */ + +#ifndef WINDOWS_SYS + #include +#else + #include + #include + #include + typedef int socklen_t; +#endif + + +/* standard C interface (as Unix-like as possible) + * for the tou (Tcp On Udp) library + */ + +#ifdef __cplusplus +extern "C" { +#endif + + /* UNIX interface: minimum for the SSL BIO interface */ +ssize_t tou_read(int sockfd, void *buf, size_t count); +ssize_t tou_write(int sockfd, const void *buf, size_t count); +int tou_close(int sockfd); + + /* non-standard */ +int tou_errno(int sockfd); +int tou_clear_error(int sockfd); + + /* check stream */ +int tou_maxread(int sockfd); +int tou_maxwrite(int sockfd); + + + /* creation/connections */ +int tou_socket(int domain, int type, int protocol); +int tou_bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen); +int tou_connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen); +int tou_listen(int sockfd, int backlog); +int tou_accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); + + /* udp interface */ + /* request an external udp port to use - returns sockfd */ +int tou_extudp(const struct sockaddr *ext, socklen_t tolen); +int tou_extaddr(int sockfd, const struct sockaddr *to, socklen_t tolen); + +ssize_t tou_recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen); +ssize_t tou_sendto(int s, const void *buf, size_t len, int flags, const struct + sockaddr *to, socklen_t tolen); + + +/* non-standard bonuses */ +int tou_connected(int sockfd); +int tou_listenfor(int sockfd, const struct sockaddr *serv_addr, + socklen_t addrlen); + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/libretroshare/src/tcponudp/tou_errno.h b/libretroshare/src/tcponudp/tou_errno.h new file mode 100644 index 000000000..cb07d4e1f --- /dev/null +++ b/libretroshare/src/tcponudp/tou_errno.h @@ -0,0 +1,75 @@ +/* + * "$Id: tou_errno.h,v 1.3 2007-02-18 21:46:50 rmf24 Exp $" + * + * TCP-on-UDP (tou) network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + +#ifndef TOU_ERRNO_HEADER +#define TOU_ERRNO_HEADER + +/* C Interface */ +#ifdef __cplusplus +extern "C" { +#endif + +/******* + * This defines the unix errno's for windows, these are + * needed to determine error types, these are defined + * to be the same as the unix ones. + */ + +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifdef WINDOWS_SYS + +#define EAGAIN 11 +#define EWOULDBLOCK EAGAIN + +#define EUSERS 87 +#define ENOTSOCK 88 + +#define EOPNOTSUPP 95 + +#define EADDRINUSE 98 +#define EADDRNOTAVAIL 99 +#define ENETDOWN 100 +#define ENETUNREACH 101 + +#define ECONNRESET 104 + +#define ETIMEDOUT 110 +#define ECONNREFUSED 111 +#define EHOSTDOWN 112 +#define EHOSTUNREACH 113 +#define EALREADY 114 +#define EINPROGRESS 115 + + +#endif +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ + +#ifdef __cplusplus +} /* C Interface */ +#endif + +#endif /* TOU_ERRNO_HEADER */ diff --git a/libretroshare/src/tcponudp/tou_net.cc b/libretroshare/src/tcponudp/tou_net.cc new file mode 100644 index 000000000..b95e5b142 --- /dev/null +++ b/libretroshare/src/tcponudp/tou_net.cc @@ -0,0 +1,346 @@ +/* + * "$Id: tou_net.cc,v 1.3 2007-02-18 21:46:50 rmf24 Exp $" + * + * TCP-on-UDP (tou) network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "tou_net.h" + + +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS + +/* Unix Version is easy -> just call the unix fn + */ + +#include /* for close definition */ + +/* the universal interface */ +int tounet_init() { return 0; } +int tounet_errno() { return errno; } + + +/* check if we can modify the TTL on a UDP packet */ +int tounet_checkTTL(int fd) { return 1;} + + +int tounet_inet_aton(const char *name, struct in_addr *addr) +{ + return inet_aton(name, addr); +} + +int tounet_close(int fd) { return close(fd); } + +int tounet_socket(int domain, int type, int protocol) +{ + return socket(domain, type, protocol); +} + +int tounet_bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen) +{ + return bind(sockfd,my_addr,addrlen); +} + +int tounet_fcntl(int fd, int cmd, long arg) +{ + return fcntl(fd, cmd, arg); +} + +int tounet_setsockopt(int s, int level, int optname, + const void *optval, socklen_t optlen) +{ + return setsockopt(s, level, optname, optval, optlen); +} + +ssize_t tounet_recvfrom(int s, void *buf, size_t len, int flags, + struct sockaddr *from, socklen_t *fromlen) +{ + return recvfrom(s, buf, len, flags, from, fromlen); +} + +ssize_t tounet_sendto(int s, const void *buf, size_t len, int flags, + const struct sockaddr *to, socklen_t tolen) +{ + return sendto(s, buf, len, flags, to, tolen); +} + + +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#else /* WINDOWS OS */ + +#include + +/* error handling */ +int tounet_int_errno; + +int tounet_errno() +{ + return tounet_int_errno; +} + +int tounet_init() +{ + std::cerr << "tounet_init()" << std::endl; + tounet_int_errno = 0; + + // Windows Networking Init. + WORD wVerReq = MAKEWORD(2,2); + WSADATA wsaData; + + if (0 != WSAStartup(wVerReq, &wsaData)) + { + std::cerr << "Failed to Startup Windows Networking"; + std::cerr << std::endl; + } + else + { + std::cerr << "Started Windows Networking"; + std::cerr << std::endl; + } + + return 0; +} + +/* check if we can modify the TTL on a UDP packet */ +int tounet_checkTTL(int fd) +{ + std::cerr << "tounet_checkTTL()" << std::endl; + int optlen = 4; + char optval[optlen]; + + int ret = getsockopt(fd, IPPROTO_IP, IP_TTL, optval, &optlen); + //int ret = getsockopt(fd, IPPROTO_IP, IP_MULTICAST_TTL, optval, &optlen); + if (ret == SOCKET_ERROR) + { + ret = -1; + tounet_int_errno = tounet_w2u_errno(WSAGetLastError()); + std::cerr << "tounet_checkTTL() Failed!"; + std::cerr << std::endl; + } + else + { + std::cerr << "tounet_checkTTL() :"; + std::cerr << (int) optval[0] << ":"; + std::cerr << (int) optval[1] << ":"; + std::cerr << (int) optval[2] << ":"; + std::cerr << (int) optval[3] << ": RET: "; + std::cerr << ret << ":"; + std::cerr << std::endl; + } + return ret; +} + +int tounet_close(int fd) +{ + std::cerr << "tounet_close()" << std::endl; + return closesocket(fd); +} + +int tounet_socket(int domain, int type, int protocol) +{ + int osock = socket(domain, type, protocol); + std::cerr << "tounet_socket()" << std::endl; + + if ((unsigned) osock == INVALID_SOCKET) + { + // Invalidate socket Unix style. + osock = -1; + tounet_int_errno = tounet_w2u_errno(WSAGetLastError()); + } + tounet_checkTTL(osock); + return osock; +} + +int tounet_bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen) +{ + std::cerr << "tounet_bind()" << std::endl; + int ret = bind(sockfd,my_addr,addrlen); + if (ret != 0) + { + /* store unix-style error + */ + + ret = -1; + tounet_int_errno = tounet_w2u_errno(WSAGetLastError()); + } + return ret; +} + +int tounet_fcntl(int fd, int cmd, long arg) +{ + int ret; + + unsigned long int on = 1; + std::cerr << "tounet_fcntl()" << std::endl; + + /* can only do NONBLOCK at the moment */ + if ((cmd != F_SETFL) || (arg != O_NONBLOCK)) + { + std::cerr << "tounet_fcntl() limited to fcntl(fd, F_SETFL, O_NONBLOCK)"; + std::cerr << std::endl; + tounet_int_errno = EOPNOTSUPP; + return -1; + } + + ret = ioctlsocket(fd, FIONBIO, &on); + + if (ret != 0) + { + /* store unix-style error + */ + + ret = -1; + tounet_int_errno = tounet_w2u_errno(WSAGetLastError()); + } + return ret; +} + +int tounet_setsockopt(int s, int level, int optname, + const void *optval, socklen_t optlen) +{ + std::cerr << "tounet_setsockopt() val:" << *((int *) optval) << std::endl; + std::cerr << "tounet_setsockopt() len:" << optlen << std::endl; + if ((level != IPPROTO_IP) || (optname != IP_TTL)) + { + std::cerr << "tounet_setsockopt() limited to "; + std::cerr << "setsockopt(fd, IPPROTO_IP, IP_TTL, ....)"; + std::cerr << std::endl; + tounet_int_errno = EOPNOTSUPP; + return -1; + } + + int ret = setsockopt(s, level, optname, (const char *) optval, optlen); + //int ret = setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, (const char *) optval, optlen); + if (ret == SOCKET_ERROR) + { + ret = -1; + tounet_int_errno = tounet_w2u_errno(WSAGetLastError()); + } + tounet_checkTTL(s); + return ret; +} + +ssize_t tounet_recvfrom(int s, void *buf, size_t len, int flags, + struct sockaddr *from, socklen_t *fromlen) +{ + std::cerr << "tounet_recvfrom()" << std::endl; + int ret = recvfrom(s, (char *) buf, len, flags, from, fromlen); + if (ret == SOCKET_ERROR) + { + ret = -1; + tounet_int_errno = tounet_w2u_errno(WSAGetLastError()); + } + return ret; +} + +ssize_t tounet_sendto(int s, const void *buf, size_t len, int flags, + const struct sockaddr *to, socklen_t tolen) +{ + std::cerr << "tounet_sendto()" << std::endl; + int ret = sendto(s, (const char *) buf, len, flags, to, tolen); + if (ret == SOCKET_ERROR) + { + ret = -1; + tounet_int_errno = tounet_w2u_errno(WSAGetLastError()); + } + return ret; +} + +int tounet_w2u_errno(int err) +{ + /* switch */ + std::cerr << "tou_net_w2u_errno(" << err << ")" << std::endl; + switch(err) + { + case WSAEINPROGRESS: + return EINPROGRESS; + break; + case WSAEWOULDBLOCK: + return EINPROGRESS; + break; + case WSAENETUNREACH: + return ENETUNREACH; + break; + case WSAETIMEDOUT: + return ETIMEDOUT; + break; + case WSAEHOSTDOWN: + return EHOSTDOWN; + break; + case WSAECONNREFUSED: + return ECONNREFUSED; + break; + case WSAEADDRINUSE: + return EADDRINUSE; + break; + case WSAEUSERS: + return EUSERS; + break; + /* This one is returned for UDP recvfrom, when nothing there + * but not a real error... translate into EINPROGRESS + */ + case WSAECONNRESET: + std::cerr << "tou_net_w2u_errno(" << err << ")"; + std::cerr << " = WSAECONNRESET ---> EINPROGRESS"; + std::cerr << std::endl; + return EINPROGRESS; + break; + /*** + * + case WSAECONNRESET: + return ECONNRESET; + break; + * + ***/ + + default: + std::cerr << "tou_net_w2u_errno(" << err << ") Unknown"; + std::cerr << std::endl; + break; + } + + return ECONNREFUSED; /* sensible default? */ +} + +int tounet_inet_aton(const char *name, struct in_addr *addr) +{ + return (((*addr).s_addr = inet_addr(name)) != INADDR_NONE); +} + + + +void sleep(int sec) +{ + Sleep(sec * 1000); +} + +void usleep(int usec) +{ + Sleep(usec / 1000); +} + +#endif +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ + diff --git a/libretroshare/src/tcponudp/tou_net.h b/libretroshare/src/tcponudp/tou_net.h new file mode 100644 index 000000000..cae4f6c26 --- /dev/null +++ b/libretroshare/src/tcponudp/tou_net.h @@ -0,0 +1,150 @@ +/* + * "$Id: tou_net.h,v 1.3 2007-02-18 21:46:50 rmf24 Exp $" + * + * TCP-on-UDP (tou) network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + +#ifndef TOU_UNIVERSAL_NETWORK_HEADER +#define TOU_UNIVERSAL_NETWORK_HEADER + +/* C Interface */ +#ifdef __cplusplus +extern "C" { +#endif + +/******* + * This defines a (unix-like) universal networking layer + * that should function on both windows and unix. (C - interface) + * + * This is of course only a subset of the full interface. + * functions required are: + * + * int tounet_close(int fd); + * int tounet_socket(int domain, int type, int protocol); + * int tounet_bind(int sockfd, const struct sockaddr *my_addr, + * socklen_t addrlen); + * int tounet_fcntl(int fd, int cmd, long arg); + * int tounet_setsockopt(int s, int level, int optname, + * const void *optval, socklen_t optlen); + * ssize_t tounet_recvfrom(int s, void *buf, size_t len, int flags, + * struct sockaddr *from, socklen_t *fromlen); + * ssize_t tounet_sendto(int s, const void *buf, size_t len, int flags, + * const struct sockaddr *to, socklen_t tolen); + * + * There are some non-standard ones as well: + * int tounet_errno(); for internal networking errors + * int tounet_init(); required for windows + * int tounet_checkTTL(); a check if we can modify the ttl + */ + +/* Some Types need to be defined before the interface can be declared + */ +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS + +#include +#include +#include + +#include +#include + +#else + +#include +#include + +#include /* for ssize_t */ +typedef int socklen_t; +typedef unsigned long in_addr_t; + +#endif +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ + + +/* the universal interface */ +int tounet_errno(); /* for internal networking errors */ +int tounet_init(); /* required for windows */ +int tounet_close(int fd); +int tounet_socket(int domain, int type, int protocol); +int tounet_bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen); +int tounet_fcntl(int fd, int cmd, long arg); +int tounet_setsockopt(int s, int level, int optname, + const void *optval, socklen_t optlen); +ssize_t tounet_recvfrom(int s, void *buf, size_t len, int flags, + struct sockaddr *from, socklen_t *fromlen); +ssize_t tounet_sendto(int s, const void *buf, size_t len, int flags, + const struct sockaddr *to, socklen_t tolen); + +/* address filling */ +int tounet_inet_aton(const char *name, struct in_addr *addr); +/* check if we can modify the TTL on a UDP packet */ +int tounet_checkTTL(int fd); + + + +/* Extra stuff to declare for windows error handling (mimics unix errno) + */ + +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifdef WINDOWS_SYS + +// Some Network functions that are missing from windows. +//in_addr_t inet_netof(struct in_addr addr); +//in_addr_t inet_network(char *inet_name); +//int inet_aton(const char *name, struct in_addr *addr); + + +// definitions for fcntl (NON_BLOCK) (random?) +#define F_SETFL 0x1010 +#define O_NONBLOCK 0x0100 + +// definitions for setsockopt (TTL) (random?) +//#define IPPROTO_IP 0x0011 +//#define IP_TTL 0x0110 + +/* define the Unix Error Codes that we use... + * NB. we should make the same, but not necessary + */ + +#include "tou_errno.h" + +int tounet_w2u_errno(int error); + +/* also put the sleep commands in here (where else to go) + * ms uses millisecs. + * void Sleep(int ms); + */ +void sleep(int sec); +void usleep(int usec); + +#endif +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ + + +#ifdef __cplusplus +} /* C Interface */ +#endif + +#endif /* TOU_UNIVERSAL_NETWORK_HEADER */ diff --git a/libretroshare/src/tcponudp/udp_server.cc b/libretroshare/src/tcponudp/udp_server.cc new file mode 100644 index 000000000..66d706312 --- /dev/null +++ b/libretroshare/src/tcponudp/udp_server.cc @@ -0,0 +1,284 @@ +/* + * "$Id: udp_server.cc,v 1.4 2007-02-18 21:46:50 rmf24 Exp $" + * + * TCP-on-UDP (tou) network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "udplayer.h" +#include "tcpstream.h" + +#include + +/* unix only +#include +#include +*/ + +#include "tou_net.h" + +#include +#include +#include + +void usage(char *name) +{ + std::cerr << "Usage: " << name; + std::cerr << " [-pco] "; + std::cerr << " "; + std::cerr << std::endl; + exit(1); + return; +} + +int main(int argc, char **argv) +{ + int c; + bool isProxy = false; + bool toConnect = false; + bool stayOpen = false; + + while(-1 != (c = getopt(argc, argv, "f:pco"))) + { + switch (c) + { + case 'p': + isProxy = true; + break; + case 'c': + toConnect = true; + break; + case 'o': + stayOpen = true; + break; + case 'f': + /* this can only work when the define below exists in tcpstream */ +#ifdef DEBUG_TCP_STREAM_EXTRA + setupBinaryCheck(std::string(optarg)); +#else + std::cerr << "Binary Check no Enabled!" << std::endl; +#endif + break; + default: + usage(argv[0]); + break; + } + } + + if (argc-optind < 4) + { + usage(argv[0]); + return 1; + } + /* setup the local/remote addresses. + */ + + tounet_init(); + + struct sockaddr_in laddr; + struct sockaddr_in raddr; + + laddr.sin_family = AF_INET; + raddr.sin_family = AF_INET; + + if ((!tounet_inet_aton(argv[optind], &(laddr.sin_addr))) || + (!tounet_inet_aton(argv[optind+2], &(raddr.sin_addr)))) + { + std::cerr << "Invalid addresses!" << std::endl; + usage(argv[0]); + } + + laddr.sin_port = htons(atoi(argv[optind+1])); + raddr.sin_port = htons(atoi(argv[optind+3])); + + std::cerr << "Local Address: " << laddr << std::endl; + std::cerr << "Remote Address: " << raddr << std::endl; + + //LossyUdpLayer udpl(laddr, 0.01); + UdpLayer udpl(laddr); + if (!udpl.openSocket()) + { + std::cerr << "Cannot Open Local Address: " << laddr << std::endl; + exit(1); + } + + udpl.setRemoteAddr(raddr); + + TcpStream tcp(&udpl); + + if (toConnect) + { + tcp.connect(); + } + + while(!tcp.isConnected()) + { + sleep(1); + std::cerr << "Waiting for TCP to Connect!" << std::endl; + udpl.status(std::cerr); + tcp.status(std::cerr); + tcp.tick(); + } + std::cerr << "TCP Connected***************************" << std::endl; + udpl.status(std::cerr); + tcp.status(std::cerr); + std::cerr << "TCP Connected***************************" << std::endl; + + int count = 1; + + if (toConnect) + { + /* send data */ + int bufsize = 51; + char buffer[bufsize]; + int readsize = 0; + + tounet_fcntl(0, F_SETFL, O_NONBLOCK); + + bool done = false; + bool blockread = false; + while(!done) + { + //sleep(1); + usleep(10000); + //usleep(1000); + if (blockread != true) + { + readsize = read(0, buffer, bufsize); + } + if (readsize == 0) + { + /* eof */ + done = true; + } + else if ((readsize == -1) && ( EAGAIN == errno )) + { + continue; + } + + /* now we write */ + if (-1 == tcp.write(buffer, readsize)) + blockread = true; + else + blockread = false; + + + tcp.tick(); + if (count++ % 10 == 0) + { + std::cerr << "******************************************" << std::endl; + tcp.status(std::cerr); + } + } + + tcp.closeWrite(); + + while(!tcp.widle()) + { + sleep(1); + //usleep(10000); + //usleep(1000); + tcp.tick(); + if (count++ % 10 == 0) + { + std::cerr << "Waiting for Idle()" << std::endl; + std::cerr << "******************************************" << std::endl; + tcp.status(std::cerr); + } + } + + std::cerr << "Transfer Complete: " << tcp.wbytes() << " bytes"; + std::cerr << std::endl; + return 1; + } + + /* recv data */ + int bufsize = 1523; + char data[bufsize]; + tounet_fcntl(1,F_SETFL,O_NONBLOCK); + while(1) + { + //sleep(1); + usleep(10000); + //usleep(1000); + //int writesize = bufsize; + int ret; + if (0 < (ret = tcp.read(data, bufsize))) + { + std::cerr << "TF(" << ret << ")" << std::endl; + write(1, data, ret); + } + else if (ret == 0) + { + /* completed transfer */ + std::cerr << "Transfer complete :" << tcp.rbytes(); + std::cerr << " bytes" << std::endl; + break; + } + + tcp.tick(); + if (count++ % 10 == 0) + { + std::cerr << "******************************************" << std::endl; + tcp.status(std::cerr); + } + if ((!stayOpen) && tcp.ridle()) + { + std::cerr << "Transfer Idle after " << tcp.rbytes(); + std::cerr << " bytes" << std::endl; + close(1); + break; + } + } + + tcp.closeWrite(); + + /* tick for a bit */ + while((stayOpen) || (!tcp.ridle())) + { + tcp.tick(); + sleep(1); + if (count++ % 10 == 0) + { + std::cerr << "Waiting for Idle()" << std::endl; + std::cerr << "******************************************" << std::endl; + tcp.status(std::cerr); + } + } + + + if ((!stayOpen) && tcp.ridle()) + { + //std::cerr << "Transfer complete :" << tcp.rbytes(); + //std::cerr << " bytes" << std::endl; + close(1); + return 1; + } + + return 1; +} + + + + diff --git a/libretroshare/src/tcponudp/udplayer.cc b/libretroshare/src/tcponudp/udplayer.cc new file mode 100644 index 000000000..c96ae09c5 --- /dev/null +++ b/libretroshare/src/tcponudp/udplayer.cc @@ -0,0 +1,472 @@ +/* + * "$Id: udplayer.cc,v 1.8 2007-02-18 21:46:50 rmf24 Exp $" + * + * TCP-on-UDP (tou) network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "udplayer.h" + +#include +#include +#include + +/* +#include +#include + +#include +#include + +#include +#include +#include +*/ + +/* + * #define DEBUG_UDP_LAYER 1 + */ + +static const int UDP_DEF_TTL = 64; + +class udpPacket +{ + public: + udpPacket(struct sockaddr_in *addr, void *dta, int dlen) + :raddr(*addr), len(dlen) + { + data = malloc(len); + memcpy(data, dta, len); + } + + ~udpPacket() + { + if (data) + { + free(data); + data = NULL; + len = 0; + } + } + + struct sockaddr_in raddr; + void *data; + int len; +}; + + +std::ostream &operator<<(std::ostream &out, struct sockaddr_in &addr) +{ + out << "[" << inet_ntoa(addr.sin_addr) << ":"; + out << htons(addr.sin_port) << "]"; + return out; +} + + +bool operator==(struct sockaddr_in &addr, struct sockaddr_in &addr2) +{ + if (addr.sin_family != addr2.sin_family) + return false; + if (addr.sin_addr.s_addr != addr2.sin_addr.s_addr) + return false; + if (addr.sin_port != addr2.sin_port) + return false; + return true; +} + +std::string printPkt(void *d, int size) +{ + std::ostringstream out; + out << "Packet:" << "**********************"; + for(int i = 0; i < size; i++) + { + if (i % 16 == 0) + out << std::endl; + out << std::hex << std::setw(2) << (unsigned int) ((unsigned char *) d)[i] << " "; + } + out << std::endl << "**********************"; + out << std::endl; + return out.str(); +} + + +std::string printPktOffset(unsigned int offset, void *d, unsigned int size) +{ + std::ostringstream out; + out << "Packet:" << "**********************"; + out << std::endl; + out << "Offset: " << std::hex << offset << " -> " << offset + size; + out << std::endl; + out << "Packet:" << "**********************"; + + unsigned int j = offset % 16; + if (j != 0) + { + out << std::endl; + out << std::hex << std::setw(6) << (unsigned int) offset - j; + out << ": "; + for(unsigned int i = 0; i < j; i++) + { + out << "xx "; + } + } + for(unsigned int i = offset; i < offset + size; i++) + { + if (i % 16 == 0) + { + out << std::endl; + out << std::hex << std::setw(6) << (unsigned int) i; + out << ": "; + } + out << std::hex << std::setw(2) << (unsigned int) ((unsigned char *) d)[i-offset] << " "; + } + out << std::endl << "**********************"; + out << std::endl; + return out.str(); +} + + + +UdpLayer::UdpLayer(struct sockaddr_in &local) + :laddr(local), raddrKnown(false), errorState(0), ttl(UDP_DEF_TTL) +{ + openSocket(); + return; +} + +int UdpLayer::status(std::ostream &out) +{ + out << "UdpLayer::status()" << std::endl; + out << "localaddr: " << laddr << std::endl; + if (raddrKnown) + { + out << "remoteaddr: " << raddr << std::endl; + } + else + { + out << "remoteaddr unKnown!" << std::endl; + } + out << "sockfd: " << sockfd << std::endl; + out << std::endl; + return 1; +} + +int UdpLayer::close() +{ + /* close socket if open */ + if (sockfd > 0) + { + tounet_close(sockfd); + } + return 1; +} + + +/* higher level interface */ +int UdpLayer::readPkt(void *data, int *size) +{ + int nsize = *size; + struct sockaddr_in from; + if (0 >= receiveUdpPacket(data, &nsize, from)) + { +#ifdef DEBUG_UDP_LAYER + //std::cerr << "UdpLayer::readPkt() not ready" << from; + //std::cerr << std::endl; +#endif + return -1; + } + +#ifdef DEBUG_UDP_LAYER + //std::cerr << "UdpLayer::readPkt() from : " << from << std::endl; + //std::cerr << printPkt(data, nsize); +#endif + + if ((raddrKnown) && (from == raddr)) + { +#ifdef DEBUG_UDP_LAYER + std::cerr << "UdpLayer::readPkt() from RemoteAddr: " << from; + std::cerr << std::endl; +#endif + *size = nsize; + return nsize; + } + +#ifdef DEBUG_UDP_LAYER + std::cerr << "UdpLayer::readPkt() from unknown remote addr: " << from; + std::cerr << std::endl; +#endif + std::cerr << "UdpLayer::readPkt() storing Random packet from: " << from; + std::cerr << std::endl; + randomPkts.push_back(new udpPacket(&from,data, nsize)); + return -1; +} + +int UdpLayer::sendPkt(void *data, int size) +{ + if (raddrKnown) + { +#ifdef DEBUG_UDP_LAYER + std::cerr << "UdpLayer::sendPkt() to: " << raddr << std::endl; + //std::cerr << printPkt(data, size); +#endif + sendUdpPacket(data, size, raddr); + return size; + } + else + { +#ifdef DEBUG_UDP_LAYER + std::cerr << "UdpLayer::sendPacket() unknown remote addr!"; + std::cerr << std::endl; +#endif + return -1; + } + return 1; +} + + +/* setup connections */ +int UdpLayer::openSocket() +{ + /* make a socket */ + sockfd = tounet_socket(PF_INET, SOCK_DGRAM, 0); +#ifdef DEBUG_UDP_LAYER + std::cerr << "UpdStreamer::openSocket()" << std::endl; +#endif + /* bind to address */ + if (0 != tounet_bind(sockfd, (struct sockaddr *) (&laddr), sizeof(laddr))) + { +#ifdef DEBUG_UDP_LAYER + std::cerr << "Socket Failed to Bind to : " << laddr << std::endl; + std::cerr << "Error: " << tounet_errno() << std::endl; +#endif + errorState = EADDRINUSE; + //exit(1); + return -1; + } + + if (-1 == tounet_fcntl(sockfd, F_SETFL, O_NONBLOCK)) + { +#ifdef DEBUG_UDP_LAYER + std::cerr << "Failed to Make Non-Blocking" << std::endl; +#endif + } + +#ifdef DEBUG_UDP_LAYER + std::cerr << "Socket Bound to : " << laddr << std::endl; +#endif +#ifdef DEBUG_UDP_LAYER + std::cerr << "Setting TTL to " << UDP_DEF_TTL << std::endl; +#endif + setTTL(UDP_DEF_TTL); + + errorState = 0; + return 1; + +} + +int UdpLayer::setTTL(int t) +{ + int err = tounet_setsockopt(sockfd, IPPROTO_IP, IP_TTL, &t, sizeof(int)); + ttl = t; + +#ifdef DEBUG_UDP_LAYER + std::cerr << "UdpLayer::setTTL(" << t << ") returned: " << err; + std::cerr << std::endl; +#endif + + return err; +} + +int UdpLayer::getTTL() +{ + return ttl; +} + + + +int UdpLayer::sendToProxy(struct sockaddr_in &proxy, const void *data, int size) +{ + sendUdpPacket(data, size, proxy); + return 1; +} + +int UdpLayer::setRemoteAddr(struct sockaddr_in &remote) +{ + raddr = remote; + raddrKnown = true; + return 1; +} + + +int UdpLayer::getRemoteAddr(struct sockaddr_in &remote) +{ + if (raddrKnown) + { + remote = raddr; + return 1; + } + return 0; +} + +/* monitoring / updates */ +int UdpLayer::okay() +{ + bool nonFatalError = ((errorState == 0) || + (errorState == EAGAIN) || + (errorState == EINPROGRESS)); + +#ifdef DEBUG_UDP_LAYER + if (!nonFatalError) + { + std::cerr << "UdpLayer::NOT okay(): Error: " << errorState << std::endl; + } + +#endif + + return nonFatalError; +} + +int UdpLayer::tick() +{ +#ifdef DEBUG_UDP_LAYER + std::cerr << "UdpLayer::tick()" << std::endl; +#endif + return 1; +} +/******************* Internals *************************************/ + + +ssize_t UdpLayer::recvRndPktfrom(void *buf, size_t len, int flags, + struct sockaddr *from, socklen_t *fromlen) +{ +#ifdef DEBUG_UDP_LAYER + std::cerr << "UdpLayer::recvRndPktfrom()" << std::endl; +#endif + + if (*fromlen != sizeof(struct sockaddr_in)) + { + +#ifdef DEBUG_UDP_LAYER + std::cerr << "UdpLayer::recvRndPktfrom() bad address length" << std::endl; +#endif + return -1; + } + + /* if raddr not known -> then we're not connected + * at a higher level and therefore our queue + * will not be filled (no ticking).... + * so feel free the get data. + */ + + if (randomPkts.size() == 0) + { + if (!raddrKnown) + { +#ifdef DEBUG_UDP_LAYER + std::cerr << "UdpLayer::recvRndPktfrom() Checking Directly" << std::endl; +#endif + int size = len; + int ret = receiveUdpPacket(buf, &size, *((struct sockaddr_in *) from)); + if (ret > 0) + { +#ifdef DEBUG_UDP_LAYER + std::cerr << "UdpLayer::recvRndPktfrom() Got Pkt directly" << std::endl; + std::cerr << "Pkt from:" << inet_ntoa(((struct sockaddr_in *) from)->sin_addr); + std::cerr << ":" << ntohs(((struct sockaddr_in *) from)->sin_port) << std::endl; +#endif + return ret; + } + } + +#ifdef DEBUG_UDP_LAYER + std::cerr << "UdpLayer::recvRndPktfrom() Nothing in the Queue" << std::endl; +#endif + return -1; + } + + udpPacket *pkt = randomPkts.front(); + randomPkts.pop_front(); + + *((struct sockaddr_in *) from) = pkt->raddr; + unsigned int size = pkt->len; + if (len < size) + { + size = len; + } + + memcpy(buf, pkt->data, size); + *((struct sockaddr_in *) from) = pkt->raddr; + +#ifdef DEBUG_UDP_LAYER + std::cerr << "UdpLayer::recvRndPktfrom() returning stored Pkt" << std::endl; + std::cerr << "Pkt from:" << inet_ntoa(pkt->raddr.sin_addr); + std::cerr << ":" << ntohs(pkt->raddr.sin_port) << std::endl; + std::cerr << "Length: " << pkt->len << std::endl; +#endif + + delete pkt; + return size; +} + +/******************* Internals *************************************/ + + +int UdpLayer::receiveUdpPacket(void *data, int *size, struct sockaddr_in &from) +{ + struct sockaddr_in fromaddr; + socklen_t fromsize = sizeof(fromaddr); + int insize = *size; + if (0<(insize=tounet_recvfrom(sockfd,data,insize,0, + (struct sockaddr*)&fromaddr,&fromsize))) + { +#ifdef DEBUG_UDP_LAYER + std::cerr << "receiveUdpPacket() from: " << fromaddr; + std::cerr << " Size: " << insize; + std::cerr << std::endl; +#endif + *size = insize; + from = fromaddr; + return insize; + } + return -1; +} + +int UdpLayer::sendUdpPacket(const void *data, int size, struct sockaddr_in &to) +{ + /* send out */ +#ifdef DEBUG_UDP_LAYER + std::cerr << "UdpLayer::sendUdpPacket(): size: " << size; + std::cerr << " To: " << to << std::endl; +#endif + struct sockaddr_in toaddr = to; + + tounet_sendto(sockfd, data, size, 0, + (struct sockaddr *) &(toaddr), + sizeof(toaddr)); + return 1; +} + + + + diff --git a/libretroshare/src/tcponudp/udplayer.h b/libretroshare/src/tcponudp/udplayer.h new file mode 100644 index 000000000..338ba5342 --- /dev/null +++ b/libretroshare/src/tcponudp/udplayer.h @@ -0,0 +1,190 @@ +/* + * "$Id: udplayer.h,v 1.5 2007-02-18 21:46:50 rmf24 Exp $" + * + * TCP-on-UDP (tou) network interface for RetroShare. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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". + * + */ + + + +#ifndef TOU_UDP_LAYER_H +#define TOU_UDP_LAYER_H + + +/* +#include +#include +#include +*/ + +/* universal networking functions */ +#include "tou_net.h" + +#include +#include +#include + +std::ostream &operator<<(std::ostream &out, struct sockaddr_in &addr); +bool operator==(struct sockaddr_in &addr, struct sockaddr_in &addr2); +std::string printPkt(void *d, int size); +std::string printPktOffset(unsigned int offset, void *d, unsigned int size); + + +/* So the UdpLayer ..... has a couple of roles + * + * Firstly Send Proxy Packet() (for address determination). + * all the rest of this functionality is handled elsewhere. + * + * Secondly support TcpStreamer.... + */ + +class udpPacket; + +class UdpLayer +{ + public: + + UdpLayer(struct sockaddr_in &local); +virtual ~UdpLayer() { return; } + +int status(std::ostream &out); + + /* setup connections */ + int openSocket(); + int setTTL(int t); + int getTTL(); + + int sendToProxy(struct sockaddr_in &proxy, const void *data, int size); + int setRemoteAddr(struct sockaddr_in &remote); + int getRemoteAddr(struct sockaddr_in &remote); + + /* Higher Level Interface */ + int readPkt(void *data, int *size); + int sendPkt(void *data, int size); + + /* monitoring / updates */ + int okay(); + int tick(); + + int close(); + + /* unix like interface for recving packets not part + * of the tcp stream + */ +ssize_t recvRndPktfrom(void *buf, size_t len, int flags, + struct sockaddr *from, socklen_t *fromlen); + + /* data */ + /* internals */ + protected: + +virtual int receiveUdpPacket(void *data, int *size, struct sockaddr_in &from); +virtual int sendUdpPacket(const void *data, int size, struct sockaddr_in &to); + + /* low level */ + /* + * int rwSocket(); + */ + private: + + + struct sockaddr_in paddr; /* proxy addr */ + struct sockaddr_in raddr; /* remote addr */ + struct sockaddr_in laddr; /* local addr */ + + bool raddrKnown; + int errorState; + int sockfd; + + int ttl; + + std::deque randomPkts; + +}; + +#include + +class LossyUdpLayer: public UdpLayer +{ + public: + + LossyUdpLayer(struct sockaddr_in &local, double frac) + :UdpLayer(local), lossFraction(frac) + { + return; + } + virtual ~LossyUdpLayer() { return; } + + protected: + + virtual int receiveUdpPacket(void *data, int *size, struct sockaddr_in &from) + { + double prob = (1.0 * (rand() / (RAND_MAX + 1.0))); + + if (prob < lossFraction) + { + /* but discard */ + if (0 < UdpLayer::receiveUdpPacket(data, size, from)) + { + std::cerr << "LossyUdpLayer::receiveUdpPacket() Dropping packet!"; + std::cerr << std::endl; + std::cerr << printPkt(data, *size); + std::cerr << std::endl; + std::cerr << "LossyUdpLayer::receiveUdpPacket() Packet Dropped!"; + std::cerr << std::endl; + } + + size = 0; + return -1; + + } + + // otherwise read normally; + return UdpLayer::receiveUdpPacket(data, size, from); + } + + + virtual int sendUdpPacket(const void *data, int size, struct sockaddr_in &to) + { + double prob = (1.0 * (rand() / (RAND_MAX + 1.0))); + + if (prob < lossFraction) + { + /* discard */ + + std::cerr << "LossyUdpLayer::sendUdpPacket() Dropping packet!"; + std::cerr << std::endl; + std::cerr << printPkt((void *) data, size); + std::cerr << std::endl; + std::cerr << "LossyUdpLayer::sendUdpPacket() Packet Dropped!"; + std::cerr << std::endl; + + return size; + } + + // otherwise read normally; + return UdpLayer::sendUdpPacket(data, size, to); + } + + double lossFraction; +}; + +#endif diff --git a/libretroshare/src/upnp/Makefile b/libretroshare/src/upnp/Makefile new file mode 100644 index 000000000..f11b528db --- /dev/null +++ b/libretroshare/src/upnp/Makefile @@ -0,0 +1,26 @@ + +RS_TOP_DIR = .. +include ../make.opt + +OBJ = upnphandler.o upnputil.o + +CFLAGS += -I$(UPNPC_DIR) -DMINIUPNP_EXPORTS + +all : $(OBJ) librs upnptest + +upnptest: $(OBJ) upnptest.o + $(CC) $(CFLAGS) -o upnptest $(OBJ) upnptest.o $(RSLIBS) + +librs: $(OBJ) + $(AR) r $(LIBRS) $(OBJ) + $(RANLIB) $(LIBRS) + +.cc.o: + $(CC) $(CFLAGS) -c $< + +clean: + -/bin/rm $(OBJ) upnptest.o + +clobber: clean + -/bin/rm upnptest + diff --git a/libretroshare/src/upnp/upnphandler.cc b/libretroshare/src/upnp/upnphandler.cc new file mode 100644 index 000000000..a17b83943 --- /dev/null +++ b/libretroshare/src/upnp/upnphandler.cc @@ -0,0 +1,356 @@ + +#include "dht/dhthandler.h" + + +/* This stuff is actually C */ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +} /* extern C */ +#endif +/* This stuff is actually C */ + + + + +/* HACK TO SWITCH THIS OFF during testing */ +/*define NO_UPNP_RUNNING 1*/ + +#include "upnp/upnputil.h" +#include "upnp/upnphandler.h" + +class uPnPConfigData +{ + public: + struct UPNPDev * devlist; + struct UPNPUrls urls; + struct IGDdatas data; + char lanaddr[16]; /* my ip address on the LAN */ +}; + +#include +#include + + +void upnphandler::run() +{ + + /* infinite loop */ + while(1) + { + std::cerr << "UPnPHandler::Run()" << std::endl; + int allowedSleep = 30; /* check every 30 seconds */ + + /* lock it up */ + dataMtx.lock(); /* LOCK MUTEX */ + + bool shutdown = toShutdown; + int state = upnpState; + + dataMtx.unlock(); /* UNLOCK MUTEX */ + + if (shutdown) + { + return; + } + + /* do the work! */ + checkUPnPState(); + + /* check new state for sleep period */ + + dataMtx.lock(); /* LOCK MUTEX */ + + state = upnpState; + + dataMtx.unlock(); /* UNLOCK MUTEX */ + + + /* state machine */ + switch(state) + { + case RS_UPNP_S_UNINITIALISED: + case RS_UPNP_S_UNAVAILABLE: + /* failed ... try again in 30 min. */ + allowedSleep = 1800; + break; + + case RS_UPNP_S_READY: + case RS_UPNP_S_TCP_FAILED: + case RS_UPNP_S_UDP_FAILED: + case RS_UPNP_S_ACTIVE: + /* working ... normal 15 seconds */ + allowedSleep = 15; + break; + + default: + /* default??? how did it get here? */ + break; + } + + std::cerr << "UPnPHandler::Run() sleeping for:" << allowedSleep << std::endl; +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS + sleep(allowedSleep); +#else + Sleep(1000 * allowedSleep); +#endif +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ + } + return; +} + +void upnphandler::checkUPnPState() +{ + dataMtx.lock(); /* LOCK MUTEX */ + + int state = upnpState; + + dataMtx.unlock(); /* UNLOCK MUTEX */ + + /* state machine */ + switch(state) + { + case RS_UPNP_S_UNINITIALISED: + case RS_UPNP_S_UNAVAILABLE: + initUPnPState(); + break; + + case RS_UPNP_S_READY: + case RS_UPNP_S_TCP_FAILED: + case RS_UPNP_S_UDP_FAILED: + case RS_UPNP_S_ACTIVE: + printUPnPState(); + updateUPnP(); + break; + + } + + return; +} + + +bool upnphandler::initUPnPState() +{ + /* allocate memory */ + uPnPConfigData *upcd = new uPnPConfigData; + + upcd->devlist = upnpDiscover(2000); + if(upcd->devlist) + { + struct UPNPDev * device; + printf("List of UPNP devices found on the network :\n"); + for(device=upcd->devlist;device;device=device->pNext) + { + printf("\n desc: %s\n st: %s\n", + device->descURL, device->st); + } + putchar('\n'); + if(UPNP_GetValidIGD(upcd->devlist, &(upcd->urls), + &(upcd->data), upcd->lanaddr, + sizeof(upcd->lanaddr))) + { + printf("Found valid IGD : %s\n", + upcd->urls.controlURL); + printf("Local LAN ip address : %s\n", + upcd->lanaddr); + + /* MODIFY STATE */ + dataMtx.lock(); /* LOCK MUTEX */ + + /* convert to ipaddress. */ + inet_aton(upcd->lanaddr, &(upnp_iaddr.sin_addr)); + upnp_iaddr.sin_port = iaddr.sin_port; + + upnpState = RS_UPNP_S_READY; + upnpConfig = upcd; /* */ + + dataMtx.unlock(); /* UNLOCK MUTEX */ + + + + + /* done -> READY */ + return 1; + + } + else + { + fprintf(stderr, "No valid UPNP Internet Gateway Device found.\n"); + } + + + freeUPNPDevlist(upcd->devlist); + upcd->devlist = 0; + } + else + { + fprintf(stderr, "No IGD UPnP Device found on the network !\n"); + } + + upnpState = RS_UPNP_S_UNAVAILABLE; + delete upcd; + upnpConfig = NULL; + + /* done, FAILED -> NOT AVAILABLE */ + + return 0; +} + +bool upnphandler::printUPnPState() +{ + std::cerr << "upnphandler::printUPnPState() ... locking"; + std::cerr << std::endl; + + dataMtx.lock(); /* LOCK MUTEX */ + + std::cerr << "upnphandler::printUPnPState() ... locked"; + std::cerr << std::endl; + + uPnPConfigData *config = upnpConfig; + if ((upnpState >= RS_UPNP_S_READY) && (config)) + { + DisplayInfos(&(config -> urls), &(config->data)); + GetConnectionStatus(&(config -> urls), &(config->data)); + ListRedirections(&(config -> urls), &(config->data)); + } + else + { + std::cerr << "UPNP not Ready" << std::endl; + } + + dataMtx.unlock(); /* UNLOCK MUTEX */ + + return 1; +} + + + +bool upnphandler::updateUPnP() +{ + dataMtx.lock(); /* LOCK MUTEX */ + + + uPnPConfigData *config = upnpConfig; + if (!((upnpState >= RS_UPNP_S_READY) && (config))) + { + return false; + } + + char eprot1[] = "TCP"; + char eprot2[] = "UDP"; + + /* if we're to unload -> unload */ + if ((toStop) && (eport_curr > 0)) + { + toStop = false; + + char eport1[256]; + char eport2[256]; + + snprintf(eport1, 256, "%d", eport_curr); + snprintf(eport2, 256, "%d", eport_curr + 1); + + std::cerr << "Attempting To Remove Redirection: port: " << eport1; + std::cerr << " Prot: " << eprot1; + std::cerr << std::endl; + + RemoveRedirect(&(config -> urls), &(config->data), + eport1, eprot1); + + + std::cerr << "Attempting To Remove Redirection: port: " << eport2; + std::cerr << " Prot: " << eprot2; + std::cerr << std::endl; + + RemoveRedirect(&(config -> urls), &(config->data), + eport2, eprot2); + + upnpState = RS_UPNP_S_READY; + } + + + /* if we're to load -> load */ + if (toStart) + { + /* select external ports */ + eport_curr = eport; + if (!eport_curr) + { + /* use local port if eport is zero */ + eport_curr = ntohs(iaddr.sin_port); + std::cerr << "Using LocalPort for extPort!"; + std::cerr << std::endl; + } + + if (!eport_curr) + { + std::cerr << "Invalid eport ... "; + std::cerr << std::endl; + return false; + } + + toStart = false; + + /* our port */ + char in_addr[256]; + char in_port1[256]; + char in_port2[256]; + char eport1[256]; + char eport2[256]; + + //struct sockaddr_in localAddr = iaddr; + if (iaddr.sin_addr.s_addr != upnp_iaddr.sin_addr.s_addr) + { + std::cerr << "Warning ... Address Mismatch!"; + std::cerr << std::endl; + } + + upnp_iaddr.sin_port = iaddr.sin_port; + struct sockaddr_in localAddr = upnp_iaddr; + + snprintf(in_port1, 256, "%d", ntohs(localAddr.sin_port)); + snprintf(in_port2, 256, "%d", ntohs(localAddr.sin_port) + 1); + snprintf(in_addr, 256, "%d.%d.%d.%d", + ((localAddr.sin_addr.s_addr >> 0) & 0xff), + ((localAddr.sin_addr.s_addr >> 8) & 0xff), + ((localAddr.sin_addr.s_addr >> 16) & 0xff), + ((localAddr.sin_addr.s_addr >> 24) & 0xff)); + + snprintf(eport1, 256, "%d", eport_curr); + snprintf(eport2, 256, "%d", eport_curr + 1); + + std::cerr << "Attempting Redirection: InAddr: " << in_addr; + std::cerr << " InPort: " << in_port1; + std::cerr << " ePort: " << eport1; + std::cerr << " eProt: " << eprot1; + std::cerr << std::endl; + + if (!SetRedirectAndTest(&(config -> urls), &(config->data), + in_addr, in_port1, eport1, eprot1)) + { + upnpState = RS_UPNP_S_TCP_FAILED; + } + else if (!SetRedirectAndTest(&(config -> urls), &(config->data), + in_addr, in_port2, eport2, eprot2)) + { + upnpState = RS_UPNP_S_UDP_FAILED; + } + else + { + upnpState = RS_UPNP_S_ACTIVE; + } + } + + dataMtx.unlock(); /* UNLOCK MUTEX */ + + + return true; + +} + + + diff --git a/libretroshare/src/upnp/upnphandler.h b/libretroshare/src/upnp/upnphandler.h new file mode 100644 index 000000000..54cd49ac8 --- /dev/null +++ b/libretroshare/src/upnp/upnphandler.h @@ -0,0 +1,230 @@ +#ifndef _RS_UPNP_IFACE_H +#define _RS_UPNP_IFACE_H + +#include + +#include "util/rsthreads.h" +#include +#include + +/* platform independent networking... */ +#include "pqi/pqinetwork.h" +#include "pqi/pqiaddrstore.h" + +class upnpentry +{ + public: + std::string name; + std::string id; + struct sockaddr_in addr; + unsigned int flags; + int status; + int lastTs; +}; + +class upnpforward +{ + public: + std::string name; + unsigned int flags; + struct sockaddr_in iaddr; + struct sockaddr_in eaddr; + int status; + int lastTs; +}; + +#define RS_UPNP_S_UNINITIALISED 0 +#define RS_UPNP_S_UNAVAILABLE 1 +#define RS_UPNP_S_READY 2 +#define RS_UPNP_S_TCP_FAILED 3 +#define RS_UPNP_S_UDP_FAILED 4 +#define RS_UPNP_S_ACTIVE 5 + +class uPnPConfigData; + +class upnphandler: public RsThread +{ + public: + + upnphandler() + :toShutdown(false), toEnable(false), + toStart(false), toStop(false), + eport(0), eport_curr(0), + upnpState(RS_UPNP_S_UNINITIALISED), + upnpConfig(NULL) + + { + return; + } + + ~upnphandler() + { + return; + } + + /* RsIface */ +void enableUPnP(bool active) +{ + dataMtx.lock(); /*** LOCK MUTEX ***/ + + toEnable = active; + + dataMtx.unlock(); /*** UNLOCK MUTEX ***/ +} + + /* RsIface */ +void shutdownUPnP() +{ + dataMtx.lock(); /*** LOCK MUTEX ***/ + + toShutdown = true; + + dataMtx.unlock(); /*** UNLOCK MUTEX ***/ +} + +void setupUPnPForwarding() +{ + dataMtx.lock(); /*** LOCK MUTEX ***/ + + toStart = true; + + dataMtx.unlock(); /*** UNLOCK MUTEX ***/ +} + +void shutdownUPnPForwarding() +{ + dataMtx.lock(); /*** LOCK MUTEX ***/ + + toStop = true; + + dataMtx.unlock(); /*** UNLOCK MUTEX ***/ +} + + + /* the address that the listening port is on */ +void setInternalAddress(struct sockaddr_in iaddr_in) +{ +// std::cerr << "UPnPHandler::setInternalAddress() pre Lock!" << std::endl; + dataMtx.lock(); /*** LOCK MUTEX ***/ +// std::cerr << "UPnPHandler::setInternalAddress() postLock!" << std::endl; + + if ((iaddr.sin_addr.s_addr != iaddr_in.sin_addr.s_addr) || + (iaddr.sin_port != iaddr_in.sin_port)) + { + iaddr = iaddr_in; + if (toEnable) + { + toStop = true; + toStart = true; + } + } + + dataMtx.unlock(); /*** UNLOCK MUTEX ***/ +} + +void setExternalPort(unsigned short eport_in) +{ +// std::cerr << "UPnPHandler::getExternalPort() pre Lock!" << std::endl; + dataMtx.lock(); /*** LOCK MUTEX ***/ +// std::cerr << "UPnPHandler::getExternalPort() postLock!" << std::endl; + + /* flag both shutdown/start -> for restart */ + if (eport != eport_in) + { + eport = eport_in; + if (toEnable) + { + toStop = true; + toStart = true; + } + } + + dataMtx.unlock(); /*** UNLOCK MUTEX ***/ +} + + /* as determined by uPnP */ +bool getInternalAddress(struct sockaddr_in &addr) +{ +// std::cerr << "UPnPHandler::getInternalAddress() pre Lock!" << std::endl; + dataMtx.lock(); /*** LOCK MUTEX ***/ +// std::cerr << "UPnPHandler::getInternalAddress() postLock!" << std::endl; + + addr = upnp_iaddr; + bool valid = (upnpState >= RS_UPNP_S_READY); + + dataMtx.unlock(); /*** UNLOCK MUTEX ***/ + + return valid; +} + +bool getExternalAddress(struct sockaddr_in &addr) +{ +// std::cerr << "UPnPHandler::getExternalAddress() pre Lock!" << std::endl; + dataMtx.lock(); /*** LOCK MUTEX ***/ +// std::cerr << "UPnPHandler::getExternalAddress() postLock!" << std::endl; + + addr = upnp_eaddr; + bool valid = (upnpState >= RS_UPNP_S_READY); + + dataMtx.unlock(); /*** UNLOCK MUTEX ***/ + + return valid; +} + +int getUPnPStatus(upnpentry &ent) +{ +// std::cerr << "UPnPHandler::getUPnPStatus() pre Lock!" << std::endl; + dataMtx.lock(); /*** LOCK MUTEX ***/ +// std::cerr << "UPnPHandler::getUPnPStatus() postLock!" << std::endl; + + /* TODO - define data structure first */ + int state = upnpState; + + dataMtx.unlock(); /*** UNLOCK MUTEX ***/ + + return state; +} + + +int init(); +int shutdown(); +int print(); + + /* must run thread */ +virtual void run(); + + private: + +bool initUPnPState(); +void checkUPnPState(); +bool printUPnPState(); +bool updateUPnP(); + + + /* Mutex for data below */ + RsMutex dataMtx; + + /* requested from rs */ + bool toShutdown; /* if set shuts down the thread. */ + + bool toEnable; /* overall on/off switch */ + bool toStart; /* if set start forwarding */ + bool toStop; /* if set stop forwarding */ + + struct sockaddr_in iaddr; + unsigned short eport; /* config */ + unsigned short eport_curr; /* current forwarded */ + + /* info from upnp */ + unsigned int upnpState; + uPnPConfigData *upnpConfig; + + struct sockaddr_in upnp_iaddr; + struct sockaddr_in upnp_eaddr; + + /* active port forwarding */ + std::list activeForwards; + +}; + +#endif /* _RS_UPNP_IFACE_H */ diff --git a/libretroshare/src/upnp/upnptest.cc b/libretroshare/src/upnp/upnptest.cc new file mode 100644 index 000000000..9f767b352 --- /dev/null +++ b/libretroshare/src/upnp/upnptest.cc @@ -0,0 +1,110 @@ + +#include "upnp/upnphandler.h" + + +int main(int argc, char **argv) +{ + + int id = argc % 3; + + /********* + char *fhash1 = "3509426505463458576487"; + char *hash2 = "1549879882341985914515"; + char *hash3 = "8743598543269526505434"; + + int port1 = 8754; + int port2 = 2355; + int port3 = 6621; + **********/ + + std::cerr << "Starting dhttest Id: " << id << std::endl; +/******************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#else + // Windows Networking Init. + WORD wVerReq = MAKEWORD(2,2); + WSADATA wsaData; + + if (0 != WSAStartup(wVerReq, &wsaData)) + { + std::cerr << "Failed to Startup Windows Networking"; + std::cerr << std::endl; + } + else + { + std::cerr << "Started Windows Networking"; + std::cerr << std::endl; + } + +#endif +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ + + #ifdef PTW32_STATIC_LIB + pthread_win32_process_attach_np(); + #endif + + + upnphandler upnp; + + upnp.start(); + +#ifdef NOTEVER + + if (id == 0) + { + dht.setOwnPort(port1); + dht.setOwnHash(hash1); + + dht.addFriend(hash2); + dht.addFriend(hash3); + } + else if (id == 1) + { + dht.setOwnPort(port2); + dht.setOwnHash(hash2); + + dht.addFriend(hash1); + dht.addFriend(hash3); + } + else + { + dht.setOwnPort(port3); + dht.setOwnHash(hash3); + + dht.addFriend(hash1); + dht.addFriend(hash2); + } +#endif /* NOTEVER */ + + for(int i = 0; 1; i++) + { + +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS + sleep(1); +#else + + Sleep(1000); +#endif +/********************************** WINDOWS/UNIX SPECIFIC PART ******************/ + + if (i % 300 == 10) + { + /* start up a forward */ + upnp.setupUPnPForwarding(); + + } + + if (i % 300 == 20) + { + /* shutdown a forward */ + upnp.shutdownUPnPForwarding(); + + } + + } + + +} + diff --git a/libretroshare/src/upnp/upnputil.c b/libretroshare/src/upnp/upnputil.c new file mode 100644 index 000000000..915f5dc12 --- /dev/null +++ b/libretroshare/src/upnp/upnputil.c @@ -0,0 +1,201 @@ + +#include "upnp/upnputil.h" + +/* protofix() checks if protocol is "UDP" or "TCP" + * returns NULL if not */ +const char * protofix(const char * proto) +{ + static const char proto_tcp[4] = { 'T', 'C', 'P', 0}; + static const char proto_udp[4] = { 'U', 'D', 'P', 0}; + int i, b; + for(i=0, b=1; i<4; i++) + b = b && ( (proto[i] == proto_tcp[i]) + || (proto[i] == (proto_tcp[i] | 32)) ); + if(b) + return proto_tcp; + for(i=0, b=1; i<4; i++) + b = b && ( (proto[i] == proto_udp[i]) + || (proto[i] == (proto_udp[i] | 32)) ); + if(b) + return proto_udp; + return 0; +} + +void DisplayInfos(struct UPNPUrls * urls, + struct IGDdatas * data) +{ + char externalIPAddress[16]; + char connectionType[64]; + char status[64]; + unsigned int uptime; + unsigned int brUp, brDown; + UPNP_GetConnectionTypeInfo(urls->controlURL, + data->servicetype, + connectionType); + if(connectionType[0]) + printf("Connection Type : %s\n", connectionType); + else + printf("GetConnectionTypeInfo failed.\n"); + UPNP_GetStatusInfo(urls->controlURL, data->servicetype, status, &uptime); + printf("Status : %s, uptime=%u\n", status, uptime); + UPNP_GetLinkLayerMaxBitRates(urls->controlURL_CIF, data->servicetype_CIF, + &brDown, &brUp); + printf("MaxBitRateDown : %u bps MaxBitRateUp %u bps\n", brDown, brUp); + UPNP_GetExternalIPAddress(urls->controlURL, + data->servicetype, + externalIPAddress); + if(externalIPAddress[0]) + printf("ExternalIPAddress = %s\n", externalIPAddress); + else + printf("GetExternalIPAddress failed.\n"); +} + +void GetConnectionStatus(struct UPNPUrls * urls, + struct IGDdatas * data) +{ + unsigned int bytessent, bytesreceived, packetsreceived, packetssent; + DisplayInfos(urls, data); + bytessent = UPNP_GetTotalBytesSent(urls->controlURL_CIF, data->servicetype_CIF); + bytesreceived = UPNP_GetTotalBytesReceived(urls->controlURL_CIF, data->servicetype_CIF); + packetssent = UPNP_GetTotalPacketsSent(urls->controlURL_CIF, data->servicetype_CIF); + packetsreceived = UPNP_GetTotalPacketsReceived(urls->controlURL_CIF, data->servicetype_CIF); + printf("Bytes: Sent: %8u\tRecv: %8u\n", bytessent, bytesreceived); + printf("Packets: Sent: %8u\tRecv: %8u\n", packetssent, packetsreceived); +} + +void ListRedirections(struct UPNPUrls * urls, + struct IGDdatas * data) +{ + int r; + int i = 0; + char index[6]; + char intClient[16]; + char intPort[6]; + char extPort[6]; + char protocol[4]; + char desc[80]; + char enabled[6]; + char rHost[64]; + char duration[16]; + /*unsigned int num=0; + UPNP_GetPortMappingNumberOfEntries(urls->controlURL, data->servicetype, &num); + printf("PortMappingNumberOfEntries : %u\n", num);*/ + do { + snprintf(index, 6, "%d", i); + rHost[0] = '\0'; enabled[0] = '\0'; + duration[0] = '\0'; desc[0] = '\0'; + extPort[0] = '\0'; intPort[0] = '\0'; intClient[0] = '\0'; + r = UPNP_GetGenericPortMappingEntry(urls->controlURL, data->servicetype, + index, + extPort, intClient, intPort, + protocol, desc, enabled, + rHost, duration); + if(r==0) + printf("%02d - %s %s->%s:%s\tenabled=%s leaseDuration=%s\n" + " desc='%s' rHost='%s'\n", + i, protocol, extPort, intClient, intPort, + enabled, duration, + desc, rHost); + i++; + } while(r==0); +} + +/* Test function + * 1 - get connection type + * 2 - get extenal ip address + * 3 - Add port mapping + * 4 - get this port mapping from the IGD */ +bool SetRedirectAndTest(struct UPNPUrls * urls, + struct IGDdatas * data, + const char * iaddr, + const char * iport, + const char * eport, + const char * proto) +{ + char externalIPAddress[16]; + char intClient[16]; + char intPort[6]; + int r; + int ok = 1; + + if(!iaddr || !iport || !eport || !proto) + { + fprintf(stderr, "Wrong arguments\n"); + return 0; + } + proto = protofix(proto); + if(!proto) + { + fprintf(stderr, "invalid protocol\n"); + return 0; + } + + UPNP_GetExternalIPAddress(urls->controlURL, + data->servicetype, + externalIPAddress); + if(externalIPAddress[0]) + printf("ExternalIPAddress = %s\n", externalIPAddress); + else + printf("GetExternalIPAddress failed.\n"); + + r = UPNP_AddPortMapping(urls->controlURL, data->servicetype, + eport, iport, iaddr, 0, proto); + if(r==0) + { + printf("AddPortMapping(%s, %s, %s) failed\n", eport, iport, iaddr); + ok = 0; + } + + UPNP_GetSpecificPortMappingEntry(urls->controlURL, + data->servicetype, + eport, proto, + intClient, intPort); + if(intClient[0]) + printf("InternalIP:Port = %s:%s\n", intClient, intPort); + else + { + printf("GetSpecificPortMappingEntry failed.\n"); + ok = 0; + } + + printf("external %s:%s is redirected to internal %s:%s\n", + externalIPAddress, eport, intClient, intPort); + + if (ok) + { + printf("uPnP Forward/Mapping Succeeded\n"); + } + else + { + printf("uPnP Forward/Mapping Failed\n"); + } + + return ok; +} + + + +bool +RemoveRedirect(struct UPNPUrls * urls, + struct IGDdatas * data, + const char * eport, + const char * proto) +{ + if(!proto || !eport) + { + fprintf(stderr, "invalid arguments\n"); + return 0; + } + proto = protofix(proto); + if(!proto) + { + fprintf(stderr, "protocol invalid\n"); + return 0; + } + UPNP_DeletePortMapping(urls->controlURL, data->servicetype, eport, proto); + + return 1; +} + + +/* EOF */ diff --git a/libretroshare/src/upnp/upnputil.h b/libretroshare/src/upnp/upnputil.h new file mode 100644 index 000000000..3c8e74b18 --- /dev/null +++ b/libretroshare/src/upnp/upnputil.h @@ -0,0 +1,48 @@ + +#ifndef MINIUPNP_UTIL_H_ +#define MINIUPNP_UTIL_H_ + +/* $Id: upnpc.c,v 1.50 2007/04/26 19:00:10 nanard Exp $ */ +/* Project : miniupnp + * Author : Thomas Bernard + * Copyright (c) 2005 Thomas Bernard + * This software is subject to the conditions detailed in the + * LICENCE file provided in this distribution. + * */ +#include +#include +#include +#ifdef WIN32 +#include +#define snprintf _snprintf +#endif +#include "miniwget.h" +#include "miniupnpc.h" +#include "upnpcommands.h" + +/* protofix() checks if protocol is "UDP" or "TCP" + * returns NULL if not */ +const char * protofix(const char * proto); +void DisplayInfos(struct UPNPUrls * urls, + struct IGDdatas * data); + +void GetConnectionStatus(struct UPNPUrls * urls, + struct IGDdatas * data); + +void ListRedirections(struct UPNPUrls * urls, + struct IGDdatas * data); + +bool SetRedirectAndTest(struct UPNPUrls * urls, + struct IGDdatas * data, + const char * iaddr, + const char * iport, + const char * eport, + const char * proto); + +bool RemoveRedirect(struct UPNPUrls * urls, + struct IGDdatas * data, + const char * eport, + const char * proto); + +/* EOF */ +#endif diff --git a/libretroshare/src/util/Makefile b/libretroshare/src/util/Makefile new file mode 100644 index 000000000..7b1566839 --- /dev/null +++ b/libretroshare/src/util/Makefile @@ -0,0 +1,27 @@ + +RS_TOP_DIR = .. +include ../make.opt + +OBJ = rsthreads.o rsdir.o + +all : $(OBJ) librs dirtest dir2test + +dirtest: $(OBJ) dirtest.o + $(CC) $(CFLAGS) -o dirtest $(OBJ) dirtest.o $(RSLIBS) + +dir2test: $(OBJ) dir2test.o + $(CC) $(CFLAGS) -o dir2test $(OBJ) dir2test.o $(RSLIBS) + +librs: $(OBJ) + $(AR) r $(LIBRS) $(OBJ) + $(RANLIB) $(LIBRS) + +.cc.o: + $(CC) $(CFLAGS) -c $< + +clean: + -/bin/rm $(OBJ) dirtest.o dir2test.o + +clobber: clean + -/bin/rm dirtest dir2test + diff --git a/libretroshare/src/util/dir2test.cc b/libretroshare/src/util/dir2test.cc new file mode 100644 index 000000000..efbf54c2e --- /dev/null +++ b/libretroshare/src/util/dir2test.cc @@ -0,0 +1,79 @@ +/* + * dirtest.cc + * + * RetroShare Test Program. + * + * Copyright 2004-2007 by Robert Fernie. + * + * 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 "util/rsdir.h" + +#include + +int processpath(std::string path); + +int main() +{ + + std::string path1 = "/home/tst1//test2///test3/"; + std::string path2 = "home2/tst4//test5///test6"; + std::string path3 = "//home3"; + std::string path4 = "//"; + std::string path5 = "/a/b/c/d/"; + std::string path6 = "a//b/c//d"; + + processpath(path1); + processpath(path2); + processpath(path3); + processpath(path4); + processpath(path5); + processpath(path6); + + return 1; +} + + +int processpath(std::string path) +{ + std::string pathtogo = path; + while(pathtogo != "") + { + std::string basedir = RsDirUtil::getRootDir(pathtogo); + std::string rempath = RsDirUtil::removeRootDir(pathtogo); + std::string topdir = RsDirUtil::getTopDir(pathtogo); + std::string remtoppath = RsDirUtil::removeTopDir(pathtogo); + + std::cerr << "Processing: \"" << pathtogo << "\"" << std::endl; + std::cerr << "\tRootDir : \"" << basedir << "\"" << std::endl; + std::cerr << "\tRemaining: \"" << rempath << "\"" << std::endl; + std::cerr << "\tTopDir : \"" << topdir << "\"" << std::endl; + std::cerr << "\tRemaining(Top): \"" << remtoppath << "\"" << std::endl; + std::cerr << std::endl; + + pathtogo = rempath; + } + return 1; +} + + + + + diff --git a/libretroshare/src/util/dirtest.cc b/libretroshare/src/util/dirtest.cc new file mode 100644 index 000000000..b2cbd4d3a --- /dev/null +++ b/libretroshare/src/util/dirtest.cc @@ -0,0 +1,99 @@ + +/* + * "$Id: dirtest.cc,v 1.1 2007-02-19 20:08:30 rmf24 Exp $" + * + * RetroShare C++ Interface. + * + * Copyright 2004-2007 by Robert Fernie. + * + * 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 "util/rsdir.h" + +#include +#include +#include + +bool testRsDirUtils(std::string path); + +int main() +{ + + std::list dirs; + std::list::iterator it; + dirs.push_back("/incoming/htuyr/file.txt"); + dirs.push_back("/incoming/htuyr/file.txt "); + dirs.push_back("/incoming/htuyr/file.txt/"); + dirs.push_back("/incoming/htuyr/file.txt//"); + dirs.push_back("/incoming/htuyr//file.txt//"); + dirs.push_back("/incoming/htuyr//file .txt"); + dirs.push_back("/incoming/htuyr/Q"); + dirs.push_back("/incoming/htuyr/Q//"); + dirs.push_back("/incoming/htuyr/Q/"); + dirs.push_back("/incoming/htuyr/Q/text"); + dirs.push_back("/home/tst1//test2///test3/"); + dirs.push_back("home2/tst4//test5///test6"); + dirs.push_back("//home3"); + dirs.push_back("//"); + dirs.push_back("A"); + dirs.push_back("ABC"); + dirs.push_back("////ABC////"); + dirs.push_back("A/B/C"); + + for(it = dirs.begin(); it != dirs.end(); it++) + { + testRsDirUtils(*it); + } +} + +bool testRsDirUtils(std::string path) +{ + + std::cerr << "RsUtilTest input: [" << path << "]"; + std::cerr << std::endl; + + std::string top = RsDirUtil::getTopDir(path); + std::string root = RsDirUtil::getRootDir(path); + std::string topdirs = RsDirUtil::removeRootDir(path); + std::string topdirs2 = RsDirUtil::removeRootDirs(path, root); + std::string restdirs = RsDirUtil::removeTopDir(path); + std::list split; + std::list::iterator it; + RsDirUtil::breakupDirList(path, split); + + std::cerr << "\tTop: [" << top << "]"; + std::cerr << std::endl; + std::cerr << "\tRest: [" << restdirs << "]"; + std::cerr << std::endl; + + std::cerr << "\tRoot: [" << root << "]"; + std::cerr << std::endl; + std::cerr << "\tRemoveRoot: [" << topdirs << "]"; + std::cerr << std::endl; + std::cerr << "\tSplit Up "; + for(it = split.begin(); it != split.end(); it++) + { + std::cerr << ":" << (*it); + } + std::cerr << std::endl; + std::cerr << std::endl; + return true; +} diff --git a/libretroshare/src/util/rsdir.cc b/libretroshare/src/util/rsdir.cc new file mode 100644 index 000000000..5fb9544bb --- /dev/null +++ b/libretroshare/src/util/rsdir.cc @@ -0,0 +1,279 @@ + +/* + * "$Id: rsdir.cc,v 1.1 2007-02-19 20:08:30 rmf24 Exp $" + * + * RetroShare C++ Interface. + * + * Copyright 2004-2007 by Robert Fernie. + * + * 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". + * + */ + +// Includes for directory creation. +#include +#include +#include + +#include "util/rsdir.h" +#include +#include + +std::string RsDirUtil::getTopDir(std::string dir) +{ + std::string top; + + /* find the subdir: [/][dir1.../][/] + */ + int i,j; + int len = dir.length(); + for(j = len - 1; (j > 0) && (dir[j] == '/'); j--); + for(i = j; (i > 0) && (dir[i] != '/'); i--); + + if (dir[i] == '/') + i++; + + for(; i <= j; i++) + { + top += dir[i]; + } + + return top; +} + +std::string RsDirUtil::removeTopDir(std::string dir) +{ + std::string rest; + + /* remove the subdir: [/][dir1.../][/] + */ + int i,j; + int len = dir.length(); + for(j = len - 1; (j > 0) && (dir[j] == '/'); j--); + for(i = j; (i >= 0) && (dir[i] != '/'); i--); + + /* remove any more slashes */ + for(; (i >= 0) && (dir[i] == '/'); i--); + + for(j = 0; j <= i; j++) + { + rest += dir[j]; + } + + return rest; +} + +std::string RsDirUtil::getRootDir(std::string dir) +{ + std::string root; + + /* find the subdir: [/]root[/...] + */ + int i,j; + int len = dir.length(); + for(i = 0; (i < len) && (dir[i] == '/'); i++); + for(j = i; (j < len) && (dir[j] != '/'); j++); + if (i == j) + return root; /* empty */ + for(; i < j; i++) + { + root += dir[i]; + } + return root; +} + +std::string RsDirUtil::removeRootDir(std::string path) +{ + unsigned int i, j; + unsigned int len = path.length(); + std::string output; + + /* chew leading '/'s */ + for(i = 0; (i < len) && (path[i] == '/'); i++); + if (i == len) + return output; /* empty string */ + + for(j = i; (j < len) && (path[j] != '/'); j++); /* run to next '/' */ + for(; (j < len) && (path[j] == '/'); j++); /* chew leading '/'s */ + + for(; j < len; j++) + { + output += path[j]; + } + + return output; +} + +std::string RsDirUtil::removeRootDirs(std::string path, std::string root) +{ + /* too tired */ + std::string notroot; + //std::cerr << "remoteRootDir( TODO! )"; + + unsigned int i = 0, j = 0; + + /* catch empty data */ + if ((root.length() < 1) || (path.length() < 1)) + return notroot; + + if ((path[0] == '/') && (root[0] != '/')) + { + i++; + } + + for(; (i < path.length()) && (j < root.length()) && (path[i] == root[j]); i++, j++); + + /* should have consumed root. */ + if (j == root.length()) + { + //std::cerr << "matched root!" << std::endl; + } + else + { + //std::cerr << "failed i: " << i << ", j: " << j << std::endl; + //std::cerr << "root: " << root << " path: " << path << std::endl; + return notroot; + } + + if (path[i] == '/') + { + i++; + } + + for(; i < path.length(); i++) + { + notroot += path[i]; + } + + //std::cerr << "Found NotRoot: " << notroot << std::endl; + + return notroot; +} + + + +int RsDirUtil::breakupDirList(std::string path, + std::list &subdirs) +{ + int start = 0; + unsigned int i; + for(i = 0; i < path.length(); i++) + { + if (path[i] == '/') + { + if (i - start > 0) + { + subdirs.push_back(path.substr(start, i-start)); + } + start = i+1; + } + } + // get the final one. + if (i - start > 0) + { + subdirs.push_back(path.substr(start, i-start)); + } + return 1; +} + + + +bool RsDirUtil::checkCreateDirectory(std::string dir) +{ + struct stat buf; + int val = stat(dir.c_str(), &buf); + if (val == -1) + { + // directory don't exist. create. +/******************************** WINDOWS/UNIX SPECIFIC PART ******************/ +#ifndef WINDOWS_SYS // UNIX + if (-1 == mkdir(dir.c_str(), 0777)) +#else // WIN + if (-1 == mkdir(dir.c_str())) +#endif +/******************************** WINDOWS/UNIX SPECIFIC PART ******************/ + + { + std::cerr << "check_create_directory() Fatal Error --"; + std::cerr < +//#include +//#include +//#include +//#include + +bool RsDirUtil::cleanupDirectory(std::string cleandir, std::list keepFiles) +{ + + /* check for the dir existance */ + DIR *dir = opendir(cleandir.c_str()); + std::list::const_iterator it; + + if (!dir) + { + return false; + } + + struct dirent *dent; + struct stat buf; + + while(NULL != (dent = readdir(dir))) + { + /* check entry type */ + std::string fname = dent -> d_name; + std::string fullname = cleandir + "/" + fname; + + if (-1 != stat(fullname.c_str(), &buf)) + { + /* only worry about files */ + if (S_ISREG(buf.st_mode)) + { + /* check if we should keep it */ + if (keepFiles.end() == (it = std::find(keepFiles.begin(), keepFiles.end(), fname))) + { + /* can remove */ + remove(fullname.c_str()); + } + } + } + } + /* close directory */ + closedir(dir); + + return true; +} + diff --git a/libretroshare/src/util/rsdir.h b/libretroshare/src/util/rsdir.h new file mode 100644 index 000000000..9eaf2b57e --- /dev/null +++ b/libretroshare/src/util/rsdir.h @@ -0,0 +1,52 @@ + +/* + * "$Id: rsdir.h,v 1.1 2007-02-19 20:08:30 rmf24 Exp $" + * + * RetroShare C++ Interface. + * + * Copyright 2004-2007 by Robert Fernie. + * + * 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". + * + */ + + +#ifndef RSUTIL_DIRFNS_H +#define RSUTIL_DIRFNS_H + +#include +#include + +namespace RsDirUtil { + +std::string getTopDir(std::string); +std::string getRootDir(std::string); +std::string removeRootDir(std::string path); +std::string removeTopDir(std::string dir); + +std::string removeRootDirs(std::string path, std::string root); + +int breakupDirList(std::string path, + std::list &subdirs); + +bool checkCreateDirectory(std::string dir); +bool cleanupDirectory(std::string dir, std::list keepFiles); + +}; + + +#endif diff --git a/libretroshare/src/util/rsthreads.cc b/libretroshare/src/util/rsthreads.cc new file mode 100644 index 000000000..467ccb6e9 --- /dev/null +++ b/libretroshare/src/util/rsthreads.cc @@ -0,0 +1,59 @@ + +/* + * "$Id: rsthreads.cc,v 1.1 2007-02-19 20:08:30 rmf24 Exp $" + * + * RetroShare C++ Interface. + * + * Copyright 2004-2007 by Robert Fernie. + * + * 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 "rsthreads.h" + +extern "C" void* rsthread_init(void* p) +{ + RsThread *thread = (RsThread *) p; + if (!thread) + { + return 0; + } + thread -> run(); + return 0; +} + + +pthread_t createThread(RsThread &thread) +{ + pthread_t tid; + void *data = (void *) (&thread); + + thread.mMutex.lock(); + { + pthread_create(&tid, 0, &rsthread_init, data); + thread.mTid = tid; + } + thread.mMutex.unlock(); + + return tid; + +} + + + diff --git a/libretroshare/src/util/rsthreads.h b/libretroshare/src/util/rsthreads.h new file mode 100644 index 000000000..84de3a0c5 --- /dev/null +++ b/libretroshare/src/util/rsthreads.h @@ -0,0 +1,67 @@ +#ifndef RSIFACE_THREADS_H +#define RSIFACE_THREADS_H + +/* + * "$Id: rsthreads.h,v 1.1 2007-02-19 20:08:30 rmf24 Exp $" + * + * RetroShare C++ Interface. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 + +/* RsIface Thread Wrappers */ + +class RsMutex +{ + public: + + RsMutex() { pthread_mutex_init(&realMutex, NULL); } + ~RsMutex() { pthread_mutex_destroy(&realMutex); } +void lock() { pthread_mutex_lock(&realMutex); } +void unlock() { pthread_mutex_unlock(&realMutex); } +bool trylock() { return (0 == pthread_mutex_trylock(&realMutex)); } + + private: + pthread_mutex_t realMutex; +}; + +class RsThread; + +/* to create a thread! */ +pthread_t createThread(RsThread &thread); + +class RsThread +{ + public: + RsThread() { return; } +virtual ~RsThread() { return; } + +virtual void start() { createThread(*this); } +virtual void run() = 0; /* called once the thread is started */ + + pthread_t mTid; + RsMutex mMutex; +}; + + +#endif diff --git a/retroshare-gui/src/README.txt b/retroshare-gui/src/README.txt new file mode 100644 index 000000000..0aaf050ef --- /dev/null +++ b/retroshare-gui/src/README.txt @@ -0,0 +1,219 @@ + +Compiling + Running RetroShare (V0.3.0) +------------------------------------------------------------- + +Quick Requirements: +--------------------------------------------- +Libraries/Tools: + C/C++ Compiler. (standard on Linux/cygwin) + OpenSSL-0.9.7g-xpgp + KadC Dht library + Qt-4.2 development libraries. + qskinobject library (Required when compile with QT 4.3.x) + +RetroShare Source Code: ( from sf.net/projects/retroshare) + Qt-GUI-XXX.tgz + retroshare-src-v0.3.XXX.tgz + +Windows Requirements: + Cygwin (Windows Only) + Pthreads (Windows Only) + Zlib (Windows Only) +--------------------------------------------- + +OpenSSL-0.9.7g-xpgp is available at: +http://www.lunamutt.com/retroshare/openssl-0.9.7g-xpgp-0.1c.tgz + +KadC (latest) is available from sourceforge.net + +Download/Compile as per instructions... + +--------------------------------------------- + +Compiling Linux +--------------------------------------------- + +(1) compile openSSL-0.9.7g-xpgp. + +(2) compile KadC. (and correct the library) + +(4) Modify ./make.opts + (4a) modify the Makefile so that: OS=Linux or OS=Win + (4c) Define SSL_DIR to point to openSSL-0.9.7g-xpgp. + (4c) Define KADC_DIR to point to KadC + +(5) type: make + This builds ./lib/libretroshare.a, + and the various test programs. + + There is server-only (no GUI) executable + compiled in ./rsiface/retroshare-nogui, + you can run this to check that its working. + +--------------------------------------------- + +Compiling Linux (Alternative Instructions from Bharath) +--------------------------------------------- +here's how to compiled retroshare on ubuntu linux: + + compile openssl: + 1. Get the patched version of openssl (openssl-0.9.7g-xpgp, from http://www.lunamutt.com) + 2. run: + ./config + make + make test + + compile KadC: + 1. Get KadC library from http://kadc.sourceforge.net/ + 2. run: + make + + install packages needed for retroshare compile: + sudo apt-get install libxft-dev + sudo apt-get install libXinerama-dev + + complile retroshare: + 1. set directories in make.opt: + RS_DIR=/home/dev/rs-v0.3.0-pr8/src + SSL_DIR=/home/dev/openssl-0.9.7g-xpgp-0.1c + KADC_DIR=/home/dev/KadC + 2. comment out the directory declarations uncer Cygwin since that will override your directory declarations from 1. + 3. change RSLIBS = -L$(LIBDIR) -lretroshare -L$(SSL_DIR) -lssl -lcrypto -lpthread -lKadC + to + RSLIBS = -L$(LIBDIR) -lretroshare -L$(SSL_DIR) -lssl -lcrypto -lpthread -L$(KADC_DIR) -lKadC + 4. run: + make + +Hope this helps. + +--------------------------------------------- +Compiling the skinobject (only Required when compile with QT 4.3.x) + +1. Download skinobject from https://sourceforge.net/projects/qskinwindows/ + +http://downloads.sourceforge.net/qskinwindows/qskinobject-0.6.1.tar.bz2? + +2. untar the qskinobject-0.6.1.tar.bz2 + +3. run: +qmake +make + +4.Copy the libskin.a to your retroshare libs directory. + +5.then add to LIBS= -lskin to the RetroShare.pro file: + +example(linux): + +TARGET = RetroShare +RSLIBS = -L/path/to/your/retroshare/libs/directory/ -lretroshare -lKadC -lKadC -lminiupnpc -lskin -lssl -lcrypto +LIBS = $(RSLIBS) + +example (Windows): + +win32 +{ + RC_FILE = gui/images/retroshare_win.rc + + "LIBS += -L"../../winlibs" -lretroshare -lssl -lcrypto -lpthreadGC2d -lKadC -lminiupnpc -lz -lws2_32 -luuid -lole32 -liphlpapi -lcrypt32-cygwin -lskin -lgdi32 + CONFIG += qt release" +} + +--------------------------------------------- +Compiling QCheckers game +_____________________________________________ + +1.qmake +2.make +3.Copy the libqcheckers.a to your retroshare libs directory. +5.then add to LIBS= -lqcheckers to the RetroShare.pro file: + +example(linux): + +RSLIBS = -L/path/to/your/retroshare/libs/directory/ -lretroshare -lKadC -lKadC -lminiupnpc -lskin -lqcheckers -lssl -lcrypto +LIBS = $(RSLIBS) + +example (Windows): + +win32 +{ + RC_FILE = gui/images/retroshare_win.rc + + "LIBS += -L"../../winlibs" -lretroshare -lssl -lcrypto -lpthreadGC2d -lKadC -lminiupnpc -lz -lws2_32 -luuid -lole32 -liphlpapi -lcrypt32-cygwin -lskin -lqcheckers -lgdi32 + CONFIG += qt release" +} + +--------------------------------------------- +Compiling SMPlayer +_____________________________________________ + +1.qmake +2.make +3.Copy the libsmplayer.a to your retroshare libs directory. +5.then add to LIBS -lsmplayer to the RetroShare.pro file: +_____________________________________________ + +--------------------------------------------- +Compiling the Qt GUI +_____________________________________________ + +(1) untar the Qt-GUI source package. run qmake, + + tar -xvzf Qt-GUI-XXXX.tgz + + cd Qt-Gui-XXX/src/ + + qmake-qt4 Retroshare.pro + +(2) tweak the makefile: The default makefile + doesn't have the links to the retroshare + libraries. It should something like this: + +RSLIBS = -L/home/dev/prog/devel/rs-v0.3.0XXX/src/lib -lretroshare -lKadC +SSLLIBS = -L/home/dev/prog/devel/openssl-0.9.7g-xpgp -lssl -lcrypto +LIBS = $(SUBLIBS) $(RSLIBS) $(SSLLIBS) -L/usr/lib -lQtXml -lQtGui -lQtNetwork -lQtCore -lpthread + + This should build you an executable: + + RetroShare. + +------------------------------------------------ +This has been compiled on the following platforms: + (a) Debian Linux (stable/testing/unstable) + (b) Suse Linux (9.X/10.X) + (c) WinXP + +------------------------------------------------ +WIN XP Compilation. +------------------------------------------------ + +This much harder, and more perilous than the +Linux compilation: It requires both the cygwin +and the mingw compilers... + +Need: + Cygwin development environment + Qt4.2 opensource development kit + MinGw. + source code for all libraries. + +In Brief: +UNDER Cygwin: + (1) Compile openssl-xpgp. + (2) Compile pthreads. + (3) Compile zlib. + (4) Compile KadC. (there are some tweaks, + needed to the code) + + (5) Compile retroshare-v0.3.0 + +UNDER Mingw: + (6) Compile qskinobject (only under QT 4.3.x) + (7) Compile the Qt-Gui. + + +Email me if you're having trouble: + retroshare@lunamutt.com +--------------------------------------------- + + + diff --git a/retroshare-gui/src/RetroShare.pro b/retroshare-gui/src/RetroShare.pro new file mode 100644 index 000000000..ca22a8f7f --- /dev/null +++ b/retroshare-gui/src/RetroShare.pro @@ -0,0 +1,299 @@ +###################################################################### +# Automatically generated by qmake (2.00a) Fr 18. Aug 22:48:56 2006 +###################################################################### +OBJECTS_DIR = temp/obj +RCC_DIR = temp/qrc +UI_DIR = temp/ui +MOC_DIR = temp/moc +CONFIG += qt release +QT += network xml +TEMPLATE = app +TARGET += + + +DEPENDPATH += . \ + rsiface \ + config \ + control \ + gui \ + lang \ + util \ + games\qbackgammon \ + gui\bwgraph \ + gui\chat \ + gui\connect \ + gui\filehash \ + gui\images \ + gui\moreinfo \ + gui\Preferences \ + gui\common\ + gui\Settings \ + gui\toaster \ + gui\authdlg + +INCLUDEPATH += . \ + games/qcheckers \ + apps/smplayer + +# Input +HEADERS += rshare.h \ + rsiface/rsiface.h \ + rsiface/rstypes.h \ + rsiface/notifyqt.h \ + rsiface/RemoteDirModel.h \ + config/rshareSettings.h \ + control/bandwidthevent.h \ + control/eventtype.h \ + gui/DLListDelegate.h \ + gui/ULListDelegate.h \ + gui/StartDialog.h \ + gui/ChatDialog.h \ + gui/NetworkDialog.h \ + gui/GenCertDialog.h \ + gui/TransfersDialog.h \ + gui/graphframe.h \ + gui/linetypes.h \ + gui/mainpage.h \ + gui/mainpagestack.h \ + gui/MainWindow.h \ + gui/ApplicationWindow.h \ + gui/ExampleDialog.h \ + gui/MessengerWindow.h \ + gui/PeersDialog.h \ + gui/SearchDialog.h \ + gui/SharedFilesDialog.h \ + gui/StatisticDialog.h \ + gui/ChannelsDialog.h \ + gui/HelpDialog.h \ + gui/LogoBar.h \ + lang/languagesupport.h \ + util/process.h \ + util/registry.h \ + util/string.h \ + util/win32.h \ + util/RetroStyleLabel.h \ + util/dllexport.h \ + util/NonCopyable.h \ + util/rsutildll.h \ + util/dllexport.h \ + util/global.h \ + util/rsqtutildll.h \ + util/Interface.h \ + util/PixmapMerging.h \ + util/MouseEventFilter.h \ + util/EventFilter.h \ + util/Widget.h \ + util/rsversion.h \ + util/RsAction.h \ + gui/bwgraph/bwgraph.h \ + gui/chat/PopupChatDialog.h \ + gui/connect/ConnectDialog.h \ + gui/connect/ConfCertDialog.h \ + gui/connect/InviteDialog.h \ + gui/connect/AddFriendDialog.h \ + gui/connect/AddFriendWizard.h \ + gui/msgs/ChanMsgDialog.h \ + gui/msgs/ChanCreateDialog.h \ + gui/filehash/FileHashDialog.h \ + gui/images/retroshare_win.rc.h \ + gui/moreinfo/moreinfo.h \ + gui/Preferences/configpage.h \ + gui/Preferences/configpagestack.h \ + gui/Preferences/CryptographyDialog.h \ + gui/Preferences/DirectoriesDialog.h \ + gui/Preferences/LogDialog.h \ + gui/Preferences/GeneralDialog.h \ + gui/Preferences/PreferencesWindow.h \ + gui/Preferences/ServerDialog.h \ + gui/Preferences/ConfirmQuitDialog.h \ + gui/toaster/MessageToaster.h \ + gui/toaster/ChatToaster.h \ + gui/toaster/CallToaster.h \ + gui/toaster/QtToaster.h \ + gui/toaster/IQtToaster.h \ + gui/toaster/RetroStyleLabelProxy.h \ + gui/common/vmessagebox.h \ + gui/common/rwindow.h \ + gui/MessagesDialog.h \ + gui/Settings/gsettingswin.h \ + gui/Settings/GeneralPage.h \ + gui/Settings/DirectoriesPage.h \ + gui/Settings/ServerPage.h \ + gui/Settings/NetworkPage.h \ + gui/authdlg/AuthorizationDialog.h \ + gui/advsearch/advancedsearchdialog.h \ + gui/advsearch/expressionwidget.h \ + gui/advsearch/guiexprelement.h \ + games/qbackgammon/bgwindow.h \ + games/qbackgammon/bgwidget.h \ + games/qbackgammon/bgboard.h \ + games/qbackgammon/optionsdlg.h + +FORMS += gui/ChatDialog.ui \ + gui/StartDialog.ui \ + gui/GenCertDialog.ui \ + gui/NetworkDialog.ui \ + gui/TransfersDialog.ui \ + gui/MainWindow.ui \ + gui/ApplicationWindow.ui \ + gui/ExampleDialog.ui \ + gui/MessengerWindow.ui \ + gui/PeersDialog.ui \ + gui/SearchDialog.ui \ + gui/SharedFilesDialog.ui \ + gui/StatisticDialog.ui \ + gui/ChannelsDialog.ui \ + gui/MessagesDialog.ui \ + gui/HelpDialog.ui \ + gui/bwgraph/bwgraph.ui \ + gui/chat/PopupChatDialog.ui \ + gui/connect/ConnectDialog.ui \ + gui/connect/ConfCertDialog.ui \ + gui/connect/InviteDialog.ui \ + gui/connect/AddFriendDialog.ui \ + gui/connect/AddFriendWizard.ui \ + gui/msgs/ChanMsgDialog.ui \ + gui/msgs/ChanCreateDialog.ui \ + gui/filehash/FileHashDialog.ui \ + gui/moreinfo/moreinfo.ui \ + gui/Preferences/CryptographyDialog.ui \ + gui/Preferences/DirectoriesDialog.ui \ + gui/Preferences/LogDialog.ui \ + gui/Preferences/GeneralDialog.ui \ + gui/Preferences/PreferencesWindow.ui \ + gui/Preferences/ServerDialog.ui \ + gui/Preferences/ConfirmQuitDialog.ui \ + gui/toaster/CallToaster.ui \ + gui/toaster/ChatToaster.ui \ + gui/toaster/MessageToaster.ui \ + gui/Settings/settings.ui \ + gui/Settings/GeneralPage.ui \ + gui/Settings/DirectoriesPage.ui \ + gui/Settings/ServerPage.ui \ + gui/Settings/NetworkPage.ui \ + gui/authdlg/AuthorizationDialog.ui \ + gui/advsearch/advancedsearchdialog.ui \ + gui/advsearch/expressionwidget.ui + +SOURCES += main.cpp \ + rshare.cpp \ + rsiface/notifyqt.cpp \ + rsiface/RemoteDirModel.cpp \ + config/rshareSettings.cpp \ + gui/DLListDelegate.cpp \ + gui/ULListDelegate.cpp \ + gui/StartDialog.cpp \ + gui/GenCertDialog.cpp \ + gui/ChatDialog.cpp \ + gui/NetworkDialog.cpp \ + gui/TransfersDialog.cpp \ + gui/graphframe.cpp \ + gui/mainpagestack.cpp \ + gui/MainWindow.cpp \ + gui/ApplicationWindow.cpp \ + gui/ExampleDialog.cpp \ + gui/MessengerWindow.cpp \ + gui/PeersDialog.cpp \ + gui/SearchDialog.cpp \ + gui/SharedFilesDialog.cpp \ + gui/StatisticDialog.cpp \ + gui/ChannelsDialog.cpp \ + gui/MessagesDialog.cpp \ + gui/HelpDialog.cpp \ + gui/LogoBar.cpp \ + lang/languagesupport.cpp \ + util/process.cpp \ + util/registry.cpp \ + util/string.cpp \ + util/win32.cpp \ + util/RetroStyleLabel.cpp \ + util/WidgetBackgroundImage.cpp \ + util/NonCopyable.cpp \ + util/PixmapMerging.cpp \ + util/MouseEventFilter.cpp \ + util/EventFilter.cpp \ + util/Widget.cpp \ + util/rsversion.cpp \ + util/RsAction.cpp \ + gui/bwgraph/bwgraph.cpp \ + gui/chat/PopupChatDialog.cpp \ + gui/connect/ConnectDialog.cpp \ + gui/connect/ConfCertDialog.cpp \ + gui/connect/InviteDialog.cpp \ + gui/connect/AddFriendDialog.cpp \ + gui/connect/AddFriendWizard.cpp \ + gui/msgs/ChanMsgDialog.cpp \ + gui/msgs/ChanCreateDialog.cpp \ + gui/filehash/FileHashDialog.cpp \ + gui/moreinfo/moreinfo.cpp \ + gui/Preferences/configpagestack.cpp \ + gui/Preferences/CryptographyDialog.cpp \ + gui/Preferences/DirectoriesDialog.cpp \ + gui/Preferences/LogDialog.cpp \ + gui/Preferences/GeneralDialog.cpp \ + gui/Preferences/PreferencesWindow.cpp \ + gui/Preferences/ServerDialog.cpp \ + gui/Preferences/ConfirmQuitDialog.cpp \ + gui/common/vmessagebox.cpp \ + gui/common/rwindow.cpp \ + gui/Settings/gsettingswin.cpp \ + gui/Settings/GeneralPage.cpp \ + gui/Settings/DirectoriesPage.cpp \ + gui/Settings/ServerPage.cpp \ + gui/Settings/NetworkPage.cpp \ + gui/toaster/ChatToaster.cpp \ + gui/toaster/MessageToaster.cpp \ + gui/toaster/CallToaster.cpp \ + gui/toaster/QtToaster.cpp \ + gui/authdlg/AuthorizationDialog.cpp \ + gui/advsearch/advancedsearchdialog.cpp \ + gui/advsearch/expressionwidget.cpp \ + gui/advsearch/guiexprelement.cpp \ + games/qbackgammon/bgwindow.cpp \ + games/qbackgammon/bgwidget.cpp \ + games/qbackgammon/bgboard.cpp \ + games/qbackgammon/optionsdlg.cpp + +RESOURCES += gui/images.qrc lang/lang.qrc games/qcheckers/qcheckers.qrc apps/smplayer/icons.qrc +TRANSLATIONS += \ + lang/retroshare_en.ts \ + lang/retroshare_de.ts \ + lang/retroshare_bg.ts \ + lang/retroshare_es.ts \ + lang/retroshare_fi.ts \ + lang/retroshare_fr.ts \ + lang/retroshare_af.ts \ + lang/retroshare_cn_simp.ts \ + lang/retroshare_cn_trad.ts \ + lang/retroshare_gr.ts \ + lang/retroshare_it.ts \ + lang/retroshare_jp.ts \ + lang/retroshare_kr.ts \ + lang/retroshare_pl.ts \ + lang/retroshare_pt.ts \ + lang/retroshare_ru.ts \ + lang/retroshare_tr.ts \ + lang/retroshare_dk.ts \ + lang/retroshare_sl.ts \ + lang/retroshare_sr.ts \ + lang/retroshare_se.ts + + + +!macx { + # On non-Mac, make the binary all lowercase + TARGET = RetroShare +} + +win32 { + + RC_FILE = gui/images/retroshare_win.rc + + "LIBS += -L"../../winlibs" -lretroshare -lssl -lcrypto -lpthreadGC2d -lKadC -lminiupnpc -lz -lws2_32 -luuid -lole32 -liphlpapi -lcrypt32-cygwin -lskin -lqcheckers -lsmplayer -lgdi32 + CONFIG += qt release" + +} + +!win32 { + LIBS += -L../../../../../lib -lretroshare -lKadC -lminiupnpc -lssl -lcrypto -lqcheckers +} diff --git a/retroshare-gui/src/apps/smplayer/aboutdialog.cpp b/retroshare-gui/src/apps/smplayer/aboutdialog.cpp new file mode 100644 index 000000000..970be4f70 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/aboutdialog.cpp @@ -0,0 +1,154 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "aboutdialog.h" + +#include +#include +#include +#include +#include + +#include "images.h" +#include "version.h" + +AboutDialog::AboutDialog(QWidget * parent, Qt::WindowFlags f) + : QDialog(parent, f) +{ + setWindowTitle( tr("About SMPlayer") ); + + logo = new QLabel(this); + logo->setPixmap( Images::icon("logo", 64) ); + + intro = new QLabel(this); + intro->setWordWrap(true); + + foot = new QLabel(this); + foot->setOpenExternalLinks(true); + + credits = new QTextEdit(this); + credits->setReadOnly(true); + credits->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ); + + ok_button = new QDialogButtonBox( QDialogButtonBox::Ok ); + connect( ok_button, SIGNAL(accepted()), this, SLOT(accept()) ); + + QVBoxLayout * lright = new QVBoxLayout; + lright->addWidget( intro ); + lright->addWidget( credits ); + lright->addWidget( foot ); + + QVBoxLayout * lleft = new QVBoxLayout; + lleft->addWidget( logo ); + lleft->addStretch(1); + + QHBoxLayout * lmain = new QHBoxLayout; + lmain->addLayout( lleft ); + lmain->addLayout( lright ); + + QHBoxLayout * lbutton = new QHBoxLayout; + lbutton->addStretch(1); + lbutton->addWidget( ok_button ); + lbutton->addStretch(1); + + QVBoxLayout * lwidget = new QVBoxLayout(this); + lwidget->addLayout( lmain ); + //lwidget->addWidget( foot ); + lwidget->addLayout( lbutton ); + + intro->setText( + "SMPlayer © 2006-2007 RVM <rvm@escomposlinux.org>

" + "" + tr("Version: %1").arg(smplayerVersion()) + "
" + +/* +#if KDE_SUPPORT + tr("Compiled with KDE support") + "
" + +#endif +*/ + "
" + + tr("Compiled with Qt %1").arg(QT_VERSION_STR) + "

" + "" + + tr("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.") + ""); + + credits->setText( + tr("Translators:") + + "
    " + + trad(tr("German"), "Henrikx") + + trad(tr("Slovak"), "Sweto <peter.mendel@gmail.com>") + + trad(tr("Italian"), "Giancarlo Scola <giancarlo@codexcoop.it>") + + trad(tr("French"), tr("%1, %2 and %3") + .arg("Olivier g <1got@caramail.com>") + .arg("Temet <goondy@free.fr>") + .arg("Kud Gray <kud.gray@gmail.com>") ) + + trad(tr("Simplified-Chinese"), "Tim Green <iamtimgreen@gmail.com>") + + trad(tr("Russian"), "Yurkovsky Andrey <anyr@tut.by>") + + trad(tr("Hungarian"), "Charles Barcza <kbarcza@blackpanther.hu>") + + trad(tr("Polish"), tr("%1 and %2") + .arg("qla <qla0@vp.pl>") + .arg("Jarek <ajep9691@wp.pl>") ) + + trad(tr("Japanese"), "Nardog <nardog@e2umail.com>") + + trad(tr("Dutch"), "Wesley S. <wesley@ubuntu-nl.org>") + + trad(tr("Ukrainian"), "Motsyo Gennadi <drool@altlinux.ru>") + + trad(tr("Portuguese - Brazil"), "Ventura <ventura.barbeiro@terra.com.br>") + + trad(tr("Georgian"), "George Machitidze <giomac@gmail.com>") + + trad(tr("Czech"), QString::fromUtf8("Martin Dvořák <martin.dvorak@centrum.cz>")) + + trad(tr("Bulgarian"), "<marzeliv@mail.bg>") + + trad(tr("Turkish"), "alper er <alperer@gmail.com>") + + trad(tr("Swedish"), "Leif Larsson <leif.larsson@gmail.com>") + + trad(tr("Serbian"), "Kunalagon Umuhanik <kunalagon@gmail.com>") + + trad(tr("Traditional Chinese"), "Hoopoe <dai715.tw@yahoo.com.tw>") + + trad(tr("Romanian"), "DoruH <doruhushhush@hotmail.com>") + + trad(tr("Portuguese - Portugal"), "Waxman <waxman.pt@gmail.com>") + + "
" + + tr("Logo designed by %1").arg("Charles Barcza <kbarcza@blackpanther.hu>") + + "
" + ); + + QString url; + #ifdef Q_OS_WIN + url = tr("http://smplayer.sourceforge.net/en/windows/download.php", + "If the web page is translated into your language you can " + "change the URL so it points to the download page in the translation." + "Otherwise leave as is."); + #else + url = tr("http://smplayer.sourceforge.net/en/linux/download.php", + "If the web page is translated into your language you can " + "change the URL so it points to the download page in the translation." + "Otherwise leave as is."); + #endif + + foot->setText( + tr("Get updates at: %1") + .arg("
" + url +"") ); + + /* + adjustSize(); + setFixedSize( sizeHint() ); + */ +} + +AboutDialog::~AboutDialog() { +} + +QString AboutDialog::trad(const QString & lang, const QString & author) { + return "
  • "+ tr("%1: %2").arg(lang).arg(author) + "
  • "; +} + +#include "moc_aboutdialog.cpp" diff --git a/retroshare-gui/src/apps/smplayer/aboutdialog.h b/retroshare-gui/src/apps/smplayer/aboutdialog.h new file mode 100644 index 000000000..b4c832e5b --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/aboutdialog.h @@ -0,0 +1,54 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef _ABOUTDIALOG_H_ +#define _ABOUTDIALOG_H_ + +#include + +class QLabel; +class QTextEdit; +class QDialogButtonBox; + +//! Shows the about smplayer dialog + +/*! + Displays copyright info, license, translators... +*/ + +class AboutDialog : public QDialog +{ + Q_OBJECT + +public: + AboutDialog( QWidget * parent = 0, Qt::WindowFlags f = 0 ); + ~AboutDialog(); + +protected: + //! Return a formated string with the translator and language + QString trad(const QString & lang, const QString & author); + + QLabel * logo; + QLabel * intro; + QLabel * foot; + QTextEdit * credits; + QDialogButtonBox * ok_button; +}; + +#endif + diff --git a/retroshare-gui/src/apps/smplayer/actionseditor.cpp b/retroshare-gui/src/apps/smplayer/actionseditor.cpp new file mode 100644 index 000000000..c6a82bd4b --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/actionseditor.cpp @@ -0,0 +1,611 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +/* This is based on qq14-actioneditor-code.zip from Qt */ + + +#include "actionseditor.h" + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "images.h" +#include "filedialog.h" +#include "helper.h" + +#include "shortcutgetter.h" + + +/* +#include +#include + +class MyDelegate : public QItemDelegate +{ +public: + MyDelegate(QObject *parent = 0); + + QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, + const QModelIndex &index) const; + virtual void setModelData(QWidget * editor, QAbstractItemModel * model, + const QModelIndex & index ) const; +}; + +MyDelegate::MyDelegate(QObject *parent) : QItemDelegate(parent) +{ +} + +static QString old_accel_text; + +QWidget * MyDelegate::createEditor(QWidget *parent, + const QStyleOptionViewItem & option, + const QModelIndex & index) const +{ + qDebug("MyDelegate::createEditor"); + + old_accel_text = index.model()->data(index, Qt::DisplayRole).toString(); + //qDebug( "text: %s", old_accel_text.toUtf8().data()); + + return QItemDelegate::createEditor(parent, option, index); +} + +void MyDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, + const QModelIndex &index) const +{ + QLineEdit *line_edit = static_cast(editor); + + QString accelText = QKeySequence(line_edit->text()).toString(); + if (accelText.isEmpty() && !line_edit->text().isEmpty()) { + model->setData(index, old_accel_text); + } + else { + model->setData(index, accelText); + } +} +*/ + + +#if USE_MULTIPLE_SHORTCUTS +QString ActionsEditor::shortcutsToString(QList shortcuts_list) { + QString accelText = ""; + + for (int n=0; n < shortcuts_list.count(); n++) { + accelText += shortcuts_list[n].toString(QKeySequence::PortableText); + if (n < (shortcuts_list.count()-1)) accelText += ", "; + } + + return accelText; +} + +QList ActionsEditor::stringToShortcuts(QString shortcuts) { + QList shortcuts_list; + + QStringList l = shortcuts.split(','); + + for (int n=0; n < l.count(); n++) { + //qDebug("%s", l[n].toUtf8().data()); + QString s = QKeySequence( l[n].simplified() ); + shortcuts_list.append( s ); + //qDebug("ActionsEditor::stringToShortcuts: shortcut %d: '%s'", n, s.toUtf8().data()); + } + + return shortcuts_list; +} +#endif + + +#define COL_CONFLICTS 0 +#define COL_SHORTCUT 1 +#define COL_DESC 2 +#define COL_NAME 3 + +ActionsEditor::ActionsEditor(QWidget * parent, Qt::WindowFlags f) + : QWidget(parent, f) +{ + latest_dir = Helper::shortcutsPath(); + + actionsTable = new QTableWidget(0, COL_NAME +1, this); + actionsTable->setSelectionMode( QAbstractItemView::SingleSelection ); + actionsTable->verticalHeader()->hide(); + + actionsTable->horizontalHeader()->setResizeMode(COL_DESC, QHeaderView::Stretch); + actionsTable->horizontalHeader()->setResizeMode(COL_NAME, QHeaderView::Stretch); + + actionsTable->setAlternatingRowColors(true); +#if USE_SHORTCUTGETTER + actionsTable->setSelectionBehavior(QAbstractItemView::SelectRows); + actionsTable->setSelectionMode(QAbstractItemView::ExtendedSelection); +#endif + //actionsTable->setItemDelegateForColumn( COL_SHORTCUT, new MyDelegate(actionsTable) ); + +#if !USE_SHORTCUTGETTER + connect(actionsTable, SIGNAL(currentItemChanged(QTableWidgetItem *,QTableWidgetItem *)), + this, SLOT(recordAction(QTableWidgetItem *)) ); + connect(actionsTable, SIGNAL(itemChanged(QTableWidgetItem *)), + this, SLOT(validateAction(QTableWidgetItem *)) ); +#else + connect(actionsTable, SIGNAL(itemActivated(QTableWidgetItem *)), + this, SLOT(editShortcut()) ); +#endif + + saveButton = new QPushButton(this); + loadButton = new QPushButton(this); + + connect(saveButton, SIGNAL(clicked()), this, SLOT(saveActionsTable())); + connect(loadButton, SIGNAL(clicked()), this, SLOT(loadActionsTable())); + +#if USE_SHORTCUTGETTER + editButton = new QPushButton(this); + connect( editButton, SIGNAL(clicked()), this, SLOT(editShortcut()) ); +#endif + + QHBoxLayout *buttonLayout = new QHBoxLayout; + buttonLayout->setSpacing(8); +#if USE_SHORTCUTGETTER + buttonLayout->addWidget(editButton); +#endif + buttonLayout->addStretch(1); + buttonLayout->addWidget(loadButton); + buttonLayout->addWidget(saveButton); + + QVBoxLayout *mainLayout = new QVBoxLayout(this); + mainLayout->setMargin(8); + mainLayout->setSpacing(8); + mainLayout->addWidget(actionsTable); + mainLayout->addLayout(buttonLayout); + + retranslateStrings(); +} + +ActionsEditor::~ActionsEditor() { +} + +void ActionsEditor::retranslateStrings() { + actionsTable->setHorizontalHeaderLabels( QStringList() << "" << + tr("Shortcut") << tr("Description") << tr("Name") ); + + saveButton->setText(tr("&Save")); + saveButton->setIcon(Images::icon("save")); + + loadButton->setText(tr("&Load")); + loadButton->setIcon(Images::icon("open")); + +#if USE_SHORTCUTGETTER + editButton->setText(tr("&Change shortcut...")); +#endif + + //updateView(); // The actions are translated later, so it's useless +} + +bool ActionsEditor::isEmpty() { + return actionsList.isEmpty(); +} + +void ActionsEditor::clear() { + actionsList.clear(); +} + +void ActionsEditor::addActions(QWidget *widget) { + QAction *action; + + QList actions = widget->findChildren(); + for (int n=0; n < actions.count(); n++) { + action = static_cast (actions[n]); + if (!action->objectName().isEmpty()) + actionsList.append(action); + } + + updateView(); +} + +void ActionsEditor::updateView() { + actionsTable->setRowCount( actionsList.count() ); + + QAction *action; + QString accelText; + +#if !USE_SHORTCUTGETTER + dont_validate = true; +#endif + //actionsTable->setSortingEnabled(false); + + for (int n=0; n < actionsList.count(); n++) { + action = static_cast (actionsList[n]); + +#if USE_MULTIPLE_SHORTCUTS + accelText = shortcutsToString( action->shortcuts() ); +#else + accelText = action->shortcut().toString(); +#endif + + // Conflict column + QTableWidgetItem * i_conf = new QTableWidgetItem(); + + // Name column + QTableWidgetItem * i_name = new QTableWidgetItem(action->objectName()); + + // Desc column + QTableWidgetItem * i_desc = new QTableWidgetItem(action->text().replace("&","")); + i_desc->setIcon( action->icon() ); + + // Shortcut column + QTableWidgetItem * i_shortcut = new QTableWidgetItem(accelText); + + // Set flags +#if !USE_SHORTCUTGETTER + i_conf->setFlags(Qt::ItemIsEnabled); + i_name->setFlags(Qt::ItemIsEnabled); + i_desc->setFlags(Qt::ItemIsEnabled); +#else + i_conf->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); + i_name->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); + i_desc->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); + i_shortcut->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); +#endif + + // Add items to table + actionsTable->setItem(n, COL_CONFLICTS, i_conf ); + actionsTable->setItem(n, COL_NAME, i_name ); + actionsTable->setItem(n, COL_DESC, i_desc ); + actionsTable->setItem(n, COL_SHORTCUT, i_shortcut ); + + } + hasConflicts(); // Check for conflicts + + actionsTable->resizeColumnsToContents(); + actionsTable->setCurrentCell(0, COL_SHORTCUT); + +#if !USE_SHORTCUTGETTER + dont_validate = false; +#endif + //actionsTable->setSortingEnabled(true); +} + + +void ActionsEditor::applyChanges() { + qDebug("ActionsEditor::applyChanges"); + + for (int row = 0; row < (int)actionsList.size(); ++row) { + QAction *action = actionsList[row]; + QTableWidgetItem *i = actionsTable->item(row, COL_SHORTCUT); + +#if USE_MULTIPLE_SHORTCUTS + action->setShortcuts( stringToShortcuts(i->text()) ); +#else + action->setShortcut( QKeySequence(i->text()) ); +#endif + } +} + +#if !USE_SHORTCUTGETTER +void ActionsEditor::recordAction(QTableWidgetItem * i) { + //qDebug("ActionsEditor::recordAction"); + + //QTableWidgetItem * i = actionsTable->currentItem(); + if (i->column() == COL_SHORTCUT) { + //qDebug("ActionsEditor::recordAction: %d %d %s", i->row(), i->column(), i->text().toUtf8().data()); + oldAccelText = i->text(); + } +} + +void ActionsEditor::validateAction(QTableWidgetItem * i) { + //qDebug("ActionsEditor::validateAction"); + if (dont_validate) return; + + if (i->column() == COL_SHORTCUT) { + QString accelText = QKeySequence(i->text()).toString(); + + if (accelText.isEmpty() && !i->text().isEmpty()) { + /* + QAction * action = static_cast (actionsList[i->row()]); + QString oldAccelText= action->accel().toString(); + */ + i->setText(oldAccelText); + } + else { + i->setText(accelText); + } + + if (hasConflicts()) qApp->beep(); + } +} + +#else + +void ActionsEditor::editShortcut() { + QTableWidgetItem * i = actionsTable->item( actionsTable->currentRow(), COL_SHORTCUT ); + if (i) { + ShortcutGetter d; + QString result = d.exec( i->text() ); + + if (!result.isNull()) { + QString accelText = QKeySequence(result).toString(QKeySequence::PortableText); + i->setText(accelText); + if (hasConflicts()) qApp->beep(); + } + } +} +#endif + +int ActionsEditor::findActionName(const QString & name) { + for (int row=0; row < actionsTable->rowCount(); row++) { + if (actionsTable->item(row, COL_NAME)->text() == name) return row; + } + return -1; +} + +int ActionsEditor::findActionAccel(const QString & accel, int ignoreRow) { + for (int row=0; row < actionsTable->rowCount(); row++) { + QTableWidgetItem * i = actionsTable->item(row, COL_SHORTCUT); + if ( (i) && (i->text() == accel) ) { + if (ignoreRow == -1) return row; + else + if (ignoreRow != row) return row; + } + } + return -1; +} + +bool ActionsEditor::hasConflicts() { + int found; + bool conflict = false; + + QString accelText; + QTableWidgetItem *i; + + for (int n=0; n < actionsTable->rowCount(); n++) { + //actionsTable->setText( n, COL_CONFLICTS, " "); + i = actionsTable->item( n, COL_CONFLICTS ); + if (i) i->setIcon( QPixmap() ); + + i = actionsTable->item(n, COL_SHORTCUT ); + if (i) { + accelText = i->text(); + if (!accelText.isEmpty()) { + found = findActionAccel( accelText, n ); + if ( (found != -1) && (found != n) ) { + conflict = true; + //actionsTable->setText( n, COL_CONFLICTS, "!"); + actionsTable->item( n, COL_CONFLICTS )->setIcon( Images::icon("conflict") ); + } + } + } + } + //if (conflict) qApp->beep(); + return conflict; +} + + +void ActionsEditor::saveActionsTable() { + QString s = MyFileDialog::getSaveFileName( + this, tr("Choose a filename"), + latest_dir, + tr("Key files") +" (*.keys)" ); + + if (!s.isEmpty()) { + // If filename has no extension, add it + if (QFileInfo(s).suffix().isEmpty()) { + s = s + ".keys"; + } + if (QFileInfo(s).exists()) { + int res = QMessageBox::question( this, + tr("Confirm overwrite?"), + tr("The file %1 already exists.\n" + "Do you want to overwrite?").arg(s), + QMessageBox::Yes, + QMessageBox::No, + Qt::NoButton); + if (res == QMessageBox::No ) { + return; + } + } + latest_dir = QFileInfo(s).absolutePath(); + bool r = saveActionsTable(s); + if (!r) { + QMessageBox::warning(this, tr("Error"), + tr("The file couldn't be saved"), + QMessageBox::Ok, Qt::NoButton); + } + } +} + +bool ActionsEditor::saveActionsTable(const QString & filename) { + qDebug("ActionsEditor::saveActions: '%s'", filename.toUtf8().data()); + + QFile f( filename ); + if ( f.open( QIODevice::WriteOnly ) ) { + QTextStream stream( &f ); + stream.setCodec("UTF-8"); + + for (int row=0; row < actionsTable->rowCount(); row++) { + stream << actionsTable->item(row, COL_NAME)->text() << "\t" + << actionsTable->item(row, COL_SHORTCUT)->text() << "\n"; + } + f.close(); + return true; + } + return false; +} + +void ActionsEditor::loadActionsTable() { + QString s = MyFileDialog::getOpenFileName( + this, tr("Choose a file"), + latest_dir, tr("Key files") +" (*.keys)" ); + + if (!s.isEmpty()) { + latest_dir = QFileInfo(s).absolutePath(); + bool r = loadActionsTable(s); + if (!r) { + QMessageBox::warning(this, tr("Error"), + tr("The file couldn't be loaded"), + QMessageBox::Ok, Qt::NoButton); + } + } +} + +bool ActionsEditor::loadActionsTable(const QString & filename) { + qDebug("ActionsEditor::loadActions: '%s'", filename.toUtf8().data()); + + QRegExp rx("^(.*)\\t(.*)"); + int row; + + QFile f( filename ); + if ( f.open( QIODevice::ReadOnly ) ) { + +#if !USE_SHORTCUTGETTER + dont_validate = true; +#endif + + QTextStream stream( &f ); + stream.setCodec("UTF-8"); + + QString line; + while ( !stream.atEnd() ) { + line = stream.readLine(); + qDebug("line: '%s'", line.toUtf8().data()); + if (rx.indexIn(line) > -1) { + QString name = rx.cap(1); + QString accelText = rx.cap(2); + qDebug(" name: '%s' accel: '%s'", name.toUtf8().data(), accelText.toUtf8().data()); + row = findActionName(name); + if (row > -1) { + qDebug("Action found!"); + actionsTable->item(row, COL_SHORTCUT)->setText(accelText); + } + } else { + qDebug(" wrong line"); + } + } + f.close(); + hasConflicts(); // Check for conflicts + +#if !USE_SHORTCUTGETTER + dont_validate = false; +#endif + + return true; + } else { + return false; + } +} + + +// Static functions + +void ActionsEditor::saveToConfig(QObject *o, QSettings *set) { + qDebug("ActionsEditor::saveToConfig"); + + set->beginGroup("actions"); + + QAction *action; + QList actions = o->findChildren(); + for (int n=0; n < actions.count(); n++) { + action = static_cast (actions[n]); + if (!action->objectName().isEmpty()) { +#if USE_MULTIPLE_SHORTCUTS + QString accelText = shortcutsToString(action->shortcuts()); +#else + QString accelText = action->shortcut().toString(); +#endif + set->setValue(action->objectName(), accelText); + } + } + + set->endGroup(); +} + + +void ActionsEditor::loadFromConfig(QObject *o, QSettings *set) { + qDebug("ActionsEditor::loadFromConfig"); + + set->beginGroup("actions"); + + QAction *action; + QString accelText; + + QList actions = o->findChildren(); + for (int n=0; n < actions.count(); n++) { + action = static_cast (actions[n]); + if (!action->objectName().isEmpty()) { +#if USE_MULTIPLE_SHORTCUTS + QString current = shortcutsToString(action->shortcuts()); + accelText = set->value(action->objectName(), current).toString(); + action->setShortcuts( stringToShortcuts( accelText ) ); +#else + accelText = set->value(action->objectName(), action->shortcut().toString()).toString(); + action->setShortcut(QKeySequence(accelText)); +#endif + } + } + + set->endGroup(); +} + +QAction * ActionsEditor::findAction(QObject *o, const QString & name) { + QAction *action; + + QList actions = o->findChildren(); + for (int n=0; n < actions.count(); n++) { + action = static_cast (actions[n]); + if (name == action->objectName()) return action; + } + + return 0; +} + +QStringList ActionsEditor::actionsNames(QObject *o) { + QStringList l; + + QAction *action; + + QList actions = o->findChildren(); + for (int n=0; n < actions.count(); n++) { + action = static_cast (actions[n]); + //qDebug("action name: '%s'", action->objectName().toUtf8().data()); + //qDebug("action name: '%s'", action->text().toUtf8().data()); + if (!action->objectName().isEmpty()) + l.append( action->objectName() ); + } + + return l; +} + + +// Language change stuff +void ActionsEditor::changeEvent(QEvent *e) { + if (e->type() == QEvent::LanguageChange) { + retranslateStrings(); + } else { + QWidget::changeEvent(e); + } +} + +#include "moc_actionseditor.cpp" diff --git a/retroshare-gui/src/apps/smplayer/actionseditor.h b/retroshare-gui/src/apps/smplayer/actionseditor.h new file mode 100644 index 000000000..1e49e89f9 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/actionseditor.h @@ -0,0 +1,104 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +/* This is based on qq14-actioneditor-code.zip from Qt */ + +#ifndef _ACTIONSEDITOR_H_ +#define _ACTIONSEDITOR_H_ + +#include +#include +#include +#include "config.h" + +class QTableWidget; +class QTableWidgetItem; +class QAction; +class QSettings; +class QPushButton; + +class ActionsEditor : public QWidget +{ + Q_OBJECT + +public: + ActionsEditor( QWidget * parent = 0, Qt::WindowFlags f = 0 ); + ~ActionsEditor(); + + // Clear the actionlist + void clear(); + + // There are no actions yet? + bool isEmpty(); + + void addActions(QWidget * widget); + + // Static functions + static QAction * findAction(QObject *o, const QString & name); + static QStringList actionsNames(QObject *o); + + static void saveToConfig(QObject *o, QSettings *set); + static void loadFromConfig(QObject *o, QSettings *set); + +#if USE_MULTIPLE_SHORTCUTS + static QString shortcutsToString(QList shortcuts_list); + static QList stringToShortcuts(QString shortcuts); +#endif + +public slots: + void applyChanges(); + void saveActionsTable(); + bool saveActionsTable(const QString & filename); + void loadActionsTable(); + bool loadActionsTable(const QString & filename); + + void updateView(); + +protected: + virtual void retranslateStrings(); + virtual void changeEvent ( QEvent * event ) ; + + // Find in table, not in actionslist + int findActionName(const QString & name); + int findActionAccel(const QString & accel, int ignoreRow = -1); + bool hasConflicts(); + +protected slots: +#if !USE_SHORTCUTGETTER + void recordAction(QTableWidgetItem*); + void validateAction(QTableWidgetItem*); +#else + void editShortcut(); +#endif + +private: + QTableWidget *actionsTable; + QList actionsList; + QPushButton *saveButton; + QPushButton *loadButton; + QString latest_dir; + +#if USE_SHORTCUTGETTER + QPushButton *editButton; +#else + QString oldAccelText; + bool dont_validate; +#endif +}; + +#endif diff --git a/retroshare-gui/src/apps/smplayer/basegui.cpp b/retroshare-gui/src/apps/smplayer/basegui.cpp new file mode 100644 index 000000000..85adf5677 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/basegui.cpp @@ -0,0 +1,3057 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "basegui.h" + +#include "filedialog.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "mplayerwindow.h" +#include "desktopinfo.h" +#include "helper.h" +#include "global.h" +#include "translator.h" +#include "images.h" +#include "preferences.h" +#include "timeslider.h" +#include "logwindow.h" +#include "playlist.h" +#include "filepropertiesdialog.h" +#include "eqslider.h" +#include "videoequalizer.h" +#include "inputdvddirectory.h" +#include "inputurl.h" +#include "recents.h" +#include "aboutdialog.h" + +#include "config.h" +#include "actionseditor.h" + +#include "myserver.h" + +#include "preferencesdialog.h" +#include "prefinterface.h" +#include "prefinput.h" +#include "prefadvanced.h" + +#include "myaction.h" +#include "myactiongroup.h" + +#include "constants.h" + + +BaseGui::BaseGui( QWidget* parent, Qt::WindowFlags flags ) + : QMainWindow( parent, flags ), + last_second(0), + near_top(false), + near_bottom(false) +{ + setWindowTitle( "SMPlayer" ); + + // Not created objects + server = 0; + popup = 0; + pref_dialog = 0; + file_dialog = 0; + + // Create objects: + recents = new Recents(this); + + createPanel(); + setCentralWidget(panel); + + createMplayerWindow(); + createCore(); + createPlaylist(); + createVideoEqualizer(); + + // Mouse Wheel + connect( this, SIGNAL(wheelUp()), + core, SLOT(wheelUp()) ); + connect( this, SIGNAL(wheelDown()), + core, SLOT(wheelDown()) ); + connect( mplayerwindow, SIGNAL(wheelUp()), + core, SLOT(wheelUp()) ); + connect( mplayerwindow, SIGNAL(wheelDown()), + core, SLOT(wheelDown()) ); + + // Set style before changing color of widgets: + // Set style +#if STYLE_SWITCHING + qDebug( "Style name: '%s'", qApp->style()->objectName().toUtf8().data() ); + qDebug( "Style class name: '%s'", qApp->style()->metaObject()->className() ); + + default_style = qApp->style()->objectName(); + if (!pref->style.isEmpty()) { + qApp->setStyle( pref->style ); + } +#endif + + mplayer_log_window = new LogWindow(this); + smplayer_log_window = new LogWindow(this); + + createActions(); + createMenus(); + +#if !DOCK_PLAYLIST + connect(playlist, SIGNAL(visibilityChanged(bool)), + showPlaylistAct, SLOT(setChecked(bool)) ); +#endif + +#if NEW_RESIZE_CODE + diff_size = QSize(0,0); + connect(core, SIGNAL(aboutToStartPlaying()), + this, SLOT(calculateDiff())); +#endif + + retranslateStrings(); + + setAcceptDrops(true); + + resize(580, 440); + + panel->setFocus(); + + initializeGui(); +} + +void BaseGui::initializeGui() { + if (pref->compact_mode) toggleCompactMode(TRUE); + if (pref->stay_on_top) toggleStayOnTop(TRUE); + toggleFrameCounter( pref->show_frame_counter ); + +#if QT_VERSION >= 0x040200 + changeStyleSheet(pref->iconset); +#endif + + recents->setMaxItems( pref->recents_max_items); + updateRecents(); + + // Call loadActions() outside initialization of the class. + // Otherwise DefaultGui (and other subclasses) doesn't exist, and + // its actions are not loaded + QTimer::singleShot(20, this, SLOT(loadActions())); + + // Single instance + server = new MyServer(this); + connect(server, SIGNAL(receivedOpen(QString)), + this, SLOT(remoteOpen(QString))); + connect(server, SIGNAL(receivedOpenFiles(QStringList)), + this, SLOT(remoteOpenFiles(QStringList))); + connect(server, SIGNAL(receivedAddFiles(QStringList)), + this, SLOT(remoteAddFiles(QStringList))); + connect(server, SIGNAL(receivedFunction(QString)), + this, SLOT(processFunction(QString))); + + if (pref->use_single_instance) { + if (server->listen(pref->connection_port)) { + qDebug("BaseGui::initializeGui: server running on port %d", pref->connection_port); + } else { + qWarning("BaseGui::initializeGui: server couldn't be started"); + } + } +} + +void BaseGui::remoteOpen(QString file) { + qDebug("BaseGui::remoteOpen: '%s'", file.toUtf8().data()); + if (isMinimized()) showNormal(); + if (!isVisible()) show(); + raise(); + activateWindow(); + open(file); +} + +void BaseGui::remoteOpenFiles(QStringList files) { + qDebug("BaseGui::remoteOpenFiles"); + if (isMinimized()) showNormal(); + if (!isVisible()) show(); + raise(); + activateWindow(); + openFiles(files); +} + +void BaseGui::remoteAddFiles(QStringList files) { + qDebug("BaseGui::remoteAddFiles"); + if (isMinimized()) showNormal(); + if (!isVisible()) show(); + raise(); + activateWindow(); + + playlist->addFiles(files); + //open(files[0]); +} + +BaseGui::~BaseGui() { + delete core; // delete before mplayerwindow, otherwise, segfault... + delete mplayer_log_window; + delete smplayer_log_window; + +//#if !DOCK_PLAYLIST + if (playlist) { + delete playlist; + playlist = 0; + } +//#endif +} + +void BaseGui::createActions() { + // Menu File + openFileAct = new MyAction( QKeySequence("Ctrl+F"), this, "open_file" ); + connect( openFileAct, SIGNAL(triggered()), + this, SLOT(openFile()) ); + + openDirectoryAct = new MyAction( this, "open_directory" ); + connect( openDirectoryAct, SIGNAL(triggered()), + this, SLOT(openDirectory()) ); + + openPlaylistAct = new MyAction( this, "open_playlist" ); + connect( openPlaylistAct, SIGNAL(triggered()), + playlist, SLOT(load()) ); + + openVCDAct = new MyAction( this, "open_vcd" ); + connect( openVCDAct, SIGNAL(triggered()), + this, SLOT(openVCD()) ); + + openAudioCDAct = new MyAction( this, "open_audio_cd" ); + connect( openAudioCDAct, SIGNAL(triggered()), + this, SLOT(openAudioCD()) ); + +#ifdef Q_OS_WIN + // VCD's and Audio CD's seem they don't work on windows + openVCDAct->setEnabled(pref->enable_vcd_on_windows); + openAudioCDAct->setEnabled(pref->enable_audiocd_on_windows); +#endif + + openDVDAct = new MyAction( this, "open_dvd" ); + connect( openDVDAct, SIGNAL(triggered()), + this, SLOT(openDVD()) ); + + openDVDFolderAct = new MyAction( this, "open_dvd_folder" ); + connect( openDVDFolderAct, SIGNAL(triggered()), + this, SLOT(openDVDFromFolder()) ); + + openURLAct = new MyAction( QKeySequence("Ctrl+U"), this, "open_url" ); + connect( openURLAct, SIGNAL(triggered()), + this, SLOT(openURL()) ); + + exitAct = new MyAction( QKeySequence("Ctrl+X"), this, "close" ); + connect( exitAct, SIGNAL(triggered()), this, SLOT(closeWindow()) ); + + clearRecentsAct = new MyAction( this, "clear_recents" ); + connect( clearRecentsAct, SIGNAL(triggered()), this, SLOT(clearRecentsList()) ); + + + // Menu Play + playAct = new MyAction( this, "play" ); + connect( playAct, SIGNAL(triggered()), + core, SLOT(play()) ); + + playOrPauseAct = new MyAction( Qt::Key_MediaPlay, this, "play_or_pause" ); + connect( playOrPauseAct, SIGNAL(triggered()), + core, SLOT(play_or_pause()) ); + + pauseAct = new MyAction( Qt::Key_Space, this, "pause" ); + connect( pauseAct, SIGNAL(triggered()), + core, SLOT(pause()) ); + + pauseAndStepAct = new MyAction( this, "pause_and_frame_step" ); + connect( pauseAndStepAct, SIGNAL(triggered()), + core, SLOT(pause_and_frame_step()) ); + + stopAct = new MyAction( Qt::Key_MediaStop, this, "stop" ); + connect( stopAct, SIGNAL(triggered()), + core, SLOT(stop()) ); + + frameStepAct = new MyAction( Qt::Key_Period, this, "frame_step" ); + connect( frameStepAct, SIGNAL(triggered()), + core, SLOT(frameStep()) ); + + rewind1Act = new MyAction( Qt::Key_Left, this, "rewind1" ); + connect( rewind1Act, SIGNAL(triggered()), + core, SLOT(srewind()) ); + + rewind2Act = new MyAction( Qt::Key_Down, this, "rewind2" ); + connect( rewind2Act, SIGNAL(triggered()), + core, SLOT(rewind()) ); + + rewind3Act = new MyAction( Qt::Key_PageDown, this, "rewind3" ); + connect( rewind3Act, SIGNAL(triggered()), + core, SLOT(fastrewind()) ); + + forward1Act = new MyAction( Qt::Key_Right, this, "forward1" ); + connect( forward1Act, SIGNAL(triggered()), + core, SLOT(sforward()) ); + + forward2Act = new MyAction( Qt::Key_Up, this, "forward2" ); + connect( forward2Act, SIGNAL(triggered()), + core, SLOT(forward()) ); + + forward3Act = new MyAction( Qt::Key_PageUp, this, "forward3" ); + connect( forward3Act, SIGNAL(triggered()), + core, SLOT(fastforward()) ); + + repeatAct = new MyAction( this, "repeat" ); + repeatAct->setCheckable( true ); + connect( repeatAct, SIGNAL(toggled(bool)), + core, SLOT(toggleRepeat(bool)) ); + + // Submenu Speed + normalSpeedAct = new MyAction( Qt::Key_Backspace, this, "normal_speed" ); + connect( normalSpeedAct, SIGNAL(triggered()), + core, SLOT(normalSpeed()) ); + + halveSpeedAct = new MyAction( Qt::Key_BraceLeft, this, "halve_speed" ); + connect( halveSpeedAct, SIGNAL(triggered()), + core, SLOT(halveSpeed()) ); + + doubleSpeedAct = new MyAction( Qt::Key_BraceRight, this, "double_speed" ); + connect( doubleSpeedAct, SIGNAL(triggered()), + core, SLOT(doubleSpeed()) ); + + decSpeedAct = new MyAction( Qt::Key_BracketLeft, this, "dec_speed" ); + connect( decSpeedAct, SIGNAL(triggered()), + core, SLOT(decSpeed()) ); + + incSpeedAct = new MyAction( Qt::Key_BracketRight, this, "inc_speed" ); + connect( incSpeedAct, SIGNAL(triggered()), + core, SLOT(incSpeed()) ); + + + // Menu Video + fullscreenAct = new MyAction( Qt::Key_F, this, "fullscreen" ); + fullscreenAct->setCheckable( true ); + connect( fullscreenAct, SIGNAL(toggled(bool)), + this, SLOT(toggleFullscreen(bool)) ); + + compactAct = new MyAction( QKeySequence("Ctrl+C"), this, "compact" ); + compactAct->setCheckable( true ); + connect( compactAct, SIGNAL(toggled(bool)), + this, SLOT(toggleCompactMode(bool)) ); + + equalizerAct = new MyAction( QKeySequence("Ctrl+E"), this, "equalizer" ); + equalizerAct->setCheckable( true ); + connect( equalizerAct, SIGNAL(toggled(bool)), + this, SLOT(showEqualizer(bool)) ); + + screenshotAct = new MyAction( Qt::Key_S, this, "screenshot" ); + connect( screenshotAct, SIGNAL(triggered()), + core, SLOT(screenshot()) ); + + onTopAct = new MyAction( this, "on_top" ); + onTopAct->setCheckable( true ); + connect( onTopAct, SIGNAL(toggled(bool)), + this, SLOT(toggleStayOnTop(bool)) ); + + flipAct = new MyAction( this, "flip" ); + flipAct->setCheckable( true ); + connect( flipAct, SIGNAL(toggled(bool)), + core, SLOT(toggleFlip(bool)) ); + + // Submenu filter + postProcessingAct = new MyAction( this, "postprocessing" ); + postProcessingAct->setCheckable( true ); + connect( postProcessingAct, SIGNAL(toggled(bool)), + core, SLOT(togglePostprocessing(bool)) ); + + phaseAct = new MyAction( this, "autodetect_phase" ); + phaseAct->setCheckable( true ); + connect( phaseAct, SIGNAL(toggled(bool)), + core, SLOT(toggleAutophase(bool)) ); + + deblockAct = new MyAction( this, "deblock" ); + deblockAct->setCheckable( true ); + connect( deblockAct, SIGNAL(toggled(bool)), + core, SLOT(toggleDeblock(bool)) ); + + deringAct = new MyAction( this, "dering" ); + deringAct->setCheckable( true ); + connect( deringAct, SIGNAL(toggled(bool)), + core, SLOT(toggleDering(bool)) ); + + addNoiseAct = new MyAction( this, "add_noise" ); + addNoiseAct->setCheckable( true ); + connect( addNoiseAct, SIGNAL(toggled(bool)), + core, SLOT(toggleNoise(bool)) ); + + + // Menu Audio + muteAct = new MyAction( Qt::Key_M, this, "mute" ); + muteAct->setCheckable( true ); + connect( muteAct, SIGNAL(toggled(bool)), + core, SLOT(mute(bool)) ); + +#if USE_MULTIPLE_SHORTCUTS + decVolumeAct = new MyAction( this, "decrease_volume" ); + decVolumeAct->setShortcuts( ActionsEditor::stringToShortcuts("9,/") ); +#else + decVolumeAct = new MyAction( Qt::Key_9, this, "dec_volume" ); +#endif + connect( decVolumeAct, SIGNAL(triggered()), + core, SLOT(decVolume()) ); + +#if USE_MULTIPLE_SHORTCUTS + incVolumeAct = new MyAction( this, "increase_volume" ); + incVolumeAct->setShortcuts( ActionsEditor::stringToShortcuts("0,*") ); +#else + incVolumeAct = new MyAction( Qt::Key_0, this, "inc_volume" ); +#endif + connect( incVolumeAct, SIGNAL(triggered()), + core, SLOT(incVolume()) ); + + decAudioDelayAct = new MyAction( Qt::Key_Minus, this, "dec_audio_delay" ); + connect( decAudioDelayAct, SIGNAL(triggered()), + core, SLOT(decAudioDelay()) ); + + incAudioDelayAct = new MyAction( Qt::Key_Plus, this, "inc_audio_delay" ); + connect( incAudioDelayAct, SIGNAL(triggered()), + core, SLOT(incAudioDelay()) ); + + loadAudioAct = new MyAction( this, "load_audio_file" ); + connect( loadAudioAct, SIGNAL(triggered()), + this, SLOT(loadAudioFile()) ); + + unloadAudioAct = new MyAction( this, "unload_audio_file" ); + connect( unloadAudioAct, SIGNAL(triggered()), + core, SLOT(unloadAudioFile()) ); + + + // Submenu Filters + extrastereoAct = new MyAction( this, "extrastereo_filter" ); + extrastereoAct->setCheckable( true ); + connect( extrastereoAct, SIGNAL(toggled(bool)), + core, SLOT(toggleExtrastereo(bool)) ); + + karaokeAct = new MyAction( this, "karaoke_filter" ); + karaokeAct->setCheckable( true ); + connect( karaokeAct, SIGNAL(toggled(bool)), + core, SLOT(toggleKaraoke(bool)) ); + + volnormAct = new MyAction( this, "volnorm_filter" ); + volnormAct->setCheckable( true ); + connect( volnormAct, SIGNAL(toggled(bool)), + core, SLOT(toggleVolnorm(bool)) ); + + + // Menu Subtitles + loadSubsAct = new MyAction( this, "load_subs" ); + connect( loadSubsAct, SIGNAL(triggered()), + this, SLOT(loadSub()) ); + +#if SUBTITLES_BY_INDEX + unloadSubsAct = new MyAction( this, "unload_subs" ); + connect( unloadSubsAct, SIGNAL(triggered()), + core, SLOT(unloadSub()) ); +#endif + + decSubDelayAct = new MyAction( Qt::Key_Z, this, "dec_sub_delay" ); + connect( decSubDelayAct, SIGNAL(triggered()), + core, SLOT(decSubDelay()) ); + + incSubDelayAct = new MyAction( Qt::Key_X, this, "inc_sub_delay" ); + connect( incSubDelayAct, SIGNAL(triggered()), + core, SLOT(incSubDelay()) ); + + decSubPosAct = new MyAction( Qt::Key_R, this, "dec_sub_pos" ); + connect( decSubPosAct, SIGNAL(triggered()), + core, SLOT(decSubPos()) ); + incSubPosAct = new MyAction( Qt::Key_T, this, "inc_sub_pos" ); + connect( incSubPosAct, SIGNAL(triggered()), + core, SLOT(incSubPos()) ); + + decSubStepAct = new MyAction( Qt::Key_G, this, "dec_sub_step" ); + connect( decSubStepAct, SIGNAL(triggered()), + core, SLOT(decSubStep()) ); + + incSubStepAct = new MyAction( Qt::Key_Y, this, "inc_sub_step" ); + connect( incSubStepAct, SIGNAL(triggered()), + core, SLOT(incSubStep()) ); + + useAssAct = new MyAction(this, "use_ass_lib"); + useAssAct->setCheckable(true); + connect( useAssAct, SIGNAL(toggled(bool)), core, SLOT(changeUseAss(bool)) ); + + // Menu Options + showPlaylistAct = new MyAction( QKeySequence("Ctrl+L"), this, "show_playlist" ); + showPlaylistAct->setCheckable( true ); + connect( showPlaylistAct, SIGNAL(toggled(bool)), + this, SLOT(showPlaylist(bool)) ); + + showPropertiesAct = new MyAction( QKeySequence("Ctrl+I"), this, "show_file_properties" ); + connect( showPropertiesAct, SIGNAL(triggered()), + this, SLOT(showFilePropertiesDialog()) ); + + frameCounterAct = new MyAction( this, "frame_counter" ); + frameCounterAct->setCheckable( true ); + connect( frameCounterAct, SIGNAL(toggled(bool)), + this, SLOT(toggleFrameCounter(bool)) ); + + showPreferencesAct = new MyAction( QKeySequence("Ctrl+P"), this, "show_preferences" ); + connect( showPreferencesAct, SIGNAL(triggered()), + this, SLOT(showPreferencesDialog()) ); + + // Submenu Logs + showLogMplayerAct = new MyAction( QKeySequence("Ctrl+M"), this, "show_mplayer_log" ); + connect( showLogMplayerAct, SIGNAL(triggered()), + this, SLOT(showMplayerLog()) ); + + showLogSmplayerAct = new MyAction( QKeySequence("Ctrl+S"), this, "show_smplayer_log" ); + connect( showLogSmplayerAct, SIGNAL(triggered()), + this, SLOT(showLog()) ); + + // Menu Help + aboutQtAct = new MyAction( this, "about_qt" ); + connect( aboutQtAct, SIGNAL(triggered()), + this, SLOT(helpAboutQt()) ); + + aboutThisAct = new MyAction( this, "about_smplayer" ); + connect( aboutThisAct, SIGNAL(triggered()), + this, SLOT(helpAbout()) ); + + // Playlist + playNextAct = new MyAction(Qt::Key_Greater, this, "play_next"); + connect( playNextAct, SIGNAL(triggered()), playlist, SLOT(playNext()) ); + + playPrevAct = new MyAction(Qt::Key_Less, this, "play_prev"); + connect( playPrevAct, SIGNAL(triggered()), playlist, SLOT(playPrev()) ); + + + // Move video window and zoom + moveUpAct = new MyAction(Qt::ALT | Qt::Key_Up, this, "move_up"); + connect( moveUpAct, SIGNAL(triggered()), mplayerwindow, SLOT(moveUp()) ); + + moveDownAct = new MyAction(Qt::ALT | Qt::Key_Down, this, "move_down"); + connect( moveDownAct, SIGNAL(triggered()), mplayerwindow, SLOT(moveDown()) ); + + moveLeftAct = new MyAction(Qt::ALT | Qt::Key_Left, this, "move_left"); + connect( moveLeftAct, SIGNAL(triggered()), mplayerwindow, SLOT(moveLeft()) ); + + moveRightAct = new MyAction(Qt::ALT | Qt::Key_Right, this, "move_right"); + connect( moveRightAct, SIGNAL(triggered()), mplayerwindow, SLOT(moveRight()) ); + + incZoomAct = new MyAction(Qt::Key_E, this, "inc_zoom"); + connect( incZoomAct, SIGNAL(triggered()), core, SLOT(incPanscan()) ); + + decZoomAct = new MyAction(Qt::Key_W, this, "dec_zoom"); + connect( decZoomAct, SIGNAL(triggered()), core, SLOT(decPanscan()) ); + + resetZoomAct = new MyAction(Qt::SHIFT | Qt::Key_E, this, "reset_zoom"); + connect( resetZoomAct, SIGNAL(triggered()), core, SLOT(resetPanscan()) ); + + + // Actions not in menus or buttons + // Volume 2 +#if !USE_MULTIPLE_SHORTCUTS + decVolume2Act = new MyAction( Qt::Key_Slash, this, "dec_volume2" ); + connect( decVolume2Act, SIGNAL(triggered()), core, SLOT(decVolume()) ); + + incVolume2Act = new MyAction( Qt::Key_Asterisk, this, "inc_volume2" ); + connect( incVolume2Act, SIGNAL(triggered()), core, SLOT(incVolume()) ); +#endif + // Exit fullscreen + exitFullscreenAct = new MyAction( Qt::Key_Escape, this, "exit_fullscreen" ); + connect( exitFullscreenAct, SIGNAL(triggered()), this, SLOT(exitFullscreen()) ); + + nextOSDAct = new MyAction( Qt::Key_O, this, "next_osd"); + connect( nextOSDAct, SIGNAL(triggered()), core, SLOT(nextOSD()) ); + + decContrastAct = new MyAction( Qt::Key_1, this, "dec_contrast"); + connect( decContrastAct, SIGNAL(triggered()), core, SLOT(decContrast()) ); + + incContrastAct = new MyAction( Qt::Key_2, this, "inc_contrast"); + connect( incContrastAct, SIGNAL(triggered()), core, SLOT(incContrast()) ); + + decBrightnessAct = new MyAction( Qt::Key_3, this, "dec_brightness"); + connect( decBrightnessAct, SIGNAL(triggered()), core, SLOT(decBrightness()) ); + + incBrightnessAct = new MyAction( Qt::Key_4, this, "inc_brightness"); + connect( incBrightnessAct, SIGNAL(triggered()), core, SLOT(incBrightness()) ); + + decHueAct = new MyAction(Qt::Key_5, this, "dec_hue"); + connect( decHueAct, SIGNAL(triggered()), core, SLOT(decHue()) ); + + incHueAct = new MyAction( Qt::Key_6, this, "inc_hue"); + connect( incHueAct, SIGNAL(triggered()), core, SLOT(incHue()) ); + + decSaturationAct = new MyAction( Qt::Key_7, this, "dec_saturation"); + connect( decSaturationAct, SIGNAL(triggered()), core, SLOT(decSaturation()) ); + + incSaturationAct = new MyAction( Qt::Key_8, this, "inc_saturation"); + connect( incSaturationAct, SIGNAL(triggered()), core, SLOT(incSaturation()) ); + + decGammaAct = new MyAction( Qt::ALT | Qt::Key_1, this, "dec_gamma"); + connect( decGammaAct, SIGNAL(triggered()), core, SLOT(decGamma()) ); + + incGammaAct = new MyAction( Qt::ALT | Qt::Key_2, this, "inc_gamma"); + connect( incGammaAct, SIGNAL(triggered()), core, SLOT(incGamma()) ); + + nextAudioAct = new MyAction( Qt::Key_H, this, "next_audio"); + connect( nextAudioAct, SIGNAL(triggered()), core, SLOT(nextAudio()) ); + + nextSubtitleAct = new MyAction( Qt::Key_J, this, "next_subtitle"); + connect( nextSubtitleAct, SIGNAL(triggered()), core, SLOT(nextSubtitle()) ); + + nextChapterAct = new MyAction( Qt::Key_At, this, "next_chapter"); + connect( nextChapterAct, SIGNAL(triggered()), core, SLOT(nextChapter()) ); + + prevChapterAct = new MyAction( Qt::Key_Exclam, this, "prev_chapter"); + connect( prevChapterAct, SIGNAL(triggered()), core, SLOT(prevChapter()) ); + + doubleSizeAct = new MyAction( Qt::CTRL | Qt::Key_D, this, "toggle_double_size"); + connect( doubleSizeAct, SIGNAL(triggered()), core, SLOT(toggleDoubleSize()) ); + + // Group actions + + // OSD + osdGroup = new MyActionGroup(this); + osdNoneAct = new MyActionGroupItem(this, osdGroup, "osd_none", Preferences::None); + osdSeekAct = new MyActionGroupItem(this, osdGroup, "osd_seek", Preferences::Seek); + osdTimerAct = new MyActionGroupItem(this, osdGroup, "osd_timer", Preferences::SeekTimer); + osdTotalAct = new MyActionGroupItem(this, osdGroup, "osd_total", Preferences::SeekTimerTotal); + connect( osdGroup, SIGNAL(activated(int)), core, SLOT(changeOSD(int)) ); + + // Denoise + denoiseGroup = new MyActionGroup(this); + denoiseNoneAct = new MyActionGroupItem(this, denoiseGroup, "denoise_none", MediaSettings::NoDenoise); + denoiseNormalAct = new MyActionGroupItem(this, denoiseGroup, "denoise_normal", MediaSettings::DenoiseNormal); + denoiseSoftAct = new MyActionGroupItem(this, denoiseGroup, "denoise_soft", MediaSettings::DenoiseSoft); + connect( denoiseGroup, SIGNAL(activated(int)), core, SLOT(changeDenoise(int)) ); + + // Video size + sizeGroup = new MyActionGroup(this); + size50 = new MyActionGroupItem(this, sizeGroup, "5&0%", "size_50", 50); + size75 = new MyActionGroupItem(this, sizeGroup, "7&5%", "size_75", 75); + size100 = new MyActionGroupItem(this, sizeGroup, "&100%", "size_100", 100); + size125 = new MyActionGroupItem(this, sizeGroup, "1&25%", "size_125", 125); + size150 = new MyActionGroupItem(this, sizeGroup, "15&0%", "size_150", 150); + size175 = new MyActionGroupItem(this, sizeGroup, "1&75%", "size_175", 175); + size200 = new MyActionGroupItem(this, sizeGroup, "&200%", "size_200", 200); + size300 = new MyActionGroupItem(this, sizeGroup, "&300%", "size_300", 300); + size400 = new MyActionGroupItem(this, sizeGroup, "&400%", "size_400", 400); + size100->setShortcut( Qt::CTRL | Qt::Key_1 ); + size200->setShortcut( Qt::CTRL | Qt::Key_2 ); + connect( sizeGroup, SIGNAL(activated(int)), core, SLOT(changeSize(int)) ); + // Make all not checkable + QList size_list = sizeGroup->actions(); + for (int n=0; n < size_list.count(); n++) { + size_list[n]->setCheckable(false); + } + + // Deinterlace + deinterlaceGroup = new MyActionGroup(this); + deinterlaceNoneAct = new MyActionGroupItem(this, deinterlaceGroup, "deinterlace_none", MediaSettings::NoDeinterlace); + deinterlaceL5Act = new MyActionGroupItem(this, deinterlaceGroup, "deinterlace_l5", MediaSettings::L5); + deinterlaceYadif0Act = new MyActionGroupItem(this, deinterlaceGroup, "deinterlace_yadif0", MediaSettings::Yadif); + deinterlaceYadif1Act = new MyActionGroupItem(this, deinterlaceGroup, "deinterlace_yadif1", MediaSettings::Yadif_1); + deinterlaceLBAct = new MyActionGroupItem(this, deinterlaceGroup, "deinterlace_lb", MediaSettings::LB); + deinterlaceKernAct = new MyActionGroupItem(this, deinterlaceGroup, "deinterlace_kern", MediaSettings::Kerndeint); + connect( deinterlaceGroup, SIGNAL(activated(int)), + core, SLOT(changeDeinterlace(int)) ); + + // Audio channels + channelsGroup = new MyActionGroup(this); + /* channelsDefaultAct = new MyActionGroupItem(this, channelsGroup, "channels_default", MediaSettings::ChDefault); */ + channelsStereoAct = new MyActionGroupItem(this, channelsGroup, "channels_stereo", MediaSettings::ChStereo); + channelsSurroundAct = new MyActionGroupItem(this, channelsGroup, "channels_surround", MediaSettings::ChSurround); + channelsFull51Act = new MyActionGroupItem(this, channelsGroup, "channels_ful51", MediaSettings::ChFull51); + connect( channelsGroup, SIGNAL(activated(int)), + core, SLOT(setAudioChannels(int)) ); + + // Stereo mode + stereoGroup = new MyActionGroup(this); + stereoAct = new MyActionGroupItem(this, stereoGroup, "stereo", MediaSettings::Stereo); + leftChannelAct = new MyActionGroupItem(this, stereoGroup, "left_channel", MediaSettings::Left); + rightChannelAct = new MyActionGroupItem(this, stereoGroup, "right_channel", MediaSettings::Right); + connect( stereoGroup, SIGNAL(activated(int)), + core, SLOT(setStereoMode(int)) ); + + // Video aspect + aspectGroup = new MyActionGroup(this); + aspectDetectAct = new MyActionGroupItem(this, aspectGroup, "aspect_detect", MediaSettings::AspectAuto); + aspect43Act = new MyActionGroupItem(this, aspectGroup, "aspect_4:3", MediaSettings::Aspect43); + aspect54Act = new MyActionGroupItem(this, aspectGroup, "aspect_5:4", MediaSettings::Aspect54 ); + aspect149Act = new MyActionGroupItem(this, aspectGroup, "aspect_14:9", MediaSettings::Aspect149 ); + aspect169Act = new MyActionGroupItem(this, aspectGroup, "aspect_16:9", MediaSettings::Aspect169 ); + aspect1610Act = new MyActionGroupItem(this, aspectGroup, "aspect_16:10", MediaSettings::Aspect1610 ); + aspect235Act = new MyActionGroupItem(this, aspectGroup, "aspect_2.35:1", MediaSettings::Aspect235 ); + QAction * aspect_separator = new QAction(aspectGroup); + aspect_separator->setSeparator(true); + aspect43LetterAct = new MyActionGroupItem(this, aspectGroup, "aspect_4:3_letterbox", MediaSettings::Aspect43Letterbox ); + aspect169LetterAct = new MyActionGroupItem(this, aspectGroup, "aspect_16:9_letterbox", MediaSettings::Aspect169Letterbox ); + aspect43PanscanAct = new MyActionGroupItem(this, aspectGroup, "aspect_4:3_panscan", MediaSettings::Aspect43Panscan ); + aspect43To169Act = new MyActionGroupItem(this, aspectGroup, "aspect_4:3_to_16:9", MediaSettings::Aspect43To169 ); + connect( aspectGroup, SIGNAL(activated(int)), + core, SLOT(changeAspectRatio(int)) ); + + // Audio track + audioTrackGroup = new MyActionGroup(this); + connect( audioTrackGroup, SIGNAL(activated(int)), + core, SLOT(changeAudio(int)) ); + + // Subtitle track + subtitleTrackGroup = new MyActionGroup(this); + connect( subtitleTrackGroup, SIGNAL(activated(int)), + core, SLOT(changeSubtitle(int)) ); + + // Titles + titleGroup = new MyActionGroup(this); + connect( titleGroup, SIGNAL(activated(int)), + core, SLOT(changeTitle(int)) ); + + // Angles + angleGroup = new MyActionGroup(this); + connect( angleGroup, SIGNAL(activated(int)), + core, SLOT(changeAngle(int)) ); + + // Chapters + chapterGroup = new MyActionGroup(this); + connect( chapterGroup, SIGNAL(activated(int)), + core, SLOT(changeChapter(int)) ); +} + + +void BaseGui::retranslateStrings() { + setWindowIcon( Images::icon("logo", 64) ); + + // ACTIONS + + // Menu File + openFileAct->change( Images::icon("open"), tr("&File...") ); + openDirectoryAct->change( Images::icon("openfolder"), tr("D&irectory...") ); + openPlaylistAct->change( Images::icon("open_playlist"), tr("&Playlist...") ); + openVCDAct->change( Images::icon("vcd"), tr("V&CD") ); + openAudioCDAct->change( Images::icon("cdda"), tr("&Audio CD") ); + openDVDAct->change( Images::icon("dvd"), tr("&DVD from drive") ); + openDVDFolderAct->change( Images::icon("dvd_hd"), tr("D&VD from folder...") ); + openURLAct->change( Images::icon("url"), tr("&URL...") ); + exitAct->change( Images::icon("close"), tr("C&lose") ); + + // Menu Play + playAct->change( tr("P&lay") ); + if (qApp->isLeftToRight()) + playAct->setIcon( Images::icon("play") ); + else + playAct->setIcon( Images::flippedIcon("play") ); + + pauseAct->change( Images::icon("pause"), tr("&Pause")); + stopAct->change( Images::icon("stop"), tr("&Stop") ); + frameStepAct->change( Images::icon("frame_step"), tr("&Frame step") ); + + playOrPauseAct->change( tr("Play / Pause") ); + if (qApp->isLeftToRight()) + playOrPauseAct->setIcon( Images::icon("play") ); + else + playOrPauseAct->setIcon( Images::flippedIcon("play") ); + + pauseAndStepAct->change( Images::icon("pause"), tr("Pause / Frame step") ); + + setJumpTexts(); // Texts for rewind*Act and forward*Act + + repeatAct->change( Images::icon("repeat"), tr("&Repeat") ); + + // Submenu speed + normalSpeedAct->change( tr("&Normal speed") ); + halveSpeedAct->change( tr("&Halve speed") ); + doubleSpeedAct->change( tr("&Double speed") ); + decSpeedAct->change( tr("Speed &-10%") ); + incSpeedAct->change( tr("Speed &+10%") ); + + // Menu Video + fullscreenAct->change( Images::icon("fullscreen"), tr("&Fullscreen") ); + compactAct->change( Images::icon("compact"), tr("&Compact mode") ); + equalizerAct->change( Images::icon("equalizer"), tr("&Equalizer") ); + screenshotAct->change( Images::icon("screenshot"), tr("&Screenshot") ); + onTopAct->change( Images::icon("ontop"), tr("S&tay on top") ); + flipAct->change( Images::icon("flip"), tr("Flip i&mage") ); + + decZoomAct->change( tr("Zoom &-") ); + incZoomAct->change( tr("Zoom &+") ); + resetZoomAct->change( tr("&Reset") ); + moveLeftAct->change( tr("Move &left") ); + moveRightAct->change( tr("Move &right") ); + moveUpAct->change( tr("Move &up") ); + moveDownAct->change( tr("Move &down") ); + + // Submenu Filters + postProcessingAct->change( tr("&Postprocessing") ); + phaseAct->change( tr("&Autodetect phase") ); + deblockAct->change( tr("&Deblock") ); + deringAct->change( tr("De&ring") ); + addNoiseAct->change( tr("Add n&oise") ); + + // Menu Audio + QIcon icset( Images::icon("volume") ); + icset.addPixmap( Images::icon("mute"), QIcon::Normal, QIcon::On ); + muteAct->change( icset, tr("&Mute") ); + decVolumeAct->change( Images::icon("audio_down"), tr("Volume &-") ); + incVolumeAct->change( Images::icon("audio_up"), tr("Volume &+") ); + decAudioDelayAct->change( Images::icon("delay_down"), tr("&Delay -") ); + incAudioDelayAct->change( Images::icon("delay_up"), tr("D&elay +") ); + loadAudioAct->change( Images::icon("open"), tr("&Load external file...") ); + unloadAudioAct->change( Images::icon("unload"), tr("U&nload") ); + + // Submenu Filters + extrastereoAct->change( tr("&Extrastereo") ); + karaokeAct->change( tr("&Karaoke") ); + volnormAct->change( tr("Volume &normalization") ); + + // Menu Subtitles + loadSubsAct->change( Images::icon("open"), tr("&Load...") ); +#if SUBTITLES_BY_INDEX + unloadSubsAct->change( Images::icon("unload"), tr("U&nload") ); +#endif + decSubDelayAct->change( Images::icon("delay_down"), tr("Delay &-") ); + incSubDelayAct->change( Images::icon("delay_up"), tr("Delay &+") ); + decSubPosAct->change( Images::icon("sub_up"), tr("&Up") ); + incSubPosAct->change( Images::icon("sub_down"), tr("&Down") ); + decSubStepAct->change( Images::icon("dec_sub_step"), + tr("&Previous line in subtitles") ); + incSubStepAct->change( Images::icon("inc_sub_step"), + tr("N&ext line in subtitles") ); + useAssAct->change( Images::icon("use_ass_lib"), tr("Use SSA/&ASS library") ); + + // Menu Options + showPlaylistAct->change( Images::icon("playlist"), tr("&Playlist") ); + showPropertiesAct->change( Images::icon("info"), tr("View &info and properties...") ); + frameCounterAct->change( Images::icon("frame_counter"), + tr("&Show frame counter") ); + showPreferencesAct->change( Images::icon("prefs"), tr("P&references") ); + + // Submenu Logs + showLogMplayerAct->change( "MPlayer" ); + showLogSmplayerAct->change( "SMPlayer" ); + + // Menu Help + aboutQtAct->change( Images::icon("qt"), tr("About &Qt") ); + aboutThisAct->change( Images::icon("logo_small"), tr("About &SMPlayer") ); + + // Playlist + playNextAct->change( tr("&Next") ); + playPrevAct->change( tr("Pre&vious") ); + + if (qApp->isLeftToRight()) { + playNextAct->setIcon( Images::icon("next") ); + playPrevAct->setIcon( Images::icon("previous") ); + } else { + playNextAct->setIcon( Images::flippedIcon("next") ); + playPrevAct->setIcon( Images::flippedIcon("previous") ); + } + + + // Actions not in menus or buttons + // Volume 2 +#if !USE_MULTIPLE_SHORTCUTS + decVolume2Act->change( tr("Dec volume (2)") ); + incVolume2Act->change( tr("Inc volume (2)") ); +#endif + // Exit fullscreen + exitFullscreenAct->change( tr("Exit fullscreen") ); + + nextOSDAct->change( tr("OSD - Next level") ); + decContrastAct->change( tr("Dec contrast") ); + incContrastAct->change( tr("Inc contrast") ); + decBrightnessAct->change( tr("Dec brightness") ); + incBrightnessAct->change( tr("Inc brightness") ); + decHueAct->change( tr("Dec hue") ); + incHueAct->change( tr("Inc hue") ); + decSaturationAct->change( tr("Dec saturation") ); + incSaturationAct->change( tr("Inc saturation") ); + decGammaAct->change( tr("Dec gamma") ); + incGammaAct->change( tr("Inc gamma") ); + nextAudioAct->change( tr("Next audio") ); + nextSubtitleAct->change( tr("Next subtitle") ); + nextChapterAct->change( tr("Next chapter") ); + prevChapterAct->change( tr("Previous chapter") ); + doubleSizeAct->change( tr("&Toggle double size") ); + + // Action groups + osdNoneAct->change( tr("&Disabled") ); + osdSeekAct->change( tr("&Seek bar") ); + osdTimerAct->change( tr("&Time") ); + osdTotalAct->change( tr("Time + T&otal time") ); + + + // MENUS + openMenu->menuAction()->setText( tr("&Open") ); + playMenu->menuAction()->setText( tr("&Play") ); + videoMenu->menuAction()->setText( tr("&Video") ); + audioMenu->menuAction()->setText( tr("&Audio") ); + subtitlesMenu->menuAction()->setText( tr("&Subtitles") ); + browseMenu->menuAction()->setText( tr("&Browse") ); + optionsMenu->menuAction()->setText( tr("Op&tions") ); + helpMenu->menuAction()->setText( tr("&Help") ); + + /* + openMenuAct->setIcon( Images::icon("open_menu") ); + playMenuAct->setIcon( Images::icon("play_menu") ); + videoMenuAct->setIcon( Images::icon("video_menu") ); + audioMenuAct->setIcon( Images::icon("audio_menu") ); + subtitlesMenuAct->setIcon( Images::icon("subtitles_menu") ); + browseMenuAct->setIcon( Images::icon("browse_menu") ); + optionsMenuAct->setIcon( Images::icon("options_menu") ); + helpMenuAct->setIcon( Images::icon("help_menu") ); + */ + + // Menu Open + recentfiles_menu->menuAction()->setText( tr("&Recent files") ); + recentfiles_menu->menuAction()->setIcon( Images::icon("recents") ); + clearRecentsAct->change( Images::icon("delete"), tr("&Clear") ); + + // Menu Play + speed_menu->menuAction()->setText( tr("Sp&eed") ); + speed_menu->menuAction()->setIcon( Images::icon("speed") ); + + // Menu Video + videosize_menu->menuAction()->setText( tr("Si&ze") ); + videosize_menu->menuAction()->setIcon( Images::icon("video_size") ); + + panscan_menu->menuAction()->setText( tr("&Pan && scan") ); + panscan_menu->menuAction()->setIcon( Images::icon("panscan") ); + + aspect_menu->menuAction()->setText( tr("&Aspect ratio") ); + aspect_menu->menuAction()->setIcon( Images::icon("aspect") ); + + deinterlace_menu->menuAction()->setText( tr("&Deinterlace") ); + deinterlace_menu->menuAction()->setIcon( Images::icon("deinterlace") ); + + videofilter_menu->menuAction()->setText( tr("F&ilters") ); + videofilter_menu->menuAction()->setIcon( Images::icon("video_filters") ); + + /* + denoise_menu->menuAction()->setText( tr("De&noise") ); + denoise_menu->menuAction()->setIcon( Images::icon("denoise") ); + */ + + aspectDetectAct->change( tr("&Autodetect") ); + aspect43Act->change( "&4:3" ); + aspect54Act->change( "&5:4" ); + aspect149Act->change( "&14:9" ); + aspect169Act->change( "16:&9" ); + aspect1610Act->change( "1&6:10" ); + aspect235Act->change( "&2.35:1" ); + aspect43LetterAct->change( tr("4:3 &Letterbox") ); + aspect169LetterAct->change( tr("16:9 L&etterbox") ); + aspect43PanscanAct->change( tr("4:3 &Panscan") ); + aspect43To169Act->change( tr("4:3 &to 16:9") ); + + deinterlaceNoneAct->change( tr("&None") ); + deinterlaceL5Act->change( tr("&Lowpass5") ); + deinterlaceYadif0Act->change( tr("&Yadif (normal)") ); + deinterlaceYadif1Act->change( tr("Y&adif (double framerate)") ); + deinterlaceLBAct->change( tr("Linear &Blend") ); + deinterlaceKernAct->change( tr("&Kerndeint") ); + + denoiseNoneAct->change( tr("Denoise o&ff") ); + denoiseNormalAct->change( tr("Denoise nor&mal") ); + denoiseSoftAct->change( tr("Denoise &soft") ); + + // Menu Audio + audiotrack_menu->menuAction()->setText( tr("&Track") ); + audiotrack_menu->menuAction()->setIcon( Images::icon("audio_track") ); + + audiofilter_menu->menuAction()->setText( tr("&Filters") ); + audiofilter_menu->menuAction()->setIcon( Images::icon("audio_filters") ); + + audiochannels_menu->menuAction()->setText( tr("&Channels") ); + audiochannels_menu->menuAction()->setIcon( Images::icon("audio_channels") ); + + stereomode_menu->menuAction()->setText( tr("&Stereo mode") ); + stereomode_menu->menuAction()->setIcon( Images::icon("stereo_mode") ); + + /* channelsDefaultAct->change( tr("&Default") ); */ + channelsStereoAct->change( tr("&Stereo") ); + channelsSurroundAct->change( tr("&4.0 Surround") ); + channelsFull51Act->change( tr("&5.1 Surround") ); + + stereoAct->change( tr("&Stereo") ); + leftChannelAct->change( tr("&Left channel") ); + rightChannelAct->change( tr("&Right channel") ); + + // Menu Subtitle + subtitlestrack_menu->menuAction()->setText( tr("&Select") ); + subtitlestrack_menu->menuAction()->setIcon( Images::icon("sub") ); + + // Menu Browse + titles_menu->menuAction()->setText( tr("&Title") ); + titles_menu->menuAction()->setIcon( Images::icon("title") ); + + chapters_menu->menuAction()->setText( tr("&Chapter") ); + chapters_menu->menuAction()->setIcon( Images::icon("chapter") ); + + angles_menu->menuAction()->setText( tr("&Angle") ); + angles_menu->menuAction()->setIcon( Images::icon("angle") ); + + // Menu Options + osd_menu->menuAction()->setText( tr("&OSD") ); + osd_menu->menuAction()->setIcon( Images::icon("osd") ); + + logs_menu->menuAction()->setText( tr("&View logs") ); + logs_menu->menuAction()->setIcon( Images::icon("logs") ); + + + // To be sure that the "" string is translated + initializeMenus(); + + // Other things + mplayer_log_window->setWindowTitle( tr("SMPlayer - mplayer log") ); + smplayer_log_window->setWindowTitle( tr("SMPlayer - smplayer log") ); + + updateRecents(); + updateWidgets(); + + // Update actions view in preferences + // It has to be done, here. The actions are translated after the + // preferences dialog. + if (pref_dialog) pref_dialog->mod_input()->actions_editor->updateView(); +} + +void BaseGui::setJumpTexts() { + rewind1Act->change( tr("-%1").arg(Helper::timeForJumps(pref->seeking1)) ); + rewind2Act->change( tr("-%1").arg(Helper::timeForJumps(pref->seeking2)) ); + rewind3Act->change( tr("-%1").arg(Helper::timeForJumps(pref->seeking3)) ); + + forward1Act->change( tr("+%1").arg(Helper::timeForJumps(pref->seeking1)) ); + forward2Act->change( tr("+%1").arg(Helper::timeForJumps(pref->seeking2)) ); + forward3Act->change( tr("+%1").arg(Helper::timeForJumps(pref->seeking3)) ); + + if (qApp->isLeftToRight()) { + rewind1Act->setIcon( Images::icon("rewind10s") ); + rewind2Act->setIcon( Images::icon("rewind1m") ); + rewind3Act->setIcon( Images::icon("rewind10m") ); + + forward1Act->setIcon( Images::icon("forward10s") ); + forward2Act->setIcon( Images::icon("forward1m") ); + forward3Act->setIcon( Images::icon("forward10m") ); + } else { + rewind1Act->setIcon( Images::flippedIcon("rewind10s") ); + rewind2Act->setIcon( Images::flippedIcon("rewind1m") ); + rewind3Act->setIcon( Images::flippedIcon("rewind10m") ); + + forward1Act->setIcon( Images::flippedIcon("forward10s") ); + forward2Act->setIcon( Images::flippedIcon("forward1m") ); + forward3Act->setIcon( Images::flippedIcon("forward10m") ); + } +} + +void BaseGui::setWindowCaption(const QString & title) { + setWindowTitle(title); +} + +void BaseGui::createCore() { + core = new Core( mplayerwindow, this ); + + connect( core, SIGNAL(menusNeedInitialize()), + this, SLOT(initializeMenus()) ); + connect( core, SIGNAL(widgetsNeedUpdate()), + this, SLOT(updateWidgets()) ); + connect( core, SIGNAL(equalizerNeedsUpdate()), + this, SLOT(updateEqualizer()) ); + + connect( core, SIGNAL(showFrame(int)), + this, SIGNAL(frameChanged(int)) ); + + connect( core, SIGNAL(showTime(double)), + this, SLOT(gotCurrentTime(double)) ); + + connect( core, SIGNAL(needResize(int, int)), + this, SLOT(resizeWindow(int,int)) ); + connect( core, SIGNAL(showMessage(QString)), + this, SLOT(displayMessage(QString)) ); + connect( core, SIGNAL(stateChanged(Core::State)), + this, SLOT(displayState(Core::State)) ); + + connect( core, SIGNAL(mediaStartPlay()), + this, SLOT(enterFullscreenOnPlay()) ); + connect( core, SIGNAL(mediaStoppedByUser()), + this, SLOT(exitFullscreenOnStop()) ); + connect( core, SIGNAL(mediaLoaded()), + this, SLOT(newMediaLoaded()) ); + connect( core, SIGNAL(mediaInfoChanged()), + this, SLOT(updateMediaInfo()) ); + + // Hide mplayer window + connect( core, SIGNAL(noVideo()), + this, SLOT(hidePanel()) ); +} + +void BaseGui::createMplayerWindow() { + mplayerwindow = new MplayerWindow( panel ); + mplayerwindow->setColorKey( pref->color_key ); + + QHBoxLayout * layout = new QHBoxLayout; + layout->setSpacing(0); + layout->setMargin(0); + layout->addWidget(mplayerwindow); + panel->setLayout(layout); + + // mplayerwindow + connect( mplayerwindow, SIGNAL(rightButtonReleased(QPoint)), + this, SLOT(showPopupMenu(QPoint)) ); + + // mplayerwindow mouse events + connect( mplayerwindow, SIGNAL(doubleClicked()), + this, SLOT(doubleClickFunction()) ); + connect( mplayerwindow, SIGNAL(leftClicked()), + this, SLOT(leftClickFunction()) ); + connect( mplayerwindow, SIGNAL(mouseMoved(QPoint)), + this, SLOT(checkMousePos(QPoint)) ); +} + +void BaseGui::createVideoEqualizer() { + // Equalizer + equalizer = new VideoEqualizer(this); + + connect( equalizer->contrast, SIGNAL(valueChanged(int)), + core, SLOT(setContrast(int)) ); + connect( equalizer->brightness, SIGNAL(valueChanged(int)), + core, SLOT(setBrightness(int)) ); + connect( equalizer->hue, SIGNAL(valueChanged(int)), + core, SLOT(setHue(int)) ); + connect( equalizer->saturation, SIGNAL(valueChanged(int)), + core, SLOT(setSaturation(int)) ); + connect( equalizer->gamma, SIGNAL(valueChanged(int)), + core, SLOT(setGamma(int)) ); + connect( equalizer, SIGNAL(visibilityChanged()), + this, SLOT(updateWidgets()) ); +} + +void BaseGui::createPlaylist() { +#if DOCK_PLAYLIST + playlist = new Playlist(core, this, 0); +#else + //playlist = new Playlist(core, this, "playlist"); + playlist = new Playlist(core, 0); +#endif + + /* + connect( playlist, SIGNAL(playlistEnded()), + this, SLOT(exitFullscreenOnStop()) ); + */ + connect( playlist, SIGNAL(playlistEnded()), + this, SLOT(playlistHasFinished()) ); + /* + connect( playlist, SIGNAL(visibilityChanged()), + this, SLOT(playlistVisibilityChanged()) ); + */ + +} + +void BaseGui::createPanel() { + panel = new QWidget( this ); + panel->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ); + panel->setMinimumSize( QSize(0,0) ); + panel->setFocusPolicy( Qt::StrongFocus ); + + // panel + panel->setAutoFillBackground(TRUE); + Helper::setBackgroundColor( panel, QColor(0,0,0) ); +} + +void BaseGui::createPreferencesDialog() { + pref_dialog = new PreferencesDialog(this); + pref_dialog->setModal(false); + pref_dialog->mod_input()->setActionsList( actions_list ); + connect( pref_dialog, SIGNAL(applied()), + this, SLOT(applyNewPreferences()) ); +} + +void BaseGui::createFilePropertiesDialog() { + file_dialog = new FilePropertiesDialog(this); + file_dialog->setModal(false); + connect( file_dialog, SIGNAL(applied()), + this, SLOT(applyFileProperties()) ); +} + + +void BaseGui::createMenus() { + // MENUS + openMenu = menuBar()->addMenu("Open"); + playMenu = menuBar()->addMenu("Play"); + videoMenu = menuBar()->addMenu("Video"); + audioMenu = menuBar()->addMenu("Audio"); + subtitlesMenu = menuBar()->addMenu("Subtitles"); + browseMenu = menuBar()->addMenu("Browwse"); + optionsMenu = menuBar()->addMenu("Options"); + helpMenu = menuBar()->addMenu("Help"); + + // OPEN MENU + openMenu->addAction(openFileAct); + + recentfiles_menu = new QMenu(this); + recentfiles_menu->addAction( clearRecentsAct ); + recentfiles_menu->addSeparator(); + + openMenu->addMenu( recentfiles_menu ); + + openMenu->addAction(openDirectoryAct); + openMenu->addAction(openPlaylistAct); + openMenu->addAction(openDVDAct); + openMenu->addAction(openDVDFolderAct); + openMenu->addAction(openVCDAct); + openMenu->addAction(openAudioCDAct); + openMenu->addAction(openURLAct); + + openMenu->addSeparator(); + openMenu->addAction(exitAct); + + // PLAY MENU + playMenu->addAction(playAct); + playMenu->addAction(pauseAct); + /* playMenu->addAction(playOrPauseAct); */ + playMenu->addAction(stopAct); + playMenu->addAction(frameStepAct); + playMenu->addSeparator(); + playMenu->addAction(rewind1Act); + playMenu->addAction(forward1Act); + playMenu->addAction(rewind2Act); + playMenu->addAction(forward2Act); + playMenu->addAction(rewind3Act); + playMenu->addAction(forward3Act); + playMenu->addSeparator(); + + // Speed submenu + speed_menu = new QMenu(this); + speed_menu->addAction(normalSpeedAct); + speed_menu->addAction(halveSpeedAct); + speed_menu->addAction(doubleSpeedAct); + speed_menu->addAction(decSpeedAct); + speed_menu->addAction(incSpeedAct); + + playMenu->addMenu(speed_menu); + + playMenu->addAction(repeatAct); + + // VIDEO MENU + videoMenu->addAction(fullscreenAct); + videoMenu->addAction(compactAct); + + // Size submenu + videosize_menu = new QMenu(this); + videosize_menu->addActions( sizeGroup->actions() ); + videosize_menu->addSeparator(); + videosize_menu->addAction(doubleSizeAct); + videoMenu->addMenu(videosize_menu); + + // Panscan submenu + panscan_menu = new QMenu(this); + panscan_menu->addAction(resetZoomAct); + panscan_menu->addAction(decZoomAct); + panscan_menu->addAction(incZoomAct); + panscan_menu->addSeparator(); + panscan_menu->addAction(moveLeftAct); + panscan_menu->addAction(moveRightAct); + panscan_menu->addAction(moveUpAct); + panscan_menu->addAction(moveDownAct); + + videoMenu->addMenu(panscan_menu); + + // Aspect submenu + aspect_menu = new QMenu(this); + aspect_menu->addActions( aspectGroup->actions() ); + + videoMenu->addMenu(aspect_menu); + + // Deinterlace submenu + deinterlace_menu = new QMenu(this); + deinterlace_menu->addActions( deinterlaceGroup->actions() ); + + videoMenu->addMenu(deinterlace_menu); + + // Video filter submenu + videofilter_menu = new QMenu(this); + videofilter_menu->addAction(postProcessingAct); + videofilter_menu->addAction(phaseAct); + videofilter_menu->addAction(deblockAct); + videofilter_menu->addAction(deringAct); + videofilter_menu->addAction(addNoiseAct); + + videofilter_menu->addSeparator(); + videofilter_menu->addActions(denoiseGroup->actions()); + + videoMenu->addMenu(videofilter_menu); + + // Denoise submenu + /* + denoise_menu = new QMenu(this); + denoise_menu->addActions(denoiseGroup->actions()); + videoMenu->addMenu(denoise_menu); + */ + + videoMenu->addAction(flipAct); + videoMenu->addSeparator(); + videoMenu->addAction(equalizerAct); + videoMenu->addAction(screenshotAct); + videoMenu->addAction(onTopAct); + + + // AUDIO MENU + + // Audio track submenu + audiotrack_menu = new QMenu(this); + + audioMenu->addMenu(audiotrack_menu); + + audioMenu->addAction(loadAudioAct); + audioMenu->addAction(unloadAudioAct); + + // Filter submenu + audiofilter_menu = new QMenu(this); + audiofilter_menu->addAction(extrastereoAct); + audiofilter_menu->addAction(karaokeAct); + audiofilter_menu->addAction(volnormAct); + + audioMenu->addMenu(audiofilter_menu); + + // Audio channels submenu + audiochannels_menu = new QMenu(this); + audiochannels_menu->addActions( channelsGroup->actions() ); + + audioMenu->addMenu(audiochannels_menu); + + // Stereo mode submenu + stereomode_menu = new QMenu(this); + stereomode_menu->addActions( stereoGroup->actions() ); + + audioMenu->addMenu(stereomode_menu); + + audioMenu->addAction(muteAct); + audioMenu->addSeparator(); + audioMenu->addAction(decVolumeAct); + audioMenu->addAction(incVolumeAct); + audioMenu->addSeparator(); + audioMenu->addAction(decAudioDelayAct); + audioMenu->addAction(incAudioDelayAct); + + + // SUBTITLES MENU + // Track submenu + subtitlestrack_menu = new QMenu(this); + + subtitlesMenu->addMenu(subtitlestrack_menu); + + subtitlesMenu->addAction(loadSubsAct); +#if SUBTITLES_BY_INDEX + subtitlesMenu->addAction(unloadSubsAct); +#endif + subtitlesMenu->addSeparator(); + subtitlesMenu->addAction(decSubDelayAct); + subtitlesMenu->addAction(incSubDelayAct); + subtitlesMenu->addSeparator(); + subtitlesMenu->addAction(decSubPosAct); + subtitlesMenu->addAction(incSubPosAct); + subtitlesMenu->addSeparator(); + subtitlesMenu->addAction(decSubStepAct); + subtitlesMenu->addAction(incSubStepAct); + subtitlesMenu->addSeparator(); + subtitlesMenu->addAction(useAssAct); + + // BROWSE MENU + // Titles submenu + titles_menu = new QMenu(this); + + browseMenu->addMenu(titles_menu); + + // Chapters submenu + chapters_menu = new QMenu(this); + + browseMenu->addMenu(chapters_menu); + + // Angles submenu + angles_menu = new QMenu(this); + + browseMenu->addMenu(angles_menu); + + // OPTIONS MENU + optionsMenu->addAction(showPropertiesAct); + optionsMenu->addAction(showPlaylistAct); + optionsMenu->addAction(frameCounterAct); + + // OSD submenu + osd_menu = new QMenu(this); + osd_menu->addActions(osdGroup->actions()); + + optionsMenu->addMenu(osd_menu); + + // Logs submenu + logs_menu = new QMenu(this); + logs_menu->addAction(showLogMplayerAct); + logs_menu->addAction(showLogSmplayerAct); + + optionsMenu->addMenu(logs_menu); + + optionsMenu->addAction(showPreferencesAct); + + + // HELP MENU + helpMenu->addAction(aboutQtAct); + helpMenu->addAction(aboutThisAct); + + // POPUP MENU + if (!popup) + popup = new QMenu(this); + else + popup->clear(); + + popup->addMenu( openMenu ); + popup->addMenu( playMenu ); + popup->addMenu( videoMenu ); + popup->addMenu( audioMenu ); + popup->addMenu( subtitlesMenu ); + popup->addMenu( browseMenu ); + popup->addMenu( optionsMenu ); + + // let's show something, even a entry + initializeMenus(); +} + +/* +void BaseGui::closeEvent( QCloseEvent * e ) { + qDebug("BaseGui::closeEvent"); + + qDebug("mplayer_log_window: %d x %d", mplayer_log_window->width(), mplayer_log_window->height() ); + qDebug("smplayer_log_window: %d x %d", smplayer_log_window->width(), smplayer_log_window->height() ); + + mplayer_log_window->close(); + smplayer_log_window->close(); + playlist->close(); + equalizer->close(); + + core->stop(); + e->accept(); +} +*/ + + +void BaseGui::closeWindow() { + qDebug("BaseGui::closeWindow"); + + core->stop(); + //qApp->closeAllWindows(); + qApp->quit(); +} + +void BaseGui::showPlaylist() { + showPlaylist( !playlist->isVisible() ); +} + +void BaseGui::showPlaylist(bool b) { + if ( !b ) { + playlist->hide(); + } else { + exitFullscreenIfNeeded(); + playlist->show(); + } + //updateWidgets(); +} + +void BaseGui::showEqualizer() { + showEqualizer( !equalizer->isVisible() ); +} + +void BaseGui::showEqualizer(bool b) { + if (!b) { + equalizer->hide(); + } else { + // Exit fullscreen, otherwise dialog is not visible + exitFullscreenIfNeeded(); + equalizer->show(); + } + updateWidgets(); +} + +void BaseGui::showPreferencesDialog() { + qDebug("BaseGui::showPreferencesDialog"); + + exitFullscreenIfNeeded(); + + if (!pref_dialog) { + createPreferencesDialog(); + } + + pref_dialog->setData(pref); + + pref_dialog->mod_input()->actions_editor->clear(); + pref_dialog->mod_input()->actions_editor->addActions(this); +#if !DOCK_PLAYLIST + pref_dialog->mod_input()->actions_editor->addActions(playlist); +#endif + pref_dialog->show(); +} + +// The user has pressed OK in preferences dialog +void BaseGui::applyNewPreferences() { + qDebug("BaseGui::applyNewPreferences"); + + bool need_update_language = false; + + pref_dialog->getData(pref); + + if (!pref->default_font.isEmpty()) { + QFont f; + f.fromString( pref->default_font ); + qApp->setFont(f); + } + + PrefInterface *_interface = pref_dialog->mod_interface(); + if (_interface->recentsChanged()) { + recents->setMaxItems(pref->recents_max_items); + updateRecents(); + } + if (_interface->languageChanged()) need_update_language = true; + + if (_interface->iconsetChanged()) { + need_update_language = true; + // Stylesheet + #if QT_VERSION >= 0x040200 + changeStyleSheet(pref->iconset); + #endif + } + + if (!pref->use_single_instance && server->isListening()) { + server->close(); + qDebug("BaseGui::applyNewPreferences: server closed"); + } + else + { + bool server_requires_restart = _interface->serverPortChanged(); + if (pref->use_single_instance && !server->isListening()) + server_requires_restart=true; + + if (server_requires_restart) { + server->close(); + if (server->listen(pref->connection_port)) { + qDebug("BaseGui::applyNewPreferences: server running on port %d", pref->connection_port); + } else { + qWarning("BaseGui::applyNewPreferences: server couldn't be started"); + } + } + } + + PrefAdvanced *advanced = pref_dialog->mod_advanced(); + if (advanced->clearingBackgroundChanged()) { + mplayerwindow->videoLayer()->allowClearingBackground(pref->always_clear_video_background); + } + if (advanced->colorkeyChanged()) { + mplayerwindow->setColorKey( pref->color_key ); + } + if (advanced->monitorAspectChanged()) { + mplayerwindow->setMonitorAspect( pref->monitor_aspect_double() ); + } + + if (need_update_language) { + translator->load(pref->language); + } + + setJumpTexts(); // Update texts in menus + updateWidgets(); // Update the screenshot action + +#if STYLE_SWITCHING + if (_interface->styleChanged()) { + qDebug( "selected style: '%s'", pref->style.toUtf8().data() ); + if ( !pref->style.isEmpty()) { + qApp->setStyle( pref->style ); + } else { + qDebug("setting default style: '%s'", default_style.toUtf8().data() ); + qApp->setStyle( default_style ); + } + } +#endif + + // Restart the video if needed + if (pref_dialog->requiresRestart()) + core->restart(); + + // Update actions + pref_dialog->mod_input()->actions_editor->applyChanges(); + saveActions(); + + pref->save(); +} + + +void BaseGui::showFilePropertiesDialog() { + qDebug("BaseGui::showFilePropertiesDialog"); + + exitFullscreenIfNeeded(); + + if (!file_dialog) { + createFilePropertiesDialog(); + } + + setDataToFileProperties(); + + file_dialog->show(); +} + +void BaseGui::setDataToFileProperties() { + // Save a copy of the original values + if (core->mset.original_demuxer.isEmpty()) + core->mset.original_demuxer = core->mdat.demuxer; + + if (core->mset.original_video_codec.isEmpty()) + core->mset.original_video_codec = core->mdat.video_codec; + + if (core->mset.original_audio_codec.isEmpty()) + core->mset.original_audio_codec = core->mdat.audio_codec; + + QString demuxer = core->mset.forced_demuxer; + if (demuxer.isEmpty()) demuxer = core->mdat.demuxer; + + QString ac = core->mset.forced_audio_codec; + if (ac.isEmpty()) ac = core->mdat.audio_codec; + + QString vc = core->mset.forced_video_codec; + if (vc.isEmpty()) vc = core->mdat.video_codec; + + file_dialog->setDemuxer(demuxer, core->mset.original_demuxer); + file_dialog->setAudioCodec(ac, core->mset.original_audio_codec); + file_dialog->setVideoCodec(vc, core->mset.original_video_codec); + + file_dialog->setMplayerAdditionalArguments( core->mset.mplayer_additional_options ); + file_dialog->setMplayerAdditionalVideoFilters( core->mset.mplayer_additional_video_filters ); + file_dialog->setMplayerAdditionalAudioFilters( core->mset.mplayer_additional_audio_filters ); + + file_dialog->setMediaData( core->mdat ); +} + +void BaseGui::applyFileProperties() { + qDebug("BaseGui::applyFileProperties"); + + bool need_restart = false; + +#undef TEST_AND_SET +#define TEST_AND_SET( Pref, Dialog ) \ + if ( Pref != Dialog ) { Pref = Dialog; need_restart = TRUE; } + + QString demuxer = file_dialog->demuxer(); + if (demuxer == core->mset.original_demuxer) demuxer=""; + TEST_AND_SET(core->mset.forced_demuxer, demuxer); + + QString ac = file_dialog->audioCodec(); + if (ac == core->mset.original_audio_codec) ac=""; + TEST_AND_SET(core->mset.forced_audio_codec, ac); + + QString vc = file_dialog->videoCodec(); + if (vc == core->mset.original_video_codec) vc=""; + TEST_AND_SET(core->mset.forced_video_codec, vc); + + TEST_AND_SET(core->mset.mplayer_additional_options, file_dialog->mplayerAdditionalArguments()); + TEST_AND_SET(core->mset.mplayer_additional_video_filters, file_dialog->mplayerAdditionalVideoFilters()); + TEST_AND_SET(core->mset.mplayer_additional_audio_filters, file_dialog->mplayerAdditionalAudioFilters()); + + // Restart the video to apply + if (need_restart) { + core->restart(); + } +} + + +void BaseGui::updateMediaInfo() { + qDebug("BaseGui::updateMediaInfo"); + + if (file_dialog) { + if (file_dialog->isVisible()) setDataToFileProperties(); + } + + setWindowCaption( core->mdat.displayName() + " - SMPlayer" ); +} + +void BaseGui::newMediaLoaded() { + qDebug("BaseGui::newMediaLoaded"); + + recents->add( core->mdat.filename ); + updateRecents(); + + // If a VCD, Audio CD or DVD, add items to playlist + if ( (core->mdat.type == TYPE_VCD) || (core->mdat.type == TYPE_DVD) || + (core->mdat.type == TYPE_AUDIO_CD) ) + { + int first_title = 1; + if (core->mdat.type == TYPE_VCD) first_title = pref->vcd_initial_title; + + QString type = "dvd"; + if (core->mdat.type == TYPE_VCD) type="vcd"; + else + if (core->mdat.type == TYPE_AUDIO_CD) type="cdda"; + + if (core->mset.current_title_id == first_title) { + playlist->clear(); + QStringList l; + QString s; + QString folder; + if (core->mdat.type == TYPE_DVD) { + folder = Helper::dvdSplitFolder( core->mdat.filename ); + } + for (int n=0; n < core->mdat.titles.numItems(); n++) { + s = type + "://" + QString::number(core->mdat.titles.itemAt(n).ID()); + if ( !folder.isEmpty() ) { + s += ":" + folder; + } + l.append(s); + } + playlist->addFiles(l); + //playlist->setModified(false); // Not a real playlist + } + } /*else { + playlist->clear(); + playlist->addCurrentFile(); + }*/ +} + +void BaseGui::showMplayerLog() { + qDebug("BaseGui::showMplayerLog"); + + exitFullscreenIfNeeded(); + + mplayer_log_window->setText( core->mplayer_log ); + mplayer_log_window->show(); +} + +void BaseGui::showLog() { + qDebug("BaseGui::showLog"); + + exitFullscreenIfNeeded(); + + smplayer_log_window->setText( Helper::log() ); + smplayer_log_window->show(); +} + + +void BaseGui::initializeMenus() { + qDebug("BaseGui::initializeMenus"); + +#define EMPTY 1 + + int n; + + // Subtitles + subtitleTrackGroup->clear(true); + QAction * subNoneAct = subtitleTrackGroup->addAction( tr("&None") ); + subNoneAct->setData(MediaSettings::SubNone); + subNoneAct->setCheckable(true); +#if SUBTITLES_BY_INDEX + for (n=0; n < core->mdat.subs.numItems(); n++) { + QAction *a = new QAction(subtitleTrackGroup); + a->setCheckable(true); + a->setText(core->mdat.subs.itemAt(n).displayName()); + a->setData(n); + } + subtitlestrack_menu->addActions( subtitleTrackGroup->actions() ); +#else + for (n=0; n < core->mdat.subtitles.numItems(); n++) { + QAction *a = new QAction(subtitleTrackGroup); + a->setCheckable(true); + a->setText(core->mdat.subtitles.itemAt(n).displayName()); + a->setData(core->mdat.subtitles.itemAt(n).ID()); + } + subtitlestrack_menu->addActions( subtitleTrackGroup->actions() ); +#endif + + // Audio + audioTrackGroup->clear(true); + if (core->mdat.audios.numItems()==0) { + QAction * a = audioTrackGroup->addAction( tr("") ); + a->setEnabled(false); + } else { + for (n=0; n < core->mdat.audios.numItems(); n++) { + QAction *a = new QAction(audioTrackGroup); + a->setCheckable(true); + a->setText(core->mdat.audios.itemAt(n).displayName()); + a->setData(core->mdat.audios.itemAt(n).ID()); + } + } + audiotrack_menu->addActions( audioTrackGroup->actions() ); + + // Titles + titleGroup->clear(true); + if (core->mdat.titles.numItems()==0) { + QAction * a = titleGroup->addAction( tr("") ); + a->setEnabled(false); + } else { + for (n=0; n < core->mdat.titles.numItems(); n++) { + QAction *a = new QAction(titleGroup); + a->setCheckable(true); + a->setText(core->mdat.titles.itemAt(n).displayName()); + a->setData(core->mdat.titles.itemAt(n).ID()); + } + } + titles_menu->addActions( titleGroup->actions() ); + + // DVD Chapters + chapterGroup->clear(true); + if ( (core->mdat.type == TYPE_DVD) && (core->mset.current_title_id > 0) ) { + for (n=1; n <= core->mdat.titles.item(core->mset.current_title_id).chapters(); n++) { + QAction *a = new QAction(chapterGroup); + a->setCheckable(true); + a->setText( QString::number(n) ); + a->setData( n ); + } + } else { + // *** Matroshka chapters *** + if (core->mdat.mkv_chapters > 0) { + for (n=0; n <= core->mdat.mkv_chapters; n++) { + QAction *a = new QAction(chapterGroup); + a->setCheckable(true); + a->setText( QString::number(n+1) ); + a->setData( n ); + } + } else { + QAction * a = chapterGroup->addAction( tr("") ); + a->setEnabled(false); + } + } + chapters_menu->addActions( chapterGroup->actions() ); + + // Angles + angleGroup->clear(true); + if (core->mset.current_angle_id > 0) { + for (n=1; n <= core->mdat.titles.item(core->mset.current_title_id).angles(); n++) { + QAction *a = new QAction(angleGroup); + a->setCheckable(true); + a->setText( QString::number(n) ); + a->setData( n ); + } + } else { + QAction * a = angleGroup->addAction( tr("") ); + a->setEnabled(false); + } + angles_menu->addActions( angleGroup->actions() ); +} + +void BaseGui::updateRecents() { + qDebug("BaseGui::updateRecents"); + + // Not clear the first 2 items + while (recentfiles_menu->actions().count() > 2) { + QAction * a = recentfiles_menu->actions()[2]; + recentfiles_menu->removeAction( a ); + a->deleteLater(); + } + + int current_items = 0; + + if (recents->count() > 0) { + int max_items = recents->count(); + if (max_items > pref->recents_max_items) { + max_items = pref->recents_max_items; + } + for (int n=0; n < max_items; n++) { + QString file = recents->item(n); + QFileInfo fi(file); + if (fi.exists()) file = fi.fileName(); + QAction * a = recentfiles_menu->addAction( file ); + a->setData(n); + connect(a, SIGNAL(triggered()), this, SLOT(openRecent())); + current_items++; + } + } else { + QAction * a = recentfiles_menu->addAction( tr("") ); + a->setEnabled(false); + + } + + recentfiles_menu->menuAction()->setVisible( current_items > 0 ); +} + +void BaseGui::clearRecentsList() { + // Delete items in menu + recents->clear(); + updateRecents(); +} + +void BaseGui::updateWidgets() { + qDebug("BaseGui::updateWidgets"); + + // Subtitles menu + subtitleTrackGroup->setChecked( core->mset.current_sub_id ); + +#if SUBTITLES_BY_INDEX + // Disable the unload subs action if there's no external subtitles + unloadSubsAct->setEnabled( !core->mset.external_subtitles.isEmpty() ); +#else + // If using an external subtitles, disable the rest + bool b = core->mset.external_subtitles.isEmpty(); + QList l = subtitleTrackGroup->actions(); + for (int n = 1; n < l.count(); n++) { + if (l[n]) l[n]->setEnabled(b); + } +#endif + + // Audio menu + audioTrackGroup->setChecked( core->mset.current_audio_id ); + channelsGroup->setChecked( core->mset.audio_use_channels ); + stereoGroup->setChecked( core->mset.stereo_mode ); + + // Disable the unload audio file action if there's no external audio file + unloadAudioAct->setEnabled( !core->mset.external_audio.isEmpty() ); + + // Aspect ratio + aspectGroup->setChecked( core->mset.aspect_ratio_id ); + + // OSD + osdGroup->setChecked( pref->osd ); + + // Titles + titleGroup->setChecked( core->mset.current_title_id ); + + // Chapters + chapterGroup->setChecked( core->mset.current_chapter_id ); + + // Angles + angleGroup->setChecked( core->mset.current_angle_id ); + + // Deinterlace menu + deinterlaceGroup->setChecked( core->mset.current_deinterlacer ); + + // Video size menu + sizeGroup->setChecked( pref->size_factor ); + + // Auto phase + phaseAct->setChecked( core->mset.phase_filter ); + + // Deblock + deblockAct->setChecked( core->mset.deblock_filter ); + + // Dering + deringAct->setChecked( core->mset.dering_filter ); + + // Add noise + addNoiseAct->setChecked( core->mset.noise_filter ); + + // Postprocessing + postProcessingAct->setChecked( core->mset.postprocessing_filter ); + + // Denoise submenu + denoiseGroup->setChecked( core->mset.current_denoiser ); + + /* + // Fullscreen button + fullscreenbutton->setOn(pref->fullscreen); + + // Mute button + mutebutton->setOn(core->mset.mute); + if (core->mset.mute) + mutebutton->setPixmap( Images::icon("mute_small") ); + else + mutebutton->setPixmap( Images::icon("volume_small") ); + + // Volume slider + volumeslider->setValue( core->mset.volume ); + */ + + // Mute menu option + muteAct->setChecked( core->mset.mute ); + + // Karaoke menu option + karaokeAct->setChecked( core->mset.karaoke_filter ); + + // Extrastereo menu option + extrastereoAct->setChecked( core->mset.extrastereo_filter ); + + // Volnorm menu option + volnormAct->setChecked( core->mset.volnorm_filter ); + + // Repeat menu option + repeatAct->setChecked( pref->loop ); + + // Fullscreen action + fullscreenAct->setChecked( pref->fullscreen ); + + // Time slider + if (core->state()==Core::Stopped) { + //FIXME + //timeslider->setValue( (int) core->mset.current_sec ); + } + + // Video equalizer + equalizerAct->setChecked( equalizer->isVisible() ); + + // Playlist +#if !DOCK_PLAYLIST + //showPlaylistAct->setChecked( playlist->isVisible() ); +#endif + +#if DOCK_PLAYLIST + showPlaylistAct->setChecked( playlist->isVisible() ); +#endif + + // Frame counter + frameCounterAct->setChecked( pref->show_frame_counter ); + + // Compact mode + compactAct->setChecked( pref->compact_mode ); + + // Stay on top + onTopAct->setChecked( pref->stay_on_top ); + + // Flip + flipAct->setChecked( core->mset.flip ); + + // Screenshot option + bool valid_directory = ( (!pref->screenshot_directory.isEmpty()) && + (QFileInfo(pref->screenshot_directory).isDir()) ); + screenshotAct->setEnabled( valid_directory ); + + // Use ass lib + useAssAct->setChecked( pref->use_ass_subtitles ); + + // Enable or disable subtitle options + bool e = !(core->mset.current_sub_id == MediaSettings::SubNone); + decSubDelayAct->setEnabled(e); + incSubDelayAct->setEnabled(e); + decSubPosAct->setEnabled(e); + incSubPosAct->setEnabled(e); + decSubStepAct->setEnabled(e); + incSubStepAct->setEnabled(e); +} + +void BaseGui::updateEqualizer() { + // Equalizer + equalizer->contrast->setValue( core->mset.contrast ); + equalizer->brightness->setValue( core->mset.brightness ); + equalizer->hue->setValue( core->mset.hue ); + equalizer->saturation->setValue( core->mset.saturation ); + equalizer->gamma->setValue( core->mset.gamma ); +} + +/* +void BaseGui::playlistVisibilityChanged() { +#if !DOCK_PLAYLIST + bool visible = playlist->isVisible(); + + showPlaylistAct->setChecked( visible ); +#endif +} +*/ + +/* +void BaseGui::openRecent(int item) { + qDebug("BaseGui::openRecent: %d", item); + if ((item > -1) && (item < RECENTS_CLEAR)) { // 1000 = Clear item + open( recents->item(item) ); + } +} +*/ + +void BaseGui::openRecent() { + QAction *a = qobject_cast (sender()); + if (a) { + int item = a->data().toInt(); + qDebug("BaseGui::openRecent: %d", item); + QString file = recents->item(item); + + if (playlist->maybeSave()) { + playlist->clear(); + playlist->addFile(file); + + open( file ); + } + } +} + +void BaseGui::open(QString file) { + qDebug("BaseGui::open: '%s'", file.toUtf8().data()); + + // If file is a playlist, open that playlist + QString extension = QFileInfo(file).suffix().toLower(); + if ( (extension=="m3u") || (extension=="m3u8") ) { + playlist->load_m3u(file); + } + else + if (QFileInfo(file).isDir()) { + openDirectory(file); + } + else { + // Let the core to open it, autodetecting the file type + //if (playlist->maybeSave()) { + // playlist->clear(); + // playlist->addFile(file); + + core->open(file); + //} + } +} + +void BaseGui::openFiles(QStringList files) { + qDebug("BaseGui::openFiles"); + if (files.empty()) return; + + if (files.count()==1) { + if (playlist->maybeSave()) { + playlist->clear(); + playlist->addFile(files[0]); + + open(files[0]); + } + } else { + if (playlist->maybeSave()) { + playlist->clear(); + playlist->addFiles(files); + open(files[0]); + } + } +} + +void BaseGui::openURL() { + qDebug("BaseGui::openURL"); + + exitFullscreenIfNeeded(); + + /* + bool ok; + QString s = QInputDialog::getText(this, + tr("SMPlayer - Enter URL"), tr("URL:"), QLineEdit::Normal, + pref->last_url, &ok ); + + if ( ok && !s.isEmpty() ) { + + //playlist->clear(); + //playlistdock->hide(); + + openURL(s); + } else { + // user entered nothing or pressed Cancel + } + */ + + InputURL d(this); + + QString url = pref->last_url; + if (url.endsWith(IS_PLAYLIST_TAG)) { + url = url.remove( QRegExp(IS_PLAYLIST_TAG_RX) ); + d.setPlaylist(true); + } + + d.setURL(url); + if (d.exec() == QDialog::Accepted ) { + QString url = d.url(); + if (!url.isEmpty()) { + if (d.isPlaylist()) url = url + IS_PLAYLIST_TAG; + openURL(url); + } + } +} + +void BaseGui::openURL(QString url) { + if (!url.isEmpty()) { + pref->last_url = url; + + if (playlist->maybeSave()) { + core->openStream(url); + + playlist->clear(); + playlist->addFile(url); + } + } +} + + +void BaseGui::openFile() { + qDebug("BaseGui::fileOpen"); + + exitFullscreenIfNeeded(); + + QString s = MyFileDialog::getOpenFileName( + this, tr("Choose a file"), pref->latest_dir, + tr("Video") +" (*.avi *.mpg *.mpeg *.mkv *.wmv " + "*.ogm *.vob *.flv *.mov *.ts *.rmvb *.mp4 " + "*.iso *.dvr-ms);;" + + tr("Audio") +" (*.mp3 *.ogg *.wav *.wma *.ac3 *.ra *.ape);;" + + tr("Playlists") +" (*.m3u *.m3u8);;" + + tr("All files") +" (*.*)" ); + + if ( !s.isEmpty() ) { + openFile(s); + } +} + +void BaseGui::openFile(QString file) { + qDebug("BaseGui::openFile: '%s'", file.toUtf8().data()); + + if ( !file.isEmpty() ) { + + //playlist->clear(); + //playlistdock->hide(); + + // If file is a playlist, open that playlist + QString extension = QFileInfo(file).suffix().toLower(); + if ( (extension=="m3u") || (extension=="m3u8") ) { + playlist->load_m3u(file); + } + else + if (extension=="iso") { + if (playlist->maybeSave()) { + core->open(file); + } + } + else { + pref->latest_dir = QFileInfo(file).absolutePath(); + if (playlist->maybeSave()) { + core->openFile(file); + + playlist->clear(); + playlist->addFile(file); + } + } + } +} + +void BaseGui::configureDiscDevices() { + QMessageBox::information( this, tr("SMPlayer - Information"), + tr("The CDROM / DVD drives are not configured yet.\n" + "The configuration dialog will be shown now, " + "so you can do it."), QMessageBox::Ok); + + showPreferencesDialog(); + pref_dialog->showSection( PreferencesDialog::Drives ); +} + +void BaseGui::openVCD() { + qDebug("BaseGui::openVCD"); + + if ( (pref->dvd_device.isEmpty()) || + (pref->cdrom_device.isEmpty()) ) + { + configureDiscDevices(); + } else { + if (playlist->maybeSave()) { + core->openVCD( pref->vcd_initial_title ); + } + } +} + +void BaseGui::openAudioCD() { + qDebug("BaseGui::openAudioCD"); + + if ( (pref->dvd_device.isEmpty()) || + (pref->cdrom_device.isEmpty()) ) + { + configureDiscDevices(); + } else { + if (playlist->maybeSave()) { + core->openAudioCD(); + } + } +} + +void BaseGui::openDVD() { + qDebug("BaseGui::openDVD"); + + if ( (pref->dvd_device.isEmpty()) || + (pref->cdrom_device.isEmpty()) ) + { + configureDiscDevices(); + } else { + if (playlist->maybeSave()) { + core->openDVD("dvd://1"); + } + } +} + +void BaseGui::openDVDFromFolder() { + qDebug("BaseGui::openDVDFromFolder"); + + if (playlist->maybeSave()) { + InputDVDDirectory *d = new InputDVDDirectory(this); + d->setFolder( pref->last_dvd_directory ); + + if (d->exec() == QDialog::Accepted) { + qDebug("BaseGui::openDVDFromFolder: accepted"); + openDVDFromFolder( d->folder() ); + } + + delete d; + } +} + +void BaseGui::openDVDFromFolder(QString directory) { + //core->openDVD(TRUE, directory); + pref->last_dvd_directory = directory; + core->openDVD( "dvd://1:" + directory); +} + +void BaseGui::openDirectory() { + qDebug("BaseGui::openDirectory"); + + QString s = MyFileDialog::getExistingDirectory( + this, tr("Choose a directory"), + pref->latest_dir ); + + if (!s.isEmpty()) { + openDirectory(s); + } +} + +void BaseGui::openDirectory(QString directory) { + qDebug("BaseGui::openDirectory: '%s'", directory.toUtf8().data()); + + if (Helper::directoryContainsDVD(directory)) { + core->open(directory); + } + else { + QFileInfo fi(directory); + if ( (fi.exists()) && (fi.isDir()) ) { + playlist->clear(); + //playlist->addDirectory(directory); + playlist->addDirectory( fi.absoluteFilePath() ); + playlist->startPlay(); + } else { + qDebug("BaseGui::openDirectory: directory is not valid"); + } + } +} + +void BaseGui::loadSub() { + qDebug("BaseGui::loadSub"); + + exitFullscreenIfNeeded(); + + QString s = MyFileDialog::getOpenFileName( + this, tr("Choose a file"), + pref->latest_dir, + tr("Subtitles") +" (*.srt *.sub *.ssa *.ass *.idx" + " *.txt *.smi *.rt *.utf *.aqt);;" + + tr("All files") +" (*.*)" ); + + if (!s.isEmpty()) core->loadSub(s); +} + +void BaseGui::loadAudioFile() { + qDebug("BaseGui::loadAudioFile"); + + exitFullscreenIfNeeded(); + + QString s = MyFileDialog::getOpenFileName( + this, tr("Choose a file"), + pref->latest_dir, + tr("Audio") +" (*.mp3 *.ogg *.wav *.wma *.ac3 *.ra *.ape);;" + + tr("All files") +" (*.*)" ); + + if (!s.isEmpty()) core->loadAudioFile(s); +} + +void BaseGui::helpAbout() { + AboutDialog d(this); + d.exec(); +} + +void BaseGui::helpAboutQt() { + QMessageBox::aboutQt(this, tr("About Qt") ); +} + +void BaseGui::exitFullscreen() { + if (pref->fullscreen) { + toggleFullscreen(false); + } +} + +void BaseGui::toggleFullscreen() { + qDebug("BaseGui::toggleFullscreen"); + + toggleFullscreen(!pref->fullscreen); +} + +void BaseGui::toggleFullscreen(bool b) { + qDebug("BaseGui::toggleFullscreen: %d", b); + + if (b==pref->fullscreen) { + // Nothing to do + qDebug("BaseGui::toggleFullscreen: nothing to do, returning"); + return; + } + + pref->fullscreen = b; + + // If using mplayer window + if (pref->use_mplayer_window) { + core->tellmp("vo_fullscreen " + QString::number(b) ); + updateWidgets(); + return; + } + + if (!panel->isVisible()) return; // mplayer window is not used. + + + if (pref->fullscreen) { + if (pref->restore_pos_after_fullscreen) { + win_pos = pos(); + win_size = size(); + } + + aboutToEnterFullscreen(); + + #ifdef Q_OS_WIN + // Avoid the video to pause + if (!pref->pause_when_hidden) hide(); + #endif + + showFullScreen(); + + } else { + #ifdef Q_OS_WIN + // Avoid the video to pause + if (!pref->pause_when_hidden) hide(); + #endif + + showNormal(); + + aboutToExitFullscreen(); + + if (pref->restore_pos_after_fullscreen) { + move( win_pos ); + resize( win_size ); + } + } + + updateWidgets(); +} + + +void BaseGui::aboutToEnterFullscreen() { + if (!pref->compact_mode) { + menuBar()->hide(); + statusBar()->hide(); + } +} + +void BaseGui::aboutToExitFullscreen() { + if (!pref->compact_mode) { + menuBar()->show(); + statusBar()->show(); + } +} + +void BaseGui::toggleFrameCounter() { + toggleFrameCounter( !pref->show_frame_counter ); +} + +void BaseGui::toggleFrameCounter(bool b) { + pref->show_frame_counter = b; + updateWidgets(); +} + + +void BaseGui::leftClickFunction() { + qDebug("BaseGui::leftClickFunction"); + + if (!pref->mouse_left_click_function.isEmpty()) { + processFunction(pref->mouse_left_click_function); + } +} + +void BaseGui::doubleClickFunction() { + qDebug("BaseGui::doubleClickFunction"); + + if (!pref->mouse_double_click_function.isEmpty()) { + processFunction(pref->mouse_double_click_function); + } +} + +void BaseGui::processFunction(QString function) { + qDebug("BaseGui::processFunction: '%s'", function.toUtf8().data()); + + QAction * action = ActionsEditor::findAction(this, function); + if (!action) action = ActionsEditor::findAction(playlist, function); + + if (action) { + qDebug("BaseGui::processFunction: action found"); + if (action->isCheckable()) + action->toggle(); + else + action->trigger(); + } +} + +void BaseGui::runActions(QString actions) { + qDebug("BaseGui::runActions"); + + QAction * action; + QStringList l = actions.split(" "); + + for (int n = 0; n < l.count(); n++) { + QString a = l[n]; + QString par = ""; + + if ( (n+1) < l.count() ) { + if ( (l[n+1].toLower() == "true") || (l[n+1].toLower() == "false") ) { + par = l[n+1].toLower(); + n++; + } + } + + action = ActionsEditor::findAction(this, a); + if (!action) action = ActionsEditor::findAction(playlist, a); + + if (action) { + qDebug("BaseGui::runActions: running action: '%s' (par: '%s')", + a.toUtf8().data(), par.toUtf8().data() ); + + if (action->isCheckable()) { + if (par.isEmpty()) { + action->toggle(); + } else { + action->setChecked( (par == "true") ); + } + } + else { + action->trigger(); + } + } else { + qWarning("BaseGui::runActions: action: '%s' not found",a.toUtf8().data()); + } + } +} + +void BaseGui::dragEnterEvent( QDragEnterEvent *e ) { + qDebug("BaseGui::dragEnterEvent"); + + if (e->mimeData()->hasUrls()) { + e->acceptProposedAction(); + } +} + + + +void BaseGui::dropEvent( QDropEvent *e ) { + qDebug("BaseGui::dropEvent"); + + QStringList files; + + if (e->mimeData()->hasUrls()) { + QList l = e->mimeData()->urls(); + QString s; + for (int n=0; n < l.count(); n++) { + if (l[n].isValid()) { + qDebug("BaseGui::dropEvent: scheme: '%s'", l[n].scheme().toUtf8().data()); + if (l[n].scheme() == "file") + s = l[n].toLocalFile(); + else + s = l[n].toString(); + /* + qDebug(" * '%s'", l[n].toString().toUtf8().data()); + qDebug(" * '%s'", l[n].toLocalFile().toUtf8().data()); + */ + qDebug("BaseGui::dropEvent: file: '%s'", s.toUtf8().data()); + files.append(s); + } + } + } + + + qDebug( "BaseGui::dropEvent: count: %d", files.count()); + if (files.count() > 0) { + if (files.count() == 1) { + QFileInfo fi( files[0] ); + + QRegExp ext_sub("^srt$|^sub$|^ssa$|^ass$|^idx$|^txt$|^smi$|^rt$|^utf$|^aqt$"); + ext_sub.setCaseSensitivity(Qt::CaseInsensitive); + if (ext_sub.indexIn(fi.suffix()) > -1) { + qDebug( "BaseGui::dropEvent: loading sub: '%s'", files[0].toUtf8().data()); + core->loadSub( files[0] ); + } + else + if (fi.isDir()) { + openDirectory( files[0] ); + } else { + //openFile( files[0] ); + if (playlist->maybeSave()) { + playlist->clear(); + playlist->addFile(files[0]); + + open( files[0] ); + } + } + } else { + // More than one file + qDebug("BaseGui::dropEvent: adding files to playlist"); + playlist->clear(); + playlist->addFiles(files); + //openFile( files[0] ); + playlist->startPlay(); + } + } +} + +void BaseGui::showPopupMenu( QPoint p ) { + qDebug("BaseGui::showPopupMenu"); + + popup->move( p ); + popup->show(); +} + +void BaseGui::mouseReleaseEvent( QMouseEvent * e ) { + qDebug("BaseGui::mouseReleaseEvent"); + + if (e->button() == Qt::LeftButton) { + e->accept(); + emit leftClicked(); + } + /* + else + if (e->button() == Qt::RightButton) { + showPopupMenu( e->globalPos() ); + } + */ + else + e->ignore(); +} + +void BaseGui::mouseDoubleClickEvent( QMouseEvent * e ) { + e->accept(); + emit doubleClicked(); +} + +void BaseGui::wheelEvent( QWheelEvent * e ) { + qDebug("BaseGui::wheelEvent: delta: %d", e->delta()); + e->accept(); + + if (e->delta() >= 0) + emit wheelUp(); + else + emit wheelDown(); +} + + +// Called when a video has started to play +void BaseGui::enterFullscreenOnPlay() { + if ( (pref->start_in_fullscreen) && (!pref->fullscreen) ) { + toggleFullscreen(TRUE); + } +} + +// Called when the playlist has stopped +void BaseGui::exitFullscreenOnStop() { + if (pref->fullscreen) { + toggleFullscreen(FALSE); + } +} + +void BaseGui::playlistHasFinished() { + qDebug("BaseGui::playlistHasFinished"); + exitFullscreenOnStop(); + + if (pref->close_on_finish) exitAct->trigger(); +} + +void BaseGui::displayState(Core::State state) { + qDebug("BaseGui::displayState: %s", core->stateToString().toUtf8().data()); + switch (state) { + case Core::Playing: statusBar()->showMessage( tr("Playing %1").arg(core->mdat.filename), 2000); break; + case Core::Paused: statusBar()->showMessage( tr("Pause") ); break; + case Core::Stopped: statusBar()->showMessage( tr("Stop") , 2000); break; + } + if (state == Core::Stopped) setWindowCaption( "SMPlayer" ); +} + +void BaseGui::displayMessage(QString message) { + statusBar()->showMessage(message, 2000); +} + +void BaseGui::gotCurrentTime(double sec) { + //qDebug( "DefaultGui::displayTime: %f", sec); + + if (floor(sec)==last_second) return; // Update only once per second + last_second = (int) floor(sec); + + QString time = Helper::formatTime( (int) sec ) + " / " + + Helper::formatTime( (int) core->mdat.duration ); + + //qDebug( " duration: %f, current_sec: %f", core->mdat.duration, core->mset.current_sec); + + int perc = 0; + //Update slider + if ( (core->mdat.duration > 1) && (core->mset.current_sec > 1) && + (core->mdat.duration > core->mset.current_sec) ) + { + perc = ( (int) core->mset.current_sec * 100) / (int) core->mdat.duration; + } + + emit timeChanged( sec, perc, time ); +} + + +#if NEW_RESIZE_CODE + +void BaseGui::resizeWindow(int w, int h) { + qDebug("BaseGui::resizeWindow: %d, %d", w, h); + + // If fullscreen, don't resize! + if (pref->fullscreen) return; + + if ( (pref->resize_method==Preferences::Never) && (panel->isVisible()) ) { + return; + } + + if (!panel->isVisible()) panel->show(); + + if (pref->size_factor != 100) { + w = w * pref->size_factor / 100; + h = h * pref->size_factor / 100; + } + + qDebug("BaseGui::resizeWindow: size to scale: %d, %d", w, h); + + QSize video_size(w,h); + + //panel->resize(w, h); + resize(w + diff_size.width(), h + diff_size.height()); + + if ( panel->size() != video_size ) { + //adjustSize(); + + qDebug("BaseGui::resizeWindow: temp window size: %d, %d", this->width(), this->height()); + qDebug("BaseGui::resizeWindow: temp panel->size: %d, %d", + panel->size().width(), + panel->size().height() ); + + int diff_width = this->width() - panel->width(); + int diff_height = this->height() - panel->height(); + + int new_width = w + diff_width; + int new_height = h + diff_height; + + if ((new_width < w) || (new_height < h)) { + qWarning("BaseGui::resizeWindow: invalid new size: %d, %d. Not resizing", new_width, new_height); + } else { + qDebug("BaseGui::resizeWindow: diff: %d, %d", diff_width, diff_height); + resize(new_width, new_height); + + diff_size = QSize(diff_width, diff_height ); + } + } + + qDebug("BaseGui::resizeWindow: done: window size: %d, %d", this->width(), this->height()); + qDebug("BaseGui::resizeWindow: done: panel->size: %d, %d", + panel->size().width(), + panel->size().height() ); + qDebug("BaseGui::resizeWindow: done: mplayerwindow->size: %d, %d", + mplayerwindow->size().width(), + mplayerwindow->size().height() ); +} + +void BaseGui::calculateDiff() { + qDebug("BaseGui::calculateDiff: diff_size: %d, %d", diff_size.width(), diff_size.height()); + +// if (diff_size == QSize(0,0)) { + int diff_width = width() - panel->width(); + int diff_height = height() - panel->height(); + + if ((diff_width < 0) || (diff_height < 0)) { + qWarning("BaseGui::calculateDiff: invalid diff: %d, %d", diff_width, diff_height); + } else { + diff_size = QSize(diff_width, diff_height); + qDebug("BaseGui::calculateDiff: diff_size set to: %d, %d", diff_size.width(), diff_size.height()); + } +// } +} + +#else + +void BaseGui::resizeWindow(int w, int h) { + qDebug("BaseGui::resizeWindow: %d, %d", w, h); + + // If fullscreen, don't resize! + if (pref->fullscreen) return; + + if ( (pref->resize_method==Preferences::Never) && (panel->isVisible()) ) { + return; + } + + if (!panel->isVisible()) { + //hide(); +/* #if QT_VERSION >= 0x040301 */ + // Work-around for Qt 4.3.1 +#if DOCK_PLAYLIST + panel->show(); + resize(600,600); +#else + resize(300,300); + panel->show(); +#endif +/* +#else + panel->show(); + QPoint p = pos(); + adjustSize(); + move(p); +#endif +*/ + //show(); + } + + if (pref->size_factor != 100) { + double zoom = (double) pref->size_factor/100; + w = w * zoom; + h = h * zoom; + } + + int width = size().width() - panel->size().width(); + int height = size().height() - panel->size().height(); + + width += w; + height += h; + + resize(width,height); + + qDebug("width: %d, height: %d", width, height); + qDebug("mplayerwindow->size: %d, %d", + mplayerwindow->size().width(), + mplayerwindow->size().height() ); + + mplayerwindow->setFocus(); // Needed? +} +#endif + +void BaseGui::hidePanel() { + qDebug("BaseGui::hidePanel"); + + if (panel->isVisible()) { + // Exit from fullscreen mode + if (pref->fullscreen) { toggleFullscreen(false); update(); } + + // Exit from compact mode first + if (pref->compact_mode) toggleCompactMode(false); + + //resizeWindow( size().width(), 0 ); + int width = size().width(); + if (width > 580) width = 580; + resize( width, size().height() - panel->size().height() ); + panel->hide(); + } +} + +void BaseGui::displayGotoTime(int t) { + int jump_time = (int)core->mdat.duration * t / 100; + //QString s = tr("Jump to %1").arg( Helper::formatTime(jump_time) ); + QString s = QString("Jump to %1").arg( Helper::formatTime(jump_time) ); + statusBar()->showMessage( s, 1000 ); + + if (pref->fullscreen) { + core->tellmp("osd_show_text \"" + s + "\" 3000 1"); + } +} + +void BaseGui::toggleCompactMode() { + toggleCompactMode( !pref->compact_mode ); +} + +void BaseGui::toggleCompactMode(bool b) { + qDebug("BaseGui::toggleCompactMode: %d", b); + + if (b) + aboutToEnterCompactMode(); + else + aboutToExitCompactMode(); + + pref->compact_mode = b; + updateWidgets(); +} + +void BaseGui::aboutToEnterCompactMode() { + menuBar()->hide(); + statusBar()->hide(); +} + +void BaseGui::aboutToExitCompactMode() { + menuBar()->show(); + statusBar()->show(); +} + + +void BaseGui::toggleStayOnTop() { + toggleStayOnTop( !pref->stay_on_top ); +} + +void BaseGui::toggleStayOnTop(bool b) { + bool visible = isVisible(); + + QPoint old_pos = pos(); + + if (b) { + setWindowFlags(Qt::WindowStaysOnTopHint); + } + else { + setWindowFlags(0); + } + + move(old_pos); + + if (visible) { + show(); + } + + pref->stay_on_top = b; + + updateWidgets(); +} + + +// Called when a new window (equalizer, preferences..) is opened. +void BaseGui::exitFullscreenIfNeeded() { + /* + if (pref->fullscreen) { + toggleFullscreen(FALSE); + } + */ +} + +void BaseGui::checkMousePos(QPoint p) { + //qDebug("BaseGui::checkMousePos: %d, %d", p.x(), p.y()); + + if (!pref->fullscreen) return; + + #define MARGIN 70 + if (p.y() > mplayerwindow->height() - MARGIN) { + qDebug("BaseGui::checkMousePos: %d, %d", p.x(), p.y()); + if (!near_bottom) { + emit cursorNearBottom(p); + near_bottom = true; + } + } else { + if (near_bottom) { + emit cursorFarEdges(); + near_bottom = false; + } + } + + if (p.y() < MARGIN) { + qDebug("BaseGui::checkMousePos: %d, %d", p.x(), p.y()); + if (!near_top) { + emit cursorNearTop(p); + near_top = true; + } + } else { + if (near_top) { + emit cursorFarEdges(); + near_top = false; + } + } +} + +void BaseGui::loadQss(QString filename) { + QFile file( filename ); + file.open(QFile::ReadOnly); + QString styleSheet = QLatin1String(file.readAll()); + + qApp->setStyleSheet(styleSheet); +} + +void BaseGui::changeStyleSheet(QString style) { + if (style.isEmpty()) { + qApp->setStyleSheet(""); + } + else { + QString qss_file = Helper::appHomePath() + "/themes/" + pref->iconset +"/style.qss"; + //qDebug("BaseGui::changeStyleSheet: '%s'", qss_file.toUtf8().data()); + if (!QFile::exists(qss_file)) { + qss_file = Helper::themesPath() +"/"+ pref->iconset +"/style.qss"; + } + if (QFile::exists(qss_file)) { + qDebug("BaseGui::changeStyleSheet: '%s'", qss_file.toUtf8().data()); + loadQss(qss_file); + } else { + qApp->setStyleSheet(""); + } + } +} + +void BaseGui::loadActions() { + qDebug("BaseGui::loadActions"); + ActionsEditor::loadFromConfig(this, settings); +#if !DOCK_PLAYLIST + ActionsEditor::loadFromConfig(playlist, settings); +#endif + + actions_list = ActionsEditor::actionsNames(this); +#if !DOCK_PLAYLIST + actions_list += ActionsEditor::actionsNames(playlist); +#endif + + //if (server) + server->setActionsList( actions_list ); +} + +void BaseGui::saveActions() { + qDebug("BaseGui::saveActions"); + + ActionsEditor::saveToConfig(this, settings); +#if !DOCK_PLAYLIST + ActionsEditor::saveToConfig(playlist, settings); +#endif +} + + +void BaseGui::showEvent( QShowEvent *e ) { + qDebug("BaseGui::showEvent"); + + //qDebug("BaseGui::showEvent: pref->pause_when_hidden: %d", pref->pause_when_hidden); + if ((pref->pause_when_hidden) && (core->state() == Core::Paused)) { + qDebug("BaseGui::showEvent: unpausing"); + core->pause(); // Unpauses + } +/* +#ifdef Q_OS_WIN + // Work-around to fix a problem in Windows. The file should be restarted in order the video to show again. + if (e->spontaneous()) { + if ( ((pref->vo=="gl") || (pref->vo=="gl2")) && + (core->state() == Core::Playing) ) + { + core->restart(); + } + } +#endif +*/ +} + +void BaseGui::hideEvent( QHideEvent * ) { + qDebug("BaseGui::hideEvent"); + + //qDebug("BaseGui::hideEvent: pref->pause_when_hidden: %d", pref->pause_when_hidden); + if ((pref->pause_when_hidden) && (core->state() == Core::Playing)) { + qDebug("BaseGui::hideEvent: pausing"); + core->pause(); + } +} + + +// Language change stuff +void BaseGui::changeEvent(QEvent *e) { + if (e->type() == QEvent::LanguageChange) { + retranslateStrings(); + } else { + QWidget::changeEvent(e); + } +} + +#include "moc_basegui.cpp" diff --git a/retroshare-gui/src/apps/smplayer/basegui.h b/retroshare-gui/src/apps/smplayer/basegui.h new file mode 100644 index 000000000..d693f1c90 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/basegui.h @@ -0,0 +1,474 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef _BASEGUI_H_ +#define _BASEGUI_H_ + +#include +#include "mediadata.h" +#include "mediasettings.h" +#include "preferences.h" +#include "core.h" +#include "config.h" + +class QWidget; +class QMenu; +class LogWindow; +class MplayerWindow; + +class QLabel; +class FilePropertiesDialog; +class VideoEqualizer; +class Playlist; + +class Recents; +class MyAction; +class MyActionGroup; + +class PreferencesDialog; +class MyServer; + + +class BaseGui : public QMainWindow +{ + Q_OBJECT + +public: + BaseGui( QWidget* parent = 0, Qt::WindowFlags flags = 0 ); + ~BaseGui(); + + /* Return true if the window shouldn't show on startup */ + virtual bool startHidden() { return false; }; + + //! Execute all actions in \a actions. The actions should be + //! separated by spaces. Checkable actions could have a parameter: + //! true or false. + void runActions(QString actions); + +public slots: + virtual void open(QString file); // Generic open, autodetect type. + virtual void openFile(); + virtual void openFile(QString file); + virtual void openFiles(QStringList files); + virtual void openURL(); + virtual void openURL(QString url); + virtual void openVCD(); + virtual void openAudioCD(); + virtual void openDVD(); + virtual void openDVDFromFolder(); + virtual void openDVDFromFolder(QString directory); + virtual void openDirectory(); + virtual void openDirectory(QString directory); + + virtual void helpAbout(); + virtual void helpAboutQt(); + + virtual void loadSub(); + virtual void loadAudioFile(); // Load external audio file + + virtual void showPlaylist(); + virtual void showPlaylist(bool b); + virtual void showEqualizer(); + virtual void showEqualizer(bool b); + virtual void showMplayerLog(); + virtual void showLog(); + virtual void showPreferencesDialog(); + virtual void showFilePropertiesDialog(); + + virtual void exitFullscreen(); + virtual void toggleFullscreen(); + virtual void toggleFullscreen(bool); + + virtual void toggleCompactMode(); + virtual void toggleCompactMode(bool); + + virtual void toggleStayOnTop(); + virtual void toggleStayOnTop(bool); + + virtual void toggleFrameCounter(); + virtual void toggleFrameCounter(bool); + +protected slots: + virtual void closeWindow(); + + virtual void setJumpTexts(); + + // Replace for setCaption (in Qt 4 it's not virtual) + virtual void setWindowCaption(const QString & title); + + //virtual void openRecent(int item); + virtual void openRecent(); + virtual void enterFullscreenOnPlay(); + virtual void exitFullscreenOnStop(); + virtual void exitFullscreenIfNeeded(); + virtual void playlistHasFinished(); + + virtual void displayState(Core::State state); + virtual void displayMessage(QString message); + virtual void gotCurrentTime(double); + + virtual void initializeMenus(); + virtual void updateWidgets(); + virtual void updateEqualizer(); + + virtual void newMediaLoaded(); + virtual void updateMediaInfo(); + + virtual void resizeWindow(int w, int h); + virtual void hidePanel(); + + /* virtual void playlistVisibilityChanged(); */ + + virtual void displayGotoTime(int); + + virtual void showPopupMenu( QPoint p ); + virtual void mouseReleaseEvent( QMouseEvent * e ); + virtual void mouseDoubleClickEvent( QMouseEvent * e ); + virtual void wheelEvent( QWheelEvent * e ) ; + + virtual void leftClickFunction(); + virtual void doubleClickFunction(); + virtual void processFunction(QString function); + + virtual void dragEnterEvent( QDragEnterEvent * ) ; + virtual void dropEvent ( QDropEvent * ); + + virtual void applyNewPreferences(); + virtual void applyFileProperties(); + + virtual void clearRecentsList(); + + virtual void loadActions(); + virtual void saveActions(); + + // Check the mouse pos in fullscreen mode, to + // show the controlwidget if it's moved to + // the bottom area. + virtual void checkMousePos( QPoint ); + + // Single instance stuff + // Another instance request open a file + virtual void remoteOpen(QString file); + virtual void remoteOpenFiles(QStringList files); + virtual void remoteAddFiles(QStringList files); + + // stylesheet + virtual void loadQss(QString filename); + virtual void changeStyleSheet(QString style); + +#if NEW_RESIZE_CODE + void calculateDiff(); //!< Updates diff_size +#endif + +signals: + void frameChanged(int); + void timeChanged(double, int, QString); + + void cursorNearTop(QPoint); + void cursorNearBottom(QPoint); + void cursorFarEdges(); + + void wheelUp(); + void wheelDown(); + void doubleClicked(); + void leftClicked(); + +protected: + virtual void retranslateStrings(); + virtual void changeEvent(QEvent * event); + virtual void hideEvent( QHideEvent * ); + virtual void showEvent( QShowEvent * ); + + virtual void aboutToEnterFullscreen(); + virtual void aboutToExitFullscreen(); + virtual void aboutToEnterCompactMode(); + virtual void aboutToExitCompactMode(); + +protected: + void createCore(); + void createMplayerWindow(); + void createVideoEqualizer(); + void createPlaylist(); + void createPanel(); + void createPreferencesDialog(); + void createFilePropertiesDialog(); + void setDataToFileProperties(); + void initializeGui(); + void createActions(); + void createMenus(); + void updateRecents(); + void configureDiscDevices(); + /* virtual void closeEvent( QCloseEvent * e ); */ + +protected: + QWidget * panel; + + // Menu File + MyAction * openFileAct; + MyAction * openDirectoryAct; + MyAction * openPlaylistAct; + MyAction * openVCDAct; + MyAction * openAudioCDAct; + MyAction * openDVDAct; + MyAction * openDVDFolderAct; + MyAction * openURLAct; + MyAction * exitAct; + MyAction * clearRecentsAct; + + // Menu Play + MyAction * playAct; + MyAction * playOrPauseAct; + MyAction * pauseAct; + MyAction * pauseAndStepAct; + MyAction * stopAct; + MyAction * frameStepAct; + MyAction * rewind1Act; + MyAction * rewind2Act; + MyAction * rewind3Act; + MyAction * forward1Act; + MyAction * forward2Act; + MyAction * forward3Act; + MyAction * repeatAct; + + // Menu Speed + MyAction * normalSpeedAct; + MyAction * halveSpeedAct; + MyAction * doubleSpeedAct; + MyAction * decSpeedAct; + MyAction * incSpeedAct; + + // Menu Video + MyAction * fullscreenAct; + MyAction * compactAct; + MyAction * equalizerAct; + MyAction * screenshotAct; + MyAction * onTopAct; + MyAction * flipAct; + MyAction * postProcessingAct; + MyAction * phaseAct; + MyAction * deblockAct; + MyAction * deringAct; + MyAction * addNoiseAct; + + // Menu Audio + MyAction * muteAct; + MyAction * decVolumeAct; + MyAction * incVolumeAct; + MyAction * decAudioDelayAct; + MyAction * incAudioDelayAct; + MyAction * extrastereoAct; + MyAction * karaokeAct; + MyAction * volnormAct; + MyAction * loadAudioAct; + MyAction * unloadAudioAct; + + // Menu Subtitles + MyAction * loadSubsAct; + MyAction * unloadSubsAct; + MyAction * decSubDelayAct; + MyAction * incSubDelayAct; + MyAction * decSubPosAct; + MyAction * incSubPosAct; + MyAction * incSubStepAct; + MyAction * decSubStepAct; + MyAction * useAssAct; + + // Menu Options + MyAction * showPlaylistAct; + MyAction * showPropertiesAct; + MyAction * frameCounterAct; + MyAction * showPreferencesAct; + MyAction * showLogMplayerAct; + MyAction * showLogSmplayerAct; + + // Menu Help + MyAction * aboutQtAct; + MyAction * aboutThisAct; + + // Playlist + MyAction * playPrevAct; + MyAction * playNextAct; + + // Actions not in menus +#if !USE_MULTIPLE_SHORTCUTS + MyAction * decVolume2Act; + MyAction * incVolume2Act; +#endif + MyAction * exitFullscreenAct; + MyAction * nextOSDAct; + MyAction * decContrastAct; + MyAction * incContrastAct; + MyAction * decBrightnessAct; + MyAction * incBrightnessAct; + MyAction * decHueAct; + MyAction * incHueAct; + MyAction * decSaturationAct; + MyAction * incSaturationAct; + MyAction * decGammaAct; + MyAction * incGammaAct; + MyAction * nextAudioAct; + MyAction * nextSubtitleAct; + MyAction * nextChapterAct; + MyAction * prevChapterAct; + MyAction * doubleSizeAct; + + // Moving and zoom + MyAction * moveUpAct; + MyAction * moveDownAct; + MyAction * moveLeftAct; + MyAction * moveRightAct; + MyAction * incZoomAct; + MyAction * decZoomAct; + MyAction * resetZoomAct; + + // OSD Action Group + MyActionGroup * osdGroup; + MyAction * osdNoneAct; + MyAction * osdSeekAct; + MyAction * osdTimerAct; + MyAction * osdTotalAct; + + // Denoise Action Group + MyActionGroup * denoiseGroup; + MyAction * denoiseNoneAct; + MyAction * denoiseNormalAct; + MyAction * denoiseSoftAct; + + // Window Size Action Group + MyActionGroup * sizeGroup; + MyAction * size50; + MyAction * size75; + MyAction * size100; + MyAction * size125; + MyAction * size150; + MyAction * size175; + MyAction * size200; + MyAction * size300; + MyAction * size400; + + // Deinterlace Action Group + MyActionGroup * deinterlaceGroup; + MyAction * deinterlaceNoneAct; + MyAction * deinterlaceL5Act; + MyAction * deinterlaceYadif0Act; + MyAction * deinterlaceYadif1Act; + MyAction * deinterlaceLBAct; + MyAction * deinterlaceKernAct; + + // Aspect Action Group + MyActionGroup * aspectGroup; + MyAction * aspectDetectAct; + MyAction * aspect43Act; + MyAction * aspect54Act; + MyAction * aspect149Act; + MyAction * aspect169Act; + MyAction * aspect1610Act; + MyAction * aspect235Act; + MyAction * aspect43LetterAct; + MyAction * aspect169LetterAct; + MyAction * aspect43PanscanAct; + MyAction * aspect43To169Act; + + // Audio Channels Action Group + MyActionGroup * channelsGroup; + /* MyAction * channelsDefaultAct; */ + MyAction * channelsStereoAct; + MyAction * channelsSurroundAct; + MyAction * channelsFull51Act; + + // Stereo Mode Action Group + MyActionGroup * stereoGroup; + MyAction * stereoAct; + MyAction * leftChannelAct; + MyAction * rightChannelAct; + + // Audio Track Group + MyActionGroup * audioTrackGroup; + MyActionGroup * subtitleTrackGroup; + MyActionGroup * titleGroup; + MyActionGroup * angleGroup; + MyActionGroup * chapterGroup; + + // MENUS + QMenu *openMenu; + QMenu *playMenu; + QMenu *videoMenu; + QMenu *audioMenu; + QMenu *subtitlesMenu; + QMenu *browseMenu; + QMenu *optionsMenu; + QMenu *helpMenu; + + QMenu * subtitlestrack_menu; + QMenu * audiotrack_menu; + QMenu * titles_menu; + QMenu * chapters_menu; + QMenu * angles_menu; + QMenu * aspect_menu; + QMenu * osd_menu; + QMenu * deinterlace_menu; + //QMenu * denoise_menu; + QMenu * videosize_menu; + QMenu * audiochannels_menu; + QMenu * stereomode_menu; + + QMenu * speed_menu; + QMenu * videofilter_menu; + QMenu * audiofilter_menu; + QMenu * logs_menu; + QMenu * panscan_menu; + + QMenu * popup; + QMenu * recentfiles_menu; + + LogWindow * mplayer_log_window; + LogWindow * smplayer_log_window; + + PreferencesDialog *pref_dialog; + FilePropertiesDialog *file_dialog; + Playlist * playlist; + VideoEqualizer * equalizer; + + Core * core; + MplayerWindow *mplayerwindow; + + Recents * recents; + + MyServer * server; + + QStringList actions_list; + +private: + QString default_style; + + int last_second; + bool near_top; + bool near_bottom; + + // Variables to restore pos and size of the window + // when exiting from fullscreen mode. + QPoint win_pos; + QSize win_size; + +#if NEW_RESIZE_CODE + QSize diff_size; //!< Main window size - panel size +#endif +}; + +#endif + diff --git a/retroshare-gui/src/apps/smplayer/baseguiplus.cpp b/retroshare-gui/src/apps/smplayer/baseguiplus.cpp new file mode 100644 index 000000000..44f0424c4 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/baseguiplus.cpp @@ -0,0 +1,405 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "baseguiplus.h" +#include "myaction.h" +#include "global.h" +#include "images.h" +#include "playlist.h" + +#include +#include + +#if DOCK_PLAYLIST +#include +#include "playlistdock.h" +#include "desktopinfo.h" +#endif + + +BaseGuiPlus::BaseGuiPlus( QWidget * parent, Qt::WindowFlags flags ) + : BaseGui( parent, flags ), + mainwindow_visible(true), + //infowindow_visible(false), + trayicon_playlist_was_visible(false) +{ + mainwindow_pos = pos(); + + tray = new QSystemTrayIcon( Images::icon("logo", 22), this ); + + tray->setToolTip( "SMPlayer" ); + connect( tray, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), + this, SLOT(trayIconActivated(QSystemTrayIcon::ActivationReason))); + + quitAct = new MyAction(this, "quit"); + connect( quitAct, SIGNAL(triggered()), this, SLOT(quit()) ); + openMenu->addAction(quitAct); + + showTrayAct = new MyAction(this, "show_tray_icon" ); + showTrayAct->setCheckable(true); + connect( showTrayAct, SIGNAL(toggled(bool)), + tray, SLOT(setVisible(bool)) ); + optionsMenu->addAction(showTrayAct); + + showAllAct = new MyAction(this, "restore/hide"); + connect( showAllAct, SIGNAL(triggered()), + this, SLOT(toggleShowAll()) ); + + context_menu = new QMenu(this); + context_menu->addAction(showAllAct); + context_menu->addSeparator(); + context_menu->addAction(openFileAct); + context_menu->addMenu(recentfiles_menu); + context_menu->addAction(openDVDAct); + context_menu->addAction(openURLAct); + context_menu->addSeparator(); + context_menu->addAction(playOrPauseAct); + context_menu->addAction(stopAct); + context_menu->addSeparator(); + context_menu->addAction(playPrevAct); + context_menu->addAction(playNextAct); + context_menu->addSeparator(); + context_menu->addAction(showPlaylistAct); + context_menu->addAction(showPreferencesAct); + context_menu->addSeparator(); + context_menu->addAction(quitAct); + + tray->setContextMenu( context_menu ); + +#if DOCK_PLAYLIST + // Playlistdock + playlistdock = new PlaylistDock(this); + playlistdock->setObjectName("playlist"); + playlistdock->setFloating(true); + playlistdock->setWidget(playlist); + playlistdock->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea); + addDockWidget(Qt::BottomDockWidgetArea, playlistdock); + playlistdock->hide(); + + connect( playlistdock, SIGNAL(closed()), this, SLOT(playlistClosed()) ); + connect( playlistdock, SIGNAL(docked()), this, SLOT(stretchWindow()) ); + connect( playlistdock, SIGNAL(undocked()), this, SLOT(shrinkWindow()) ); + + ignore_playlist_events = false; +#endif + + retranslateStrings(); + + loadConfig(); +} + +BaseGuiPlus::~BaseGuiPlus() { + saveConfig(); +} + +bool BaseGuiPlus::startHidden() { + if ( (!showTrayAct->isChecked()) || (mainwindow_visible) ) + return false; + else + return true; +} + +void BaseGuiPlus::closeEvent( QCloseEvent * e ) { + qDebug("BaseGuiPlus::closeEvent"); + e->ignore(); + closeWindow(); +} + +void BaseGuiPlus::closeWindow() { + qDebug("BaseGuiPlus::closeWindow"); + + if (tray->isVisible()) { + //e->ignore(); + exitFullscreen(); + showAll(false); // Hide windows + if (core->state() == Core::Playing) core->stop(); + + if (pref->balloon_count > 0) { + tray->showMessage( "SMPlayer", + tr("SMPlayer is still running here"), + QSystemTrayIcon::Information, 3000 ); + pref->balloon_count--; + } + + } else { + BaseGui::closeWindow(); + } + //tray->hide(); + +} + +void BaseGuiPlus::quit() { + qDebug("BaseGuiPlus::quit"); + BaseGui::closeWindow(); +} + +void BaseGuiPlus::retranslateStrings() { + BaseGui::retranslateStrings(); + + quitAct->change( Images::icon("exit"), tr("&Quit") ); + showTrayAct->change( Images::icon("systray"), tr("S&how icon in system tray") ); + + updateShowAllAct(); + +#if DOCK_PLAYLIST + playlistdock->setWindowTitle( tr("Playlist") ); +#endif +} + +void BaseGuiPlus::updateShowAllAct() { + if (isVisible()) + showAllAct->change( tr("&Hide") ); + else + showAllAct->change( tr("&Restore") ); +} + +void BaseGuiPlus::saveConfig() { + qDebug("BaseGuiPlus::saveConfig"); + + QSettings * set = settings; + + set->beginGroup( "base_gui_plus"); + + set->setValue( "show_tray_icon", showTrayAct->isChecked() ); + set->setValue( "mainwindow_visible", isVisible() ); + +/* +#if DOCK_PLAYLIST + set->setValue( "playlist_and_toolbars_state", saveState() ); +#endif +*/ + + set->endGroup(); +} + +void BaseGuiPlus::loadConfig() { + qDebug("BaseGuiPlus::loadConfig"); + + QSettings * set = settings; + + set->beginGroup( "base_gui_plus"); + + bool show_tray_icon = set->value( "show_tray_icon", false).toBool(); + showTrayAct->setChecked( show_tray_icon ); + //tray->setVisible( show_tray_icon ); + + mainwindow_visible = set->value("mainwindow_visible", true).toBool(); + +/* +#if DOCK_PLAYLIST + restoreState( set->value( "playlist_and_toolbars_state" ).toByteArray() ); +#endif +*/ + + set->endGroup(); + + updateShowAllAct(); +} + + +void BaseGuiPlus::trayIconActivated(QSystemTrayIcon::ActivationReason reason) { + qDebug("DefaultGui::trayIconActivated: %d", reason); + + updateShowAllAct(); + + if (reason == QSystemTrayIcon::Trigger) { + toggleShowAll(); + } + else + if (reason == QSystemTrayIcon::MiddleClick) { + core->pause(); + } +} + +void BaseGuiPlus::toggleShowAll() { + showAll( !isVisible() ); +} + +void BaseGuiPlus::showAll(bool b) { + if (!b) { + // Hide all +#if DOCK_PLAYLIST + trayicon_playlist_was_visible = (playlistdock->isVisible() && + playlistdock->isFloating() ); + if (trayicon_playlist_was_visible) + playlistdock->hide(); + + /* + trayicon_playlist_was_visible = playlistdock->isVisible(); + playlistdock->hide(); + */ +#else + trayicon_playlist_was_visible = playlist->isVisible(); + playlist_pos = playlist->pos(); + playlist->hide(); +#endif + + mainwindow_pos = pos(); + hide(); + + /* + infowindow_visible = info_window->isVisible(); + infowindow_pos = info_window->pos(); + info_window->hide(); + */ + } else { + // Show all + move(mainwindow_pos); + show(); + +#if DOCK_PLAYLIST + if (trayicon_playlist_was_visible) { + playlistdock->show(); + } +#else + if (trayicon_playlist_was_visible) { + playlist->move(playlist_pos); + playlist->show(); + } +#endif + + /* + if (infowindow_visible) { + info_window->show(); + info_window->move(infowindow_pos); + } + */ + } + updateShowAllAct(); +} + +void BaseGuiPlus::resizeWindow(int w, int h) { + qDebug("BaseGuiPlus::resizeWindow: %d, %d", w, h); + + if ( (tray->isVisible()) && (!isVisible()) ) showAll(true); + + BaseGui::resizeWindow(w, h ); +} + +void BaseGuiPlus::updateMediaInfo() { + qDebug("BaseGuiPlus::updateMediaInfo"); + BaseGui::updateMediaInfo(); + + tray->setToolTip( windowTitle() ); +} + +void BaseGuiPlus::setWindowCaption(const QString & title) { + tray->setToolTip( title ); + + BaseGui::setWindowCaption( title ); +} + + +// Playlist stuff +void BaseGuiPlus::aboutToEnterFullscreen() { + qDebug("BaseGuiPlus::aboutToEnterFullscreen"); + + BaseGui::aboutToEnterFullscreen(); + +#if DOCK_PLAYLIST + fullscreen_playlist_was_visible = playlistdock->isVisible(); + fullscreen_playlist_was_floating = playlistdock->isFloating(); + //showPlaylistAct->setEnabled(false); + ignore_playlist_events = true; + playlistdock->setFloating(true); + playlistdock->hide(); + //showPlaylistAct->setChecked(false); + //playlist_state = saveState(); +#endif +} + +void BaseGuiPlus::aboutToExitFullscreen() { + qDebug("BaseGuiPlus::aboutToExitFullscreen"); + + BaseGui::aboutToExitFullscreen(); + +#if DOCK_PLAYLIST + if (fullscreen_playlist_was_visible) { + playlistdock->show(); + } + playlistdock->setFloating( fullscreen_playlist_was_floating ); + //restoreState( playlist_state ); + ignore_playlist_events = false; + //showPlaylistAct->setEnabled(true); +#endif +} + +void BaseGuiPlus::aboutToEnterCompactMode() { + BaseGui::aboutToEnterCompactMode(); + +#if DOCK_PLAYLIST + compact_playlist_was_visible = (playlistdock->isVisible() && + !playlistdock->isFloating()); + if (compact_playlist_was_visible) + playlistdock->hide(); +#endif +} + +void BaseGuiPlus::aboutToExitCompactMode() { + BaseGui::aboutToExitCompactMode(); + +#if DOCK_PLAYLIST + if (compact_playlist_was_visible) + playlistdock->show(); +#endif +} + +#if DOCK_PLAYLIST +void BaseGuiPlus::showPlaylist(bool b) { + if ( !b ) { + playlistdock->hide(); + } else { + exitFullscreenIfNeeded(); + playlistdock->show(); + } + //updateWidgets(); +} + +void BaseGuiPlus::playlistClosed() { + showPlaylistAct->setChecked(false); +} + +void BaseGuiPlus::stretchWindow() { + qDebug("BaseGuiPlus::stretchWindow"); + if ((ignore_playlist_events) || (pref->resize_method!=Preferences::Always)) return; + + int new_height = height() + playlistdock->height(); + + //if (new_height > DesktopInfo::desktop_size(this).height()) + // new_height = DesktopInfo::desktop_size(this).height() - 20; + + qDebug("BaseGuiPlus::stretchWindow: stretching: new height: %d", new_height); + resize( width(), new_height ); + + //resizeWindow(core->mset.win_width, core->mset.win_height); +} + +void BaseGuiPlus::shrinkWindow() { + qDebug("BaseGuiPlus::shrinkWindow"); + if ((ignore_playlist_events) || (pref->resize_method!=Preferences::Always)) return; + + int new_height = height() - playlistdock->height(); + qDebug("DefaultGui::shrinkWindow: shrinking: new height: %d", new_height); + resize( width(), new_height ); + + //resizeWindow(core->mset.win_width, core->mset.win_height); +} + +#endif + +#include "moc_baseguiplus.cpp" diff --git a/retroshare-gui/src/apps/smplayer/baseguiplus.h b/retroshare-gui/src/apps/smplayer/baseguiplus.h new file mode 100644 index 000000000..0c33d89db --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/baseguiplus.h @@ -0,0 +1,102 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef _BASEGUIPLUS_H_ +#define _BASEGUIPLUS_H_ + +#include "basegui.h" +#include +#include +#include "config.h" + +class QMenu; +class PlaylistDock; + +class BaseGuiPlus : public BaseGui +{ + Q_OBJECT + +public: + BaseGuiPlus( QWidget* parent = 0, Qt::WindowFlags flags = 0 ); + ~BaseGuiPlus(); + + virtual bool startHidden(); + +protected: + virtual void retranslateStrings(); + + void loadConfig(); + void saveConfig(); + void updateShowAllAct(); + + virtual void aboutToEnterFullscreen(); + virtual void aboutToExitFullscreen(); + virtual void aboutToEnterCompactMode(); + virtual void aboutToExitCompactMode(); + + virtual void closeEvent( QCloseEvent * e ); + +protected slots: + // Reimplemented methods + virtual void closeWindow(); + virtual void setWindowCaption(const QString & title); + virtual void resizeWindow(int w, int h); + virtual void updateMediaInfo(); + // New + virtual void trayIconActivated(QSystemTrayIcon::ActivationReason); + virtual void toggleShowAll(); + virtual void showAll(bool b); + virtual void quit(); + +#if DOCK_PLAYLIST + virtual void showPlaylist(bool b); + void playlistClosed(); + + void stretchWindow(); + void shrinkWindow(); +#endif + +protected: + QSystemTrayIcon * tray; + QMenu * context_menu; + + MyAction * quitAct; + MyAction * showTrayAct; + MyAction * showAllAct; + + // To save state + QPoint mainwindow_pos; + bool mainwindow_visible; + + QPoint playlist_pos; + bool trayicon_playlist_was_visible; + + //QPoint infowindow_pos; + //bool infowindow_visible; + +#if DOCK_PLAYLIST + PlaylistDock * playlistdock; + bool fullscreen_playlist_was_visible; + bool fullscreen_playlist_was_floating; + bool compact_playlist_was_visible; + bool ignore_playlist_events; +#endif + +}; + +#endif diff --git a/retroshare-gui/src/apps/smplayer/config.h b/retroshare-gui/src/apps/smplayer/config.h new file mode 100644 index 000000000..ca00f9ba4 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/config.h @@ -0,0 +1,94 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef _CONFIG_H_ +#define _CONFIG_H_ + + +// SUBTITLES_BY_INDEX 1 +// New code for subtitle handling. + +#define SUBTITLES_BY_INDEX 1 + + +// CONTROLWIDGET_OVER_VIDEO +// if set to 1, the controlwidget will be shown in fullscreen +// *over* the video (not moving the video) when the user move the mouse +// to the bottom area of the screen. + +#define CONTROLWIDGET_OVER_VIDEO 1 + + +// NEW_CONTROLWIDGET +// New design for the floating control, with only one row. + +#define NEW_CONTROLWIDGET 1 + + +// DOCK_PLAYLIST +// if 1, the playlist will be docked in the main window, instead +// of being a top level window + +#define DOCK_PLAYLIST 1 + + +// STYLE_SWITCHING +// if 1, the preferences dialog will have an option to switch +// the Qt style + +#define STYLE_SWITCHING 1 + + +// New code to resize the main window + +#define NEW_RESIZE_CODE 1 + + +// Allow to use multiple shortcuts for actions + +#define USE_MULTIPLE_SHORTCUTS 1 + + +// EXTERNAL_SLEEP +// if 1, it will be used the function usleep() from unistd.h +// instead of QThread::msleep() +// It can be useful if your Qt doesn't have QThread support. +// Note: not much test it +// Note 2: not used anymore + +#define EXTERNAL_SLEEP 0 + + +// USE_SHORTCUTGETTER +// if 1, a new dialog will be used to ask the user for a +// keyshortcut. + +#define USE_SHORTCUTGETTER 1 + + +// USE_SUBFONT +// if 1, use -subfont option. + +#define USE_SUBFONT 0 + + +// Testing with a QGLWidget (for Windows) +#define USE_GL_WIDGET 0 + + +#endif diff --git a/retroshare-gui/src/apps/smplayer/constants.h b/retroshare-gui/src/apps/smplayer/constants.h new file mode 100644 index 000000000..4ca467c7d --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/constants.h @@ -0,0 +1,29 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef _CONSTANTS_H_ +#define _CONSTANTS_H_ + +#define COMPANY "RVM" +#define PROGRAM "smplayer" + +#define IS_PLAYLIST_TAG "|smplayer:isplaylist" +#define IS_PLAYLIST_TAG_RX "\\|smplayer\\:isplaylist$" + +#endif + diff --git a/retroshare-gui/src/apps/smplayer/core.cpp b/retroshare-gui/src/apps/smplayer/core.cpp new file mode 100644 index 000000000..19f5a128e --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/core.cpp @@ -0,0 +1,2579 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "core.h" +#include +#include +#include + +#include + +#include "mplayerprocess.h" +#include "mplayerwindow.h" +#include "desktopinfo.h" +#include "constants.h" +#include "helper.h" +#include "preferences.h" +#include "global.h" +#include "config.h" + + +#ifdef Q_OS_WIN +/* To change app priority */ +#include +#include // To get Windows version +#endif + + +Core::Core( MplayerWindow *mpw, QWidget* parent ) + : QObject( parent ) +{ + mplayerwindow = mpw; + + _state = Stopped; + + we_are_restarting = false; + just_loaded_external_subs = false; + just_unloaded_external_subs = false; + + proc = new MplayerProcess(this); + + connect( proc, SIGNAL(receivedCurrentSec(double)), + this, SLOT(changeCurrentSec(double)) ); + + connect( proc, SIGNAL(receivedCurrentFrame(int)), + this, SIGNAL(showFrame(int)) ); + + connect( proc, SIGNAL(receivedPause()), + this, SLOT(changePause()) ); + + connect( proc, SIGNAL(processExited()), + this, SLOT(processFinished()) ); + + connect( proc, SIGNAL(mplayerFullyLoaded()), + this, SLOT(finishRestart()) ); + + connect( proc, SIGNAL(lineAvailable(QString)), + this, SLOT(updateLog(QString)) ); + + connect( proc, SIGNAL(receivedCacheMessage(QString)), + this, SLOT(displayMessage(QString)) ); + + connect( proc, SIGNAL(receivedCreatingIndex(QString)), + this, SLOT(displayMessage(QString)) ); + + connect( proc, SIGNAL(receivedConnectingToMessage(QString)), + this, SLOT(displayMessage(QString)) ); + + connect( proc, SIGNAL(receivedResolvingMessage(QString)), + this, SLOT(displayMessage(QString)) ); + + connect( proc, SIGNAL(receivedScreenshot(QString)), + this, SLOT(displayScreenshotName(QString)) ); + + connect( proc, SIGNAL(receivedWindowResolution(int,int)), + this, SLOT(gotWindowResolution(int,int)) ); + + connect( proc, SIGNAL(receivedNoVideo()), + this, SLOT(gotNoVideo()) ); + + connect( proc, SIGNAL(receivedVO(QString)), + this, SLOT(gotVO(QString)) ); + + connect( proc, SIGNAL(receivedAO(QString)), + this, SLOT(gotAO(QString)) ); + + connect( proc, SIGNAL(receivedEndOfFile()), + this, SLOT(fileReachedEnd()) ); + + connect( proc, SIGNAL(receivedStartingTime(double)), + this, SLOT(gotStartingTime(double)) ); + + connect( proc, SIGNAL(receivedStreamTitleAndUrl(QString,QString)), + this, SLOT(streamTitleAndUrlChanged(QString,QString)) ); + + //pref->load(); + mset.reset(); + + // Mplayerwindow + connect( this, SIGNAL(aboutToStartPlaying()), + mplayerwindow->videoLayer(), SLOT(playingStarted()) ); + connect( proc, SIGNAL(processExited()), + mplayerwindow->videoLayer(), SLOT(playingStopped()) ); + + mplayerwindow->videoLayer()->allowClearingBackground(pref->always_clear_video_background); + mplayerwindow->setMonitorAspect( pref->monitor_aspect_double() ); +} + + +Core::~Core() { + saveMediaInfo(); + + if (proc->isRunning()) stopMplayer(); + proc->terminate(); + delete proc; +} + +void Core::setState(State s) { + if (s != _state) { + _state = s; + emit stateChanged(_state); + } +} + +QString Core::stateToString() { + if (state()==Playing) return "Playing"; + else + if (state()==Stopped) return "Stopped"; + else + if (state()==Paused) return "Paused"; + else + return "Unknown"; +} + +// Public restart +void Core::restart() { + qDebug("Core::restart"); + if (proc->isRunning()) { + restartPlay(); + } else { + qDebug("Core::restart: mplayer is not running"); + } +} + +bool Core::checkHaveSettingsSaved(QString group_name) { + qDebug("Core::checkHaveSettingsSaved: group_name: '%s'", group_name.toUtf8().data()); + + settings->beginGroup( group_name ); + bool saved = settings->value( "saved", false ).toBool(); + settings->endGroup(); + + return saved; +} + +void Core::saveMediaInfo() { + qDebug("Core::saveMediaInfo"); + + if (pref->dont_remember_media_settings) { + qDebug("Core::saveMediaInfo: not saving settings, disabled by user"); + return; + } + + QString group_name; + + /* + if ( (mdat.type == TYPE_DVD) && (!mdat.dvd_id.isEmpty()) ) { + group_name = dvdForPref( mdat.dvd_id, mset.current_title_id ); + } + else + */ + if ( (mdat.type == TYPE_FILE) && (!mdat.filename.isEmpty()) ) { + group_name = Helper::filenameForPref( mdat.filename ); + } + + if (!group_name.isEmpty()) { + settings->beginGroup( group_name ); + settings->setValue( "saved", true); + + /*mdat.save(*settings);*/ + mset.save(); + + settings->endGroup(); + } +} + +void Core::loadMediaInfo(QString group_name) { + qDebug("Core::loadMediaInfo: '%s'", group_name.toUtf8().data() ); + + settings->beginGroup( group_name ); + + /*mdat.load(*settings);*/ + mset.load(); + + settings->endGroup(); +} + + +void Core::updateLog(QString line) { + if (pref->log_mplayer) { + if ( (line.indexOf("A:")==-1) && (line.indexOf("V:")==-1) ) { + mplayer_log += line + "\n"; + } + } +} + +void Core::initializeMenus() { + qDebug("Core::initializeMenus"); + + emit menusNeedInitialize(); +} + + +void Core::updateWidgets() { + qDebug("Core::updateWidgets"); + + emit widgetsNeedUpdate(); +} + + +void Core::tellmp(const QString & command) { + qDebug("Core::tellmp: '%s'", command.toUtf8().data()); + + //qDebug("Command: '%s'", command.toUtf8().data()); + if (proc->isRunning()) { + proc->writeToStdin( command ); + //proc->write( command.toLocal8Bit() + "\n" ); + } else { + qWarning(" tellmp: no process running: %s", command.toUtf8().data()); + } +} + +// Generic open, autodetect type +void Core::open(QString file, int seek) { + qDebug("Core::open: '%s'", file.toUtf8().data()); + + QFileInfo fi(file); + + if ( (fi.exists()) && (fi.suffix().toLower()=="iso") ) { + qDebug(" * identified as a dvd iso"); + openDVD("dvd://1:" + file); + } + else + if ( (fi.exists()) && (!fi.isDir()) ) { + qDebug(" * identified as local file"); + // Local file + file = QFileInfo(file).absoluteFilePath(); + openFile(file, seek); + } + else + if ( (fi.exists()) && (fi.isDir()) ) { + // Directory + qDebug(" * identified as a directory"); + qDebug(" checking if contains a dvd"); + file = QFileInfo(file).absoluteFilePath(); + if (Helper::directoryContainsDVD(file)) { + qDebug(" * directory contains a dvd"); + openDVD("dvd://1:"+ file); + } else { + qDebug(" * directory doesn't contain a dvd"); + qDebug(" opening nothing"); + } + } + else + if (file.toLower().startsWith("dvd:")) { + qDebug(" * identified as dvd"); + openDVD(file); + /* + QString f = file.lower(); + QRegExp s("^dvd://(\\d+)"); + if (s.indexIn(f) != -1) { + int title = s.cap(1).toInt(); + openDVD(title); + } else { + qWarning("Core::open: couldn't parse dvd title, playing first one"); + openDVD(); + } + */ + } + else + if (file.toLower().startsWith("vcd:")) { + qDebug(" * identified as vcd"); + + QString f = file.toLower(); + QRegExp s("^vcd://(\\d+)"); + if (s.indexIn(f) != -1) { + int title = s.cap(1).toInt(); + openVCD(title); + } else { + qWarning("Core::open: couldn't parse vcd title, playing first one"); + openVCD(); + } + } + else + if (file.toLower().startsWith("cdda:")) { + qDebug(" * identified as cdda"); + + QString f = file.toLower(); + QRegExp s("^cdda://(\\d+)"); + if (s.indexIn(f) != -1) { + int title = s.cap(1).toInt(); + openAudioCD(title); + } else { + qWarning("Core::open: couldn't parse cdda title, playing first one"); + openAudioCD(); + } + } + else { + qDebug(" * not identified, playing as stream"); + openStream(file); + } +} + +void Core::openFile(QString filename, int seek) { + qDebug("Core::openFile: '%s'", filename.toUtf8().data()); + + QFileInfo fi(filename); + if (fi.exists()) { + playNewFile(fi.absoluteFilePath(), seek); + } else { + //File doesn't exists + //TODO: error message + } +} + + +void Core::loadSub(const QString & sub ) { + if ( !sub.isEmpty() ) { + //tellmp( "sub_load " + sub ); + mset.external_subtitles = sub; +#if SUBTITLES_BY_INDEX + just_loaded_external_subs = true; +#endif + restartPlay(); + } +} + +void Core::unloadSub() { +#if SUBTITLES_BY_INDEX + if ( !mset.external_subtitles.isEmpty() ) { + mset.external_subtitles = ""; + just_unloaded_external_subs = true; + restartPlay(); + } +#endif +} + +void Core::loadAudioFile(const QString & audiofile) { + if (!audiofile.isEmpty()) { + mset.external_audio = audiofile; + restartPlay(); + } +} + +void Core::unloadAudioFile() { + if (!mset.external_audio.isEmpty()) { + mset.external_audio = ""; + restartPlay(); + } +} + +/* +void Core::openDVD( bool from_folder, QString directory) { + qDebug("Core::openDVD"); + + if (from_folder) { + if (!directory.isEmpty()) { + QFileInfo fi(directory); + if ( (fi.exists()) && (fi.isDir()) ) { + pref->dvd_directory = directory; + pref->play_dvd_from_hd = TRUE; + openDVD(); + } else { + qDebug("Core::openDVD: directory '%s' is not valid", directory.toUtf8().data()); + } + } else { + qDebug("Core::openDVD: directory is empty"); + } + } else { + pref->play_dvd_from_hd = FALSE; + openDVD(); + } +} + +void Core::openDVD() { + openDVD(1); +} + +void Core::openDVD(int title) { + qDebug("Core::openDVD: %d", title); + + if (proc->isRunning()) { + stopMplayer(); + } + + // Save data of previous file: + saveMediaInfo(); + + mdat.reset(); + mdat.filename = "dvd://" + QString::number(title); + mdat.type = TYPE_DVD; + + mset.reset(); + + mset.current_title_id = title; + mset.current_chapter_id = 1; + mset.current_angle_id = 1; + + initializeMenus(); + + initPlaying(); +} +*/ + +void Core::openVCD(int title) { + qDebug("Core::openVCD: %d", title); + + if (title == -1) title = pref->vcd_initial_title; + + if (proc->isRunning()) { + stopMplayer(); + } + + // Save data of previous file: + saveMediaInfo(); + + mdat.reset(); + mdat.filename = "vcd://" + QString::number(title); + mdat.type = TYPE_VCD; + + mset.reset(); + + mset.current_title_id = title; + mset.current_chapter_id = -1; + mset.current_angle_id = -1; + + /* initializeMenus(); */ + + initPlaying(); +} + +void Core::openAudioCD(int title) { + qDebug("Core::openAudioCD: %d", title); + + if (title == -1) title = 1; + + if (proc->isRunning()) { + stopMplayer(); + } + + // Save data of previous file: + saveMediaInfo(); + + mdat.reset(); + mdat.filename = "cdda://" + QString::number(title); + mdat.type = TYPE_AUDIO_CD; + + mset.reset(); + + mset.current_title_id = title; + mset.current_chapter_id = -1; + mset.current_angle_id = -1; + + /* initializeMenus(); */ + + initPlaying(); +} + +void Core::openDVD(QString dvd_url) { + qDebug("Core::openDVD: '%s'", dvd_url.toUtf8().data()); + + //Checks + QString folder = Helper::dvdSplitFolder(dvd_url); + int title = Helper::dvdSplitTitle(dvd_url); + + if (title == -1) { + qWarning("Core::openDVD: title invalid, not playing dvd"); + return; + } + + if (folder.isEmpty()) { + qDebug("Core::openDVD: not folder"); + } else { + QFileInfo fi(folder); + if ( (!fi.exists()) /*|| (!fi.isDir())*/ ) { + qWarning("Core::openDVD: folder invalid, not playing dvd"); + return; + } + } + + if (proc->isRunning()) { + stopMplayer(); + we_are_restarting = false; + } + + // Save data of previous file: + saveMediaInfo(); + + mdat.reset(); + mdat.filename = dvd_url; + mdat.type = TYPE_DVD; + + mset.reset(); + + mset.current_title_id = title; + mset.current_chapter_id = 1; + mset.current_angle_id = 1; + + /* initializeMenus(); */ + + initPlaying(); +} + +void Core::openStream(QString name) { + qDebug("Core::openStream: '%s'", name.toUtf8().data()); + + if (proc->isRunning()) { + stopMplayer(); + we_are_restarting = false; + } + + // Save data of previous file: + saveMediaInfo(); + + mdat.reset(); + mdat.filename = name; + mdat.type = TYPE_STREAM; + + mset.reset(); + + /* initializeMenus(); */ + + initPlaying(); +} + + +void Core::playNewFile(QString file, int seek) { + qDebug("Core::playNewFile: '%s'", file.toUtf8().data()); + + if (proc->isRunning()) { + stopMplayer(); + we_are_restarting = false; + } + + // Save data of previous file: + saveMediaInfo(); + + mdat.reset(); + mdat.filename = file; + mdat.type = TYPE_FILE; + + int old_volume = mset.volume; + mset.reset(); + + // Check if we already have info about this file + if (checkHaveSettingsSaved( Helper::filenameForPref(file) )) { + qDebug("We have settings for this file!!!"); + + // In this case we read info from config + if (!pref->dont_remember_media_settings) { + loadMediaInfo( Helper::filenameForPref(file) ); + qDebug("Media settings read"); + if (pref->dont_remember_time_pos) { + mset.current_sec = 0; + qDebug("Time pos reset to 0"); + } + } else { + qDebug("Media settings have not read because of preferences setting"); + } + } else { + // Recover volume + mset.volume = old_volume; + } + + /* initializeMenus(); */ + + qDebug("Core::playNewFile: volume: %d, old_volume: %d", mset.volume, old_volume); + initPlaying(seek); +} + + +void Core::restartPlay() { + we_are_restarting = true; + initPlaying(); +} + +void Core::initPlaying(int seek) { + qDebug("Core::initPlaying"); + + /* + mdat.list(); + mset.list(); + */ + + /* updateWidgets(); */ + + mplayerwindow->showLogo(FALSE); + + if (proc->isRunning()) { + stopMplayer(); + } + + int start_sec = (int) mset.current_sec; + if (seek > -1) start_sec = seek; + + startMplayer( mdat.filename, start_sec ); +} + +// This is reached when a new video has just started playing +// and maybe we need to give some defaults +void Core::newMediaPlaying() { + qDebug("Core::newMediaPlaying"); + + QString file = mdat.filename; + int type = mdat.type; + mdat = proc->mediaData(); + mdat.filename = file; + mdat.type = type; + + initializeMenus(); // Old + + // First audio if none selected + if ( (mset.current_audio_id == MediaSettings::NoneSelected) && + (mdat.audios.numItems() > 0) ) + { + // Don't set mset.current_audio_id here! changeAudio will do. + // Otherwise changeAudio will do nothing. + + int audio = mdat.audios.itemAt(0).ID(); // First one + if (mdat.audios.existsItemAt(pref->initial_audio_track)) { + audio = mdat.audios.itemAt(pref->initial_audio_track).ID(); + } + + // Check if one of the audio tracks is the user preferred. + if (!pref->audio_lang.isEmpty()) { + int res = mdat.audios.findLang( pref->audio_lang ); + if (res != -1) audio = res; + } + + changeAudio( audio ); + } + + // Subtitles + if (mset.external_subtitles.isEmpty()) { + if (pref->autoload_sub) { +#if SUBTITLES_BY_INDEX + //Select first subtitle if none selected + if (mset.current_sub_id == MediaSettings::NoneSelected) { + int sub = mdat.subs.selectOne( pref->subtitle_lang, pref->initial_subtitle_track ); + changeSubtitle( sub ); + } +#else + //Select first subtitle if none selected + if (mset.current_sub_id == MediaSettings::NoneSelected) { + int sub = MediaSettings::SubNone; // In case of no subtitle available + if (mdat.subtitles.numItems() > 0) { + sub = mdat.subtitles.itemAt(0).ID(); + + // Check if one of the subtitles is the user preferred. + if (!pref->subtitle_lang.isEmpty()) { + int res = mdat.subtitles.findLang( pref->subtitle_lang ); + if (res != -1) sub = res; + } + + } + changeSubtitle( sub ); + } +#endif + } else { + changeSubtitle( MediaSettings::SubNone ); + } + } + + // mkv chapters + if (mdat.mkv_chapters > 0) { + // Just to show the first chapter checked in the menu + mset.current_chapter_id = 0; // 0 is the first chapter in mkv + } + + mdat.initialized = TRUE; + + // MPlayer doesn't display the length in ID_LENGTH for audio CDs... + if ((mdat.duration == 0) && (mdat.type == TYPE_AUDIO_CD)) { + /* + qDebug(" *** get duration here from title info *** "); + qDebug(" *** current title: %d", mset.current_title_id ); + */ + if (mset.current_title_id > 0) { + mdat.duration = mdat.titles.item(mset.current_title_id).duration(); + } + } + + /* updateWidgets(); */ + + mdat.list(); + mset.list(); +} + +void Core::finishRestart() { + qDebug("Core::finishRestart"); + + if (!we_are_restarting) { + newMediaPlaying(); + } + + if (we_are_restarting) { + // Update info about codecs and demuxer + mdat.video_codec = proc->mediaData().video_codec; + mdat.audio_codec = proc->mediaData().audio_codec; + mdat.demuxer = proc->mediaData().demuxer; + } + +#if SUBTITLES_BY_INDEX + //if (we_are_restarting) { + if ( (just_loaded_external_subs) || (just_unloaded_external_subs) ) { + qDebug("Core::finishRestart: processing new subtitles"); + + // Just to simplify things + if (mset.current_sub_id == MediaSettings::NoneSelected) { + mset.current_sub_id = MediaSettings::SubNone; + } + + // Save current sub + SubData::Type type; + int ID; + int old_item = -1; + if ( mset.current_sub_id != MediaSettings::SubNone ) { + old_item = mset.current_sub_id; + type = mdat.subs.itemAt(old_item).type(); + ID = mdat.subs.itemAt(old_item).ID(); + } + + // Use the subtitle info from mplayerprocess + qDebug( "Core::finishRestart: copying sub data from proc to mdat"); + mdat.subs = proc->mediaData().subs; + initializeMenus(); + int item = MediaSettings::SubNone; + + // Try to recover old subtitle + if (old_item > -1) { + int new_item = mdat.subs.find(type, ID); + if (new_item > -1) item = new_item; + } + + // If we've just loaded a subtitle file + // select one if the user wants to autoload + // one subtitle + if (just_loaded_external_subs) { + if ( (pref->autoload_sub) && (item == MediaSettings::SubNone) ) { + qDebug("Core::finishRestart: cannot find previous subtitle"); + qDebug("Core::finishRestart: selecting a new one"); + item = mdat.subs.selectOne( pref->subtitle_lang ); + } + } + changeSubtitle( item ); + just_loaded_external_subs = false; + just_unloaded_external_subs = false; + } else { + // Normal restart, subtitles haven't changed + // Recover current subtitle + changeSubtitle( mset.current_sub_id ); + } +#endif + + we_are_restarting = false; + +#if !SUBTITLES_BY_INDEX + if (mset.external_subtitles.isEmpty()) { + changeSubtitle( mset.current_sub_id ); + } +#endif + + if (mset.aspect_ratio_id < MediaSettings::Aspect43Letterbox) { + changeAspectRatio(mset.aspect_ratio_id); + } + + bool isMuted = mset.mute; + if (!pref->dont_change_volume) setVolume( mset.volume, TRUE ); + if (isMuted) mute(TRUE); + + setGamma( mset.gamma ); + + changePanscan(mset.panscan_factor); + + updateWidgets(); // New + + emit mediaLoaded(); + emit mediaInfoChanged(); +} + + +void Core::stop() +{ + qDebug("Core::stop"); + qDebug(" state: %s", stateToString().toUtf8().data()); + + if (state()==Stopped) { + // if pressed stop twice, reset video to the beginning + qDebug(" mset.current_sec: %f", mset.current_sec); + mset.current_sec = 0; + updateWidgets(); + } + + stopMplayer(); + emit mediaStoppedByUser(); +} + + +void Core::play() +{ + qDebug("Core::play"); + + if ((proc->isRunning()) && (state()==Paused)) { + tellmp("pause"); // Unpauses + } + else + if ((proc->isRunning()) && (state()==Playing)) { + // nothing to do, continue playing + } + else { + // if we're stopped, play it again + if ( !mdat.filename.isEmpty() ) { + /* + qDebug( "current_sec: %f, duration: %f", mset.current_sec, mdat.duration); + if ( (floor(mset.current_sec)) >= (floor(mdat.duration)) ) { + mset.current_sec = 0; + } + */ + restartPlay(); + } + } +} + +void Core::pause_and_frame_step() { + qDebug("Core::pause_and_frame_step"); + + if (proc->isRunning()) { + if (state() == Paused) { + tellmp("frame_step"); + } + else { + tellmp("pause"); + //proc->write("pause\n"); + } + } +} + +void Core::pause() { + qDebug("Core::pause"); + qDebug("Current state: %s", stateToString().toUtf8().data()); + + if (proc->isRunning()) { + // Pauses and unpauses + tellmp("pause"); + } +} + +void Core::play_or_pause() { + if (proc->isRunning()) { + pause(); + } else { + play(); + } +} + +void Core::frameStep() { + qDebug("Core::franeStep"); + + if (proc->isRunning()) { + tellmp("frame_step"); + } +} + +void Core::screenshot() { + qDebug("Core::screenshot"); + + if ( (!pref->screenshot_directory.isEmpty()) && + (QFileInfo(pref->screenshot_directory).isDir()) ) + { + tellmp("pausing_keep screenshot 0"); + qDebug(" taken screenshot"); + } else { + qDebug(" error: directory for screenshots not valid"); + QString text = "Screenshot NOT taken, folder not configured"; + tellmp("osd_show_text \"" + text + "\" 3000 1"); + emit showMessage(text); + } +} + +void Core::processFinished() +{ + qDebug("Core::processFinished"); + + // Enable screensaver (in windows) + if (pref->disable_screensaver) { + Helper::setScreensaverEnabled(TRUE); + } + + qDebug("Core::processFinished: we_are_restarting: %d", we_are_restarting); + + //mset.current_sec = 0; + + if (!we_are_restarting) { + qDebug("Core::processFinished: play has finished!"); + setState(Stopped); + //emit stateChanged(state()); + } + + int exit_status = proc->exitStatus(); + qDebug(" exit_status: %d", exit_status); + if (exit_status != 0) { + emit mplayerFinishedWithError(exit_status); + } +} + +void Core::fileReachedEnd() { + /* + if (mdat.type == TYPE_VCD) { + // If the first vcd title has nothing, it doesn't start to play + // and menus are not initialized. + initializeMenus(); + } + */ + + // If we're at the end of the movie, reset to 0 + mset.current_sec = 0; + updateWidgets(); + + emit mediaFinished(); +} + +void Core::goToPos(int perc) +{ + qDebug("Core::goToPos: per: %d", perc); + + tellmp ( "seek " + QString::number( perc) + " 1"); +} + + + +void Core::startMplayer( QString file, double seek ) +{ + qDebug("Core::startMplayer"); + + if (file.isEmpty()) { + qWarning("Core:startMplayer: file is empty!"); + return; + } + + if (proc->isRunning()) { + qWarning("Core::startMplayer: MPlayer still running!"); + return; + } + + // Disable screensaver (in windows) + if (pref->disable_screensaver) { + Helper::setScreensaverEnabled(FALSE); + } + + mplayer_log = ""; + bool is_mkv = (QFileInfo(file).suffix().toLower() == "mkv"); + + // DVD + QString dvd_folder; + int dvd_title = -1; + if (mdat.type==TYPE_DVD) { + dvd_folder = Helper::dvdSplitFolder(file); + if (dvd_folder.isEmpty()) dvd_folder = pref->dvd_device; + // Remove trailing "/" + if (dvd_folder.endsWith("/")) { +#ifdef Q_OS_WIN + QRegExp r("^[A-Z]:/$"); + int pos = r.indexIn(dvd_folder); + qDebug("Core::startMplayer: drive check: '%s': regexp: %d", dvd_folder.toUtf8().data(), pos); + if (pos == -1) +#endif + dvd_folder = dvd_folder.remove( dvd_folder.length()-1, 1); + } + dvd_title = Helper::dvdSplitTitle(file); + file = "dvd://" + QString::number(dvd_title); + } + + // URL + bool url_is_playlist = file.endsWith(IS_PLAYLIST_TAG); + if (url_is_playlist) file = file.remove( QRegExp(IS_PLAYLIST_TAG_RX) ); + + proc->clearArguments(); + + // Set working directory to screenshot directory + if ( (!pref->screenshot_directory.isEmpty()) && + (QFileInfo(pref->screenshot_directory).isDir()) ) + { + qDebug("Core::startMplayer: setting working directory to '%s'", pref->screenshot_directory.toUtf8().data()); + proc->setWorkingDirectory( pref->screenshot_directory ); + } + + // Use absolute path + QString mplayer_bin = pref->mplayer_bin; + QFileInfo fi(mplayer_bin); + if (fi.exists()) { + mplayer_bin = fi.absoluteFilePath(); + } + +/* +#ifdef Q_OS_WIN + // Windows 98 and ME: call another program as intermediate + if ( (QSysInfo::WindowsVersion == QSysInfo::WV_98) || + (QSysInfo::WindowsVersion == QSysInfo::WV_Me) ) + { + QString intermediate_bin = Helper::mplayer_intermediate(mplayer_bin); + if (!intermediate_bin.isEmpty()) { + proc->addArgument( intermediate_bin ); + } + } +#endif +*/ + + proc->addArgument( mplayer_bin ); + + /* + proc->addArgument("-key-fifo-size"); + proc->addArgument("1000"); + */ + + proc->addArgument("-noquiet"); + + // No mplayer fullscreen mode + proc->addArgument("-nofs"); + + // Demuxer and audio and video codecs: + if (!mset.forced_demuxer.isEmpty()) { + proc->addArgument("-demuxer"); + proc->addArgument(mset.forced_demuxer); + } + if (!mset.forced_audio_codec.isEmpty()) { + proc->addArgument("-ac"); + proc->addArgument(mset.forced_audio_codec); + } + if (!mset.forced_video_codec.isEmpty()) { + proc->addArgument("-vc"); + proc->addArgument(mset.forced_video_codec); + } + + if (pref->use_hwac3) { + proc->addArgument("-afm"); + proc->addArgument("hwac3"); + } + + proc->addArgument("-sub-fuzziness"); +#if SUBTITLES_BY_INDEX + proc->addArgument( QString::number(pref->subfuzziness) ); +#else + if (mset.external_subtitles.isEmpty()) { + proc->addArgument( QString::number(pref->subfuzziness) ); + } else { + proc->addArgument("0"); + } +#endif + + /* + if (!pref->mplayer_verbose.isEmpty()) { + proc->addArgument("-msglevel"); + proc->addArgument( pref->mplayer_verbose ); + } + */ + + proc->addArgument("-identify"); + + // We need this to get info about mkv chapters + if (is_mkv) { + proc->addArgument("-msglevel"); + proc->addArgument("demux=6"); + + // **** Reset chapter *** + // Select first chapter, otherwise we cannot + // resume playback at the same point + // (time would be relative to chapter) + mset.current_chapter_id = 0; + } + + proc->addArgument("-slave"); + + if (!pref->vo.isEmpty()) { + proc->addArgument( "-vo"); + proc->addArgument( pref->vo ); + } + + if (!pref->ao.isEmpty()) { + proc->addArgument( "-ao"); + proc->addArgument( pref->ao ); + } + + proc->addArgument( "-zoom"); + proc->addArgument("-nokeepaspect"); + + // Performance options + #ifdef Q_OS_WIN + QString p; + int app_p = NORMAL_PRIORITY_CLASS; + switch (pref->priority) { + case Preferences::Realtime: p = "realtime"; + app_p = REALTIME_PRIORITY_CLASS; + break; + case Preferences::High: p = "high"; + app_p = REALTIME_PRIORITY_CLASS; + break; + case Preferences::AboveNormal: p = "abovenormal"; + app_p = HIGH_PRIORITY_CLASS; + break; + case Preferences::Normal: p = "normal"; + app_p = ABOVE_NORMAL_PRIORITY_CLASS; + break; + case Preferences::BelowNormal: p = "belownormal"; break; + case Preferences::Idle: p = "idle"; break; + default: p = "normal"; + } + proc->addArgument("-priority"); + proc->addArgument( p ); + SetPriorityClass(GetCurrentProcess(), app_p); + qDebug("Priority of smplayer process set to %d", app_p); + #endif + + if (pref->frame_drop) { + proc->addArgument("-framedrop"); + } + + if (pref->hard_frame_drop) { + proc->addArgument("-hardframedrop"); + } + + if (pref->autosync) { + proc->addArgument("-autosync"); + proc->addArgument( QString::number( pref->autosync_factor ) ); + } + + if (pref->use_direct_rendering) { + proc->addArgument("-dr"); + } + + if (!pref->use_double_buffer) { + proc->addArgument("-nodouble"); + } + +#ifndef Q_OS_WIN + if (!pref->use_mplayer_window) { + proc->addArgument( "-input" ); + proc->addArgument( "conf=" + Helper::dataPath() +"/input.conf" ); + } +#endif + +#ifndef Q_OS_WIN + if (pref->disable_screensaver) { + proc->addArgument("-stop-xscreensaver"); + } +#endif + + if (!pref->use_mplayer_window) { + proc->addArgument("-wid"); + proc->addArgument( QString::number( (int) mplayerwindow->videoLayer()->winId() ) ); + + proc->addArgument("-colorkey"); + //proc->addArgument( QString::number(COLORKEY) ); + proc->addArgument( QString::number(pref->color_key) ); + + // Set monitoraspect to desktop aspect + proc->addArgument("-monitoraspect"); + proc->addArgument( QString::number( DesktopInfo::desktop_aspectRatio(mplayerwindow) ) ); + } else { + // no -wid + if (!pref->monitor_aspect.isEmpty()) { + proc->addArgument("-monitoraspect"); + proc->addArgument( pref->monitor_aspect ); + } + } + + if (pref->use_ass_subtitles) { + proc->addArgument("-ass"); + proc->addArgument("-embeddedfonts"); + proc->addArgument("-ass-color"); + proc->addArgument( Helper::colorToRGBA( pref->ass_color ) ); + proc->addArgument("-ass-border-color"); + proc->addArgument( Helper::colorToRGBA( pref->ass_border_color ) ); + if (!pref->ass_styles.isEmpty()) { + proc->addArgument("-ass-force-style"); + proc->addArgument( pref->ass_styles ); + } + } + + // Subtitles font + if ( (pref->use_fontconfig) && (!pref->font_name.isEmpty()) ) { + proc->addArgument("-fontconfig"); + proc->addArgument("-font"); + proc->addArgument( pref->font_name ); + } + + if ( (!pref->use_fontconfig) && (!pref->font_file.isEmpty()) ) { + proc->addArgument("-font"); + proc->addArgument( pref->font_file ); + +#if USE_SUBFONT + if (pref->use_subfont) { + proc->addArgument("-subfont"); + proc->addArgument( pref->font_file ); + } +#endif + } + + proc->addArgument( "-subfont-autoscale"); + proc->addArgument( QString::number( pref->font_autoscale ) ); + proc->addArgument( "-subfont-text-scale"); + proc->addArgument( QString::number( pref->font_textscale ) ); + + if (!pref->subcp.isEmpty()) { + proc->addArgument("-subcp"); + proc->addArgument( pref->subcp ); + } + + if (mset.current_audio_id != MediaSettings::NoneSelected) { + proc->addArgument("-aid"); + proc->addArgument( QString::number( mset.current_audio_id ) ); + } + + if (!mset.external_subtitles.isEmpty()) { + if (QFileInfo(mset.external_subtitles).suffix().toLower()=="idx") { + // sub/idx subtitles + QFileInfo fi(mset.external_subtitles); + QString s = fi.path() +"/"+ fi.baseName(); + qDebug(" * subtitle file without extension: '%s'", s.toUtf8().data()); + proc->addArgument("-vobsub"); + proc->addArgument( s ); + } else { + proc->addArgument("-sub"); + proc->addArgument( mset.external_subtitles ); + } + } + + if (!mset.external_audio.isEmpty()) { + proc->addArgument("-audiofile"); + proc->addArgument( mset.external_audio ); + } + + proc->addArgument("-subpos"); + proc->addArgument( QString::number(mset.sub_pos) ); + + if (mset.audio_delay!=0) { + proc->addArgument("-delay"); + proc->addArgument( QString::number( (double) mset.audio_delay/1000 ) ); + } + + if (mset.sub_delay!=0) { + proc->addArgument("-subdelay"); + proc->addArgument( QString::number( (double) mset.sub_delay/1000 ) ); + } + + // Contrast, brightness... + //if (mset.contrast !=0) { + if (!pref->dont_use_eq_options) { + proc->addArgument("-contrast"); + proc->addArgument( QString::number( mset.contrast ) ); + } + + #ifdef Q_OS_WIN + if (mset.brightness != 0) { + #endif + if (!pref->dont_use_eq_options) { + proc->addArgument("-brightness"); + proc->addArgument( QString::number( mset.brightness ) ); + } + #ifdef Q_OS_WIN + } + #endif + + //if (mset.hue !=0) { + if (!pref->dont_use_eq_options) { + proc->addArgument("-hue"); + proc->addArgument( QString::number( mset.hue ) ); + } + + //if (mset.saturation !=0) { + if (!pref->dont_use_eq_options) { + proc->addArgument("-saturation"); + proc->addArgument( QString::number( mset.saturation ) ); + } + + + /* + if (mdat.type==TYPE_DVD) { + if ( (pref->play_dvd_from_hd) && (!pref->dvd_directory.isEmpty()) ) { + proc->addArgument("-dvd-device"); + proc->addArgument( pref->dvd_directory ); + } else { + if (!pref->dvd_device.isEmpty()) { + proc->addArgument("-dvd-device"); + proc->addArgument( pref->dvd_device ); + } + } + } + */ + + if (mdat.type==TYPE_DVD) { + if (!dvd_folder.isEmpty()) { + proc->addArgument("-dvd-device"); + proc->addArgument( dvd_folder ); + } else { + qWarning("Core::startMplayer: dvd device is empty!"); + } + } + + if ((mdat.type==TYPE_VCD) || (mdat.type==TYPE_AUDIO_CD)) { + if (!pref->cdrom_device.isEmpty()) { + proc->addArgument("-cdrom-device"); + proc->addArgument( pref->cdrom_device ); + } + } + + if (mset.current_chapter_id > 0) { + proc->addArgument("-chapter"); + proc->addArgument( QString::number( mset.current_chapter_id ) ); + } + + if (mset.current_angle_id > 0) { + proc->addArgument("-dvdangle"); + proc->addArgument( QString::number( mset.current_angle_id ) ); + } + + + bool cache_activated = ( (pref->use_cache) && (pref->cache > 0) ); + if ( (mdat.type==TYPE_DVD) && (pref->fast_chapter_change) ) + cache_activated = false; + + //if ( (pref->cache > 0) && ((mdat.type!=TYPE_DVD) || (!pref->fast_chapter_change)) ) { + if (cache_activated) { + proc->addArgument("-cache"); + proc->addArgument( QString::number( pref->cache ) ); + } + + if (mset.speed != 1.0) { + proc->addArgument("-speed"); + proc->addArgument( QString::number( mset.speed ) ); + } + + // If seek < 5 it's better to allow the video to start from the beginning + if ((seek >= 5) && (!pref->loop)) { + proc->addArgument("-ss"); + proc->addArgument( QString::number( seek ) ); + } + + proc->addArgument("-osdlevel"); + proc->addArgument( QString::number( pref->osd ) ); + + if (mset.flip) { + proc->addArgument("-flip"); + } + + if (pref->use_idx) { + proc->addArgument("-idx"); + } + + // Video filters: + // Phase + if (mset.phase_filter) { + proc->addArgument("-vf-add"); + proc->addArgument( "phase=A" ); + } + + // Deinterlace + if (mset.current_deinterlacer != MediaSettings::NoDeinterlace) { + proc->addArgument("-vf-add"); + switch (mset.current_deinterlacer) { + case MediaSettings::L5: proc->addArgument("pp=l5"); break; + case MediaSettings::Yadif: proc->addArgument("yadif"); break; + case MediaSettings::LB: proc->addArgument("pp=lb"); break; + case MediaSettings::Yadif_1: proc->addArgument("yadif=1"); break; + case MediaSettings::Kerndeint: proc->addArgument("kerndeint=5"); break; + } + } + + // Panscan (crop) + if (!mset.panscan_filter.isEmpty()) { + proc->addArgument( "-vf-add" ); + proc->addArgument( mset.panscan_filter ); + } + + // Crop 4:3 to 16:9 + if (!mset.crop_43to169_filter.isEmpty()) { + proc->addArgument( "-vf-add" ); + proc->addArgument( mset.crop_43to169_filter ); + } + + // Denoise + if (mset.current_denoiser != MediaSettings::NoDenoise) { + proc->addArgument("-vf-add"); + if (mset.current_denoiser==MediaSettings::DenoiseSoft) { + proc->addArgument( "hqdn3d=2:1:2" ); + } else { + proc->addArgument( "hqdn3d" ); + } + } + + // Deblock + if (mset.deblock_filter) { + proc->addArgument("-vf-add"); + proc->addArgument( "pp=vb/hb" ); + } + + // Dering + if (mset.dering_filter) { + proc->addArgument("-vf-add"); + proc->addArgument( "pp=dr" ); + } + + // Addnoise + if (mset.noise_filter) { + proc->addArgument("-vf-add"); + proc->addArgument( "noise=9ah:5ah" ); + } + + // Postprocessing + if (mset.postprocessing_filter) { + proc->addArgument("-vf-add"); + proc->addArgument("pp"); + proc->addArgument("-autoq"); + proc->addArgument( QString::number(pref->autoq) ); + } + + + // Letterbox (expand) + if (mset.letterbox == MediaSettings::Letterbox_43) { + proc->addArgument("-vf-add"); + proc->addArgument("expand=:::::4/3"); + } + else + if (mset.letterbox == MediaSettings::Letterbox_169) { + proc->addArgument("-vf-add"); + proc->addArgument("expand=:::::16/9"); + } + + // Additional video filters, supplied by user + // File + if ( !mset.mplayer_additional_video_filters.isEmpty() ) { + proc->addArgument("-vf-add"); + proc->addArgument( mset.mplayer_additional_video_filters ); + } + // Global + if ( !pref->mplayer_additional_video_filters.isEmpty() ) { + proc->addArgument("-vf-add"); + proc->addArgument( pref->mplayer_additional_video_filters ); + } + + // Screenshot + if ( (!pref->screenshot_directory.isEmpty()) && + (QFileInfo(pref->screenshot_directory).isDir()) ) + { + // Subtitles on screenshots + if (pref->subtitles_on_screenshots) { + if (pref->use_ass_subtitles) { + proc->addArgument("-vf-add"); + proc->addArgument("ass"); + } else { + proc->addArgument("-vf-add"); + proc->addArgument("expand=osd=1"); + proc->addArgument("-noslices"); + } + } + proc->addArgument("-vf-add"); + proc->addArgument("screenshot"); + } + + if ( (pref->use_soft_video_eq) && (pref->vo!="gl") && (pref->vo!="gl2") ) { + proc->addArgument("-vf-add"); + proc->addArgument("eq2"); + } + + // Audio channels + if (mset.audio_use_channels != 0) { + proc->addArgument("-channels"); + proc->addArgument( QString::number( mset.audio_use_channels ) ); + } + + // Stereo mode + if (mset.stereo_mode != 0) { + proc->addArgument("-stereo"); + proc->addArgument( QString::number( mset.stereo_mode ) ); + } + + // Audio filters + QString af=""; + if (mset.karaoke_filter) { + af="karaoke"; + } + + if (mset.extrastereo_filter) { + if (!af.isEmpty()) af += ","; + af += "extrastereo"; + } + + if (mset.volnorm_filter) { + if (!af.isEmpty()) af += ","; + af += "volnorm=2"; + } + + // Additional audio filters, supplied by user + // File + if ( !pref->mplayer_additional_audio_filters.isEmpty() ) { + if (!af.isEmpty()) af += ","; + af += pref->mplayer_additional_audio_filters; + } + // Global + if ( !mset.mplayer_additional_audio_filters.isEmpty() ) { + if (!af.isEmpty()) af += ","; + af += mset.mplayer_additional_audio_filters; + } + + if (!af.isEmpty()) { + proc->addArgument("-af"); + proc->addArgument( af ); + } + + if (pref->use_soft_vol) { + proc->addArgument("-softvol"); + proc->addArgument("-softvol-max"); + proc->addArgument( QString::number(pref->softvol_max) ); + } + + if (pref->loop) { + proc->addArgument("-loop"); + proc->addArgument("0"); + } + + // Additional options supplied by the user + // File + if (!mset.mplayer_additional_options.isEmpty()) { + QStringList args = mset.mplayer_additional_options.split(" "); + QStringList::Iterator it = args.begin(); + while( it != args.end() ) { + proc->addArgument( (*it) ); + ++it; + } + } + // Global + if (!pref->mplayer_additional_options.isEmpty()) { + QStringList args = pref->mplayer_additional_options.split(" "); + QStringList::Iterator it = args.begin(); + while( it != args.end() ) { + proc->addArgument( (*it) ); + ++it; + } + } + + // File to play + if (url_is_playlist) { + proc->addArgument("-playlist"); + } + + proc->addArgument( file ); + + //Log command + //mplayer_log = "Command: \n"; + /* + QString commandline; + QStringList list = proc->arguments(); + QStringList::Iterator it = list.begin(); + while( it != list.end() ) { + commandline += ( *it ); + commandline += " "; + ++it; + } + */ + QString commandline = proc->arguments().join(" "); + mplayer_log += commandline + "\n\n"; + qDebug("Core::startMplayer: command: '%s'", commandline.toUtf8().data()); + + emit aboutToStartPlaying(); + + if ( !proc->start() ) { + // error handling + qWarning("Core::startMplayer: mplayer process didn't start"); + } + + //stopped_by_user = FALSE; + + // Try to set the volume as soon as possible + tellmp("volume " + QString::number(mset.volume) + " 1"); +} + +void Core::stopMplayer() { + qDebug("Core::stopMplayer"); + + if (!proc->isRunning()) { + qWarning("Core::stopMplayer: mplayer in not running!"); + return; + } + + tellmp("quit"); + + qDebug("Core::stopMplayer: Waiting mplayer to finish..."); + //Helper::finishProcess( proc ); + if (!proc->waitForFinished(5000)) { + proc->kill(); + } + + qDebug("Core::stopMplayer: Finished. (I hope)"); +} + + +/* +void Core::goToSec( double sec ) +{ + qDebug("Core::goToSec: %f", sec); + + if (sec < 0) sec = 0; + if (sec > mdat.duration ) sec = mdat.duration - 20; + tellmp("seek " + QString::number(sec) + " 2"); +} +*/ + +void Core::seek(int secs) { + qDebug("seek: %d", secs); + if ( (proc->isRunning()) && (secs!=0) ) { + tellmp("seek " + QString::number(secs) + " 0"); + } +} + +void Core::sforward() { + qDebug("Core::sforward"); + seek( pref->seeking1 ); // +10s +} + +void Core::srewind() { + qDebug("Core::srewind"); + seek( -pref->seeking1 ); // -10s +} + + +void Core::forward() { + qDebug("Core::forward"); + seek( pref->seeking2 ); // +1m +} + + +void Core::rewind() { + qDebug("Core::rewind"); + seek( -pref->seeking2 ); // -1m +} + + +void Core::fastforward() { + qDebug("Core::fastforward"); + seek( pref->seeking3 ); // +10m +} + + +void Core::fastrewind() { + qDebug("Core::fastrewind"); + seek( -pref->seeking3 ); // -10m +} + +void Core::forward(int secs) { + qDebug("forward: %d", secs); + seek(secs); +} + +void Core::rewind(int secs) { + qDebug("rewind: %d", secs); + seek(-secs); +} + +void Core::wheelUp() { + qDebug("wheelUp"); + switch (pref->wheel_function) { + case Preferences::Volume : incVolume(); break; + case Preferences::Zoom : incPanscan(); break; + default : forward( pref->seeking4 ); + } +} + +void Core::wheelDown() { + qDebug("wheelDown"); + switch (pref->wheel_function) { + case Preferences::Volume : decVolume(); break; + case Preferences::Zoom : decPanscan(); break; + default : rewind( pref->seeking4 ); + } +} + + +void Core::toggleRepeat() { + qDebug("Core::toggleRepeat"); + toggleRepeat( !pref->loop ); +} + +void Core::toggleRepeat(bool b) { + qDebug("Core::toggleRepeat: %d", b); + if ( pref->loop != b ) { + pref->loop = b; + if (proc->isRunning()) restartPlay(); + } +} + + +void Core::toggleFlip() { + qDebug("Core::toggleFlip"); + toggleFlip( !mset.flip ); +} + +void Core::toggleFlip(bool b) { + qDebug("Core::toggleFlip: %d", b); + + if (mset.flip != b) { + mset.flip = b; + if (proc->isRunning()) restartPlay(); + } +} + + +// Audio filters +void Core::toggleKaraoke() { + toggleKaraoke( !mset.karaoke_filter ); +} + +void Core::toggleKaraoke(bool b) { + qDebug("Core::toggleKaraoke: %d", b); + if (b != mset.karaoke_filter) { + mset.karaoke_filter = b; + restartPlay(); + } +} + +void Core::toggleExtrastereo() { + toggleExtrastereo( !mset.extrastereo_filter ); +} + +void Core::toggleExtrastereo(bool b) { + qDebug("Core::toggleExtrastereo: %d", b); + if (b != mset.extrastereo_filter) { + mset.extrastereo_filter = b; + restartPlay(); + } +} + +void Core::toggleVolnorm() { + toggleVolnorm( !mset.volnorm_filter ); +} + +void Core::toggleVolnorm(bool b) { + qDebug("Core::toggleVolnorm: %d", b); + if (b != mset.volnorm_filter) { + mset.volnorm_filter = b; + restartPlay(); + } +} + +void Core::setAudioChannels(int channels) { + qDebug("Core::setAudioChannels:%d", channels); + if (channels != mset.audio_use_channels ) { + mset.audio_use_channels = channels; + restartPlay(); + } +} + +void Core::setStereoMode(int mode) { + qDebug("Core::setStereoMode:%d", mode); + if (mode != mset.stereo_mode ) { + mset.stereo_mode = mode; + restartPlay(); + } +} + + +// Video filters +void Core::toggleAutophase() { + toggleAutophase( !mset.phase_filter ); +} + +void Core::toggleAutophase( bool b ) { + qDebug("Core::toggleAutophase: %d", b); + if ( b != mset.phase_filter) { + mset.phase_filter = b; + restartPlay(); + } +} + +void Core::toggleDeblock() { + toggleDeblock( !mset.deblock_filter ); +} + +void Core::toggleDeblock(bool b) { + qDebug("Core::toggleDeblock: %d", b); + if ( b != mset.deblock_filter ) { + mset.deblock_filter = b; + restartPlay(); + } +} + +void Core::toggleDering() { + toggleDering( !mset.dering_filter ); +} + +void Core::toggleDering(bool b) { + qDebug("Core::toggleDering: %d", b); + if ( b != mset.dering_filter) { + mset.dering_filter = b; + restartPlay(); + } +} + +void Core::toggleNoise() { + toggleNoise( !mset.noise_filter ); +} + +void Core::toggleNoise(bool b) { + qDebug("Core::toggleNoise: %d", b); + if ( b!= mset.noise_filter ) { + mset.noise_filter = b; + restartPlay(); + } +} + +void Core::togglePostprocessing() { + togglePostprocessing( !mset.postprocessing_filter ); +} + +void Core::togglePostprocessing(bool b) { + qDebug("Core::togglePostprocessing: %d", b); + if ( b != mset.postprocessing_filter ) { + mset.postprocessing_filter = b; + restartPlay(); + } +} + +void Core::changeDenoise(int id) { + qDebug( "Core::changeDenoise: %d", id ); + if (id != mset.current_denoiser) { + mset.current_denoiser = id; + restartPlay(); + } +} + +void Core::setBrightness(int value) { + qDebug("Core::setBrightness: %d", value); + tellmp("brightness " + QString::number(value) + " 1"); + mset.brightness = value; + displayMessage( tr("Brightness: %1").arg(value) ); + emit equalizerNeedsUpdate(); +} + + +void Core::setContrast(int value) { + qDebug("Core::setContrast: %d", value); + tellmp("contrast " + QString::number(value) + " 1"); + mset.contrast = value; + displayMessage( tr("Contrast: %1").arg(value) ); + emit equalizerNeedsUpdate(); +} + +void Core::setGamma(int value) { + qDebug("Core::setGamma: %d", value); + tellmp("gamma " + QString::number(value) + " 1"); + mset.gamma= value; + displayMessage( tr("Gamma: %1").arg(value) ); + emit equalizerNeedsUpdate(); +} + +void Core::setHue(int value) { + qDebug("Core::setHue: %d", value); + tellmp("hue " + QString::number(value) + " 1"); + mset.hue = value; + displayMessage( tr("Hue: %1").arg(value) ); + emit equalizerNeedsUpdate(); +} + +void Core::setSaturation(int value) { + qDebug("Core::setSaturation: %d", value); + tellmp("saturation " + QString::number(value) + " 1"); + mset.saturation = value; + displayMessage( tr("Saturation: %1").arg(value) ); + emit equalizerNeedsUpdate(); +} + +void Core::incBrightness() { + int v = mset.brightness + 4; + if (v > 100) v = 100; + setBrightness(v); +} + +void Core::decBrightness() { + int v = mset.brightness - 4; + if (v < -100) v = -100; + setBrightness(v); +} + +void Core::incContrast() { + int v = mset.contrast + 4; + if (v > 100) v = 100; + setContrast(v); +} + +void Core::decContrast() { + int v = mset.contrast - 4; + if (v < -100) v = -100; + setContrast(v); +} + +void Core::incGamma() { + int v = mset.gamma + 4; + if (v > 100) v = 100; + setGamma(v); +} + +void Core::decGamma() { + int v = mset.gamma - 4; + if (v < -100) v = -100; + setGamma(v); +} + +void Core::incHue() { + int v = mset.hue + 4; + if (v > 100) v = 100; + setHue(v); +} + +void Core::decHue() { + int v = mset.hue - 4; + if (v < -100) v = -100; + setHue(v); +} + +void Core::incSaturation() { + int v = mset.saturation + 4; + if (v > 100) v = 100; + setSaturation(v); +} + +void Core::decSaturation() { + int v = mset.saturation - 4; + if (v < -100) v = -100; + setSaturation(v); +} + +void Core::setSpeed( double value ) { + qDebug("Core::setSpeed: %f", value); + + if (value < 0.10) value = 0.10; + if (value > 100) value = 100; + + mset.speed = value; + tellmp( "speed_set " + QString::number( value ) ); +} + +void Core::incSpeed() { + qDebug("Core::incSpeed"); + setSpeed( (double) mset.speed + 0.1 ); +} + +void Core::decSpeed() { + qDebug("Core::decSpeed"); + setSpeed( (double) mset.speed - 0.1 ); +} + +void Core::doubleSpeed() { + qDebug("Core::doubleSpeed"); + setSpeed( (double) mset.speed * 2 ); +} + +void Core::halveSpeed() { + qDebug("Core::halveSpeed"); + setSpeed( (double) mset.speed / 2 ); +} + +void Core::normalSpeed() { + setSpeed(1); +} + +void Core::setVolume(int volume, bool force) { + qDebug("Core::setVolume: %d", volume); + + if ((volume==mset.volume) && (!force)) return; + + mset.volume = volume; + if (mset.volume > 100 ) mset.volume = 100; + if (mset.volume < 0 ) mset.volume = 0; + + tellmp("pausing_keep volume " + QString::number(volume) + " 1"); + + //if (mset.mute) mute(TRUE); + mset.mute=FALSE; + + updateWidgets(); + + displayMessage( tr("Volume: %1").arg(mset.volume) ); + emit volumeChanged( mset.volume ); +} + +void Core::switchMute() { + qDebug("Core::switchMute"); + + mset.mute = !mset.mute; + mute(mset.mute); +} + +void Core::mute(bool b) { + qDebug("Core::mute"); + + mset.mute = b; + + int v = 0; + if (mset.mute) v = 1; + tellmp("mute " + QString::number(v) ); + + updateWidgets(); +} + +void Core::incVolume() { + qDebug("Core::incVolume"); + setVolume(mset.volume + 4); +} + +void Core::decVolume() { + qDebug("Core::incVolume"); + setVolume(mset.volume-4); +} + +void Core::incSubDelay() { + qDebug("Core::incSubDelay"); + + mset.sub_delay += 100; + tellmp("sub_delay " + QString::number( (double) mset.sub_delay/1000 ) +" 1"); +} + +void Core::decSubDelay() { + qDebug("Core::decSubDelay"); + + mset.sub_delay -= 100; + tellmp("sub_delay " + QString::number( (double) mset.sub_delay/1000 ) +" 1"); +} + +void Core::incAudioDelay() { + qDebug("Core::incAudioDelay"); + + mset.audio_delay += 100; + tellmp("audio_delay " + QString::number( (double) mset.audio_delay/1000 ) +" 1"); +} + +void Core::decAudioDelay() { + qDebug("Core::decAudioDelay"); + + mset.audio_delay -= 100; + tellmp("audio_delay " + QString::number( (double) mset.audio_delay/1000 ) +" 1"); +} + +void Core::incSubPos() { + qDebug("Core::incSubPos"); + + mset.sub_pos++; + if (mset.sub_pos > 100) mset.sub_pos = 100; + tellmp("sub_pos " + QString::number( mset.sub_pos ) + " 1"); +} + +void Core::decSubPos() { + qDebug("Core::decSubPos"); + + mset.sub_pos--; + if (mset.sub_pos < 0) mset.sub_pos = 0; + tellmp("sub_pos " + QString::number( mset.sub_pos ) + " 1"); +} + + +void Core::incSubStep() { + qDebug("Core::incSubStep"); + tellmp("sub_step +1"); +} + +void Core::decSubStep() { + qDebug("Core::decSubStep"); + tellmp("sub_step -1"); +} + + +void Core::changeCurrentSec(double sec) { + mset.current_sec = sec; + + if (mset.starting_time != -1) { + mset.current_sec -= mset.starting_time; + } + + if (state() != Playing) { + setState(Playing); + qDebug("mplayer reports that now it's playing"); + emit mediaStartPlay(); + //emit stateChanged(state()); + } + + emit showTime(mset.current_sec); +} + +void Core::gotStartingTime(double time) { + qDebug("Core::gotStartingTime: %f", time); + qDebug("Core::gotStartingTime: current_sec: %f", mset.current_sec); + if ((mset.starting_time == -1.0) && (mset.current_sec == 0)) { + mset.starting_time = time; + qDebug("Core::gotStartingTime: starting time set to %f", time); + } +} + + +void Core::changePause() { + qDebug("Core::changePause"); + qDebug("mplayer reports that it's paused"); + setState(Paused); + //emit stateChanged(state()); +} + +void Core::changeDeinterlace(int ID) { + qDebug("Core::changeDeinterlace: %d", ID); + + if (ID!=mset.current_deinterlacer) { + mset.current_deinterlacer = ID; + restartPlay(); + } +} + + + +void Core::changeSubtitle(int ID) { + qDebug("Core::changeSubtitle: %d", ID); + + mset.current_sub_id = ID; + if (ID==MediaSettings::SubNone) { + ID=-1; +#if !SUBTITLES_BY_INDEX + if (!mset.external_subtitles.isEmpty()) { + mset.external_subtitles=""; + restartPlay(); + } +#endif + } + + qDebug("Core::changeSubtitle: ID: %d", ID); + tellmp( "sub_select " + QString::number(ID) ); + updateWidgets(); +} + +void Core::nextSubtitle() { + qDebug("Core::nextSubtitle"); + +#if SUBTITLES_BY_INDEX + if ( (mset.current_sub_id == MediaSettings::SubNone) && + (mdat.subs.numItems() > 0) ) + { + changeSubtitle(0); + } + else { + int item = mset.current_sub_id + 1; + if (item >= mdat.subs.numItems()) { + item = MediaSettings::SubNone; + } + changeSubtitle( item ); + } +#else + int item; + if ( (mset.current_sub_id == MediaSettings::SubNone) && + (mdat.subtitles.numItems() > 0) ) + { + item = 0; + int ID = mdat.subtitles.itemAt(item).ID(); + changeSubtitle(ID); + } else { + item = mdat.subtitles.find( mset.current_sub_id ); + if (item == -1) { + qWarning(" subtitle ID %d not found!", mset.current_sub_id); + } else { + qDebug( " numItems: %d, item: %d", mdat.subtitles.numItems(), item); + item++; + int ID; + if (item >= mdat.subtitles.numItems()) { + ID = MediaSettings::SubNone; + } else { + ID = mdat.subtitles.itemAt(item).ID(); + } + qDebug( " item: %d, ID: %d", item, ID); + changeSubtitle( ID ); + } + } +#endif +} + +void Core::changeAudio(int ID) { + qDebug("Core::changeAudio: ID: %d", ID); + + if (ID!=mset.current_audio_id) { + mset.current_audio_id = ID; + qDebug("changeAudio: ID: %d", ID); + + if (pref->audio_change_requires_restart) { + restartPlay(); + } else { + tellmp("switch_audio " + QString::number(ID) ); + #ifdef Q_OS_WIN + // Workaround for a mplayer problem in windows, + // volume is too loud after changing audio. + setVolume( mset.volume, true ); + #endif + if (mset.mute) mute(TRUE); // if muted, mute again + updateWidgets(); + } + } +} + +void Core::nextAudio() { + qDebug("Core::nextAudio"); + + int item = mdat.audios.find( mset.current_audio_id ); + if (item == -1) { + qWarning(" audio ID %d not found!", mset.current_audio_id); + } else { + qDebug( " numItems: %d, item: %d", mdat.audios.numItems(), item); + item++; + if (item >= mdat.audios.numItems()) item=0; + int ID = mdat.audios.itemAt(item).ID(); + qDebug( " item: %d, ID: %d", item, ID); + changeAudio( ID ); + } +} + +void Core::changeTitle(int ID) { + if (mdat.type == TYPE_VCD) { + // VCD + openVCD( ID ); + } + else + if (mdat.type == TYPE_AUDIO_CD) { + // AUDIO CD + openAudioCD( ID ); + } + else + if (mdat.type == TYPE_DVD) { + QString dvd_url = "dvd://" + QString::number(ID); + QString folder = Helper::dvdSplitFolder(mdat.filename); + if (!folder.isEmpty()) dvd_url += ":" + folder; + + openDVD(dvd_url); + //openDVD( ID ); + } +} + +void Core::changeChapter(int ID) { + qDebug("Core::changeChapter: ID: %d", ID); + + if (ID != mset.current_chapter_id) { + //if (QFileInfo(mdat.filename).extension().lower()=="mkv") { + if (mdat.mkv_chapters > 0) { + // mkv doesn't require to restart + tellmp("seek_chapter " + QString::number(ID) +" 1"); + mset.current_chapter_id = ID; + updateWidgets(); + } else { + if (pref->fast_chapter_change) { + tellmp("seek_chapter " + QString::number(ID-1) +" 1"); + mset.current_chapter_id = ID; + updateWidgets(); + } else { + stopMplayer(); + mset.current_chapter_id = ID; + //goToPos(0); + mset.current_sec = 0; + restartPlay(); + } + } + } +} + +void Core::prevChapter() { + qDebug("Core::prevChapter"); + + int last_chapter = 0; + bool matroshka = (mdat.mkv_chapters > 0); + + int first_chapter=1; + if (matroshka) first_chapter = 0; + + // Matroshka chapters + if (matroshka) last_chapter = mdat.mkv_chapters; + else + // DVD chapters + if (mset.current_title_id > 0) { + last_chapter = mdat.titles.item(mset.current_title_id).chapters(); + } + + int ID = mset.current_chapter_id - 1; + if (ID < first_chapter) { + ID = last_chapter; + } + changeChapter(ID); +} + +void Core::nextChapter() { + qDebug("Core::nextChapter"); + + int last_chapter = 0; + bool matroshka = (mdat.mkv_chapters > 0); + + // Matroshka chapters + if (matroshka) last_chapter = mdat.mkv_chapters; + else + // DVD chapters + if (mset.current_title_id > 0) { + last_chapter = mdat.titles.item(mset.current_title_id).chapters(); + } + + int ID = mset.current_chapter_id + 1; + if (ID > last_chapter) { + if (matroshka) ID=0; else ID=1; + } + changeChapter(ID); +} + +void Core::changeAngle(int ID) { + qDebug("Core::changeAngle: ID: %d", ID); + + if (ID != mset.current_angle_id) { + mset.current_angle_id = ID; + restartPlay(); + } +} + +void Core::changeAspectRatio( int ID ) { + qDebug("Core::changeAspectRatio: %d", ID); + + int old_id = mset.aspect_ratio_id; + mset.aspect_ratio_id = ID; + bool need_restart = FALSE; + + double asp = mdat.video_aspect; // Set a default + + if (ID==MediaSettings::Aspect43Letterbox) { + need_restart = (old_id != MediaSettings::Aspect43Letterbox); + asp = (double) 4 / 3; + mset.letterbox = MediaSettings::Letterbox_43; + mset.panscan_filter = ""; + mset.crop_43to169_filter = ""; + } + else + if (ID==MediaSettings::Aspect169Letterbox) { + need_restart = (old_id != MediaSettings::Aspect169Letterbox); + asp = (double) 16 / 9; + mset.letterbox = MediaSettings::Letterbox_169; + mset.panscan_filter = ""; + mset.crop_43to169_filter = ""; + } + else + if (ID==MediaSettings::Aspect43Panscan) { + need_restart = (old_id != MediaSettings::Aspect43Panscan); + mset.crop_43to169_filter = ""; + mset.letterbox = MediaSettings::NoLetterbox; + + asp = (double) 4 / 3; + int real_width = (int) round(mdat.video_height * mdat.video_aspect); + mset.panscan_filter = QString("scale=%1:%2,").arg(real_width).arg(mdat.video_height); + mset.panscan_filter += QString("crop=%1:%2").arg(round(mdat.video_height * 4 /3)).arg(mdat.video_height); + //mset.crop = QSize( mdat.video_height * 4 /3, mdat.video_height ); + qDebug(" panscan_filter = '%s'", mset.panscan_filter.toUtf8().data() ); + + } + else + if (ID==MediaSettings::Aspect43To169) { + need_restart = (old_id != MediaSettings::Aspect43To169); + mset.panscan_filter = ""; + mset.crop_43to169_filter = ""; + mset.letterbox = MediaSettings::NoLetterbox; + + int real_width = (int) round(mdat.video_height * mdat.video_aspect); + int height = (int) round(real_width * 9 / 16); + + qDebug("video_width: %d, video_height: %d", real_width, mdat.video_height); + qDebug("crop: %d, %d", real_width, height ); + + if (height > mdat.video_height) { + // Invalid size, source video is not 4:3 + need_restart = FALSE; + } else { + asp = (double) 16 / 9; + mset.crop_43to169_filter = QString("scale=%1:%2,").arg(real_width).arg(mdat.video_height); + mset.crop_43to169_filter += QString("crop=%1:%2").arg(real_width).arg(height); + qDebug(" crop_43to169_filter = '%s'", mset.crop_43to169_filter.toUtf8().data() ); + } + } + else + { + //need_restart = (mset.force_letterbox == TRUE); + need_restart = ( (old_id == MediaSettings::Aspect43Letterbox) || + (old_id == MediaSettings::Aspect169Letterbox) || + (old_id == MediaSettings::Aspect43Panscan) || + (old_id == MediaSettings::Aspect43To169) ); + mset.letterbox = MediaSettings::NoLetterbox; + mset.panscan_filter = ""; + mset.crop_43to169_filter = ""; + switch (ID) { + //case MediaSettings::AspectAuto: asp = mdat.video_aspect; break; + case MediaSettings::AspectAuto: asp = mset.win_aspect(); break; + case MediaSettings::Aspect43: asp = (double) 4 / 3; break; + case MediaSettings::Aspect169: asp = (double) 16 / 9; break; + case MediaSettings::Aspect149: asp = (double) 14 / 9; break; + case MediaSettings::Aspect1610: asp = (double) 16 / 10; break; + case MediaSettings::Aspect54: asp = (double) 5 / 4; break; + case MediaSettings::Aspect235: asp = 2.35; break; + } + } + + mplayerwindow->setAspect( asp ); + //tellmp("switch_ratio " + QString::number( asp ) ); + + updateWidgets(); + + if (need_restart) { + /*mdat.calculateWinResolution(mset.force_letterbox);*/ + restartPlay(); + } +} + +void Core::changeOSD(int v) { + qDebug("Core::changeOSD: %d", v); + + pref->osd = v; + tellmp("osd " + QString::number( pref->osd ) ); + updateWidgets(); +} + +void Core::nextOSD() { + int osd = pref->osd + 1; + if (osd > Preferences::SeekTimerTotal) { + osd = Preferences::None; + } + changeOSD( osd ); +} + +void Core::changeSize(int n) { + if ( /*(n != pref->size_factor) &&*/ (!pref->use_mplayer_window) ) { + pref->size_factor = n; + + emit needResize(mset.win_width, mset.win_height); + updateWidgets(); + } +} + +void Core::toggleDoubleSize() { + if (pref->size_factor != 100) + changeSize(100); + else + changeSize(200); +} + +void Core::changePanscan(double p) { + qDebug("Core::changePanscan: %f", p); + if (p < 1.0) p = 1.0; + + mset.panscan_factor = p; + mplayerwindow->setZoom(p); + displayMessage( tr("Zoom: %1").arg(mset.panscan_factor) ); +} + +void Core::resetPanscan() { + changePanscan(1.0); +} + +void Core::incPanscan() { + qDebug("Core::incPanscan"); + changePanscan( mset.panscan_factor + 0.10 ); +} + +void Core::decPanscan() { + qDebug("Core::decPanscan"); + changePanscan( mset.panscan_factor - 0.10 ); +} + +void Core::changeUseAss(bool b) { + qDebug("Core::changeUseAss: %d", b); + + if (pref->use_ass_subtitles != b) { + pref->use_ass_subtitles = b; + if (proc->isRunning()) restartPlay(); + } +} + +void Core::displayMessage(QString text) { + qDebug("Core::displayMessage"); + emit showMessage(text); +} + +void Core::displayScreenshotName(QString filename) { + qDebug("Core::displayScreenshotName"); + //QString text = tr("Screenshot saved as %1").arg(filename); + QString text = QString("Screenshot saved as %1").arg(filename); + + if (state() != Paused) { + // Dont' show the message on OSD while in pause, otherwise + // the video goes forward a frame. + tellmp("pausing_keep osd_show_text \"" + text + "\" 3000 1"); + } + + emit showMessage(text); +} + + +void Core::gotWindowResolution(int w, int h) { + qDebug("Core::gotWindowResolution: %d, %d", w, h); + //double aspect = (double) w/h; + + if (pref->use_mplayer_window) { + emit noVideo(); + } else { + if ((pref->resize_method==Preferences::Afterload) && (we_are_restarting)) { + // Do nothing + } else { + emit needResize(w,h); + } + } + + mset.win_width = w; + mset.win_height = h; + + //Override aspect ratio, is this ok? + //mdat.video_aspect = mset.win_aspect(); + + mplayerwindow->setResolution( w, h ); + mplayerwindow->setAspect( mset.win_aspect() ); +} + +void Core::gotNoVideo() { + // File has no video (a sound file) + + // Reduce size of window + /* + mset.win_width = mplayerwindow->size().width(); + mset.win_height = 0; + mplayerwindow->setResolution( mset.win_width, mset.win_height ); + emit needResize( mset.win_width, mset.win_height ); + */ + //mplayerwindow->showLogo(TRUE); + emit noVideo(); +} + +void Core::gotVO(QString vo) { + qDebug("Core::gotVO: '%s'", vo.toUtf8().data() ); + + if ( pref->vo.isEmpty()) { + qDebug("saving vo"); + pref->vo = vo; + } +} + +void Core::gotAO(QString ao) { + qDebug("Core::gotAO: '%s'", ao.toUtf8().data() ); + + if ( pref->ao.isEmpty()) { + qDebug("saving ao"); + pref->ao = ao; + } +} + +void Core::streamTitleAndUrlChanged(QString title, QString url) { + mdat.stream_title = title; + mdat.stream_url = url; + emit mediaInfoChanged(); +} + +#include "moc_core.cpp" diff --git a/retroshare-gui/src/apps/smplayer/core.h b/retroshare-gui/src/apps/smplayer/core.h new file mode 100644 index 000000000..f87d3c9c2 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/core.h @@ -0,0 +1,273 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef _CORE_H_ +#define _CORE_H_ + +#include + +#include "mediadata.h" +#include "mediasettings.h" + + +class MplayerProcess; +class MplayerWindow; + +class Core : public QObject +{ + Q_OBJECT + +public: + enum State { Stopped = 0, Playing = 1, Paused = 2 }; + + Core( MplayerWindow *mpw, QWidget* parent = 0 ); + ~Core(); + + MediaData mdat; + MediaSettings mset; + + QString mplayer_log; + + //! Return the current state + State state() { return _state; }; + + //! Return a string with the name of the current state, + //! so it can be printed on debugging messages. + QString stateToString(); + +protected: + //! Change the current state (Stopped, Playing or Paused) + //! And sends the stateChanged() signal. + void setState(State s); + +public slots: + //! Generic open, with autodetection of type + void open(QString file, int seek=-1); + void openFile(QString filename, int seek=-1); + void openStream(QString name); + /* + void openDVD( bool from_folder, QString directory = ""); + void openDVD(); // Plays title 1 + void openDVD(int title = 1); + */ + void openDVD(QString dvd_url); + void openVCD(int title = -1); + void openAudioCD(int title = -1); + + void loadSub(const QString & sub); + void unloadSub(); + + void loadAudioFile(const QString & audiofile); + void unloadAudioFile(); + + void stop(); + void play(); + void play_or_pause(); + void pause_and_frame_step(); + void pause(); + void frameStep(); + void screenshot(); + + //! Public restart, for the GUI. + void restart(); + + void goToPos( int perc ); + /*void goToSec( double sec );*/ + + void toggleRepeat(); + void toggleRepeat(bool b); + + void toggleFlip(); + void toggleFlip(bool b); + + // Audio filters + void toggleKaraoke(); + void toggleKaraoke(bool b); + void toggleExtrastereo(); + void toggleExtrastereo(bool b); + void toggleVolnorm(); + void toggleVolnorm(bool b); + + void setAudioChannels(int channels); + void setStereoMode(int mode); + + // Video filters + void toggleAutophase(); + void toggleAutophase(bool b); + void toggleDeblock(); + void toggleDeblock(bool b); + void toggleDering(); + void toggleDering(bool b); + void toggleNoise(); + void toggleNoise(bool b); + void togglePostprocessing(); + void togglePostprocessing(bool b); + void changeDenoise(int); + + void seek(int secs); + void sforward(); // + 10 seconds + void srewind(); // - 10 seconds + void forward(); // + 1 minute + void rewind(); // -1 minute + void fastforward(); // + 10 minutes + void fastrewind(); // - 10 minutes + void forward(int secs); + void rewind(int secs); + void wheelUp(); + void wheelDown(); + + void setSpeed( double value ); + void incSpeed(); + void decSpeed(); + void doubleSpeed(); + void halveSpeed(); + void normalSpeed(); + + void setVolume(int volume, bool force = false); + void switchMute(); + void mute(bool b); + void incVolume(); + void decVolume(); + + void setBrightness(int value); + void setContrast(int value); + void setGamma(int value); + void setHue(int value); + void setSaturation(int value); + + void incBrightness(); + void decBrightness(); + void incContrast(); + void decContrast(); + void incGamma(); + void decGamma(); + void incHue(); + void decHue(); + void incSaturation(); + void decSaturation(); + + void incSubDelay(); + void decSubDelay(); + + void incAudioDelay(); + void decAudioDelay(); + + void incSubPos(); + void decSubPos(); + + //! Select next line in subtitle file + void incSubStep(); + //! Select previous line in subtitle file + void decSubStep(); + + void changeDeinterlace(int); + void changeSubtitle(int); + void nextSubtitle(); + void changeAudio(int); + void nextAudio(); + void changeTitle(int); + void changeChapter(int); + void prevChapter(); + void nextChapter(); + void changeAngle(int); + void changeAspectRatio(int); + void changeOSD(int); + void nextOSD(); + + void changeSize(int); // Size of the window + void toggleDoubleSize(); + void changePanscan(double); // Zoom on mplayerwindow + + void incPanscan(); + void decPanscan(); + void resetPanscan(); + + void changeUseAss(bool); + + // Pass a command to mplayer by stdin: + void tellmp(const QString & command); + +protected slots: + void changeCurrentSec(double sec); + void changePause(); + void gotWindowResolution( int w, int h ); + void gotNoVideo(); + void gotVO(QString); + void gotAO(QString); + void gotStartingTime(double); + + void finishRestart(); + void processFinished(); + void fileReachedEnd(); + + void updateLog(QString line); + + void displayMessage(QString text); + void displayScreenshotName(QString filename); + + void streamTitleAndUrlChanged(QString,QString); + +protected: + void playNewFile(QString file, int seek=-1); + void restartPlay(); + void initPlaying(int seek=-1); + void newMediaPlaying(); + + void startMplayer(QString file, double seek = -1 ); + void stopMplayer(); + + bool checkHaveSettingsSaved(QString filename); + void saveMediaInfo(); + void loadMediaInfo(QString filename); + + void initializeMenus(); + void updateWidgets(); + +signals: + void aboutToStartPlaying(); // Signal emited just before to start mplayer + void mediaLoaded(); + void mediaInfoChanged(); + void stateChanged(Core::State state); + void mediaStartPlay(); + void mediaFinished(); // Media has arrived to the end. + void mediaStoppedByUser(); + void showMessage(QString text); + void menusNeedInitialize(); + void widgetsNeedUpdate(); + void equalizerNeedsUpdate(); + void showTime(double sec); + void showFrame(int frame); + void needResize(int w, int h); + void mplayerFinishedWithError(int); + void noVideo(); + void volumeChanged(int); + +protected: + MplayerProcess * proc; + MplayerWindow *mplayerwindow; + +private: + // Some variables to proper restart + bool we_are_restarting; + + bool just_loaded_external_subs; + bool just_unloaded_external_subs; + State _state; +}; + +#endif diff --git a/retroshare-gui/src/apps/smplayer/defaultgui.cpp b/retroshare-gui/src/apps/smplayer/defaultgui.cpp new file mode 100644 index 000000000..0e149d52f --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/defaultgui.cpp @@ -0,0 +1,641 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "defaultgui.h" +#include "helper.h" +#include "core.h" +#include "global.h" +#include "timeslider.h" +#include "playlist.h" +#include "mplayerwindow.h" +#include "floatingcontrol.h" +#include "myaction.h" +#include "images.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#if !NEW_CONTROLWIDGET +#include +#endif + + +DefaultGui::DefaultGui( QWidget * parent, Qt::WindowFlags flags ) + : BaseGuiPlus( parent, flags ), + floating_control_width(100) //% +{ + createStatusBar(); + + connect( this, SIGNAL(timeChanged(double, int, QString)), + this, SLOT(displayTime(double, int, QString)) ); + connect( this, SIGNAL(frameChanged(int)), + this, SLOT(displayFrame(int)) ); + + connect( this, SIGNAL(cursorNearBottom(QPoint)), + this, SLOT(showFloatingControl(QPoint)) ); + connect( this, SIGNAL(cursorNearTop(QPoint)), + this, SLOT(showFloatingMenu(QPoint)) ); + connect( this, SIGNAL(cursorFarEdges()), + this, SLOT(hideFloatingControls()) ); + + createMainToolBars(); + createActions(); + createControlWidget(); + createControlWidgetMini(); + createFloatingControl(); + createMenus(); + + retranslateStrings(); + + loadConfig(); + + //if (playlist_visible) showPlaylist(true); + + if (pref->compact_mode) { + controlwidget->hide(); + toolbar1->hide(); + toolbar2->hide(); + } +} + +DefaultGui::~DefaultGui() { + saveConfig(); +} + +/* +void DefaultGui::closeEvent( QCloseEvent * ) { + qDebug("DefaultGui::closeEvent"); + + //BaseGuiPlus::closeEvent(e); + qDebug("w: %d h: %d", width(), height() ); +} +*/ + +void DefaultGui::createActions() { + showMainToolbarAct = new MyAction(Qt::Key_F5, this, "show_main_toolbar" ); + showMainToolbarAct->setCheckable(true); + connect( showMainToolbarAct, SIGNAL(toggled(bool)), + this, SLOT(showMainToolbar(bool)) ); + + showLanguageToolbarAct = new MyAction(Qt::Key_F6, this, "show_language_toolbar" ); + showLanguageToolbarAct->setCheckable(true); + connect( showLanguageToolbarAct, SIGNAL(toggled(bool)), + this, SLOT(showLanguageToolbar(bool)) ); +} + +void DefaultGui::createMenus() { + toolbar_menu = new QMenu(this); + toolbar_menu->addAction(showMainToolbarAct); + toolbar_menu->addAction(showLanguageToolbarAct); + + optionsMenu->addSeparator(); + optionsMenu->addMenu(toolbar_menu); +} + +QMenu * DefaultGui::createPopupMenu() { + QMenu * m = new QMenu(this); + m->addAction(showMainToolbarAct); + m->addAction(showLanguageToolbarAct); + return m; +} + +void DefaultGui::createMainToolBars() { + toolbar1 = new QToolBar( this ); + toolbar1->setObjectName("toolbar1"); + //toolbar1->setMovable(false); + addToolBar(Qt::TopToolBarArea, toolbar1); + + toolbar1->addAction(openFileAct); + toolbar1->addAction(openDVDAct); + toolbar1->addAction(openURLAct); + toolbar1->addSeparator(); + toolbar1->addAction(compactAct); + toolbar1->addAction(fullscreenAct); + toolbar1->addSeparator(); + toolbar1->addAction(screenshotAct); + toolbar1->addSeparator(); + toolbar1->addAction(showPropertiesAct); + toolbar1->addAction(showPlaylistAct); + toolbar1->addAction(showPreferencesAct); + toolbar1->addSeparator(); + toolbar1->addAction(playPrevAct); + toolbar1->addAction(playNextAct); + + toolbar2 = new QToolBar( this ); + toolbar2->setObjectName("toolbar2"); + //toolbar2->setMovable(false); + addToolBar(Qt::TopToolBarArea, toolbar2); + + select_audio = new QPushButton( this ); + select_audio->setMenu( audiotrack_menu ); + toolbar2->addWidget(select_audio); + + select_subtitle = new QPushButton( this ); + select_subtitle->setMenu( subtitlestrack_menu ); + toolbar2->addWidget(select_subtitle); + + /* + toolbar1->show(); + toolbar2->show(); + */ +} + + +void DefaultGui::createControlWidgetMini() { + controlwidget_mini = new QToolBar( this ); + controlwidget_mini->setObjectName("controlwidget_mini"); + //controlwidget_mini->setResizeEnabled(false); + controlwidget_mini->setMovable(false); + //addDockWindow(controlwidget_mini, Qt::DockBottom ); + addToolBar(Qt::BottomToolBarArea, controlwidget_mini); + + controlwidget_mini->addAction(playOrPauseAct); + controlwidget_mini->addAction(stopAct); + controlwidget_mini->addSeparator(); + + controlwidget_mini->addAction(rewind1Act); + + timeslider_mini = new TimeSlider( this ); + connect( timeslider_mini, SIGNAL( posChanged(int) ), + core, SLOT(goToPos(int)) ); + connect( timeslider_mini, SIGNAL( draggingPos(int) ), + this, SLOT(displayGotoTime(int)) ); + //controlwidget_mini->setStretchableWidget( timeslider_mini ); + controlwidget_mini->addWidget(timeslider_mini); + + controlwidget_mini->addAction(forward1Act); + + controlwidget_mini->addSeparator(); + + controlwidget_mini->addAction(muteAct ); + + volumeslider_mini = new MySlider( this ); + volumeslider_mini->setValue(50); + volumeslider_mini->setMinimum(0); + volumeslider_mini->setMaximum(100); + volumeslider_mini->setOrientation( Qt::Horizontal ); + volumeslider_mini->setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ); + volumeslider_mini->setFocusPolicy( Qt::NoFocus ); + volumeslider_mini->setTickPosition( QSlider::TicksBelow ); + volumeslider_mini->setTickInterval( 10 ); + volumeslider_mini->setSingleStep( 1 ); + volumeslider_mini->setPageStep( 10 ); + connect( volumeslider_mini, SIGNAL( valueChanged(int) ), + core, SLOT( setVolume(int) ) ); + connect( core, SIGNAL(volumeChanged(int)), + volumeslider_mini, SLOT(setValue(int)) ); + controlwidget_mini->addWidget(volumeslider_mini); + + controlwidget_mini->hide(); +} + +void DefaultGui::createControlWidget() { + controlwidget = new QToolBar( this ); + controlwidget->setObjectName("controlwidget"); + //controlwidget->setResizeEnabled(false); + controlwidget->setMovable(false); + //addDockWindow(controlwidget, Qt::DockBottom ); + addToolBar(Qt::BottomToolBarArea, controlwidget); + + controlwidget->addAction(playAct); + controlwidget->addAction(pauseAndStepAct); + controlwidget->addAction(stopAct); + + controlwidget->addSeparator(); + + controlwidget->addAction(rewind3Act); + controlwidget->addAction(rewind2Act); + controlwidget->addAction(rewind1Act); + + timeslider = new TimeSlider( this ); + connect( timeslider, SIGNAL( posChanged(int) ), + core, SLOT(goToPos(int)) ); + connect( timeslider, SIGNAL( draggingPos(int) ), + this, SLOT(displayGotoTime(int)) ); + //controlwidget->setStretchableWidget( timeslider ); + controlwidget->addWidget(timeslider); + + controlwidget->addAction(forward1Act); + controlwidget->addAction(forward2Act); + controlwidget->addAction(forward3Act); + + controlwidget->addSeparator(); + + controlwidget->addAction(fullscreenAct); + controlwidget->addAction(muteAct); + + volumeslider = new MySlider( this ); + volumeslider->setMinimum(0); + volumeslider->setMaximum(100); + volumeslider->setValue(50); + volumeslider->setOrientation( Qt::Horizontal ); + volumeslider->setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ); + volumeslider->setFocusPolicy( Qt::NoFocus ); + volumeslider->setTickPosition( QSlider::TicksBelow ); + volumeslider->setTickInterval( 10 ); + volumeslider->setSingleStep( 1 ); + volumeslider->setPageStep( 10 ); + connect( volumeslider, SIGNAL( valueChanged(int) ), + core, SLOT( setVolume(int) ) ); + connect( core, SIGNAL(volumeChanged(int)), + volumeslider, SLOT(setValue(int)) ); + + controlwidget->addWidget(volumeslider); + + /* + controlwidget->show(); + */ +} + +void DefaultGui::createFloatingControl() { + floating_control = new FloatingControl(this); + + connect( floating_control->rewind3, SIGNAL(clicked()), + core, SLOT(fastrewind()) ); + connect( floating_control->rewind2, SIGNAL(clicked()), + core, SLOT(rewind()) ); + connect( floating_control->rewind1, SIGNAL(clicked()), + core, SLOT(srewind()) ); + + connect( floating_control->forward1, SIGNAL(clicked()), + core, SLOT(sforward()) ); + connect( floating_control->forward2, SIGNAL(clicked()), + core, SLOT(forward()) ); + connect( floating_control->forward3, SIGNAL(clicked()), + core, SLOT(fastforward()) ); + + connect( floating_control->play, SIGNAL(clicked()), + core, SLOT(play()) ); + connect( floating_control->pause, SIGNAL(clicked()), + core, SLOT(pause_and_frame_step()) ); + connect( floating_control->stop, SIGNAL(clicked()), + core, SLOT(stop()) ); + + connect( floating_control->mute, SIGNAL(toggled(bool)), + core, SLOT(mute(bool)) ); + + connect( floating_control->fullscreen, SIGNAL(toggled(bool)), + this, SLOT(toggleFullscreen(bool)) ); + + connect( floating_control->volume, SIGNAL( valueChanged(int) ), + core, SLOT( setVolume(int) ) ); + connect( core, SIGNAL(volumeChanged(int)), + floating_control->volume, SLOT(setValue(int)) ); + + connect( floating_control->time, SIGNAL( posChanged(int) ), + core, SLOT(goToPos(int)) ); + connect( floating_control->time, SIGNAL( draggingPos(int) ), + this, SLOT(displayGotoTime(int)) ); +} + +void DefaultGui::createStatusBar() { + qDebug("DefaultGui::createStatusBar"); + + time_display = new QLabel( statusBar() ); + time_display->setAlignment(Qt::AlignRight); + time_display->setFrameShape(QFrame::NoFrame); + time_display->setText(" 88:88:88 / 88:88:88 "); + time_display->setMinimumSize(time_display->sizeHint()); + + frame_display = new QLabel( statusBar() ); + frame_display->setAlignment(Qt::AlignRight); + frame_display->setFrameShape(QFrame::NoFrame); + frame_display->setText("88888888"); + frame_display->setMinimumSize(frame_display->sizeHint()); + + statusBar()->setAutoFillBackground(TRUE); + + Helper::setBackgroundColor( statusBar(), QColor(0,0,0) ); + Helper::setForegroundColor( statusBar(), QColor(255,255,255) ); + Helper::setBackgroundColor( time_display, QColor(0,0,0) ); + Helper::setForegroundColor( time_display, QColor(255,255,255) ); + Helper::setBackgroundColor( frame_display, QColor(0,0,0) ); + Helper::setForegroundColor( frame_display, QColor(255,255,255) ); + statusBar()->setSizeGripEnabled(FALSE); + + statusBar()->showMessage( tr("Welcome to SMPlayer") ); + statusBar()->addPermanentWidget( frame_display, 0 ); + frame_display->setText( "0" ); + + statusBar()->addPermanentWidget( time_display, 0 ); + time_display->setText(" 00:00:00 / 00:00:00 "); + + time_display->show(); + frame_display->hide(); +} + +void DefaultGui::retranslateStrings() { + BaseGuiPlus::retranslateStrings(); + + showMainToolbarAct->change( Images::icon("main_toolbar"), tr("&Main toolbar") ); + showLanguageToolbarAct->change( Images::icon("lang_toolbar"), tr("&Language toolbar") ); + + toolbar_menu->menuAction()->setText( tr("&Toolbars") ); + toolbar_menu->menuAction()->setIcon( Images::icon("toolbars") ); + + volumeslider->setToolTip( tr("Volume") ); + volumeslider_mini->setToolTip( tr("Volume") ); + + select_audio->setText( tr("Audio") ); + select_subtitle->setText( tr("Subtitle") ); +} + + +void DefaultGui::displayTime(double sec, int perc, QString text) { + time_display->setText( text ); + timeslider->setPos(perc); + timeslider_mini->setPos(perc); + + //if (floating_control->isVisible()) { + floating_control->time->setPos(perc); +#if NEW_CONTROLWIDGET + //floating_control->time_label->setText( Helper::formatTime((int)sec) ); + floating_control->time_label->setText( text ); +#else + floating_control->lcd->display( Helper::formatTime((int)sec) ); +#endif + //} +} + +void DefaultGui::displayFrame(int frame) { + if (frame_display->isVisible()) { + frame_display->setNum( frame ); + } +} + +void DefaultGui::updateWidgets() { + qDebug("DefaultGui::updateWidgets"); + + BaseGuiPlus::updateWidgets(); + + // Frame counter + frame_display->setVisible( pref->show_frame_counter ); + + floating_control->fullscreen->setChecked(pref->fullscreen); + floating_control->mute->setChecked(core->mset.mute); + + /* + showMainToolbarAct->setOn( show_main_toolbar ); + showLanguageToolbarAct->setOn( show_language_toolbar ); + */ + + panel->setFocus(); +} + +void DefaultGui::aboutToEnterFullscreen() { + qDebug("DefaultGui::aboutToEnterFullscreen"); + + BaseGuiPlus::aboutToEnterFullscreen(); + + if (!pref->compact_mode) { + //menuBar()->hide(); + //statusBar()->hide(); + controlwidget->hide(); + controlwidget_mini->hide(); + toolbar1->hide(); + toolbar2->hide(); + } +} + +void DefaultGui::aboutToExitFullscreen() { + qDebug("DefaultGui::aboutToExitFullscreen"); + + BaseGuiPlus::aboutToExitFullscreen(); + + floating_control->hide(); + + if (!pref->compact_mode) { + //menuBar()->show(); + //statusBar()->show(); + controlwidget->show(); + + showMainToolbar( show_main_toolbar ); + showLanguageToolbar( show_language_toolbar ); + } +} + +void DefaultGui::aboutToEnterCompactMode() { + BaseGuiPlus::aboutToEnterCompactMode(); + + //menuBar()->hide(); + //statusBar()->hide(); + controlwidget->hide(); + controlwidget_mini->hide(); + toolbar1->hide(); + toolbar2->hide(); +} + +void DefaultGui::aboutToExitCompactMode() { + BaseGuiPlus::aboutToExitCompactMode(); + + //menuBar()->show(); + //statusBar()->show(); + controlwidget->show(); + + showMainToolbar( show_main_toolbar ); + showLanguageToolbar( show_language_toolbar ); + + // Recheck size of controlwidget + resizeEvent( new QResizeEvent( size(), size() ) ); +} + +void DefaultGui::showFloatingControl(QPoint /*p*/) { + qDebug("DefaultGui::showFloatingControl"); + +#if CONTROLWIDGET_OVER_VIDEO + //int w = mplayerwindow->width() / 2; + int w = mplayerwindow->width() * floating_control_width / 100; + int h = floating_control->height(); + floating_control->resize( w, h ); + + //int x = ( mplayerwindow->width() - floating_control->width() ) / 2; + //int y = mplayerwindow->height() - floating_control->height(); + + int x = ( panel->x() + panel->width() - floating_control->width() ) / 2; + int y = panel->y() + panel->height() - floating_control->height(); + floating_control->move( mapToGlobal(QPoint(x, y)) ); + + floating_control->show(); +#else + if (!controlwidget->isVisible()) { + controlwidget->show(); + } +#endif +} + +void DefaultGui::showFloatingMenu(QPoint /*p*/) { +#if !CONTROLWIDGET_OVER_VIDEO + qDebug("DefaultGui::showFloatingMenu"); + + if (!menuBar()->isVisible()) + menuBar()->show(); +#endif +} + +void DefaultGui::hideFloatingControls() { + qDebug("DefaultGui::hideFloatingControls"); + +#if CONTROLWIDGET_OVER_VIDEO + floating_control->hide(); +#else + if (controlwidget->isVisible()) + controlwidget->hide(); + + if (menuBar()->isVisible()) + menuBar()->hide(); +#endif +} + +void DefaultGui::resizeEvent( QResizeEvent * ) { + /* + qDebug("defaultGui::resizeEvent"); + qDebug(" controlwidget width: %d", controlwidget->width() ); + qDebug(" controlwidget_mini width: %d", controlwidget_mini->width() ); + */ + +#if QT_VERSION < 0x040000 +#define LIMIT 470 +#else +#define LIMIT 570 +#endif + + if ( (controlwidget->isVisible()) && (width() < LIMIT) ) { + controlwidget->hide(); + controlwidget_mini->show(); + } + else + if ( (controlwidget_mini->isVisible()) && (width() > LIMIT) ) { + controlwidget_mini->hide(); + controlwidget->show(); + } +} + +void DefaultGui::showMainToolbar(bool b) { + qDebug("DefaultGui::showMainToolBar: %d", b); + + show_main_toolbar = b; + if (b) { + toolbar1->show(); + } + else { + toolbar1->hide(); + } +} + +void DefaultGui::showLanguageToolbar(bool b) { + qDebug("DefaultGui::showLanguageToolBar: %d", b); + + show_language_toolbar = b; + if (b) { + toolbar2->show(); + } + else { + toolbar2->hide(); + } +} + +void DefaultGui::saveConfig() { + qDebug("DefaultGui::saveConfig"); + + QSettings * set = settings; + + set->beginGroup( "default_gui"); + + /* + QString str; + QTextOStream out(&str); + out << *this; + set->writeEntry( "data", str); + */ + + set->setValue( "show_main_toolbar", show_main_toolbar ); + set->setValue( "show_language_toolbar", show_language_toolbar ); + set->setValue( "floating_control_width", floating_control_width ); + + if (pref->save_window_size_on_exit) { + qDebug("DefaultGui::saveConfig: w: %d h: %d", width(), height()); + set->setValue( "x", x() ); + set->setValue( "y", y() ); + set->setValue( "width", width() ); + set->setValue( "height", height() ); + } + + set->setValue( "toolbars_state", saveState() ); + + set->endGroup(); +} + +void DefaultGui::loadConfig() { + qDebug("DefaultGui::loadConfig"); + + QSettings * set = settings; + + set->beginGroup( "default_gui"); + + /* + QString str = set->readEntry("data"); + QTextIStream in(&str); + in >> *this; + */ + + show_main_toolbar = set->value( "show_main_toolbar", true ).toBool(); + show_language_toolbar = set->value( "show_language_toolbar", true ).toBool(); + floating_control_width = set->value( "floating_control_width", floating_control_width ).toInt(); + + if (pref->save_window_size_on_exit) { + int x = set->value( "x", this->x() ).toInt(); + int y = set->value( "y", this->y() ).toInt(); + int width = set->value( "width", this->width() ).toInt(); + int height = set->value( "height", this->height() ).toInt(); + + if (height < 200) { + width = 580; + height = 440; + } + + move(x,y); + resize(width,height); + } + + restoreState( set->value( "toolbars_state" ).toByteArray() ); + + set->endGroup(); + + showMainToolbarAct->setChecked( show_main_toolbar ); + showLanguageToolbarAct->setChecked( show_language_toolbar ); + + showMainToolbar( show_main_toolbar ); + showLanguageToolbar( show_language_toolbar ); + + updateWidgets(); +} + +void DefaultGui::closeEvent (QCloseEvent * event) +{ + hide(); + event->ignore(); +} + + +#include "moc_defaultgui.cpp" diff --git a/retroshare-gui/src/apps/smplayer/defaultgui.h b/retroshare-gui/src/apps/smplayer/defaultgui.h new file mode 100644 index 000000000..4ef087245 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/defaultgui.h @@ -0,0 +1,117 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef _DEFAULTGUI_H_ +#define _DEFAULTGUI_H_ + +#include "config.h" +#include "baseguiplus.h" +#include + +class QLabel; +class QToolBar; +class TimeSlider; +class MySlider; +class QPushButton; +class QResizeEvent; +class FloatingControl; +class MyAction; +class QMenu; + +class DefaultGui : public BaseGuiPlus +{ + Q_OBJECT + +public: + DefaultGui( QWidget* parent = 0, Qt::WindowFlags flags = 0 ); + ~DefaultGui(); + +public slots: + //virtual void showPlaylist(bool b); + virtual void showMainToolbar(bool b); + virtual void showLanguageToolbar(bool b); + +protected: + void closeEvent (QCloseEvent * event); + virtual void retranslateStrings(); + virtual QMenu * createPopupMenu(); + + void createStatusBar(); + void createMainToolBars(); + void createControlWidget(); + void createControlWidgetMini(); + void createFloatingControl(); + void createActions(); + void createMenus(); + + void loadConfig(); + void saveConfig(); + + virtual void aboutToEnterFullscreen(); + virtual void aboutToExitFullscreen(); + virtual void aboutToEnterCompactMode(); + virtual void aboutToExitCompactMode(); + + virtual void resizeEvent( QResizeEvent * ); + /* virtual void closeEvent( QCloseEvent * ); */ + +protected slots: + virtual void updateWidgets(); + virtual void displayTime(double sec, int perc, QString text); + virtual void displayFrame(int frame); + + virtual void showFloatingControl(QPoint p); + virtual void showFloatingMenu(QPoint p); + virtual void hideFloatingControls(); + +protected: + QLabel * time_display; + QLabel * frame_display; + + QToolBar * controlwidget; + QToolBar * controlwidget_mini; + + QToolBar * toolbar1; + QToolBar * toolbar2; + + QPushButton * select_audio; + QPushButton * select_subtitle; + + TimeSlider * timeslider; + TimeSlider * timeslider_mini; + + MySlider * volumeslider; + MySlider * volumeslider_mini; + + FloatingControl * floating_control; + + MyAction * showMainToolbarAct; + MyAction * showLanguageToolbarAct; + + QMenu * toolbar_menu; + + int last_second; + + // Properties to save + bool show_main_toolbar; + bool show_language_toolbar; + + int floating_control_width; // Percentage of screen +}; + +#endif diff --git a/retroshare-gui/src/apps/smplayer/desktopinfo.cpp b/retroshare-gui/src/apps/smplayer/desktopinfo.cpp new file mode 100644 index 000000000..a05e48ed8 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/desktopinfo.cpp @@ -0,0 +1,42 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "desktopinfo.h" +#include +#include + +QSize DesktopInfo::desktop_size(QWidget *w) { + QDesktopWidget * dw = QApplication::desktop(); + qDebug("DesktopInfo::desktop_size: primary screen: %d", dw->primaryScreen()); + + QSize s = dw->screen( dw->primaryScreen() )->size(); + + qDebug("DesktopInfo::desktop_size: size of primary screen: %d x %d", s.width(), s.height() ); + //return dw->screen( dw->primaryScreen() )->size(); + + QRect r = dw->screenGeometry(w); + qDebug("DesktopInfo::desktop_size: size of screen: %d x %d", r.width(), r.height() ); + + return QSize(r.width(), r.height() ); +} + +double DesktopInfo::desktop_aspectRatio(QWidget *w) { + QSize s = DesktopInfo::desktop_size(w); + return (double) s.width() / s.height() ; +} + diff --git a/retroshare-gui/src/apps/smplayer/desktopinfo.h b/retroshare-gui/src/apps/smplayer/desktopinfo.h new file mode 100644 index 000000000..15248f28e --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/desktopinfo.h @@ -0,0 +1,34 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + + +#ifndef _DESKTOPINFO_H_ +#define _DESKTOPINFO_H_ + +#include + +class QWidget; + +class DesktopInfo +{ +public: + static QSize desktop_size(QWidget *w); + static double desktop_aspectRatio(QWidget *w); +}; + +#endif diff --git a/retroshare-gui/src/apps/smplayer/encodings.cpp b/retroshare-gui/src/apps/smplayer/encodings.cpp new file mode 100644 index 000000000..38089dbb2 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/encodings.cpp @@ -0,0 +1,75 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "encodings.h" +#include + +Encodings::Encodings( QObject * parent ) : QObject(parent) +{ + retranslate(); +} + +void Encodings::retranslate() { + l.clear(); + l.append( "Unicode" ); + l.append( "UTF-8" ); + l.append( tr("Western European Languages") + " (ISO-8859-1)"); + l.append( tr("Western European Languages with Euro") + " (ISO-8859-15)"); + l.append( tr("Slavic/Central European Languages") + " (ISO-8859-2)"); + l.append( tr("Esperanto, Galician, Maltese, Turkish") + " (ISO-8859-3)"); + l.append( tr("Old Baltic charset") + " (ISO-8859-4)"); + l.append( tr("Cyrillic") + " (ISO-8859-5)"); + l.append( tr("Arabic") + " (ISO-8859-6)"); + l.append( tr("Modern Greek") + " (ISO-8859-7)"); + l.append( tr( "Turkish") + " (ISO-8859-9)"); + l.append( tr( "Baltic") + " (ISO-8859-13)"); + l.append( tr( "Celtic") + " (ISO-8859-14)"); + l.append( tr( "Hebrew charsets") + " (ISO-8859-8)"); + l.append( tr( "Russian") + " (KOI8-R)"); + l.append( tr( "Ukrainian, Belarusian") + " (KOI8-U/RU)"); + l.append( tr( "Simplified Chinese charset") + " (CP936)"); + l.append( tr( "Traditional Chinese charset") + " (BIG5)"); + l.append( tr( "Japanese charsets") + " (SHIFT-JIS)"); + l.append( tr( "Korean charset") + " (CP949)"); + l.append( tr( "Thai charset") + " (CP874)"); + l.append( tr( "Cyrillic Windows") + " (CP1251)"); + l.append( tr( "Slavic/Central European Windows") + " (CP1250)"); + l.append( tr( "Arabic Windows") + " (CP1256)"); +} + +Encodings::~Encodings() { +} + +QString Encodings::parseEncoding(QString item) { + QRegExp s(".* \\((.*)\\)"); + if (s.indexIn(item) != -1 ) + return s.cap(1); + else + return item; +} + +int Encodings::findEncoding(QString encoding) { + int n; + for (n=0; n < l.count(); n++) { + if (l[n].contains("(" + encoding + ")") > 0) + return n; + } + return -1; +} + +#include "moc_encodings.cpp" diff --git a/retroshare-gui/src/apps/smplayer/encodings.h b/retroshare-gui/src/apps/smplayer/encodings.h new file mode 100644 index 000000000..098a112b0 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/encodings.h @@ -0,0 +1,43 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef _ENCODINGS_H_ +#define _ENCODINGS_H_ + +#include +#include + +class Encodings : public QObject +{ + Q_OBJECT + +public: + Encodings( QObject * parent = 0 ); + ~Encodings(); + + QStringList list() { return l;} ; + QString parseEncoding(QString item); + int findEncoding(QString encoding); + + void retranslate(); + +private: + QStringList l; +}; + +#endif diff --git a/retroshare-gui/src/apps/smplayer/eqslider.cpp b/retroshare-gui/src/apps/smplayer/eqslider.cpp new file mode 100644 index 000000000..26ada7565 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/eqslider.cpp @@ -0,0 +1,78 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "eqslider.h" +#include +#include +#include +#include "verticaltext.h" + + +EqSlider::EqSlider( QWidget* parent, Qt::WindowFlags f) + : QWidget(parent, f) +{ + setupUi(this); + + _icon->setText( QString::null ); + _slider->setFocusPolicy( Qt::StrongFocus ); + _slider->setTickPosition( QSlider::TicksRight ); + _slider->setTickInterval( 10 ); + _slider->setSingleStep( 1 ); + _slider->setPageStep( 10 ); + + connect( _slider, SIGNAL(valueChanged(int)), + this, SLOT(sliderValueChanged(int)) ); +} + +EqSlider::~EqSlider() { +} + +/* +void EqSlider::languageChange() { +} +*/ + +void EqSlider::setIcon( QPixmap i) { + _icon->setPixmap(i); +} + +const QPixmap * EqSlider::icon() const { + return _icon->pixmap(); +} + +void EqSlider::setLabel( QString s) { + _label->setText(s); +} + +QString EqSlider::label() const { + return _label->text(); +} + +void EqSlider::setValue(int value) { + _slider->setValue(value); +} + +int EqSlider::value() const { + return _slider->value(); +} + +void EqSlider::sliderValueChanged(int v) { + emit valueChanged( v ); +} + +#include "moc_eqslider.cpp" diff --git a/retroshare-gui/src/apps/smplayer/eqslider.h b/retroshare-gui/src/apps/smplayer/eqslider.h new file mode 100644 index 000000000..5a22bc72a --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/eqslider.h @@ -0,0 +1,58 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + + +#ifndef _EQSLIDER_H_ +#define _EQSLIDER_H_ + +#include "ui_eqslider.h" +#include + +class EqSlider : public QWidget, public Ui::EqSlider +{ + Q_OBJECT + Q_PROPERTY(QPixmap icon READ icon WRITE setIcon) + Q_PROPERTY(QString label READ label WRITE setLabel) + Q_PROPERTY(int value READ value WRITE setValue) + +public: + EqSlider( QWidget* parent = 0, Qt::WindowFlags f = 0 ); + ~EqSlider(); + +public slots: + void setIcon( QPixmap i); + void setLabel( QString s); + void setValue(int value); + +public: + int value() const; + const QPixmap * icon() const; + QString label() const; + +signals: + void valueChanged(int); + +protected slots: + void sliderValueChanged(int); + +protected: + /* virtual void languageChange(); */ + +}; + +#endif diff --git a/retroshare-gui/src/apps/smplayer/eqslider.ui b/retroshare-gui/src/apps/smplayer/eqslider.ui new file mode 100644 index 000000000..e82cdf028 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/eqslider.ui @@ -0,0 +1,85 @@ + + EqSlider + + + + 0 + 0 + 124 + 205 + + + + + + + + 0 + + + 0 + + + + + icon + + + Qt::AlignCenter + + + false + + + + + + + 0 + + + 0 + + + + + + 1 + 1 + 0 + 0 + + + + + + + + -100 + + + 100 + + + Qt::Vertical + + + + + + + + + + + VerticalText + QWidget +
    verticaltext.h
    +
    +
    + + verticaltext.h + + + +
    diff --git a/retroshare-gui/src/apps/smplayer/filedialog.cpp b/retroshare-gui/src/apps/smplayer/filedialog.cpp new file mode 100644 index 000000000..69c809ab2 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/filedialog.cpp @@ -0,0 +1,60 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "filedialog.h" +#include + +QString MyFileDialog::getOpenFileName( QWidget * parent, + const QString & caption, + const QString & dir, const QString & filter, + QString * selectedFilter, QFileDialog::Options options ) +{ + return QFileDialog::getOpenFileName( parent, caption, dir, filter, + selectedFilter, options ); +} + +QString MyFileDialog::getExistingDirectory ( QWidget * parent, + const QString & caption, + const QString & dir, + QFileDialog::Options options ) +{ + return QFileDialog::getExistingDirectory( parent, caption, dir, options ); +} + +QString MyFileDialog::getSaveFileName ( QWidget * parent, + const QString & caption, + const QString & dir, + const QString & filter, + QString * selectedFilter, + QFileDialog::Options options ) +{ + return QFileDialog::getSaveFileName( parent, caption, dir, filter, + selectedFilter, options ); +} + +QStringList MyFileDialog::getOpenFileNames ( QWidget * parent, + const QString & caption, + const QString & dir, + const QString & filter, + QString * selectedFilter, + QFileDialog::Options options ) +{ + return QFileDialog::getOpenFileNames( parent, caption, dir, filter, + selectedFilter, options ); +} + diff --git a/retroshare-gui/src/apps/smplayer/filedialog.h b/retroshare-gui/src/apps/smplayer/filedialog.h new file mode 100644 index 000000000..6b2ce595d --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/filedialog.h @@ -0,0 +1,61 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef _FILEDIALOG_H +#define _FILEDIALOG_H + +#include +#include +#include + +class QWidget; + +class MyFileDialog { + +public: + static QString getOpenFileName( QWidget * parent = 0, + const QString & caption = QString(), + const QString & dir = QString(), + const QString & filter = QString(), + QString * selectedFilter = 0, + QFileDialog::Options options = QFileDialog::DontResolveSymlinks ) ; + + static QString getExistingDirectory ( QWidget * parent = 0, + const QString & caption = QString(), + const QString & dir = QString(), + QFileDialog::Options options = QFileDialog::ShowDirsOnly ); + + static QString getSaveFileName ( QWidget * parent = 0, + const QString & caption = QString(), + const QString & dir = QString(), + const QString & filter = QString(), + QString * selectedFilter = 0, + QFileDialog::Options options = QFileDialog::DontResolveSymlinks | + QFileDialog::DontConfirmOverwrite ); + + static QStringList getOpenFileNames ( QWidget * parent = 0, + const QString & caption = QString(), + const QString & dir = QString(), + const QString & filter = QString(), + QString * selectedFilter = 0, + QFileDialog::Options options = QFileDialog::DontResolveSymlinks ); + +}; + +#endif + diff --git a/retroshare-gui/src/apps/smplayer/filepropertiesdialog.cpp b/retroshare-gui/src/apps/smplayer/filepropertiesdialog.cpp new file mode 100644 index 000000000..7280bc322 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/filepropertiesdialog.cpp @@ -0,0 +1,225 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "filepropertiesdialog.h" +#include +#include +#include +#include +#include "images.h" +#include "infofile.h" + + +FilePropertiesDialog::FilePropertiesDialog( QWidget* parent, Qt::WindowFlags f ) + : QDialog(parent, f) +{ + setupUi(this); + + // Setup buttons + okButton = buttonBox->button(QDialogButtonBox::Ok); + cancelButton = buttonBox->button(QDialogButtonBox::Cancel); + applyButton = buttonBox->button(QDialogButtonBox::Apply); + connect( applyButton, SIGNAL(clicked()), this, SLOT(apply()) ); + + codecs_set = FALSE; + + // Read codec info from InfoReader: + InfoReader *i = InfoReader::obj(); + setCodecs( i->vcList(), i->acList(), i->demuxerList() ); + + retranslateStrings(); +} + +FilePropertiesDialog::~FilePropertiesDialog() { +} + +void FilePropertiesDialog::setMediaData(MediaData md) { + media_data = md; + showInfo(); +} + +void FilePropertiesDialog::showInfo() { + InfoFile info; + info_edit->setText( info.getInfo(media_data) ); +} + +void FilePropertiesDialog::retranslateStrings() { + retranslateUi(this); + + setWindowIcon( Images::icon("logo") ); + + showInfo(); + + // Qt 4.2 doesn't update the buttons' text +#if QT_VERSION < 0x040300 + okButton->setText( tr("OK") ); + cancelButton->setText( tr("Cancel") ); + applyButton->setText( tr("Apply") ); +#endif + +} + +void FilePropertiesDialog::accept() { + qDebug("FilePropertiesDialog::accept"); + + hide(); + setResult( QDialog::Accepted ); + emit applied(); +} + +void FilePropertiesDialog::apply() { + qDebug("FilePropertiesDialog::apply"); + + setResult( QDialog::Accepted ); + emit applied(); +} + +void FilePropertiesDialog::setCodecs(InfoList vc, InfoList ac, InfoList demuxer) +{ + vclist = vc; + aclist = ac; + demuxerlist = demuxer; + + InfoList::iterator it; + + for ( it = vclist.begin(); it != vclist.end(); ++it ) { + vc_listbox->addItem( (*it).name() +" - "+ (*it).desc() ); + } + + for ( it = aclist.begin(); it != aclist.end(); ++it ) { + ac_listbox->addItem( (*it).name() +" - "+ (*it).desc() ); + } + + for ( it = demuxerlist.begin(); it != demuxerlist.end(); ++it ) { + demuxer_listbox->addItem( (*it).name() +" - "+ (*it).desc() ); + } + + codecs_set = TRUE; +} + +void FilePropertiesDialog::setDemuxer(QString demuxer, QString original_demuxer) { + qDebug("FilePropertiesDialog::setDemuxer"); + if (!original_demuxer.isEmpty()) orig_demuxer = original_demuxer; + int pos = find(demuxer, demuxerlist ); + if (pos != -1) demuxer_listbox->setCurrentRow(pos); + + qDebug(" * demuxer: '%s', pos: %d", demuxer.toUtf8().data(), pos ); +} + +QString FilePropertiesDialog::demuxer() { + int pos = demuxer_listbox->currentRow(); + if ( pos < 0 ) + return ""; + else + return demuxerlist[pos].name(); +} + +void FilePropertiesDialog::setVideoCodec(QString vc, QString original_vc) { + qDebug("FilePropertiesDialog::setVideoCodec"); + if (!original_vc.isEmpty()) orig_vc = original_vc; + int pos = find(vc, vclist ); + if (pos != -1) vc_listbox->setCurrentRow(pos); + + qDebug(" * vc: '%s', pos: %d", vc.toUtf8().data(), pos ); +} + +QString FilePropertiesDialog::videoCodec() { + int pos = vc_listbox->currentRow(); + if ( pos < 0 ) + return ""; + else + return vclist[pos].name(); +} + +void FilePropertiesDialog::setAudioCodec(QString ac, QString original_ac) { + qDebug("FilePropertiesDialog::setAudioCodec"); + if (!original_ac.isEmpty()) orig_ac = original_ac; + int pos = find(ac, aclist ); + if (pos != -1) ac_listbox->setCurrentRow(pos); + + qDebug(" * ac: '%s', pos: %d", ac.toUtf8().data(), pos ); +} + +QString FilePropertiesDialog::audioCodec() { + int pos = ac_listbox->currentRow(); + if ( pos < 0 ) + return ""; + else + return aclist[pos].name(); +} + +void FilePropertiesDialog::on_resetDemuxerButton_clicked() { + setDemuxer( orig_demuxer ); +} + +void FilePropertiesDialog::on_resetACButton_clicked() { + setAudioCodec( orig_ac ); +} + +void FilePropertiesDialog::on_resetVCButton_clicked() { + setVideoCodec( orig_vc ); +} + +int FilePropertiesDialog::find(QString s, InfoList &list) { + qDebug("FilePropertiesDialog::find"); + + int n=0; + InfoList::iterator it; + + for ( it = list.begin(); it != list.end(); ++it ) { + //qDebug(" * item: '%s', s: '%s'", (*it).name().toUtf8().data(), s.toUtf8().data()); + if ((*it).name() == s) return n; + n++; + } + return -1; +} + +void FilePropertiesDialog::setMplayerAdditionalArguments(QString args) { + mplayer_args_edit->setText(args); +} + +QString FilePropertiesDialog::mplayerAdditionalArguments() { + return mplayer_args_edit->text(); +} + +void FilePropertiesDialog::setMplayerAdditionalVideoFilters(QString s) { + mplayer_vfilters_edit->setText(s); +} + +QString FilePropertiesDialog::mplayerAdditionalVideoFilters() { + return mplayer_vfilters_edit->text(); +} + +void FilePropertiesDialog::setMplayerAdditionalAudioFilters(QString s) { + mplayer_afilters_edit->setText(s); +} + +QString FilePropertiesDialog::mplayerAdditionalAudioFilters() { + return mplayer_afilters_edit->text(); +} + +// Language change stuff +void FilePropertiesDialog::changeEvent(QEvent *e) { + if (e->type() == QEvent::LanguageChange) { + retranslateStrings(); + } else { + QWidget::changeEvent(e); + } +} + +#include "moc_filepropertiesdialog.cpp" diff --git a/retroshare-gui/src/apps/smplayer/filepropertiesdialog.h b/retroshare-gui/src/apps/smplayer/filepropertiesdialog.h new file mode 100644 index 000000000..0e8d25025 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/filepropertiesdialog.h @@ -0,0 +1,91 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef _FILEPROPERTIESDIALOG_H_ +#define _FILEPROPERTIESDIALOG_H_ + +#include "ui_filepropertiesdialog.h" +#include "inforeader.h" +#include "mediadata.h" + +class QPushButton; + +class FilePropertiesDialog : public QDialog, public Ui::FilePropertiesDialog +{ + Q_OBJECT + +public: + FilePropertiesDialog( QWidget* parent = 0, Qt::WindowFlags f = 0 ); + ~FilePropertiesDialog(); + + void setMediaData(MediaData md); + + void setDemuxer(QString demuxer, QString original_demuxer=""); + QString demuxer(); + + void setVideoCodec(QString vc, QString original_vc=""); + QString videoCodec(); + + void setAudioCodec(QString ac, QString original_ac=""); + QString audioCodec(); + + void setMplayerAdditionalArguments(QString args); + QString mplayerAdditionalArguments(); + + void setMplayerAdditionalVideoFilters(QString s); + QString mplayerAdditionalVideoFilters(); + + void setMplayerAdditionalAudioFilters(QString s); + QString mplayerAdditionalAudioFilters(); + +public slots: + void accept(); // Reimplemented to send a signal + void apply(); + +signals: + void applied(); + +protected slots: + virtual void on_resetDemuxerButton_clicked(); + virtual void on_resetACButton_clicked(); + virtual void on_resetVCButton_clicked(); + +protected: + // Call it as soon as possible + void setCodecs(InfoList vc, InfoList ac, InfoList demuxer); + bool hasCodecsList() { return codecs_set; }; + + int find(QString s, InfoList &list); + void showInfo(); + +protected: + virtual void retranslateStrings(); + virtual void changeEvent ( QEvent * event ) ; + +private: + bool codecs_set; + InfoList vclist, aclist, demuxerlist; + QString orig_demuxer, orig_ac, orig_vc; + MediaData media_data; + + QPushButton * okButton; + QPushButton * cancelButton; + QPushButton * applyButton; +}; + +#endif diff --git a/retroshare-gui/src/apps/smplayer/filepropertiesdialog.ui b/retroshare-gui/src/apps/smplayer/filepropertiesdialog.ui new file mode 100644 index 000000000..7ecf1cc5c --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/filepropertiesdialog.ui @@ -0,0 +1,502 @@ + + Ricardo Villalba + FilePropertiesDialog + + + + 0 + 0 + 502 + 455 + + + + SMPlayer - File properties + + + + + + true + + + + 9 + + + 6 + + + + + 0 + + + + &Information + + + + 6 + + + 6 + + + + + true + + + + + + + + &Demuxer + + + + 6 + + + 6 + + + + + &Select the demuxer that will be used for this file: + + + false + + + demuxer_listbox + + + + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 241 + 41 + + + + + + + + &Reset + + + + + + + + + + &Video codec + + + + 6 + + + 6 + + + + + &Select the video codec: + + + false + + + vc_listbox + + + + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 241 + 41 + + + + + + + + &Reset + + + + + + + + + + A&udio codec + + + + 6 + + + 6 + + + + + &Select the audio codec: + + + false + + + ac_listbox + + + + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 241 + 41 + + + + + + + + &Reset + + + + + + + + + + &MPlayer options + + + + 9 + + + 6 + + + + + Additional Options for MPlayer + + + + 9 + + + 6 + + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + + + Qt::AlignVCenter + + + false + + + + + + + 0 + + + 6 + + + + + &Options: + + + false + + + mplayer_args_edit + + + + + + + + + + + + + 7 + 0 + 0 + 0 + + + + QFrame::HLine + + + QFrame::Sunken + + + Qt::Horizontal + + + + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + + + Qt::AlignVCenter + + + false + + + + + + + 0 + + + 6 + + + + + V&ideo filters: + + + false + + + mplayer_vfilters_edit + + + + + + + + + + + + + 7 + 0 + 0 + 0 + + + + QFrame::HLine + + + QFrame::Sunken + + + Qt::Horizontal + + + + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + + + Qt::AlignVCenter + + + false + + + + + + + 0 + + + 6 + + + + + Audio &filters: + + + false + + + mplayer_afilters_edit + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok + + + + + + + qPixmapFromMimeSource + + tabWidget + resetDemuxerButton + resetVCButton + resetACButton + + + + + buttonBox + accepted() + FilePropertiesDialog + accept() + + + 267 + 468 + + + 267 + 246 + + + + + buttonBox + rejected() + FilePropertiesDialog + reject() + + + 267 + 468 + + + 267 + 246 + + + + + diff --git a/retroshare-gui/src/apps/smplayer/floatingcontrol.cpp b/retroshare-gui/src/apps/smplayer/floatingcontrol.cpp new file mode 100644 index 000000000..1a6f772d6 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/floatingcontrol.cpp @@ -0,0 +1,247 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "floatingcontrol.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "timeslider.h" +#include "images.h" +#include "helper.h" + + +class MyToolButton : public QToolButton { +public: + MyToolButton ( QWidget * parent ); +}; + +MyToolButton::MyToolButton( QWidget * parent ) : QToolButton(parent) +{ + setAutoRaise(true); + setIconSize( QSize(32,32) ); +} + + +FloatingControl::FloatingControl( QWidget * parent ) + : QWidget( parent, Qt::Window | Qt::FramelessWindowHint | + Qt::WindowStaysOnTopHint | + Qt::X11BypassWindowManagerHint ) +{ + play = new MyToolButton(this); + pause = new MyToolButton(this); + stop = new MyToolButton(this); + + rewind3 = new MyToolButton(this); + rewind2 = new MyToolButton(this); + rewind1 = new MyToolButton(this); + + time = new TimeSlider(this); + + forward1 = new MyToolButton(this); + forward2 = new MyToolButton(this); + forward3 = new MyToolButton(this); + +#if NEW_CONTROLWIDGET + time_label = new QLabel(this); + time_label->setAlignment(Qt::AlignVCenter | Qt::AlignHCenter); + time_label->setAutoFillBackground(TRUE); + + Helper::setBackgroundColor( time_label, QColor(0,0,0) ); + Helper::setForegroundColor( time_label, QColor(255,255,255) ); + time_label->setText( "00:00:00" ); + time_label->setFrameShape( QFrame::Panel ); + time_label->setFrameShadow( QFrame::Sunken ); +#else + lcd = new QLCDNumber(this); + lcd->setNumDigits(10); // maximum time with 10 digits is 9999:59:59 + lcd->setFrameShape( QFrame::WinPanel ); + lcd->setFrameShadow( QFrame::Sunken ); + lcd->setAutoFillBackground(TRUE); + + Helper::setBackgroundColor( lcd, QColor(0,0,0) ); + Helper::setForegroundColor( lcd, QColor(200,200,200) ); + lcd->setSegmentStyle( QLCDNumber::Flat ); + lcd->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed); +#endif + + fullscreen = new MyToolButton(this); + fullscreen->setCheckable(true); + + mute = new MyToolButton(this); + mute->setCheckable(true); + + volume = new MySlider(this); + volume->setMinimum(0); + volume->setMaximum(100); + volume->setValue(50); + volume->setTickPosition( QSlider::TicksBelow ); + volume->setTickInterval( 10 ); + volume->setSingleStep( 1 ); + volume->setPageStep( 10 ); + volume->setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed); + + // No focus on widgets + rewind3->setFocusPolicy( Qt::NoFocus ); + rewind2->setFocusPolicy( Qt::NoFocus ); + rewind1->setFocusPolicy( Qt::NoFocus ); + + forward1->setFocusPolicy( Qt::NoFocus ); + forward2->setFocusPolicy( Qt::NoFocus ); + forward3->setFocusPolicy( Qt::NoFocus ); + + play->setFocusPolicy( Qt::NoFocus ); + pause->setFocusPolicy( Qt::NoFocus ); + stop->setFocusPolicy( Qt::NoFocus ); +#if !NEW_CONTROLWIDGET + lcd->setFocusPolicy( Qt::NoFocus ); +#endif + fullscreen->setFocusPolicy( Qt::NoFocus ); + mute->setFocusPolicy( Qt::NoFocus ); + volume->setFocusPolicy( Qt::NoFocus ); + + // Layout +#if NEW_CONTROLWIDGET + QHBoxLayout * l = new QHBoxLayout; + l->setMargin(2); + l->setSpacing(1); + + l->addWidget( play ); + l->addWidget( pause ); + l->addWidget( stop ); + l->addSpacing( 10 ); + l->addWidget( rewind3 ); + l->addWidget( rewind2 ); + l->addWidget( rewind1 ); + l->addWidget( time ); + l->addWidget( forward1 ); + l->addWidget( forward2 ); + l->addWidget( forward3 ); + l->addSpacing( 10 ); + l->addWidget( fullscreen ); + l->addWidget( mute ); + l->addWidget( volume ); + l->addSpacing( 10 ); + l->addWidget( time_label ); + + setLayout(l); +#else + QHBoxLayout * l1 = new QHBoxLayout; + l1->setMargin(0); + l1->setSpacing(0); + + l1->addWidget( rewind3 ); + l1->addWidget( rewind2 ); + l1->addWidget( rewind1 ); + l1->addWidget( time ); + l1->addWidget( forward1 ); + l1->addWidget( forward2 ); + l1->addWidget( forward3 ); + + QSpacerItem * spacer1 = new QSpacerItem( 20, 10, QSizePolicy::Expanding, + QSizePolicy::Minimum ); + + QSpacerItem * spacer2 = new QSpacerItem( 20, 10, QSizePolicy::Expanding, + QSizePolicy::Minimum ); + + QHBoxLayout * l2 = new QHBoxLayout; + l2->setMargin(0); + l2->setSpacing(0); + + l2->addWidget( play ); + l2->addWidget( pause ); + l2->addWidget( stop ); + l2->addItem( spacer1 ); + l2->addWidget( lcd ); + l2->addItem( spacer2 ); + l2->addWidget( fullscreen ); + l2->addWidget( mute ); + l2->addWidget( volume ); + + QVBoxLayout * l = new QVBoxLayout; + l->setMargin(0); + l->setSpacing(0); + + l->addLayout(l1); + l->addLayout(l2); + + setLayout(l); +#endif + + retranslateStrings(); + + setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed); + adjustSize(); +} + + +FloatingControl::~FloatingControl() +{ +} + +void FloatingControl::retranslateStrings() { + int size = 22; + + pause->setIcon( Images::icon("pause", size) ); + stop->setIcon( Images::icon("stop", size) ); + + if (qApp->isLeftToRight()) { + play->setIcon( Images::icon("play", size) ); + + forward1->setIcon( Images::icon("forward10s", size) ); + forward2->setIcon( Images::icon("forward1m", size) ); + forward3->setIcon( Images::icon("forward10m", size) ); + + rewind1->setIcon( Images::icon("rewind10s", size) ); + rewind2->setIcon( Images::icon("rewind1m", size) ); + rewind3->setIcon( Images::icon("rewind10m", size) ); + } else { + play->setIcon( Images::flippedIcon("play", size) ); + + forward1->setIcon( Images::flippedIcon("forward10s", size) ); + forward2->setIcon( Images::flippedIcon("forward1m", size) ); + forward3->setIcon( Images::flippedIcon("forward10m", size) ); + + rewind1->setIcon( Images::flippedIcon("rewind10s", size) ); + rewind2->setIcon( Images::flippedIcon("rewind1m", size) ); + rewind3->setIcon( Images::flippedIcon("rewind10m", size) ); + } + + fullscreen->setIcon( Images::icon("fullscreen", size) ); + + QIcon icset( Images::icon("volume", size) ); + icset.addPixmap( Images::icon("mute", size), QIcon::Normal, QIcon::On ); + mute->setIcon( icset ); +} + +// Language change stuff +void FloatingControl::changeEvent(QEvent *e) { + if (e->type() == QEvent::LanguageChange) { + retranslateStrings(); + } else { + QWidget::changeEvent(e); + } +} + +#include "moc_floatingcontrol.cpp" diff --git a/retroshare-gui/src/apps/smplayer/floatingcontrol.h b/retroshare-gui/src/apps/smplayer/floatingcontrol.h new file mode 100644 index 000000000..001541df6 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/floatingcontrol.h @@ -0,0 +1,65 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef _FLOATINGCONTROL_H_ +#define _FLOATINGCONTROL_H_ + +#include +#include "config.h" + +class QToolButton; +class TimeSlider; +class MySlider; +class QLCDNumber; +class QLabel; + +class FloatingControl : public QWidget +{ + Q_OBJECT + +public: + + FloatingControl( QWidget * parent = 0); + ~FloatingControl(); + + QToolButton * rewind1; + QToolButton * rewind2; + QToolButton * rewind3; + QToolButton * forward1; + QToolButton * forward2; + QToolButton * forward3; + QToolButton * play; + QToolButton * stop; + QToolButton * pause; + TimeSlider * time; + QToolButton * fullscreen; + QToolButton * mute; + MySlider * volume; +#if NEW_CONTROLWIDGET + QLabel * time_label; +#else + QLCDNumber * lcd; +#endif + +protected: + void retranslateStrings(); + virtual void changeEvent ( QEvent * event ) ; +}; + +#endif + diff --git a/retroshare-gui/src/apps/smplayer/global.cpp b/retroshare-gui/src/apps/smplayer/global.cpp new file mode 100644 index 000000000..bcb19a53c --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/global.cpp @@ -0,0 +1,71 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + + +#include "global.h" +#include "constants.h" +#include +#include "preferences.h" +#include "translator.h" +#include "helper.h" +#include +#include + +QSettings * settings; +Preferences * pref; +Translator * translator; + + +void global_init(const QString & ini_path) { + qDebug("global_init"); + + // Translator + translator = new Translator(); + + // settings + if (!ini_path.isEmpty()) { + QString file = ini_path + "/smplayer.ini"; + settings = new QSettings( file, QSettings::IniFormat ); + qDebug("global_init: config file: '%s'", file.toUtf8().data()); + } + else + if (QFile::exists(Helper::appHomePath())) { + QString file = Helper::appHomePath() + "/smplayer.ini"; + settings = new QSettings( file, QSettings::IniFormat ); + qDebug("global_init: config file: '%s'", file.toUtf8().data()); + } + else + { + settings = new QSettings(QSettings::IniFormat, QSettings::UserScope, + QString(COMPANY), QString(PROGRAM) ); + } + + // Preferences + pref = new Preferences(); +} + +void global_end() { + qDebug("global_end"); + + // delete + delete pref; + pref = 0; + + delete settings; + delete translator; +} diff --git a/retroshare-gui/src/apps/smplayer/global.h b/retroshare-gui/src/apps/smplayer/global.h new file mode 100644 index 000000000..c38ab9cee --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/global.h @@ -0,0 +1,46 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + + +#ifndef _GLOBAL_H_ +#define _GLOBAL_H_ + +#include + +// Some global objects + +class QSettings; +class Preferences; +class Translator; + + +// Read and store application settings +extern QSettings * settings; + +// Prefences +extern Preferences * pref; + +// Translator (for changing language) +extern Translator * translator; + + +void global_init(const QString & ini_path); +void global_end(); + +#endif + diff --git a/retroshare-gui/src/apps/smplayer/helper.cpp b/retroshare-gui/src/apps/smplayer/helper.cpp new file mode 100644 index 000000000..eb2fbcea3 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/helper.cpp @@ -0,0 +1,351 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "helper.h" + +#include +#include +#include +#include +#include +#include +#include +#include "config.h" + +#include + +#ifdef Q_OS_WIN +#include // For the screensaver stuff +#endif + +/* +#if EXTERNAL_SLEEP +#include +#else +#include +#endif + + +#if !EXTERNAL_SLEEP +class Sleeper : public QThread +{ +public: + static void sleep(unsigned long secs) {QThread::sleep(secs);} + static void msleep(unsigned long msecs) { + //qDebug("sleeping..."); + QThread::msleep(msecs); + //qDebug("finished"); + } + static void usleep(unsigned long usecs) {QThread::usleep(usecs);} +}; +#endif +*/ + + +QString Helper::logs; +QString Helper::app_path; + + +void Helper::setAppPath(QString path) { + app_path = path; +} + +QString Helper::appPath() { + return app_path; +} + +QString Helper::dataPath() { +#ifdef DATA_PATH + QString path = QString(DATA_PATH); + if (!path.isEmpty()) + return path; + else + return appPath(); +#else + return appPath(); +#endif +} + +QString Helper::translationPath() { +#ifdef TRANSLATION_PATH + QString path = QString(TRANSLATION_PATH); + if (!path.isEmpty()) + return path; + else + return appPath() + "/translations"; +#else + return appPath() + "/translations"; +#endif +} + +QString Helper::docPath() { +#ifdef DOC_PATH + QString path = QString(DOC_PATH); + if (!path.isEmpty()) + return path; + else + return appPath(); +#else + return appPath(); +#endif +} + +QString Helper::confPath() { +#ifdef CONF_PATH + QString path = QString(CONF_PATH); + if (!path.isEmpty()) + return path; + else + return appPath(); +#else + return appPath(); +#endif +} + +QString Helper::themesPath() { +#ifdef THEMES_PATH + QString path = QString(THEMES_PATH); + if (!path.isEmpty()) + return path; + else + return appPath() + "/themes"; +#else + return appPath() + "/themes"; +#endif +} + +QString Helper::shortcutsPath() { +#ifdef SHORTCUTS_PATH + QString path = QString(SHORTCUTS_PATH); + if (!path.isEmpty()) + return path; + else + return appPath() + "/shortcuts"; +#else + return appPath() + "/shortcuts"; +#endif +} + +QString Helper::qtTranslationPath() { + return QLibraryInfo::location(QLibraryInfo::TranslationsPath); +} + +QString Helper::appHomePath() { + return QDir::homePath() + "/.smplayer"; +} + +QString Helper::filenameForPref(const QString & filename) { + QString s = filename; + s = s.replace('/', '_'); + s = s.replace('\\', '_'); + s = s.replace(':', '_'); + s = s.replace('.', '_'); + s = s.replace(' ', '_'); + + QFileInfo fi(filename); + if (fi.exists()) { + s += "_" + QString::number( fi.size() ); + } + + return s; +} + +QString Helper::dvdForPref(const QString & dvd_id, int title) { + return QString("DVD_%1_%2").arg(dvd_id).arg(title); +} + + +void Helper::addLog(QString s) { + logs += s + "\n"; +} + +QString Helper::log() { + return logs; +} + +QString Helper::formatTime(int secs) { + int t = secs; + int hours = (int) t / 3600; + t -= hours*3600; + int minutes = (int) t / 60; + t -= minutes*60; + int seconds = t; + + QString tf; + return tf.sprintf("%02d:%02d:%02d",hours,minutes,seconds); +} + +QString Helper::timeForJumps(int secs) { + int minutes = (int) secs / 60; + int seconds = secs % 60; + + if (minutes==0) { + if (seconds==1) + return QObject::tr("1 second"); + else + return QObject::tr("%1 seconds").arg(seconds); + } + else { + if (minutes==1) { + if (seconds==0) + return QObject::tr("1 minute"); + else + if (seconds==1) + return QObject::tr("1 minute and 1 second"); + else + return QObject::tr("1 minute and %1 seconds").arg(seconds); + } else { + if (seconds==0) + return QObject::tr("%1 minutes").arg(minutes); + else + if (seconds==1) + return QObject::tr("%1 minutes and 1 second").arg(minutes); + else + return QObject::tr("%1 minutes and %2 seconds").arg(minutes) + .arg(seconds); + } + } +} + +void Helper::setScreensaverEnabled(bool b) { + qDebug("Helper::setScreensaverEnabled: %d", b); +#ifdef Q_OS_WIN + if (b) { + // Activate screensaver + SystemParametersInfo( SPI_SETSCREENSAVEACTIVE, true, 0, SPIF_SENDWININICHANGE); + SystemParametersInfo( SPI_SETLOWPOWERACTIVE, 1, NULL, 0); + SystemParametersInfo( SPI_SETPOWEROFFACTIVE, 1, NULL, 0); + } else { + SystemParametersInfo( SPI_SETSCREENSAVEACTIVE, false, 0, SPIF_SENDWININICHANGE); + SystemParametersInfo( SPI_SETLOWPOWERACTIVE, 0, NULL, 0); + SystemParametersInfo( SPI_SETPOWEROFFACTIVE, 0, NULL, 0); + } +#endif +} + +/* +void Helper::msleep(int ms) { +#if EXTERNAL_SLEEP + qDebug("Helper::msleep: %d (using usleep)", ms); + usleep(ms*1000); +#else + qDebug("Helper::msleep: %d (using QThread::msleep)", ms); + Sleeper::msleep( ms ); +#endif +} +*/ + +QString Helper::colorToRGBA(unsigned int color) { + QColor c; + c.setRgb( color ); + + QString s; + return s.sprintf("%02x%02x%02x00", c.red(), c.green(), c.blue() ); +} + +QString Helper::colorToRGB(unsigned int color) { + QColor c; + c.setRgb( color ); + + QString s; + return s.sprintf("%02x%02x%02x", c.red(), c.green(), c.blue() ); +} + +void Helper::setForegroundColor(QWidget * w, const QColor & color) { + QPalette p = w->palette(); + p.setColor(w->foregroundRole(), color); + w->setPalette(p); +} + +void Helper::setBackgroundColor(QWidget * w, const QColor & color) { + QPalette p = w->palette(); + p.setColor(w->backgroundRole(), color); + w->setPalette(p); +} + +QString Helper::changeSlashes(QString filename) { + // Only change if file exists (it's a local file) + if (QFileInfo(filename).exists()) + return filename.replace('/', '\\'); + else + return filename; +} + +QString Helper::dvdSplitFolder(QString dvd_url) { + qDebug("Helper::dvdSplitFolder: '%s'", dvd_url.toUtf8().data()); + QRegExp s("^dvd://(\\d+):(.*)", Qt::CaseInsensitive); + if (s.indexIn(dvd_url)!=-1) { + return s.cap(2); + } else { + return QString::null; + } +} + +int Helper::dvdSplitTitle(QString dvd_url) { + qDebug("Helper::dvdSplitTitle: '%s'", dvd_url.toUtf8().data()); + QRegExp s("^dvd://(\\d+)(.*)", Qt::CaseInsensitive); + if (s.indexIn(dvd_url)!=-1) { + return s.cap(1).toInt(); + } else { + return -1; + } +} + + +bool Helper::directoryContainsDVD(QString directory) { + //qDebug("Helper::directoryContainsDVD: '%s'", directory.latin1()); + + QDir dir(directory); + QStringList l = dir.entryList(); + bool valid = FALSE; + for (int n=0; n < l.count(); n++) { + //qDebug(" * entry %d: '%s'", n, l[n].toUtf8().data()); + if (l[n].toLower() == "video_ts") valid = TRUE; + } + + return valid; +} + +/* +#ifdef Q_OS_WIN +QString Helper::mplayer_intermediate(QString mplayer_bin) { + // Windows 98 and ME: call another program as intermediate + + QString intermediate = "w9xpopen.exe"; + + QFileInfo fi(mplayer_bin); + if (fi.exists()) { + mplayer_bin = fi.absoluteFilePath(); + } + + QString mplayer_path = QFileInfo(mplayer_bin).absolutePath(); + qDebug("Helper::mplayer_intermediate: mplayer_path: %s", mplayer_path.toUtf8().data()); + QString intermediate_bin = mplayer_path + "/" + intermediate; + qDebug("Helper::mplayer_intermediate: intermediate_bin: %s", intermediate_bin.toUtf8().data()); + + if (QFile::exists(intermediate_bin)) { + return intermediate_bin; + } else { + qDebug("Helper::mplayer_intermediate: intermediate_bin doesn't exist"); + } + + return ""; +} +#endif +*/ + diff --git a/retroshare-gui/src/apps/smplayer/helper.h b/retroshare-gui/src/apps/smplayer/helper.h new file mode 100644 index 000000000..439a4673a --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/helper.h @@ -0,0 +1,97 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + + +#ifndef _HELPER_H_ +#define _HELPER_H_ + +#include +#include + +class QWidget; +class QColor; + +class Helper +{ +public: + + static void setAppPath(QString path); + static QString appPath(); + + static QString dataPath(); + static QString translationPath(); + static QString docPath(); + static QString confPath(); + static QString themesPath(); + static QString shortcutsPath(); + static QString qtTranslationPath(); + + //! Return the user's home + static QString appHomePath(); + + // Format a time (hh:mm:ss) + static QString formatTime(int secs); + + static QString timeForJumps(int secs); + + // Give a name for config (group name) based on filename + static QString filenameForPref(const QString & filename); + + // Give a name for config (group name) based on dvd id + static QString dvdForPref(const QString & dvd_id, int title); + + //! Adds a line to the log + static void addLog(QString s); + + //! Returns the log (the debugging messages) + static QString log(); + + //! Enable or disables the screensaver + static void setScreensaverEnabled(bool b); + + /* static void msleep(int ms); */ + + static QString colorToRGBA(unsigned int color); + static QString colorToRGB(unsigned int color); + + //! Changes the foreground color of the specified widget + static void setForegroundColor(QWidget * w, const QColor & color); + + //! Changes the background color of the specified widget + static void setBackgroundColor(QWidget * w, const QColor & color); + + //! Change filenames like "C:/Program Files/" to "C:\Program Files\" + static QString changeSlashes(QString filename); + + static QString dvdSplitFolder(QString dvd_url); + static int dvdSplitTitle(QString dvd_url); + + static bool directoryContainsDVD(QString directory); + +/* +#ifdef Q_OS_WIN + static QString mplayer_intermediate(QString mplayer_bin); +#endif +*/ + +private: + static QString logs; + static QString app_path; +}; + +#endif diff --git a/retroshare-gui/src/apps/smplayer/icons-png/Thumbs.db b/retroshare-gui/src/apps/smplayer/icons-png/Thumbs.db new file mode 100644 index 000000000..72dd152e8 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/Thumbs.db differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/aspect.png b/retroshare-gui/src/apps/smplayer/icons-png/aspect.png new file mode 100644 index 000000000..7fc67bd6b Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/aspect.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/background.png b/retroshare-gui/src/apps/smplayer/icons-png/background.png new file mode 100644 index 000000000..befe614c3 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/background.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/brightness.png b/retroshare-gui/src/apps/smplayer/icons-png/brightness.png new file mode 100644 index 000000000..96a9f5047 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/brightness.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/cdda.png b/retroshare-gui/src/apps/smplayer/icons-png/cdda.png new file mode 100644 index 000000000..3afaea6e2 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/cdda.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/cdrom_drive.png b/retroshare-gui/src/apps/smplayer/icons-png/cdrom_drive.png new file mode 100644 index 000000000..396b81dd4 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/cdrom_drive.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/chapter.png b/retroshare-gui/src/apps/smplayer/icons-png/chapter.png new file mode 100644 index 000000000..66c36d947 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/chapter.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/close.png b/retroshare-gui/src/apps/smplayer/icons-png/close.png new file mode 100644 index 000000000..7cb985935 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/close.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/compact.png b/retroshare-gui/src/apps/smplayer/icons-png/compact.png new file mode 100644 index 000000000..cafed65e8 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/compact.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/conflict.png b/retroshare-gui/src/apps/smplayer/icons-png/conflict.png new file mode 100644 index 000000000..700530438 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/conflict.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/contrast.png b/retroshare-gui/src/apps/smplayer/icons-png/contrast.png new file mode 100644 index 000000000..9ae6745f1 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/contrast.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/copy.png b/retroshare-gui/src/apps/smplayer/icons-png/copy.png new file mode 100644 index 000000000..4d60db641 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/copy.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/delete.png b/retroshare-gui/src/apps/smplayer/icons-png/delete.png new file mode 100644 index 000000000..6fb193f06 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/delete.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/down.png b/retroshare-gui/src/apps/smplayer/icons-png/down.png new file mode 100644 index 000000000..0ffef41dc Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/down.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/dvd.png b/retroshare-gui/src/apps/smplayer/icons-png/dvd.png new file mode 100644 index 000000000..8c92fa5fa Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/dvd.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/dvd_drive.png b/retroshare-gui/src/apps/smplayer/icons-png/dvd_drive.png new file mode 100644 index 000000000..98fee075a Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/dvd_drive.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/dvd_hd.png b/retroshare-gui/src/apps/smplayer/icons-png/dvd_hd.png new file mode 100644 index 000000000..381ad938a Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/dvd_hd.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/exit.png b/retroshare-gui/src/apps/smplayer/icons-png/exit.png new file mode 100644 index 000000000..6ad33b023 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/exit.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/forward10m.png b/retroshare-gui/src/apps/smplayer/icons-png/forward10m.png new file mode 100644 index 000000000..096a58a44 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/forward10m.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/forward10s.png b/retroshare-gui/src/apps/smplayer/icons-png/forward10s.png new file mode 100644 index 000000000..10685477f Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/forward10s.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/forward1m.png b/retroshare-gui/src/apps/smplayer/icons-png/forward1m.png new file mode 100644 index 000000000..f68032dfc Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/forward1m.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/fullscreen.png b/retroshare-gui/src/apps/smplayer/icons-png/fullscreen.png new file mode 100644 index 000000000..7356dafe5 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/fullscreen.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/gamma.png b/retroshare-gui/src/apps/smplayer/icons-png/gamma.png new file mode 100644 index 000000000..90ad051a2 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/gamma.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/hue.png b/retroshare-gui/src/apps/smplayer/icons-png/hue.png new file mode 100644 index 000000000..45a7dd692 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/hue.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/info.png b/retroshare-gui/src/apps/smplayer/icons-png/info.png new file mode 100644 index 000000000..22cd5420a Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/info.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/input_devices.png b/retroshare-gui/src/apps/smplayer/icons-png/input_devices.png new file mode 100644 index 000000000..81ef713c7 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/input_devices.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/keyboard.png b/retroshare-gui/src/apps/smplayer/icons-png/keyboard.png new file mode 100644 index 000000000..d8ab063f5 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/keyboard.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/logo.png b/retroshare-gui/src/apps/smplayer/icons-png/logo.png new file mode 100644 index 000000000..befe614c3 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/logo.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/logs.png b/retroshare-gui/src/apps/smplayer/icons-png/logs.png new file mode 100644 index 000000000..34549a456 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/logs.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/minus.png b/retroshare-gui/src/apps/smplayer/icons-png/minus.png new file mode 100644 index 000000000..216fcad63 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/minus.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/monitor.png b/retroshare-gui/src/apps/smplayer/icons-png/monitor.png new file mode 100644 index 000000000..54f62c2f9 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/monitor.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/mouse.png b/retroshare-gui/src/apps/smplayer/icons-png/mouse.png new file mode 100644 index 000000000..56ca70b93 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/mouse.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/mute.png b/retroshare-gui/src/apps/smplayer/icons-png/mute.png new file mode 100644 index 000000000..bfc847cf2 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/mute.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/next.png b/retroshare-gui/src/apps/smplayer/icons-png/next.png new file mode 100644 index 000000000..2f9ff3a68 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/next.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/ok.png b/retroshare-gui/src/apps/smplayer/icons-png/ok.png new file mode 100644 index 000000000..13ba71d56 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/ok.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/open.png b/retroshare-gui/src/apps/smplayer/icons-png/open.png new file mode 100644 index 000000000..a79982ea1 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/open.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/openfolder.png b/retroshare-gui/src/apps/smplayer/icons-png/openfolder.png new file mode 100644 index 000000000..0ed1f21b5 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/openfolder.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/pause.png b/retroshare-gui/src/apps/smplayer/icons-png/pause.png new file mode 100644 index 000000000..291dc4665 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/pause.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/play.png b/retroshare-gui/src/apps/smplayer/icons-png/play.png new file mode 100644 index 000000000..dbb952051 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/play.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/playlist.png b/retroshare-gui/src/apps/smplayer/icons-png/playlist.png new file mode 100644 index 000000000..5df091855 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/playlist.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/plus.png b/retroshare-gui/src/apps/smplayer/icons-png/plus.png new file mode 100644 index 000000000..d2400ac7e Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/plus.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/pref_advanced.png b/retroshare-gui/src/apps/smplayer/icons-png/pref_advanced.png new file mode 100644 index 000000000..3c31b733e Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/pref_advanced.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/pref_associations.png b/retroshare-gui/src/apps/smplayer/icons-png/pref_associations.png new file mode 100644 index 000000000..87bb5380f Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/pref_associations.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/pref_devices.png b/retroshare-gui/src/apps/smplayer/icons-png/pref_devices.png new file mode 100644 index 000000000..dbb8a6f59 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/pref_devices.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/pref_general.png b/retroshare-gui/src/apps/smplayer/icons-png/pref_general.png new file mode 100644 index 000000000..725d827e1 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/pref_general.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/pref_gui.png b/retroshare-gui/src/apps/smplayer/icons-png/pref_gui.png new file mode 100644 index 000000000..0d685bb1f Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/pref_gui.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/pref_performance.png b/retroshare-gui/src/apps/smplayer/icons-png/pref_performance.png new file mode 100644 index 000000000..166aabd37 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/pref_performance.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/pref_subtitles.png b/retroshare-gui/src/apps/smplayer/icons-png/pref_subtitles.png new file mode 100644 index 000000000..eb7261aa2 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/pref_subtitles.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/prefs.png b/retroshare-gui/src/apps/smplayer/icons-png/prefs.png new file mode 100644 index 000000000..2726fc047 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/prefs.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/previous.png b/retroshare-gui/src/apps/smplayer/icons-png/previous.png new file mode 100644 index 000000000..f38b8d887 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/previous.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/repeat.png b/retroshare-gui/src/apps/smplayer/icons-png/repeat.png new file mode 100644 index 000000000..6783b5bc6 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/repeat.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/resize_window.png b/retroshare-gui/src/apps/smplayer/icons-png/resize_window.png new file mode 100644 index 000000000..fed63ecec Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/resize_window.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/rewind10m.png b/retroshare-gui/src/apps/smplayer/icons-png/rewind10m.png new file mode 100644 index 000000000..5aa7ea747 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/rewind10m.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/rewind10s.png b/retroshare-gui/src/apps/smplayer/icons-png/rewind10s.png new file mode 100644 index 000000000..ff035ee2b Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/rewind10s.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/rewind1m.png b/retroshare-gui/src/apps/smplayer/icons-png/rewind1m.png new file mode 100644 index 000000000..8389492a4 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/rewind1m.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/saturation.png b/retroshare-gui/src/apps/smplayer/icons-png/saturation.png new file mode 100644 index 000000000..28e751a7b Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/saturation.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/save.png b/retroshare-gui/src/apps/smplayer/icons-png/save.png new file mode 100644 index 000000000..47d8f201f Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/save.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/screenshot.png b/retroshare-gui/src/apps/smplayer/icons-png/screenshot.png new file mode 100644 index 000000000..259aaa1f0 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/screenshot.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/shuffle.png b/retroshare-gui/src/apps/smplayer/icons-png/shuffle.png new file mode 100644 index 000000000..9b068f5b1 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/shuffle.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/speaker.png b/retroshare-gui/src/apps/smplayer/icons-png/speaker.png new file mode 100644 index 000000000..0b4305b18 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/speaker.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/speed.png b/retroshare-gui/src/apps/smplayer/icons-png/speed.png new file mode 100644 index 000000000..585622d0a Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/speed.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/stop.png b/retroshare-gui/src/apps/smplayer/icons-png/stop.png new file mode 100644 index 000000000..1ca4cfa83 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/stop.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/sub.png b/retroshare-gui/src/apps/smplayer/icons-png/sub.png new file mode 100644 index 000000000..028732ba0 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/sub.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/title.png b/retroshare-gui/src/apps/smplayer/icons-png/title.png new file mode 100644 index 000000000..1b44b756f Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/title.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/type_audio.png b/retroshare-gui/src/apps/smplayer/icons-png/type_audio.png new file mode 100644 index 000000000..d1919234d Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/type_audio.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/type_cdda.png b/retroshare-gui/src/apps/smplayer/icons-png/type_cdda.png new file mode 100644 index 000000000..99539cd37 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/type_cdda.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/type_dvd.png b/retroshare-gui/src/apps/smplayer/icons-png/type_dvd.png new file mode 100644 index 000000000..b16b95ec0 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/type_dvd.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/type_unknown.png b/retroshare-gui/src/apps/smplayer/icons-png/type_unknown.png new file mode 100644 index 000000000..cbb914865 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/type_unknown.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/type_url.png b/retroshare-gui/src/apps/smplayer/icons-png/type_url.png new file mode 100644 index 000000000..31e5c26b2 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/type_url.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/type_vcd.png b/retroshare-gui/src/apps/smplayer/icons-png/type_vcd.png new file mode 100644 index 000000000..99539cd37 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/type_vcd.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/type_video.png b/retroshare-gui/src/apps/smplayer/icons-png/type_video.png new file mode 100644 index 000000000..ac61bd5dd Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/type_video.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/unload.png b/retroshare-gui/src/apps/smplayer/icons-png/unload.png new file mode 100644 index 000000000..a79982ea1 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/unload.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/up.png b/retroshare-gui/src/apps/smplayer/icons-png/up.png new file mode 100644 index 000000000..61e4850df Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/up.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/url.png b/retroshare-gui/src/apps/smplayer/icons-png/url.png new file mode 100644 index 000000000..a7ea68856 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/url.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/url_big.png b/retroshare-gui/src/apps/smplayer/icons-png/url_big.png new file mode 100644 index 000000000..a9e8db94d Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/url_big.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/vcd.png b/retroshare-gui/src/apps/smplayer/icons-png/vcd.png new file mode 100644 index 000000000..3afaea6e2 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/vcd.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons-png/volume.png b/retroshare-gui/src/apps/smplayer/icons-png/volume.png new file mode 100644 index 000000000..81d23e70e Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/icons-png/volume.png differ diff --git a/retroshare-gui/src/apps/smplayer/icons.qrc b/retroshare-gui/src/apps/smplayer/icons.qrc new file mode 100644 index 000000000..b01d643b2 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/icons.qrc @@ -0,0 +1,80 @@ + + + icons-png/aspect.png + icons-png/background.png + icons-png/brightness.png + icons-png/cdda.png + icons-png/cdrom_drive.png + icons-png/chapter.png + icons-png/close.png + icons-png/compact.png + icons-png/conflict.png + icons-png/contrast.png + icons-png/copy.png + icons-png/delete.png + icons-png/down.png + icons-png/dvd.png + icons-png/dvd_drive.png + icons-png/dvd_hd.png + icons-png/exit.png + icons-png/forward10m.png + icons-png/forward10s.png + icons-png/forward1m.png + icons-png/fullscreen.png + icons-png/gamma.png + icons-png/hue.png + icons-png/info.png + icons-png/input_devices.png + icons-png/keyboard.png + icons-png/logo.png + icons-png/logs.png + icons-png/minus.png + icons-png/monitor.png + icons-png/mouse.png + icons-png/mute.png + icons-png/ok.png + icons-png/open.png + icons-png/openfolder.png + icons-png/pause.png + icons-png/play.png + icons-png/playlist.png + icons-png/plus.png + icons-png/pref_advanced.png + icons-png/pref_devices.png + icons-png/pref_general.png + icons-png/pref_gui.png + icons-png/pref_performance.png + icons-png/pref_subtitles.png + icons-png/prefs.png + icons-png/previous.png + icons-png/saturation.png + icons-png/save.png + icons-png/screenshot.png + icons-png/shuffle.png + icons-png/speaker.png + icons-png/speed.png + icons-png/stop.png + icons-png/sub.png + icons-png/unload.png + icons-png/up.png + icons-png/url.png + icons-png/vcd.png + icons-png/volume.png + icons-png/next.png + icons-png/repeat.png + icons-png/resize_window.png + icons-png/rewind10m.png + icons-png/rewind10s.png + icons-png/rewind1m.png + icons-png/title.png + icons-png/type_audio.png + icons-png/type_cdda.png + icons-png/type_dvd.png + icons-png/type_unknown.png + icons-png/type_url.png + icons-png/type_vcd.png + icons-png/type_video.png + icons-png/url_big.png + icons-png/pref_associations.png + + diff --git a/retroshare-gui/src/apps/smplayer/images.cpp b/retroshare-gui/src/apps/smplayer/images.cpp new file mode 100644 index 000000000..f81478445 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/images.cpp @@ -0,0 +1,114 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#define COMPAT_WITH_OLD_ICONS 1 + +#include "images.h" +#include "global.h" +#include "preferences.h" +#include "helper.h" + +#include + +QString Images::filename(const QString & name, bool png) { + QString filename = name; + + if (filename.endsWith("_small")) { + filename = filename.replace("_small", ""); + } + + if (png) filename += ".png"; + + return filename; +} + +QPixmap Images::loadIcon(const QString & icon_name) { + QPixmap p; + + if (!pref->iconset.isEmpty()) { + QString filename = Helper::appHomePath() + "/themes/" + pref->iconset + "/" + icon_name; + if (!QFile::exists(filename)) { + filename = Helper::themesPath() + "/" + pref->iconset + "/" + icon_name; + } + //qDebug("Images::loadIcon: filename: '%s'", filename.toUtf8().data()); + + if (QFile::exists(filename)) { + p.load( filename ); + } + } + + return p; +} + +QPixmap Images::icon(QString name, int size, bool png) { + bool small = false; + + if (name.endsWith("_small")) { + small = true; + } + + QString icon_name = Images::filename(name,png); + + QPixmap p = Images::loadIcon( icon_name ); + bool ok = !p.isNull(); + +#if COMPAT_WITH_OLD_ICONS + if (!ok) { + if ( (name.startsWith("r")) || + (name.startsWith("t")) || + (name.startsWith("n")) ) + { + QString icon_name = Images::filename("x"+name,png); + p = Images::loadIcon( icon_name ); + ok = !p.isNull(); + } + } +#endif + + if (!ok) { + p = QPixmap(":/icons-png/" + icon_name); + ok = !p.isNull(); + } + + if (ok) { + if (small) { + p = resize(&p); + } + if (size!=-1) { + p = resize(&p,size); + } + } else { + //qWarning("Images2::icon: icon '%s' not found", name.toUtf8().data()); + } + + return p; +} + +QPixmap Images::resize(QPixmap *p, int size) { + return QPixmap::fromImage( (*p).toImage().scaled(size,size,Qt::IgnoreAspectRatio,Qt::SmoothTransformation) ); +} + +QPixmap Images::flip(QPixmap *p) { + return QPixmap::fromImage( (*p).toImage().mirrored(true, false) ); +} + +QPixmap Images::flippedIcon(QString name, int size, bool png) { + QPixmap p = icon(name, size, png); + p = flip(&p); + return p; +} diff --git a/retroshare-gui/src/apps/smplayer/images.h b/retroshare-gui/src/apps/smplayer/images.h new file mode 100644 index 000000000..11b92ec72 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/images.h @@ -0,0 +1,46 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef _IMAGES_H_ +#define _IMAGES_H_ + +#include +#include + +/* Warning: don't use this until global->preferences is created! */ +class Images +{ + +public: + static QPixmap icon(QString name, int size=-1, bool png = true); + static QPixmap flippedIcon(QString name, int size=-1, bool png = true); + + static QPixmap resize(QPixmap *p, int size=20); + static QPixmap flip(QPixmap *p); + +private: + //! Return the filename for the icon + static QString filename(const QString & name, bool png); + + //! Try to load an icon. \a icon_name is the filename of the + //! icon without path. Return a null pixmap if loads fails. + static QPixmap loadIcon(const QString & icon_name); +}; + +#endif + diff --git a/retroshare-gui/src/apps/smplayer/infofile.cpp b/retroshare-gui/src/apps/smplayer/infofile.cpp new file mode 100644 index 000000000..7229799d5 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/infofile.cpp @@ -0,0 +1,235 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "infofile.h" +#include +#include "helper.h" +#include "config.h" +#include "constants.h" + +InfoFile::InfoFile( QObject * parent ) : QObject(parent) +{ + row = 0; +} + +InfoFile::~InfoFile() { +} + +QString InfoFile::getInfo(MediaData md) { + QString s; + + // General + QFileInfo fi(md.filename); + + QString icon; + switch (md.type) { + case TYPE_FILE : if (md.novideo) + icon = "type_audio.png"; + else + icon = "type_video.png"; + break; + case TYPE_DVD : icon = "type_dvd.png"; break; + case TYPE_VCD : icon = "type_vcd.png"; break; + case TYPE_AUDIO_CD : icon = "type_vcd.png"; break; + case TYPE_STREAM : icon = "type_url.png"; break; + default : icon = "type_unknown.png"; + } + icon = " "; + + if (md.type == TYPE_DVD) { + s += title( icon + "dvd://" + QString::number(Helper::dvdSplitTitle(md.filename) ) ); + } else { + s += title( icon + md.displayName() ); + } + + s += openPar( tr("General") ); + if (fi.exists()) { + //s += addItem( tr("Path"), fi.dirPath() ); + s += addItem( tr("File"), fi.absoluteFilePath() ); + s += addItem( tr("Size"), tr("%1 KB (%2 MB)").arg(fi.size()/1024) + .arg(fi.size()/1048576) ); + } else { + QString url = md.filename; + if (url.endsWith(IS_PLAYLIST_TAG)) { + url = url.remove( QRegExp(IS_PLAYLIST_TAG_RX) ); + } + s += addItem( tr("URL"), url ); + } + s += addItem( tr("Length"), Helper::formatTime((int)md.duration) ); + s += addItem( tr("Demuxer"), md.demuxer ); + s += closePar(); + + // Clip info + QString c; + if (!md.clip_name.isEmpty()) c+= addItem( tr("Name"), md.clip_name ); + if (!md.clip_artist.isEmpty()) c+= addItem( tr("Artist"), md.clip_artist ); + if (!md.clip_author.isEmpty()) c+= addItem( tr("Author"), md.clip_author ); + if (!md.clip_album.isEmpty()) c+= addItem( tr("Album"), md.clip_album ); + if (!md.clip_genre.isEmpty()) c+= addItem( tr("Genre"), md.clip_genre ); + if (!md.clip_date.isEmpty()) c+= addItem( tr("Date"), md.clip_date ); + if (!md.clip_track.isEmpty()) c+= addItem( tr("Track"), md.clip_track ); + if (!md.clip_copyright.isEmpty()) c+= addItem( tr("Copyright"), md.clip_copyright ); + if (!md.clip_comment.isEmpty()) c+= addItem( tr("Comment"), md.clip_comment ); + if (!md.clip_software.isEmpty()) c+= addItem( tr("Software"), md.clip_software ); + if (!md.stream_title.isEmpty()) c+= addItem( tr("Stream title"), md.stream_title ); + if (!md.stream_url.isEmpty()) c+= addItem( tr("Stream URL"), md.stream_url ); + + if (!c.isEmpty()) { + s += openPar( tr("Clip info") ); + s += c; + s += closePar(); + } + + // Video info + if (!md.novideo) { + s += openPar( tr("Video") ); + s += addItem( tr("Resolution"), QString("%1 x %2").arg(md.video_width).arg(md.video_height) ); + s += addItem( tr("Aspect ratio"), QString::number(md.video_aspect) ); + s += addItem( tr("Format"), md.video_format ); + s += addItem( tr("Bitrate"), tr("%1 kbps").arg(md.video_bitrate / 1000) ); + s += addItem( tr("Frames per second"), md.video_fps ); + s += addItem( tr("Selected codec"), md.video_codec ); + s += closePar(); + } + + // Audio info + s += openPar( tr("Initial Audio Stream") ); + s += addItem( tr("Format"), md.audio_format ); + s += addItem( tr("Bitrate"), tr("%1 kbps").arg(md.audio_bitrate / 1000) ); + s += addItem( tr("Rate"), tr("%1 Hz").arg(md.audio_rate) ); + s += addItem( tr("Channels"), QString::number(md.audio_nch) ); + s += addItem( tr("Selected codec"), md.audio_codec ); + s += closePar(); + + // Audio Tracks + if (md.audios.numItems() > 0) { + s += openPar( tr("Audio Streams") ); + row++; + s += openItem(); + s += "" + tr("#", "Info for translators: this is a abbreviation for number") + "" + + tr("Language") + "" + tr("Name") +"" + + tr("ID", "Info for translators: this is a identification code") + ""; + s += closeItem(); + for (int n = 0; n < md.audios.numItems(); n++) { + row++; + s += openItem(); + QString lang = md.audios.itemAt(n).lang(); + if (lang.isEmpty()) lang = "<"+tr("empty")+">"; + QString name = md.audios.itemAt(n).name(); + if (name.isEmpty()) name = "<"+tr("empty")+">"; + s += QString("%1%2%3%4") + .arg(n).arg(lang).arg(name) + .arg(md.audios.itemAt(n).ID()); + s += closeItem(); + } + s += closePar(); + } + + // Subtitles +#if SUBTITLES_BY_INDEX + if (md.subs.numItems() > 0) { + s += openPar( tr("Subtitles") ); + row++; + s += openItem(); + s += "" + tr("#", "Info for translators: this is a abbreviation for number") + "" + + tr("Type") + "" + + tr("Language") + "" + tr("Name") +"" + + tr("ID", "Info for translators: this is a identification code") + ""; + s += closeItem(); + for (int n = 0; n < md.subs.numItems(); n++) { + row++; + s += openItem(); + QString t; + switch (md.subs.itemAt(n).type()) { + case SubData::File: t = "FILE_SUB"; break; + case SubData::Vob: t = "VOB"; break; + default: t = "SUB"; + } + QString lang = md.subs.itemAt(n).lang(); + if (lang.isEmpty()) lang = "<"+tr("empty")+">"; + QString name = md.subs.itemAt(n).name(); + if (name.isEmpty()) name = "<"+tr("empty")+">"; + s += QString("%1%2%3%4%5") + .arg(n).arg(t).arg(lang).arg(name) + .arg(md.subs.itemAt(n).ID()); + s += closeItem(); + } + s += closePar(); + } +#else + if (md.subtitles.numItems() > 0) { + s += openPar( tr("Subtitles") ); + row++; + s += openItem(); + s += "" + tr("#", "Info for translators: this is a abbreviation for number") + "" + + tr("Language") + "" + tr("Name") +"" + + tr("ID", "Info for translators: this is a identification code") + ""; + s += closeItem(); + for (int n = 0; n < md.subtitles.numItems(); n++) { + row++; + s += openItem(); + QString lang = md.subtitles.itemAt(n).lang(); + if (lang.isEmpty()) lang = "<"+tr("empty")+">"; + QString name = md.subtitles.itemAt(n).name(); + if (name.isEmpty()) name = "<"+tr("empty")+">"; + s += QString("%1%2%3%4") + .arg(n).arg(lang).arg(name) + .arg(md.subtitles.itemAt(n).ID()); + s += closeItem(); + } + s += closePar(); + } +#endif + + return s; +} + +QString InfoFile::title(QString text) { + return "

    " + text + "

    "; +} + +QString InfoFile::openPar(QString text) { + return "

    " + text + "

    " + ""; +} + +QString InfoFile::closePar() { + row = 0; + return "
    "; +} + +QString InfoFile::openItem() { + if (row % 2 == 1) + return ""; + else + return ""; +} + +QString InfoFile::closeItem() { + return ""; +} + +QString InfoFile::addItem( QString tag, QString value ) { + row++; + return openItem() + + "" + tag + "" + + "" + value + "" + + closeItem(); +} + +#include "moc_infofile.cpp" diff --git a/retroshare-gui/src/apps/smplayer/infofile.h b/retroshare-gui/src/apps/smplayer/infofile.h new file mode 100644 index 000000000..8b1867801 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/infofile.h @@ -0,0 +1,48 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef _INFOFILE_H_ +#define _INFOFILE_H_ + +#include "mediadata.h" +#include +#include + +class InfoFile : public QObject +{ + Q_OBJECT + +public: + InfoFile( QObject * parent = 0 ); + ~InfoFile(); + + QString getInfo(MediaData md); + +protected: + QString title(QString text); + QString openPar(QString text); + QString closePar(); + QString openItem(); + QString closeItem(); + + QString addItem( QString tag, QString value ); + + int row; +}; + +#endif diff --git a/retroshare-gui/src/apps/smplayer/inforeader.cpp b/retroshare-gui/src/apps/smplayer/inforeader.cpp new file mode 100644 index 000000000..7fa035ef9 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/inforeader.cpp @@ -0,0 +1,266 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "inforeader.h" +#include +#include +#include + +#include "helper.h" +#include "global.h" +#include "preferences.h" + +#if USE_QPROCESS +#include +#else +#include "myprocess.h" +#endif + +#define NOME 0 +#define VO 1 +#define AO 2 +#define DEMUXER 3 +#define VC 4 +#define AC 5 + +InfoReader * InfoReader::static_obj = 0; + +InfoReader * InfoReader::obj() { + if (!static_obj) { + static_obj = new InfoReader( pref->mplayer_bin ); + static_obj->getInfo(); + } + return static_obj; +} + +InfoReader::InfoReader( QString mplayer_bin, QObject * parent ) + : QObject(parent) +{ + mplayerbin = mplayer_bin; + +#if USE_QPROCESS + proc = new QProcess(this); + proc->setProcessChannelMode( QProcess::MergedChannels ); +#else + proc = new MyProcess(this); + + connect( proc, SIGNAL(lineAvailable(QByteArray)), + this, SLOT(readLine(QByteArray)) ); +#endif +} + +InfoReader::~InfoReader() { +} + +void InfoReader::getInfo() { + waiting_for_key = TRUE; + vo_list.clear(); + ao_list.clear(); + demuxer_list.clear(); + + run("-identify -vo help -ao help -demuxer help -vc help -ac help"); + + //list(); +} + +void InfoReader::list() { + qDebug("InfoReader::list"); + + InfoList::iterator it; + + qDebug(" vo_list:"); + for ( it = vo_list.begin(); it != vo_list.end(); ++it ) { + qDebug( "driver: '%s', desc: '%s'", (*it).name().toUtf8().data(), (*it).desc().toUtf8().data()); + } + + qDebug(" ao_list:"); + for ( it = ao_list.begin(); it != ao_list.end(); ++it ) { + qDebug( "driver: '%s', desc: '%s'", (*it).name().toUtf8().data(), (*it).desc().toUtf8().data()); + } + + qDebug(" demuxer_list:"); + for ( it = demuxer_list.begin(); it != demuxer_list.end(); ++it ) { + qDebug( "demuxer: '%s', desc: '%s'", (*it).name().toUtf8().data(), (*it).desc().toUtf8().data()); + } + + qDebug(" vc_list:"); + for ( it = vc_list.begin(); it != vc_list.end(); ++it ) { + qDebug( "codec: '%s', desc: '%s'", (*it).name().toUtf8().data(), (*it).desc().toUtf8().data()); + } + + qDebug(" ac_list:"); + for ( it = ac_list.begin(); it != ac_list.end(); ++it ) { + qDebug( "codec: '%s', desc: '%s'", (*it).name().toUtf8().data(), (*it).desc().toUtf8().data()); + } + +} + +static QRegExp rx_vo_key("^ID_VIDEO_OUTPUTS"); +static QRegExp rx_ao_key("^ID_AUDIO_OUTPUTS"); +static QRegExp rx_demuxer_key("^ID_DEMUXERS"); +static QRegExp rx_ac_key("^ID_AUDIO_CODECS"); +static QRegExp rx_vc_key("^ID_VIDEO_CODECS"); + +static QRegExp rx_driver("\\t(.*)\\t(.*)"); +static QRegExp rx_demuxer("^\\s+([A-Z,a-z,0-9]+)\\s+(\\d+)\\s+(\\S.*)"); +static QRegExp rx_codec("^([A-Z,a-z,0-9]+)\\s+([A-Z,a-z,0-9]+)\\s+([A-Z,a-z,0-9]+)\\s+(\\S.*)"); + +void InfoReader::readLine(QByteArray line) { + qDebug("InfoReader::readLine: line: '%s'", line.data()); + //qDebug("waiting_for_key: %d", waiting_for_key); + + if (!waiting_for_key) { + if ( rx_driver.indexIn(line) > -1 ) { + QString name = rx_driver.cap(1); + QString desc = rx_driver.cap(2); + qDebug("InfoReader::readLine: found driver: '%s' '%s'", name.toUtf8().data(), desc.toUtf8().data()); + if (reading_type==VO) { + vo_list.append( InfoData(name, desc) ); + } + else + if (reading_type==AO) { + ao_list.append( InfoData(name, desc) ); + } + else + qWarning("InfoReader::readLine: Unknown type! Ignoring"); + } + else + if ( rx_demuxer.indexIn(line) > -1 ) { + QString name = rx_demuxer.cap(1); + QString desc = rx_demuxer.cap(3); + qDebug("InfoReader::readLine: found demuxer: '%s' '%s'", name.toUtf8().data(), desc.toUtf8().data()); + demuxer_list.append( InfoData(name, desc) ); + } + else + if ( rx_codec.indexIn(line) > -1 ) { + QString name = rx_codec.cap(1); + QString desc = rx_codec.cap(4); + qDebug("InfoReader::readLine: found codec: '%s' '%s'", name.toUtf8().data(), desc.toUtf8().data()); + if (reading_type==VC) { + vc_list.append( InfoData(name, desc) ); + } + else + if (reading_type==AC) { + ac_list.append( InfoData(name, desc) ); + } + else + qWarning("InfoReader::readLine: Unknown type! Ignoring"); + } + } + + if ( rx_vo_key.indexIn(line) > -1 ) { + reading_type = VO; + waiting_for_key = FALSE; + qDebug("InfoReader::readLine: found key: vo"); + } + + if ( rx_ao_key.indexIn(line) > -1 ) { + reading_type = AO; + waiting_for_key = FALSE; + qDebug("InfoReader::readLine: found key: ao"); + } + + if ( rx_demuxer_key.indexIn(line) > -1 ) { + reading_type = DEMUXER; + waiting_for_key = FALSE; + qDebug("InfoReader::readLine: found key: demuxer"); + } + + if ( rx_ac_key.indexIn(line) > -1 ) { + reading_type = AC; + waiting_for_key = FALSE; + qDebug("InfoReader::readLine: found key: ac"); + } + + if ( rx_vc_key.indexIn(line) > -1 ) { + reading_type = VC; + waiting_for_key = FALSE; + qDebug("InfoReader::readLines: found key: vc"); + } +} + +#if USE_QPROCESS +bool InfoReader::run(QString options) { + qDebug("InfoReader::run: '%s'", options.toUtf8().data()); + qDebug("InfoReader::run: using QProcess"); + + if (proc->state() == QProcess::Running) { + qWarning("InfoReader::run: process already running"); + return false; + } + + QStringList args = options.split(" "); + + proc->start(mplayerbin, args); + if (!proc->waitForStarted()) { + qWarning("InfoReader::run: process can't start!"); + return false; + } + + //Wait until finish + proc->waitForFinished(); + + qDebug("InfoReader::run : terminating"); + + QByteArray ba; + while (proc->canReadLine()) { + ba = proc->readLine(); + ba.replace("\n", ""); + ba.replace("\r", ""); + readLine( ba ); + } + + return true; +} +#else +bool InfoReader::run(QString options) { + qDebug("InfoReader::run: '%s'", options.toUtf8().data()); + qDebug("InfoReader::run: using myprocess"); + + if (proc->isRunning()) { + qWarning("InfoReader::run: process already running"); + return false; + } + + proc->clearArguments(); + + proc->addArgument(mplayerbin); + + QStringList args = options.split(" "); + QStringList::Iterator it = args.begin(); + while( it != args.end() ) { + proc->addArgument( (*it) ); + ++it; + } + + proc->start(); + if (!proc->waitForStarted()) { + qWarning("InfoReader::run: process can't start!"); + return false; + } + + //Wait until finish + proc->waitForFinished(); + + qDebug("InfoReader::run : terminating"); + + return true; +} +#endif + +#include "moc_inforeader.cpp" diff --git a/retroshare-gui/src/apps/smplayer/inforeader.h b/retroshare-gui/src/apps/smplayer/inforeader.h new file mode 100644 index 000000000..68132d2db --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/inforeader.h @@ -0,0 +1,104 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + + +#ifndef _INFOREADER_H_ +#define _INFOREADER_H_ + +#include +#include + +#define USE_QPROCESS 1 + +#if USE_QPROCESS +class QProcess; +#else +class MyProcess; +#endif + +class InfoData { + +public: + InfoData() {}; + InfoData( QString name, QString desc) { + _name = name; + _desc = desc; + }; + ~InfoData() {}; + + void setName(QString name) { _name = name; }; + void setDesc(QString desc) { _desc = desc; }; + + QString name() { return _name; }; + QString desc() { return _desc; }; + +private: + QString _name, _desc; +}; + + +typedef QList InfoList; + + +class InfoReader : QObject { + Q_OBJECT + +public: + InfoReader( QString mplayer_bin, QObject * parent = 0 ); + ~InfoReader(); + + void getInfo(); + + InfoList voList() { return vo_list; }; + InfoList aoList() { return ao_list; }; + InfoList demuxerList() { return demuxer_list; }; + InfoList vcList() { return vc_list; }; + InfoList acList() { return ac_list; }; + + static InfoReader * obj(); + +protected slots: + virtual void readLine(QByteArray); + +protected: + bool run(QString options); + void list(); + +protected: +#if USE_QPROCESS + QProcess * proc; +#else + MyProcess * proc; +#endif + QString mplayerbin; + + InfoList vo_list; + InfoList ao_list; + InfoList demuxer_list; + InfoList vc_list; + InfoList ac_list; + +private: + bool waiting_for_key; + int reading_type; + + static InfoReader * static_obj; +}; + + +#endif diff --git a/retroshare-gui/src/apps/smplayer/input.conf b/retroshare-gui/src/apps/smplayer/input.conf new file mode 100644 index 000000000..cf543ab26 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/input.conf @@ -0,0 +1,70 @@ +## prevent mplayer from messing up our shortcuts + +RIGHT gui_about +LEFT gui_about +DOWN gui_about +UP gui_about +PGUP gui_about +PGDWN gui_about +- gui_about ++ gui_about +ESC gui_about +ENTER gui_about +SPACE pausing_keep gui_about +HOME gui_about +END gui_about +> gui_about +< gui_about +INS gui_about +DEL gui_about +[ gui_about +] gui_about +{ gui_about +} gui_about +BS gui_about +TAB gui_about +. gui_about +# gui_about +@ gui_about +! gui_about +9 gui_about +/ gui_about +0 gui_about +* gui_about +1 gui_about +2 gui_about +3 gui_about +4 gui_about +5 gui_about +6 gui_about +7 gui_about +8 gui_about +a gui_about +b gui_about +c gui_about +d gui_about +e gui_about +F invalid_command +f invalid_command +g gui_about +h gui_about +i gui_about +j gui_about +k gui_about +l gui_about +m gui_about +n gui_about +o gui_about +p gui_about +q gui_about +r gui_about +s gui_about +t gui_about +T gui_about +u gui_about +v gui_about +w gui_about +x gui_about +y gui_about +z gui_about +S gui_about diff --git a/retroshare-gui/src/apps/smplayer/inputdvddirectory.cpp b/retroshare-gui/src/apps/smplayer/inputdvddirectory.cpp new file mode 100644 index 000000000..2a23046ae --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/inputdvddirectory.cpp @@ -0,0 +1,58 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "inputdvddirectory.h" + +#include +#include "filedialog.h" + +InputDVDDirectory::InputDVDDirectory( QWidget* parent, Qt::WindowFlags f ) + : QDialog(parent, f) +{ + setupUi(this); +} + +InputDVDDirectory::~InputDVDDirectory() { +} + +void InputDVDDirectory::setFolder(QString folder) { + dvd_directory_edit->setText( folder ); +} + +QString InputDVDDirectory::folder() { + return dvd_directory_edit->text(); +} + +void InputDVDDirectory::on_searchButton_clicked() { + QString s = MyFileDialog::getExistingDirectory( + this, tr("Choose a directory"), + dvd_directory_edit->text() ); + /* + QString s = QFileDialog::getOpenFileName( + dvd_directory_edit->text(), + "*.*", this, + "select_dvd_device_dialog", + tr("Choose a directory or iso file") ); + */ + + if (!s.isEmpty()) { + dvd_directory_edit->setText(s); + } +} + +#include "moc_inputdvddirectory.cpp" diff --git a/retroshare-gui/src/apps/smplayer/inputdvddirectory.h b/retroshare-gui/src/apps/smplayer/inputdvddirectory.h new file mode 100644 index 000000000..03c92c574 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/inputdvddirectory.h @@ -0,0 +1,40 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef _INPUTDVDDIRECTORY_H_ +#define _INPUTDVDDIRECTORY_H_ + +#include "ui_inputdvddirectory.h" + +class InputDVDDirectory : public QDialog, public Ui::InputDVDDirectory +{ + Q_OBJECT + +public: + InputDVDDirectory( QWidget* parent = 0, Qt::WindowFlags f = 0 ); + ~InputDVDDirectory(); + + void setFolder(QString folder); + QString folder(); + +protected slots: + void on_searchButton_clicked(); +}; + + +#endif diff --git a/retroshare-gui/src/apps/smplayer/inputdvddirectory.ui b/retroshare-gui/src/apps/smplayer/inputdvddirectory.ui new file mode 100644 index 000000000..ef24e1a5f --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/inputdvddirectory.ui @@ -0,0 +1,171 @@ + + InputDVDDirectory + + + + 0 + 0 + 586 + 140 + + + + SMPlayer - Play a DVD from a folder + + + + + + true + + + + 9 + + + 6 + + + + + + 7 + 5 + 0 + 0 + + + + You can play a dvd from your hard disc. Just select the folder which contains the VIDEO_TS and AUDIO_TS directories. + + + Qt::AlignVCenter + + + true + + + + + + + 0 + + + 6 + + + + + + 7 + 0 + 0 + 0 + + + + + + + + Choose a directory... + + + + + + + + + + 7 + 0 + 0 + 0 + + + + QFrame::HLine + + + QFrame::Sunken + + + Qt::Horizontal + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok + + + + + + + + + qPixmapFromMimeSource + + + + buttonBox + accepted() + InputDVDDirectory + accept() + + + 468 + 185 + + + 286 + 132 + + + + + buttonBox + rejected() + InputDVDDirectory + reject() + + + 468 + 185 + + + 286 + 132 + + + + + diff --git a/retroshare-gui/src/apps/smplayer/inputurl.cpp b/retroshare-gui/src/apps/smplayer/inputurl.cpp new file mode 100644 index 000000000..82a6d7e3c --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/inputurl.cpp @@ -0,0 +1,54 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "inputurl.h" +#include "images.h" + +InputURL::InputURL( QWidget* parent, Qt::WindowFlags f ) + : QDialog(parent, f) +{ + setupUi(this); + url_icon->setPixmap( Images::icon("url_big") ); + url_edit->setFocus(); + + playlist_check->setWhatsThis( + tr("If this option is checked, the URL will be treated as a playlist: " + "it will be opened as text and will play the URLs in it.") ); +} + +InputURL::~InputURL() { +} + +void InputURL::setURL(QString url) { + url_edit->setText(url); + url_edit->selectAll(); +} + +QString InputURL::url() { + return url_edit->text(); +} + +void InputURL::setPlaylist(bool b) { + playlist_check->setChecked(b); +} + +bool InputURL::isPlaylist() { + return playlist_check->isChecked(); +} + +#include "moc_inputurl.cpp" diff --git a/retroshare-gui/src/apps/smplayer/inputurl.h b/retroshare-gui/src/apps/smplayer/inputurl.h new file mode 100644 index 000000000..1d7337c6a --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/inputurl.h @@ -0,0 +1,40 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef _INPUTURL_H_ +#define _INPUTURL_H_ + +#include "ui_inputurl.h" +#include + +class InputURL : public QDialog, public Ui::InputURL +{ + Q_OBJECT + +public: + InputURL( QWidget* parent = 0, Qt::WindowFlags f = 0 ); + ~InputURL(); + + void setURL(QString url); + QString url(); + + void setPlaylist(bool b); + bool isPlaylist(); +}; + +#endif diff --git a/retroshare-gui/src/apps/smplayer/inputurl.ui b/retroshare-gui/src/apps/smplayer/inputurl.ui new file mode 100644 index 000000000..9880f0380 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/inputurl.ui @@ -0,0 +1,144 @@ + + InputURL + + + + 0 + 0 + 608 + 126 + + + + SMPlayer - Enter URL + + + + + + + 9 + + + 6 + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + It's a &playlist + + + + + + + + + Qt::Horizontal + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok + + + + + + + 0 + + + 6 + + + + + &URL: + + + url_edit + + + + + + + + + + + + + + + :/icons-png/url_big.png + + + + + + + + + + + buttonBox + accepted() + InputURL + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + InputURL + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/retroshare-gui/src/apps/smplayer/logwindow.cpp b/retroshare-gui/src/apps/smplayer/logwindow.cpp new file mode 100644 index 000000000..87d072f21 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/logwindow.cpp @@ -0,0 +1,116 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "logwindow.h" +#include +#include "filedialog.h" +#include +#include +#include +#include +#include + +#include "images.h" + +LogWindow::LogWindow( QWidget* parent ) + : QWidget(parent, Qt::Window ) +{ + setupUi(this); + + browser->setFont( QFont("fixed") ); + + retranslateStrings(); +} + +LogWindow::~LogWindow() { +} + +void LogWindow::retranslateStrings() { + retranslateUi(this); + + saveButton->setText(""); + copyButton->setText(""); + + saveButton->setIcon( Images::icon("save") ); + copyButton->setIcon( Images::icon("copy") ); + + setWindowIcon( Images::icon("logo") ); +} + + +void LogWindow::setText(QString log) { + browser->setPlainText(log); +} + +QString LogWindow::text() { + return browser->toPlainText(); +} + +void LogWindow::on_copyButton_clicked() { + browser->selectAll(); + browser->copy(); +} + +void LogWindow::on_saveButton_clicked() { + QString s = MyFileDialog::getSaveFileName( + this, tr("Choose a filename to save under"), + "", tr("Logs") +" (*.log *.txt)" ); + + if (!s.isEmpty()) { + if (QFileInfo(s).exists()) { + int res =QMessageBox::question( this, + tr("Confirm overwrite?"), + tr("The file already exists.\n" + "Do you want to overwrite?"), + QMessageBox::Yes, + QMessageBox::No, + QMessageBox::NoButton); + if (res == QMessageBox::No ) { + return; + } + } + + QFile file( s ); + if ( file.open( QIODevice::WriteOnly ) ) { + QTextStream stream( &file ); + stream << browser->toPlainText(); + file.close(); + } else { + // Error opening file + qDebug("LogWindow::save: error saving file"); + QMessageBox::warning ( this, + tr("Error saving file"), + tr("The log couldn't be saved"), + QMessageBox::Ok, + QMessageBox::NoButton, + QMessageBox::NoButton ); + + } + } +} + +// Language change stuff +void LogWindow::changeEvent(QEvent *e) { + if (e->type() == QEvent::LanguageChange) { + retranslateStrings(); + } else { + QWidget::changeEvent(e); + } +} + +#include "moc_logwindow.cpp" diff --git a/retroshare-gui/src/apps/smplayer/logwindow.h b/retroshare-gui/src/apps/smplayer/logwindow.h new file mode 100644 index 000000000..4c24cd799 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/logwindow.h @@ -0,0 +1,45 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef _LOGWINDOW_H_ +#define _LOGWINDOW_H_ + +#include "ui_logwindowbase.h" + +class LogWindow : public QWidget, public Ui::LogWindowBase +{ + Q_OBJECT + +public: + LogWindow( QWidget* parent = 0); + ~LogWindow(); + + void setText(QString log); + QString text(); + +protected: + virtual void retranslateStrings(); + virtual void changeEvent ( QEvent * event ) ; + +protected slots: + void on_copyButton_clicked(); + void on_saveButton_clicked(); +}; + + +#endif diff --git a/retroshare-gui/src/apps/smplayer/logwindowbase.ui b/retroshare-gui/src/apps/smplayer/logwindowbase.ui new file mode 100644 index 000000000..46d5d8eac --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/logwindowbase.ui @@ -0,0 +1,112 @@ + + Ricardo Villalba + LogWindowBase + + + + 0 + 0 + 615 + 541 + + + + Log Window + + + + + + + 11 + + + 6 + + + + + true + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 191 + 21 + + + + + + + + Save + + + Save + + + + + + + Copy to clipboard + + + Copy to clipboard + + + + + + + Close + + + &Close + + + + + + + + + qPixmapFromMimeSource + + + + closeButton + clicked() + LogWindowBase + close() + + + 20 + 20 + + + 20 + 20 + + + + + diff --git a/retroshare-gui/src/apps/smplayer/main.cpp b/retroshare-gui/src/apps/smplayer/main.cpp new file mode 100644 index 000000000..477b7f015 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/main.cpp @@ -0,0 +1,439 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + + +#include "defaultgui.h" +#include "helper.h" +#include "global.h" +#include "preferences.h" +#include "translator.h" +#include "version.h" +#include "config.h" +#include "myclient.h" +#include "constants.h" + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +static QRegExp rx_log; + +void myMessageOutput( QtMsgType type, const char *msg ) { + if ( (!pref) || (!pref->log_smplayer) ) return; + + rx_log.setPattern(pref->log_filter); + + QString line = QString::fromUtf8(msg); + switch ( type ) { + case QtDebugMsg: + if (rx_log.indexIn(line) > -1) { + #ifndef NO_DEBUG_ON_CONSOLE + fprintf( stderr, "Debug: %s\n", line.toLocal8Bit().data() ); + #endif + Helper::addLog( line ); + } + break; + case QtWarningMsg: + #ifndef NO_DEBUG_ON_CONSOLE + fprintf( stderr, "Warning: %s\n", line.toLocal8Bit().data() ); + #endif + Helper::addLog( "WARNING: " + line ); + break; + case QtFatalMsg: + #ifndef NO_DEBUG_ON_CONSOLE + fprintf( stderr, "Fatal: %s\n", line.toLocal8Bit().data() ); + #endif + Helper::addLog( "FATAL: " + line ); + abort(); // deliberately core dump + case QtCriticalMsg: + #ifndef NO_DEBUG_ON_CONSOLE + fprintf( stderr, "Critical: %s\n", line.toLocal8Bit().data() ); + #endif + Helper::addLog( "CRITICAL: " + line ); + break; + } +} + +void showInfo() { + QString s = QObject::tr("This is SMPlayer v. %1 running on %2") + .arg(smplayerVersion()) +#ifdef Q_OS_LINUX + .arg("Linux") +#else +#ifdef Q_OS_WIN + .arg("Windows") +#else + .arg("Other OS") +#endif +#endif + ; + + printf("%s\n", s.toLocal8Bit().data() ); + qDebug("%s", s.toUtf8().data() ); + qDebug("Qt v. " QT_VERSION_STR); + + qDebug(" * application path: '%s'", Helper::appPath().toUtf8().data()); + qDebug(" * data path: '%s'", Helper::dataPath().toUtf8().data()); + qDebug(" * translation path: '%s'", Helper::translationPath().toUtf8().data()); + qDebug(" * doc path: '%s'", Helper::docPath().toUtf8().data()); + qDebug(" * themes path: '%s'", Helper::themesPath().toUtf8().data()); + qDebug(" * shortcuts path: '%s'", Helper::shortcutsPath().toUtf8().data()); + qDebug(" * smplayer home path: '%s'", Helper::appHomePath().toUtf8().data()); +} + +QString formatText(QString s, int col) { + QString res = ""; + + int last = 0; + int pos; + + pos = s.indexOf(" "); + while (pos != -1) { + + if (s.count() < col) { + res = res + s; + s = ""; + break; + } + + while ((pos < col) && (pos != -1)) { + last = pos; + pos = s.indexOf(" ", pos+1); + } + + res = res + s.left(last) + "\n"; + s = s.mid(last+1); + + last = 0; + pos = s.indexOf(" "); + + } + + if (!s.isEmpty()) res = res + s; + + return res; +} + +QString formatHelp(QString parameter, QString help) { + int par_width = 20; + int help_width = 80 - par_width; + + QString s; + s = s.fill( ' ', par_width - (parameter.count()+2) ); + s = s + parameter + ": "; + + QString f; + f = f.fill(' ', par_width); + + QString s2 = formatText(help, help_width); + int pos = s2.indexOf('\n'); + while (pos != -1) { + s2 = s2.insert(pos+1, f); + pos = s2.indexOf('\n', pos+1); + } + + return s + s2; +} + +void printHelp(QString parameter, QString help) { + QString s = formatHelp(parameter, help); + printf( "%s\n", s.toLocal8Bit().data() ); +} + +void showHelp(QString app_name) { + printf( "%s\n", formatText(QObject::tr("Usage: %1 [-ini-path directory] " + "[-send-action action_name] [-actions action_list " + "[-close-at-end] [-no-close-at-end] [-fullscreen] [-no-fullscreen] " + "[-add-to-playlist] [-help|--help|-h|-?] " + "[[-playlist] media] " + "[[-playlist] media]...").arg(app_name), 80).toLocal8Bit().data() ); + + printHelp( "-ini-path", QObject::tr( + "specifies the directory for the configuration file " + "(smplayer.ini).") ); + + printHelp( "-send-action", QObject::tr( + "tries to make a connection to another running instance " + "and send to it the specified action. Example: -send-action pause " + "The rest of options (if any) will be ignored and the " + "application will exit. It will return 0 on success or -1 " + "on failure.") ); + + printHelp( "-actions", QObject::tr( + "action_list is a list of actions separated by spaces. " + "The actions will be executed just after loading the file (if any) " + "in the same order you entered. For checkable actions you can pass " + "true or false as parameter. Example: " + "-actions \"fullscreen compact true\". Quotes are necessary in " + "case you pass more than one action.") ); + + printHelp( "-close-at-end", QObject::tr( + "the main window will be closed when the file/playlist finishes.") ); + + printHelp( "-no-close-at-end", QObject::tr( + "the main window won't be closed when the file/playlist finishes.") ); + + printHelp( "-fullscreen", QObject::tr( + "the video will be played in fullscreen mode.") ); + + printHelp( "-no-fullscreen", QObject::tr( + "the video will be played in window mode.") ); + + printHelp( "-help", QObject::tr( + "will show this message and then will exit.") ); + + printHelp( "-add-to-playlist", QObject::tr( + "if there's another instance running, the media will be added " + "to that instance's playlist. If there's no other instance, " + "this option will be ignored and the " + "files will be opened in a new instance.") ); + + printHelp( QObject::tr("media"), QObject::tr( + "'media' is any kind of file that SMPlayer can open. It can " + "be a local file, a DVD (e.g. dvd://1), an Internet stream " + "(e.g. mms://....) or a local playlist in format m3u. " + "If the -playlist option is used, that means that SMPlayer " + "will pass the -playlist option to MPlayer, so MPlayer will " + "handle the playlist, not SMPlayer.") ); +} + +void createHomeDirectory() { + // Create smplayer home directories + if (!QFile::exists(Helper::appHomePath())) { + QDir d; + if (!d.mkdir(Helper::appHomePath())) { + qWarning("main: can't create %s", Helper::appHomePath().toUtf8().data()); + } + QString s = Helper::appHomePath() + "/screenshots"; + if (!d.mkdir(s)) { + qWarning("main: can't create %s", s.toUtf8().data()); + } + } +} + +int main( int argc, char ** argv ) +{ + QApplication a( argc, argv ); + + QString app_path = a.applicationDirPath(); + Helper::setAppPath(app_path); + //qDebug( "main: application path: '%s'", app_path.toUtf8().data()); + + QString ini_path=""; + QStringList files_to_play; + QString action; // Action to be passed to running instance + QString actions_list; // Actions to be run on startup + bool add_to_playlist = false; + + QString app_name = QFileInfo(a.applicationFilePath()).baseName(); + qDebug("main: app name: %s", app_name.toUtf8().data()); + // If the name is smplayer_portable, activate the -ini_path by default + if (app_name.toLower() == "smplayer_portable") { + ini_path = Helper::appPath(); + } + else if (QFile::exists( Helper::appPath() + "/smplayer.ini" ) ) { + ini_path = Helper::appPath(); + qDebug("Using existing %s", QString(Helper::appPath() + "/smplayer.ini").toUtf8().data()); + } + + int close_at_end = -1; // -1 = not set, 1 = true, 0 false + int start_in_fullscreen = -1; + bool show_help = false; + + // Deleted KDE code + // ... + + // Qt code + int arg_init = 1; + int arg_count = a.arguments().count(); + + bool is_playlist = false; + + if ( arg_count > arg_init ) { + for (int n=arg_init; n < arg_count; n++) { + QString argument = a.arguments()[n]; + if (argument == "-ini-path") { + //qDebug( "ini_path: %d %d", n+1, arg_count ); + ini_path = Helper::appPath(); + if (n+1 < arg_count) { + n++; + ini_path = a.arguments()[n]; + } else { + printf("Error: expected parameter for -ini-path\r\n"); + return -1; + } + } + else + if (argument == "-send-action") { + if (n+1 < arg_count) { + n++; + action = a.arguments()[n]; + } else { + printf("Error: expected parameter for -send-action\r\n"); + return -1; + } + } + else + if (argument == "-actions") { + if (n+1 < arg_count) { + n++; + actions_list = a.arguments()[n]; + } else { + printf("Error: expected parameter for -actions\r\n"); + return -1; + } + } + else + if (argument == "-playlist") { + is_playlist = true; + } + else + if ((argument == "--help") || (argument == "-help") || + (argument == "-h") || (argument == "-?") ) { + show_help = true; + } + else + if (argument == "-close-at-end") { + close_at_end = 1; + } + else + if (argument == "-no-close-at-end") { + close_at_end = 0; + } + else + if (argument == "-fullscreen") { + start_in_fullscreen = 1; + } + else + if (argument == "-no-fullscreen") { + start_in_fullscreen = 0; + } + else + if (argument == "-add-to-playlist") { + add_to_playlist = true; + } + else { + // File + if (QFile::exists( argument )) { + argument = QFileInfo(argument).absoluteFilePath(); + } + if (is_playlist) { + argument = argument + IS_PLAYLIST_TAG; + is_playlist = false; + } + files_to_play.append( argument ); + } + } + } + + if (ini_path.isEmpty()) createHomeDirectory(); + + global_init(ini_path); + + qInstallMsgHandler( myMessageOutput ); + + // Application translations + translator->load( pref->language ); + + showInfo(); + // FIXME: this should be in showInfo() ? + qDebug(" * ini path: '%s'", ini_path.toUtf8().data()); + + if (show_help) { + showHelp(app_name); + return 0; + } + + qDebug("main: files_to_play: count: %d", files_to_play.count() ); + for (int n=0; n < files_to_play.count(); n++) { + qDebug("main: files_to_play[%d]: '%s'", n, files_to_play[n].toUtf8().data()); + } + + + if (pref->use_single_instance) { + // Single instance + MyClient *c = new MyClient(pref->connection_port); + //c->setTimeOut(1000); + if (c->openConnection()) { + qDebug("main: found another instance"); + + if (!action.isEmpty()) { + if (c->sendAction(action)) { + qDebug("main: action passed successfully to the running instance"); + } else { + printf("Error: action couldn't be passed to the running instance"); + return -1; + } + } + else + if (!files_to_play.isEmpty()) { + if (c->sendFiles(files_to_play, add_to_playlist)) { + qDebug("main: files sent successfully to the running instance"); + qDebug("main: exiting."); + } else { + qDebug("main: files couldn't be sent to another instance"); + } + } + + return 0; + + } else { + if (!action.isEmpty()) { + printf("Error: no running instance found\r\n"); + return -1; + } + } + } + + if (!pref->default_font.isEmpty()) { + QFont f; + f.fromString(pref->default_font); + a.setFont(f); + } + + if (close_at_end != -1) { + pref->close_on_finish = close_at_end; + } + + if (start_in_fullscreen != -1) { + pref->start_in_fullscreen = start_in_fullscreen; + } + + DefaultGui * w = new DefaultGui(0); + + if (!w->startHidden() || !files_to_play.isEmpty() ) w->show(); + if (!files_to_play.isEmpty()) w->openFiles(files_to_play); + + if (!actions_list.isEmpty()) w->runActions(actions_list); + + a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) ); + + int r = a.exec(); + delete w; + + global_end(); + + return r; +} diff --git a/retroshare-gui/src/apps/smplayer/mediadata.cpp b/retroshare-gui/src/apps/smplayer/mediadata.cpp new file mode 100644 index 000000000..8c4a2c6d9 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/mediadata.cpp @@ -0,0 +1,145 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "mediadata.h" +#include +#include + + +MediaData::MediaData() { + reset(); +} + +MediaData::~MediaData() { +} + +void MediaData::reset() { + filename=""; + dvd_id=""; + type = TYPE_UNKNOWN; + duration=0; + + novideo = FALSE; + + video_width=0; + video_height=0; + video_aspect= (double) 4/3; + + audios.clear(); + titles.clear(); + +#if SUBTITLES_BY_INDEX + subs.clear(); +#else + subtitles.clear(); +#endif + + //chapters=0; + //angles=0; + + mkv_chapters=0; + + initialized=false; + + // Clip info; + clip_name = ""; + clip_artist = ""; + clip_author = ""; + clip_album = ""; + clip_genre = ""; + clip_date = ""; + clip_track = ""; + clip_copyright = ""; + clip_comment = ""; + clip_software = ""; + + stream_title = ""; + stream_url = ""; + + // Other data + demuxer=""; + video_format=""; + audio_format=""; + video_bitrate=0; + video_fps=""; + audio_bitrate=0; + audio_rate=0; + audio_nch=0; + video_codec=""; + audio_codec=""; +} + +QString MediaData::displayName() { + if (!clip_name.isEmpty()) return clip_name; + else + if (!stream_title.isEmpty()) return stream_title; + + QFileInfo fi(filename); + if (fi.exists()) + return fi.fileName(); // filename without path + else + return filename; +} + + +void MediaData::list() { + qDebug("MediaData::list"); + + qDebug(" filename: '%s'", filename.toUtf8().data()); + qDebug(" duration: %f", duration); + + qDebug(" video_width: %d", video_width); + qDebug(" video_height: %d", video_height); + qDebug(" video_aspect: %f", video_aspect); + + qDebug(" type: %d", type); + qDebug(" novideo: %d", novideo); + qDebug(" dvd_id: '%s'", dvd_id.toUtf8().data()); + + qDebug(" initialized: %d", initialized); + + qDebug(" mkv_chapters: %d", mkv_chapters); + + qDebug(" Subs:"); +#if SUBTITLES_BY_INDEX + subs.list(); +#else + subtitles.list(); +#endif + + qDebug(" Audios:"); + audios.list(); + + qDebug(" Titles:"); + titles.list(); + + //qDebug(" chapters: %d", chapters); + //qDebug(" angles: %d", angles); + + qDebug(" demuxer: '%s'", demuxer.toUtf8().data() ); + qDebug(" video_format: '%s'", video_format.toUtf8().data() ); + qDebug(" audio_format: '%s'", audio_format.toUtf8().data() ); + qDebug(" video_bitrate: %d", video_bitrate ); + qDebug(" video_fps: '%s'", video_fps.toUtf8().data() ); + qDebug(" audio_bitrate: %d", audio_bitrate ); + qDebug(" audio_rate: %d", audio_rate ); + qDebug(" audio_nch: %d", audio_nch ); + qDebug(" video_codec: '%s'", video_codec.toUtf8().data() ); + qDebug(" audio_codec: '%s'", audio_codec.toUtf8().data() ); +} + diff --git a/retroshare-gui/src/apps/smplayer/mediadata.h b/retroshare-gui/src/apps/smplayer/mediadata.h new file mode 100644 index 000000000..cf568e7d0 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/mediadata.h @@ -0,0 +1,115 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef _MEDIADATA_H_ +#define _MEDIADATA_H_ + +/* Here we store some volatile info about the file we need to remember */ + +#include "config.h" + +#if SUBTITLES_BY_INDEX +#include "subtracks.h" +#endif + +#include +#include +#include "tracks.h" + +// Types of media + +#define TYPE_UNKNOWN -1 +#define TYPE_FILE 0 +#define TYPE_DVD 1 +#define TYPE_STREAM 2 +#define TYPE_VCD 3 +#define TYPE_AUDIO_CD 4 + +class MediaData { + +public: + MediaData(); + virtual ~MediaData(); + + virtual void reset(); + + QString filename; + double duration; + + //Resolution of the video + int video_width; + int video_height; + double video_aspect; + + int type; // file, dvd... + QString dvd_id; + + bool novideo; // Only audio + + bool initialized; + + void list(); + + TrackList audios; + TrackList titles; // for DVDs + +#if SUBTITLES_BY_INDEX + SubTracks subs; +#else + TrackList subtitles; +#endif + + //int chapters, angles; // for DVDs + + // Matroshka chapters + int mkv_chapters; + + // Clip info + QString clip_name; + QString clip_artist; + QString clip_author; + QString clip_album; + QString clip_genre; + QString clip_date; + QString clip_track; + QString clip_copyright; + QString clip_comment; + QString clip_software; + + QString stream_title; + QString stream_url; + + + // Other data not really useful for us, + // just to show info to the user. + QString demuxer; + QString video_format; + QString audio_format; + int video_bitrate; + QString video_fps; + int audio_bitrate; + int audio_rate; + int audio_nch; // channels? + QString video_codec; + QString audio_codec; + + /*QString info();*/ + QString displayName(); +}; + +#endif diff --git a/retroshare-gui/src/apps/smplayer/mediasettings.cpp b/retroshare-gui/src/apps/smplayer/mediasettings.cpp new file mode 100644 index 000000000..560596d1d --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/mediasettings.cpp @@ -0,0 +1,316 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "mediasettings.h" +#include "preferences.h" +#include "global.h" +#include + +MediaSettings::MediaSettings() { + reset(); +} + +MediaSettings::~MediaSettings() { +} + +void MediaSettings::reset() { + current_sec = 0; + current_sub_id = NoneSelected; + current_audio_id = NoneSelected; + current_title_id = NoneSelected; + current_chapter_id = NoneSelected; + current_angle_id = NoneSelected; + letterbox = NoLetterbox; + aspect_ratio_id = AspectAuto; + //fullscreen = FALSE; + volume = pref->initial_volume; + mute = false; + external_subtitles = ""; + external_audio = ""; + sub_delay=0; + audio_delay=0; + sub_pos = pref->initial_sub_pos; // 100% by default + + brightness = pref->initial_brightness; + contrast = pref->initial_contrast; + gamma = pref->initial_gamma; + hue = pref->initial_hue; + saturation = pref->initial_saturation; + + speed = 1.0; + + phase_filter = FALSE; + current_denoiser = NoDenoise; + deblock_filter = FALSE; + dering_filter = FALSE; + noise_filter = FALSE; + postprocessing_filter = pref->initial_postprocessing; + + current_deinterlacer = NoDeinterlace; + panscan_filter = ""; + crop_43to169_filter = ""; + karaoke_filter = false; + extrastereo_filter = false; + volnorm_filter = pref->initial_volnorm; + + audio_use_channels = pref->initial_audio_channels; //ChDefault; // (0) + stereo_mode = Stereo; // (0) + + panscan_factor = pref->initial_panscan_factor; // 1.0; + + starting_time = -1; // Not set yet. + + flip = false; + + forced_demuxer=""; + forced_video_codec=""; + forced_audio_codec=""; + + original_demuxer=""; + original_video_codec=""; + original_audio_codec=""; + + mplayer_additional_options=""; + mplayer_additional_video_filters=""; + mplayer_additional_audio_filters=""; + + win_width=400; + win_height=300; +} + +double MediaSettings::win_aspect() { + return (double) win_width / win_height; +} + +void MediaSettings::list() { + qDebug("MediaSettings::list"); + + qDebug(" current_sec: %f", current_sec); + qDebug(" current_sub_id: %d", current_sub_id); + qDebug(" current_audio_id: %d", current_audio_id); + qDebug(" current_title_id: %d", current_title_id); + qDebug(" current_chapter_id: %d", current_chapter_id); + qDebug(" current_angle_id: %d", current_angle_id); + qDebug(" letterbox: %d", letterbox); + qDebug(" aspect_ratio_id: %d", aspect_ratio_id); + //qDebug(" fullscreen: %d", fullscreen); + qDebug(" volume: %d", volume); + qDebug(" mute: %d", mute); + qDebug(" external_subtitles: '%s'", external_subtitles.toUtf8().data()); + qDebug(" external_audio: '%s'", external_audio.toUtf8().data()); + qDebug(" sub_delay: %d", sub_delay); + qDebug(" audio_delay: %d", sub_delay); + qDebug(" sub_pos: %d", sub_pos); + + qDebug(" brightness: %d", brightness); + qDebug(" contrast: %d", contrast); + qDebug(" gamma: %d", gamma); + qDebug(" hue: %d", hue); + qDebug(" saturation: %d", saturation); + + qDebug(" speed: %f", speed); + + qDebug(" phase_filter: %d", phase_filter); + qDebug(" current_denoiser: %d", current_denoiser); + qDebug(" deblock_filter: %d", deblock_filter); + qDebug(" dering_filter: %d", dering_filter); + qDebug(" noise_filter: %d", noise_filter); + qDebug(" postprocessing_filter: %d", postprocessing_filter); + + qDebug(" current_deinterlacer: %d", current_deinterlacer); + qDebug(" panscan_filter: '%s'", panscan_filter.toUtf8().data()); + qDebug(" crop_43to169_filter: '%s'", crop_43to169_filter.toUtf8().data()); + qDebug(" karaoke_filter: %d", karaoke_filter); + qDebug(" extrastereo_filter: %d", extrastereo_filter); + qDebug(" volnorm_filter: %d", volnorm_filter); + + qDebug(" audio_use_channels: %d", audio_use_channels); + qDebug(" stereo_mode: %d", stereo_mode); + + qDebug(" panscan_factor: %f", panscan_factor); + + qDebug(" flip: %d", flip); + + qDebug(" forced_demuxer: '%s'", forced_demuxer.toUtf8().data()); + qDebug(" forced_video_codec: '%s'", forced_video_codec.toUtf8().data()); + qDebug(" forced_audio_codec: '%s'", forced_video_codec.toUtf8().data()); + + qDebug(" original_demuxer: '%s'", original_demuxer.toUtf8().data()); + qDebug(" original_video_codec: '%s'", original_video_codec.toUtf8().data()); + qDebug(" original_audio_codec: '%s'", original_video_codec.toUtf8().data()); + + qDebug(" mplayer_additional_options: '%s'", mplayer_additional_options.toUtf8().data()); + qDebug(" mplayer_additional_video_filters: '%s'", mplayer_additional_video_filters.toUtf8().data()); + qDebug(" mplayer_additional_audio_filters: '%s'", mplayer_additional_audio_filters.toUtf8().data()); + + qDebug(" win_width: %d", win_width); + qDebug(" win_height: %d", win_height); + qDebug(" win_aspect(): %f", win_aspect()); + + qDebug(" starting_time: %f", starting_time); +} + +void MediaSettings::save() { + qDebug("MediaSettings::save"); + + QSettings * set = settings; + + /*set->beginGroup( "mediasettings" );*/ + + set->setValue( "current_sec", current_sec ); + set->setValue( "current_sub_id", current_sub_id ); + set->setValue( "current_audio_id", current_audio_id ); + set->setValue( "current_title_id", current_title_id ); + set->setValue( "current_chapter_id", current_chapter_id ); + set->setValue( "current_angle_id", current_angle_id ); + set->setValue( "letterbox", letterbox ); + set->setValue( "aspect_ratio_id", aspect_ratio_id ); + //set->setValue( "fullscreen", fullscreen ); + set->setValue( "volume", volume ); + set->setValue( "mute", mute ); + set->setValue( "external_subtitles", external_subtitles ); + set->setValue( "external_audio", external_audio ); + set->setValue( "sub_delay", sub_delay); + set->setValue( "audio_delay", audio_delay); + set->setValue( "sub_pos", sub_pos); + + set->setValue( "brightness", brightness); + set->setValue( "contrast", contrast); + set->setValue( "gamma", gamma); + set->setValue( "hue", hue); + set->setValue( "saturation", saturation); + + set->setValue( "speed", speed); + + set->setValue( "phase_filter", phase_filter); + set->setValue( "current_denoiser", current_denoiser); + set->setValue( "deblock_filter", deblock_filter); + set->setValue( "dering_filter", dering_filter); + set->setValue( "noise_filter", noise_filter); + set->setValue( "postprocessing_filter", postprocessing_filter); + + set->setValue( "current_deinterlacer", current_deinterlacer); + set->setValue( "panscan_filter", panscan_filter); + set->setValue( "crop_43to169_filter", crop_43to169_filter); + set->setValue( "karaoke_filter", karaoke_filter); + set->setValue( "extrastereo_filter", extrastereo_filter); + set->setValue( "volnorm_filter", volnorm_filter); + + set->setValue( "audio_use_channels", audio_use_channels); + set->setValue( "stereo_mode", stereo_mode); + + set->setValue( "panscan_factor", panscan_factor); + + set->setValue( "flip", flip); + + set->setValue( "forced_demuxer", forced_demuxer); + set->setValue( "forced_video_codec", forced_video_codec); + set->setValue( "forced_audio_codec", forced_audio_codec); + + set->setValue( "original_demuxer", original_demuxer); + set->setValue( "original_video_codec", original_video_codec); + set->setValue( "original_audio_codec", original_audio_codec); + + set->setValue( "mplayer_additional_options", mplayer_additional_options); + set->setValue( "mplayer_additional_video_filters", mplayer_additional_video_filters); + set->setValue( "mplayer_additional_audio_filters", mplayer_additional_audio_filters); + + set->setValue( "win_width", win_width ); + set->setValue( "win_height", win_height ); + + set->setValue( "starting_time", starting_time ); + + /*set->endGroup();*/ +} + +void MediaSettings::load() { + qDebug("MediaSettings::load"); + + QSettings * set = settings; + + /*set->beginGroup( "mediasettings" );*/ + + current_sec = set->value( "current_sec", current_sec).toDouble(); + current_sub_id = set->value( "current_sub_id", current_sub_id ).toInt(); + current_audio_id = set->value( "current_audio_id", current_audio_id ).toInt(); + current_title_id = set->value( "current_title_id", current_title_id ).toInt(); + current_chapter_id = set->value( "current_chapter_id", current_chapter_id ).toInt(); + current_angle_id = set->value( "current_angle_id", current_angle_id ).toInt(); + letterbox = (LetterboxType) set->value( "letterbox", letterbox ).toInt(); + aspect_ratio_id = set->value( "aspect_ratio_id", aspect_ratio_id ).toInt(); + //fullscreen = set->value( "fullscreen", fullscreen ).toBool(); + volume = set->value( "volume", volume ).toInt(); + mute = set->value( "mute", mute ).toBool(); + external_subtitles = set->value( "external_subtitles", external_subtitles ).toString(); + external_audio = set->value( "external_audio", external_audio ).toString(); + sub_delay = set->value( "sub_delay", sub_delay).toInt(); + audio_delay = set->value( "audio_delay", audio_delay).toInt(); + sub_pos = set->value( "sub_pos", sub_pos).toInt(); + + brightness = set->value( "brightness", brightness).toInt(); + contrast = set->value( "contrast", contrast).toInt(); + gamma = set->value( "gamma", gamma).toInt(); + hue = set->value( "hue", hue).toInt(); + saturation = set->value( "saturation", saturation).toInt(); + + speed = set->value( "speed", speed ).toDouble(); + + phase_filter = set->value( "phase_filter", phase_filter ).toBool(); + current_denoiser = set->value( "current_denoiser", current_denoiser).toInt(); + deblock_filter = set->value( "deblock_filter", deblock_filter).toBool(); + dering_filter = set->value( "dering_filter", dering_filter).toBool(); + noise_filter = set->value( "noise_filter", noise_filter).toBool(); + postprocessing_filter = set->value( "postprocessing_filter", postprocessing_filter).toBool(); + + current_deinterlacer = set->value( "current_deinterlacer", current_deinterlacer ).toInt(); + panscan_filter = set->value( "panscan_filter", panscan_filter).toString(); + crop_43to169_filter = set->value( "crop_43to169_filter", crop_43to169_filter).toString(); + karaoke_filter = set->value( "karaoke_filter", karaoke_filter).toBool(); + extrastereo_filter = set->value( "extrastereo_filter", extrastereo_filter).toBool(); + volnorm_filter = set->value( "volnorm_filter", volnorm_filter).toBool(); + + audio_use_channels = set->value( "audio_use_channels", audio_use_channels).toInt(); + stereo_mode = set->value( "stereo_mode", stereo_mode).toInt(); + + panscan_factor = set->value( "panscan_factor", panscan_factor).toDouble(); + + flip = set->value( "flip", flip).toBool(); + + forced_demuxer = set->value( "forced_demuxer", forced_demuxer).toString(); + forced_video_codec = set->value( "forced_video_codec", forced_video_codec).toString(); + forced_audio_codec = set->value( "forced_audio_codec", forced_audio_codec).toString(); + + original_demuxer = set->value( "original_demuxer", original_demuxer).toString(); + original_video_codec = set->value( "original_video_codec", original_video_codec).toString(); + original_audio_codec = set->value( "original_audio_codec", original_audio_codec).toString(); + + mplayer_additional_options = set->value( "mplayer_additional_options", mplayer_additional_options).toString(); + mplayer_additional_video_filters = set->value( "mplayer_additional_video_filters", mplayer_additional_video_filters).toString(); + mplayer_additional_audio_filters = set->value( "mplayer_additional_audio_filters", mplayer_additional_audio_filters).toString(); + + win_width = set->value( "win_width", win_width ).toInt(); + win_height = set->value( "win_height", win_height ).toInt(); + + starting_time = set->value( "starting_time", starting_time ).toDouble(); + + /*set->endGroup();*/ + + // ChDefault not used anymore + if (audio_use_channels == ChDefault) audio_use_channels = ChStereo; +} + diff --git a/retroshare-gui/src/apps/smplayer/mediasettings.h b/retroshare-gui/src/apps/smplayer/mediasettings.h new file mode 100644 index 000000000..221a0f72c --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/mediasettings.h @@ -0,0 +1,140 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef _MEDIASETTINGS_H_ +#define _MEDIASETTINGS_H_ + + +/* Settings the user has set for this file, and that we need to */ +/* restore the video after a restart */ + +#include +#include + + +class MediaSettings { + +public: + enum LetterboxType { NoLetterbox = 0, Letterbox_43 = 1, Letterbox_169 = 2 }; + enum Denoise { NoDenoise = 0, DenoiseNormal = 1, DenoiseSoft = 2 }; + enum Aspect { AspectAuto = 1, Aspect43 = 2, Aspect169 = 3, Aspect235 = 4, + Aspect43Letterbox = 5, Aspect43Panscan = 6, + Aspect43To169 = 7, Aspect149 = 8, Aspect1610 = 9, + Aspect54 = 10, Aspect169Letterbox = 11 }; + enum Deinterlace { NoDeinterlace = 0, L5 = 1, Yadif = 2, LB = 3, + Yadif_1 = 4, Kerndeint = 5 }; + enum AudioChannels { ChDefault = 0, ChStereo = 2, ChSurround = 4, + ChFull51 = 6 }; + enum StereoMode { Stereo = 0, Left = 1, Right = 2 }; + enum IDs { NoneSelected = -1000, SubNone = 90000 }; + + MediaSettings(); + virtual ~MediaSettings(); + + virtual void reset(); + + double current_sec; + int current_sub_id; + + int current_audio_id; + + int current_title_id; + int current_chapter_id; + int current_angle_id; + + LetterboxType letterbox; // Force letterbox + int aspect_ratio_id; + + //bool fullscreen; + + int volume; + bool mute; + + int brightness, contrast, gamma, hue, saturation; + + QString external_subtitles; + QString external_audio; // external audio file + + int sub_delay; + int audio_delay; + + // Subtitles position (0-100) + int sub_pos; + + double speed; // Speed of playback: 1.0 = normal speed + + int current_deinterlacer; + QString panscan_filter; + QString crop_43to169_filter; + + // Filters in menu + bool phase_filter; + int current_denoiser; + bool deblock_filter; + bool dering_filter; + bool noise_filter; + bool postprocessing_filter; + + bool karaoke_filter; + bool extrastereo_filter; + bool volnorm_filter; + + int audio_use_channels; + int stereo_mode; + + double panscan_factor; // mplayerwindow zoom + + bool flip; //!< Flip image + + // This a property of the video and it should be + // in mediadata, but we have to save it to preserve + // this data among restarts. + double starting_time; // Some videos don't start at 0 + + // Advanced settings + QString forced_demuxer; + QString forced_video_codec; + QString forced_audio_codec; + + // A copy of the original values, so we can restore them. + QString original_demuxer; + QString original_video_codec; + QString original_audio_codec; + + // Options to mplayer (for this file only) + QString mplayer_additional_options; + QString mplayer_additional_video_filters; + QString mplayer_additional_audio_filters; + + // Some things that were before in mediadata + // They can vary, because of filters, so better here + + //Resolution used by mplayer + //Can be bigger that video resolution + //because of the aspect ratio or expand filter + int win_width; + int win_height; + double win_aspect(); + + + void list(); + void save(); + void load(); +}; + +#endif diff --git a/retroshare-gui/src/apps/smplayer/mplayerprocess.cpp b/retroshare-gui/src/apps/smplayer/mplayerprocess.cpp new file mode 100644 index 000000000..3ba6e9bca --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/mplayerprocess.cpp @@ -0,0 +1,612 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "mplayerprocess.h" +#include +#include +#include + +#include "global.h" +#include "preferences.h" +#include "config.h" + + +MplayerProcess::MplayerProcess(QObject * parent) : MyProcess(parent) +{ + connect( this, SIGNAL(lineAvailable(QByteArray)), + this, SLOT(parseLine(QByteArray)) ); + + connect( this, SIGNAL(finished(int,QProcess::ExitStatus)), + this, SLOT(processFinished()) ); + + connect( this, SIGNAL(error(QProcess::ProcessError)), + this, SLOT(gotError(QProcess::ProcessError)) ); + + notified_mplayer_is_running = FALSE; + last_sub_id = -1; + + init_rx(); +} + +MplayerProcess::~MplayerProcess() { +} + +bool MplayerProcess::start() { + init_rx(); // Update configurable regular expressions + + md.reset(); + notified_mplayer_is_running = false; + last_sub_id = -1; + received_end_of_file = false; + + MyProcess::start(); + return waitForStarted(); +} + +void MplayerProcess::writeToStdin(QString text) { + if (isRunning()) { + //qDebug("MplayerProcess::writeToStdin"); + write( text.toLocal8Bit() + "\n"); + } else { + qWarning("MplayerProcess::writeToStdin: process not running"); + } +} + + +static QRegExp rx_av("^[AV]: *([0-9,:.-]+)"); +static QRegExp rx_frame("^[AV]:.* (\\d+)\\/.\\d+");// [0-9,.]+"); +static QRegExp rx("^(.*)=(.*)"); +static QRegExp rx_audio_mat("^ID_AID_(\\d+)_(LANG|NAME)=(.*)"); +static QRegExp rx_title("^ID_DVD_TITLE_(\\d+)_(LENGTH|CHAPTERS|ANGLES)=(.*)"); +static QRegExp rx_winresolution("^VO: \\[(.*)\\] (\\d+)x(\\d+) => (\\d+)x(\\d+)"); +static QRegExp rx_ao("^AO: \\[(.*)\\]"); +static QRegExp rx_paused("^ID_PAUSED"); +static QRegExp rx_novideo("^Video: no video"); +static QRegExp rx_cache("^Cache fill:.*"); +static QRegExp rx_create_index("^Generating Index:.*"); +static QRegExp rx_play("^Starting playback..."); +static QRegExp rx_connecting("^Connecting to .*"); +static QRegExp rx_resolving("^Resolving .*"); +static QRegExp rx_screenshot("^\\*\\*\\* screenshot '(.*)'"); +static QRegExp rx_endoffile("^Exiting... \\(End of file\\)"); +static QRegExp rx_mkvchapters("\\[mkv\\] Chapter (\\d+) from"); +static QRegExp rx_aspect2("^Movie-Aspect is ([0-9,.]+):1"); + +// VCD +static QRegExp rx_vcd("^ID_VCD_TRACK_(\\d+)_MSF=(.*)"); + +// Audio CD +static QRegExp rx_cdda("^ID_CDDA_TRACK_(\\d+)_MSF=(.*)"); + + +//Subtitles +#if SUBTITLES_BY_INDEX +static QRegExp rx_subtitle("^ID_(SUBTITLE|FILE_SUB|VOBSUB)_ID=(\\d+)"); +static QRegExp rx_sid("^ID_(SID|VSID)_(\\d+)_(LANG|NAME)=(.*)"); +static QRegExp rx_subtitle_file("^ID_FILE_SUB_FILENAME=(.*)"); +#else +static QRegExp rx_subs("^ID_SID_(\\d+)_(LANG|NAME)=(.*)"); +#endif + +//Clip info +static QRegExp rx_clip_name("^ (name|title): (.*)", Qt::CaseInsensitive); +static QRegExp rx_clip_artist("^ artist: (.*)", Qt::CaseInsensitive); +static QRegExp rx_clip_author("^ author: (.*)", Qt::CaseInsensitive); +static QRegExp rx_clip_album("^ album: (.*)", Qt::CaseInsensitive); +static QRegExp rx_clip_genre("^ genre: (.*)", Qt::CaseInsensitive); +static QRegExp rx_clip_date("^ (creation date|year): (.*)", Qt::CaseInsensitive); +static QRegExp rx_clip_track("^ track: (.*)", Qt::CaseInsensitive); +static QRegExp rx_clip_copyright("^ copyright: (.*)", Qt::CaseInsensitive); +static QRegExp rx_clip_comment("^ comment: (.*)", Qt::CaseInsensitive); +static QRegExp rx_clip_software("^ software: (.*)", Qt::CaseInsensitive); + +static QRegExp rx_stream_title("^.* StreamTitle='(.*)';StreamUrl='(.*)';"); + +void MplayerProcess::init_rx() { + qDebug("MplayerProcess::init_rx"); + + if (!pref->rx_endoffile.isEmpty()) + rx_endoffile.setPattern(pref->rx_endoffile); + + if (!pref->rx_novideo.isEmpty()) + rx_novideo.setPattern(pref->rx_novideo); +} + + +void MplayerProcess::parseLine(QByteArray ba) { + //qDebug("MplayerProcess::parseLine: '%s'", ba.data() ); + + QString tag; + QString value; + + // Parse A: V: line + //qDebug("%s", line.toUtf8().data()); + if (rx_av.indexIn(ba) > -1) { + double sec = rx_av.cap(1).toDouble(); + //qDebug("cap(1): '%s'", rx_av.cap(1).toUtf8().data() ); + //qDebug("sec: %f", sec); + + if (!notified_mplayer_is_running) { + qDebug("MplayerProcess::parseLine: starting sec: %f", sec); + emit receivedStartingTime(sec); + emit mplayerFullyLoaded(); + notified_mplayer_is_running = true; + } + + emit receivedCurrentSec( sec ); + + // Check for frame + if (rx_frame.indexIn(ba) > -1) { + int frame = rx_frame.cap(1).toInt(); + //qDebug(" frame: %d", frame); + emit receivedCurrentFrame(frame); + } + } + else { + QString line = QString::fromLocal8Bit( ba ); + //QString line = QString::fromUtf8( ba ); + emit lineAvailable(line); + + // Parse other things + qDebug("MplayerProcess::parseLine: '%s'", line.toUtf8().data() ); + + // Screenshot + if (rx_screenshot.indexIn(line) > -1) { + QString shot = rx_screenshot.cap(1); + qDebug("MplayerProcess::parseLine: screenshot: '%s'", shot.toUtf8().data()); + emit receivedScreenshot( shot ); + } + else + + // End of file + if (rx_endoffile.indexIn(line) > -1) { + qDebug("MplayerProcess::parseLine: detected end of file"); + + // In case of playing VCDs or DVDs, maybe the first title + // is not playable, so the GUI doesn't get the info about + // available titles. So if we received the end of file + // first let's pretend the file has started so the GUI can have + // the data. + if ( !notified_mplayer_is_running) { + emit mplayerFullyLoaded(); + } + + //emit receivedEndOfFile(); + // Send signal once the process is finished, not now! + received_end_of_file = true; + } + else + + // Window resolution + if (rx_winresolution.indexIn(line) > -1) { + /* + md.win_width = rx_winresolution.cap(4).toInt(); + md.win_height = rx_winresolution.cap(5).toInt(); + md.video_aspect = (double) md.win_width / md.win_height; + */ + + int w = rx_winresolution.cap(4).toInt(); + int h = rx_winresolution.cap(5).toInt(); + + emit receivedVO( rx_winresolution.cap(1) ); + emit receivedWindowResolution( w, h ); + //emit mplayerFullyLoaded(); + } + else + + // No video + if (rx_novideo.indexIn(line) > -1) { + md.novideo = TRUE; + emit receivedNoVideo(); + //emit mplayerFullyLoaded(); + } + else + + // Pause + if (rx_paused.indexIn(line) > -1) { + emit receivedPause(); + } + + // Stream title + if (rx_stream_title.indexIn(line) > -1) { + QString s = rx_stream_title.cap(1); + QString url = rx_stream_title.cap(2); + qDebug("MplayerProcess::parseLine: stream_title: '%s'", s.toUtf8().data()); + qDebug("MplayerProcess::parseLine: stream_url: '%s'", url.toUtf8().data()); + md.stream_title = s; + md.stream_url = url; + emit receivedStreamTitleAndUrl( s, url ); + } + + // The following things are not sent when the file has started to play + // (or if sent, smplayer will ignore anyway...) + // So not process anymore, if video is playing to save some time + if (notified_mplayer_is_running) { + return; + } + +#if SUBTITLES_BY_INDEX + if (rx_subtitle.indexIn(line) > -1) { + md.subs.process(line); + } + else + if (rx_sid.indexIn(line) > -1) { + md.subs.process(line); + } + else + if (rx_subtitle_file.indexIn(line) > -1) { + md.subs.process(line); + } +#endif + + // AO + if (rx_ao.indexIn(line) > -1) { + emit receivedAO( rx_ao.cap(1) ); + } + else + +#if !SUBTITLES_BY_INDEX + // Matroska subtitles + if (rx_subs.indexIn(line) > -1) { + int ID = rx_subs.cap(1).toInt(); + QString lang = rx_subs.cap(3); + QString t = rx_subs.cap(2); + qDebug("MplayerProcess::parseLine: Subs: ID: %d, Lang: '%s' Type: '%s'", + ID, lang.toUtf8().data(), t.toUtf8().data()); + + if ( t == "NAME" ) + md.subtitles.addName(ID, lang); + else + md.subtitles.addLang(ID, lang); + } + else +#endif + + // Matroska audio + if (rx_audio_mat.indexIn(line) > -1) { + int ID = rx_audio_mat.cap(1).toInt(); + QString lang = rx_audio_mat.cap(3); + QString t = rx_audio_mat.cap(2); + qDebug("MplayerProcess::parseLine: Audio: ID: %d, Lang: '%s' Type: '%s'", + ID, lang.toUtf8().data(), t.toUtf8().data()); + + if ( t == "NAME" ) + md.audios.addName(ID, lang); + else + md.audios.addLang(ID, lang); + } + else + + // Matroshka chapters + if (rx_mkvchapters.indexIn(line)!=-1) { + int c = rx_mkvchapters.cap(1).toInt(); + qDebug("MplayerProcess::parseLine: mkv chapters: %d", c); + if (c > md.mkv_chapters) { + md.mkv_chapters = c; + qDebug("MplayerProcess::parseLine: mkv_chapters set to: %d", c); + } + } + else + + // VCD titles + if (rx_vcd.indexIn(line) > -1 ) { + int ID = rx_vcd.cap(1).toInt(); + QString length = rx_vcd.cap(2); + //md.titles.addID( ID ); + md.titles.addName( ID, length ); + } + else + + // Audio CD titles + if (rx_cdda.indexIn(line) > -1 ) { + int ID = rx_cdda.cap(1).toInt(); + QString length = rx_cdda.cap(2); + double duration = 0; + QRegExp r("(\\d+):(\\d+):(\\d+)"); + if ( r.indexIn(length) > -1 ) { + duration = r.cap(1).toInt() * 60; + duration += r.cap(2).toInt(); + } + md.titles.addID( ID ); + /* + QString name = QString::number(ID) + " (" + length + ")"; + md.titles.addName( ID, name ); + */ + md.titles.addDuration( ID, duration ); + } + else + + // DVD titles + if (rx_title.indexIn(line) > -1) { + int ID = rx_title.cap(1).toInt(); + QString t = rx_title.cap(2); + + if (t=="LENGTH") { + double length = rx_title.cap(3).toDouble(); + qDebug("MplayerProcess::parseLine: Title: ID: %d, Length: '%f'", ID, length); + md.titles.addDuration(ID, length); + } + else + if (t=="CHAPTERS") { + int chapters = rx_title.cap(3).toInt(); + qDebug("MplayerProcess::parseLine: Title: ID: %d, Chapters: '%d'", ID, chapters); + md.titles.addChapters(ID, chapters); + } + else + if (t=="ANGLES") { + int angles = rx_title.cap(3).toInt(); + qDebug("MplayerProcess::parseLine: Title: ID: %d, Angles: '%d'", ID, angles); + md.titles.addAngles(ID, angles); + } + } + else + + // Catch cache messages + if (rx_cache.indexIn(line) > -1) { + emit receivedCacheMessage(line); + } + else + + // Creating index + if (rx_create_index.indexIn(line) > -1) { + emit receivedCreatingIndex(line); + } + else + + // Catch connecting message + if (rx_connecting.indexIn(line) > -1) { + emit receivedConnectingToMessage(line); + } + else + + // Catch resolving message + if (rx_resolving.indexIn(line) > -1) { + emit receivedResolvingMessage(line); + } + else + + // Aspect ratio for old versions of mplayer + if (rx_aspect2.indexIn(line) > -1) { + md.video_aspect = rx_aspect2.cap(1).toDouble(); + qDebug("MplayerProcess::parseLine: md.video_aspect set to %f", md.video_aspect); + } + else + + // Clip info + // Name + if (rx_clip_name.indexIn(line) > -1) { + QString s = rx_clip_name.cap(2); + qDebug("MplayerProcess::parseLine: clip_name: '%s'", s.toUtf8().data()); + md.clip_name = s; + } + else + + // Artist + if (rx_clip_artist.indexIn(line) > -1) { + QString s = rx_clip_artist.cap(1); + qDebug("MplayerProcess::parseLine: clip_artist: '%s'", s.toUtf8().data()); + md.clip_artist = s; + } + else + + // Author + if (rx_clip_author.indexIn(line) > -1) { + QString s = rx_clip_author.cap(1); + qDebug("MplayerProcess::parseLine: clip_author: '%s'", s.toUtf8().data()); + md.clip_author = s; + } + else + + // Album + if (rx_clip_album.indexIn(line) > -1) { + QString s = rx_clip_album.cap(1); + qDebug("MplayerProcess::parseLine: clip_album: '%s'", s.toUtf8().data()); + md.clip_album = s; + } + else + + // Genre + if (rx_clip_genre.indexIn(line) > -1) { + QString s = rx_clip_genre.cap(1); + qDebug("MplayerProcess::parseLine: clip_genre: '%s'", s.toUtf8().data()); + md.clip_genre = s; + } + else + + // Date + if (rx_clip_date.indexIn(line) > -1) { + QString s = rx_clip_date.cap(2); + qDebug("MplayerProcess::parseLine: clip_date: '%s'", s.toUtf8().data()); + md.clip_date = s; + } + else + + // Track + if (rx_clip_track.indexIn(line) > -1) { + QString s = rx_clip_track.cap(1); + qDebug("MplayerProcess::parseLine: clip_track: '%s'", s.toUtf8().data()); + md.clip_track = s; + } + else + + // Copyright + if (rx_clip_copyright.indexIn(line) > -1) { + QString s = rx_clip_copyright.cap(1); + qDebug("MplayerProcess::parseLine: clip_copyright: '%s'", s.toUtf8().data()); + md.clip_copyright = s; + } + else + + // Comment + if (rx_clip_comment.indexIn(line) > -1) { + QString s = rx_clip_comment.cap(1); + qDebug("MplayerProcess::parseLine: clip_comment: '%s'", s.toUtf8().data()); + md.clip_comment = s; + } + else + + // Software + if (rx_clip_software.indexIn(line) > -1) { + QString s = rx_clip_software.cap(1); + qDebug("MplayerProcess::parseLine: clip_software: '%s'", s.toUtf8().data()); + md.clip_software = s; + } + else + + // Catch starting message + /* + pos = rx_play.indexIn(line); + if (pos > -1) { + emit mplayerFullyLoaded(); + } + */ + + //Generic things + if (rx.indexIn(line) > -1) { + tag = rx.cap(1); + value = rx.cap(2); + //qDebug("MplayerProcess::parseLine: tag: %s, value: %s", tag.toUtf8().data(), value.toUtf8().data()); + + // Generic audio + if (tag == "ID_AUDIO_ID") { + int ID = value.toInt(); + qDebug("MplayerProcess::parseLine: ID_AUDIO_ID: %d", ID); + md.audios.addID( ID ); + } + else + +#if !SUBTITLES_BY_INDEX + // Generic subtitle + if (tag == "ID_SUBTITLE_ID") { + int ID = value.toInt(); + qDebug("MplayerProcess::parseLine: ID_SUBTITLE_ID: %d", ID); + md.subtitles.addID( ID ); + } + else + + // Avi subs (srt, sub...) + + if (tag == "ID_FILE_SUB_ID") { + int ID = value.toInt(); + qDebug("MplayerProcess::parseLine: SUB_ID: %d", ID); + md.subtitles.addID( ID ); + last_sub_id = ID; + } + else + + if (tag == "ID_FILE_SUB_FILENAME") { + QString name = value; + qDebug("MplayerProcess::parseLine: SUB_FILENAME: %s", name.toUtf8().data() ); + if (last_sub_id != -1) md.subtitles.addFilename( last_sub_id, name ); + /* + if (!md.subtitles.existsFilename(name)) { + int new_id = md.subtitles.lastID() + 1; + qDebug("MplayerProcess::parseLine: creating new id for file sub: %d", new_id); + md.subtitles.addFilename( new_id, value ); + } + */ + } +#endif + + if (tag == "ID_LENGTH") { + md.duration = value.toDouble(); + qDebug("MplayerProcess::parseLine: md.duration set to %f", md.duration); + } + else + if (tag == "ID_VIDEO_WIDTH") { + md.video_width = value.toInt(); + qDebug("MplayerProcess::parseLine: md.video_width set to %d", md.video_width); + } + else + if (tag == "ID_VIDEO_HEIGHT") { + md.video_height = value.toInt(); + qDebug("MplayerProcess::parseLine: md.video_height set to %d", md.video_height); + } + else + if (tag == "ID_VIDEO_ASPECT") { + md.video_aspect = value.toDouble(); + if ( md.video_aspect == 0.0 ) { + // I hope width & height are already set. + md.video_aspect = (double) md.video_width / md.video_height; + } + qDebug("MplayerProcess::parseLine: md.video_aspect set to %f", md.video_aspect); + } + else + if (tag == "ID_DVD_DISC_ID") { + md.dvd_id = value; + qDebug("MplayerProcess::parseLine: md.dvd_id set to '%s'", md.dvd_id.toUtf8().data()); + } + else + if (tag == "ID_DEMUXER") { + md.demuxer = value; + } + else + if (tag == "ID_VIDEO_FORMAT") { + md.video_format = value; + } + else + if (tag == "ID_AUDIO_FORMAT") { + md.audio_format = value; + } + else + if (tag == "ID_VIDEO_BITRATE") { + md.video_bitrate = value.toInt(); + } + else + if (tag == "ID_VIDEO_FPS") { + md.video_fps = value; + } + else + if (tag == "ID_AUDIO_BITRATE") { + md.audio_bitrate = value.toInt(); + } + else + if (tag == "ID_AUDIO_RATE") { + md.audio_rate = value.toInt(); + } + else + if (tag == "ID_AUDIO_NCH") { + md.audio_nch = value.toInt(); + } + else + if (tag == "ID_VIDEO_CODEC") { + md.video_codec = value; + } + else + if (tag == "ID_AUDIO_CODEC") { + md.audio_codec = value; + } + } + } +} + +// Called when the process is finished +void MplayerProcess::processFinished() { + qDebug("MplayerProcess::processFinished"); + // Send this signal before the endoffile one, otherwise + // the playlist will start to play next file before all + // objects are notified that the process has exited. + emit processExited(); + if (received_end_of_file) emit receivedEndOfFile(); +} + +void MplayerProcess::gotError(QProcess::ProcessError error) { + qDebug("MplayerProcess::gotError: %d", (int) error); +} + +#include "moc_mplayerprocess.cpp" diff --git a/retroshare-gui/src/apps/smplayer/mplayerprocess.h b/retroshare-gui/src/apps/smplayer/mplayerprocess.h new file mode 100644 index 000000000..da1922091 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/mplayerprocess.h @@ -0,0 +1,82 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef _MPLAYERPROCESS_H_ +#define _MPLAYERPROCESS_H_ + +#include +#include "myprocess.h" +#include "mediadata.h" + +class QStringList; + +class MplayerProcess : public MyProcess +{ + Q_OBJECT + +public: + MplayerProcess(QObject * parent = 0); + ~MplayerProcess(); + + bool start(); + void writeToStdin(QString text); + + MediaData mediaData() { return md; }; + +signals: + void processExited(); + void lineAvailable(QString line); + + void receivedCurrentSec(double sec); + void receivedCurrentFrame(int frame); + void receivedPause(); + void receivedWindowResolution(int,int); + void receivedNoVideo(); + void receivedVO(QString); + void receivedAO(QString); + void receivedEndOfFile(); + void mplayerFullyLoaded(); + void receivedStartingTime(double sec); + + void receivedCacheMessage(QString); + void receivedCreatingIndex(QString); + void receivedConnectingToMessage(QString); + void receivedResolvingMessage(QString); + void receivedScreenshot(QString); + + void receivedStreamTitleAndUrl(QString,QString); + +protected slots: + void parseLine(QByteArray ba); + void processFinished(); + void gotError(QProcess::ProcessError); + +protected: + void init_rx(); + +private: + bool notified_mplayer_is_running; + bool received_end_of_file; + + MediaData md; + + int last_sub_id; +}; + + +#endif diff --git a/retroshare-gui/src/apps/smplayer/mplayerwindow.cpp b/retroshare-gui/src/apps/smplayer/mplayerwindow.cpp new file mode 100644 index 000000000..446ca7a7b --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/mplayerwindow.cpp @@ -0,0 +1,419 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "mplayerwindow.h" +#include "constants.h" + +#include "images.h" +#include "global.h" +#include "desktopinfo.h" +#include "helper.h" + +#include +#include +#include +#include +#include +#include +#include + +Screen::Screen(QWidget* parent, Qt::WindowFlags f) +#if USE_GL_WIDGET + : QGLWidget(parent, 0, f ) +#else + : QWidget(parent, f ) +#endif +{ + setMouseTracking(TRUE); + setFocusPolicy( Qt::NoFocus ); + setMinimumSize( QSize(0,0) ); + + cursor_pos = QPoint(0,0); + last_cursor_pos = QPoint(0,0); + + QTimer *timer = new QTimer(this); + connect( timer, SIGNAL(timeout()), this, SLOT(checkMousePos()) ); + timer->start(2000); + + // Change attributes + setAttribute(Qt::WA_NoSystemBackground); + setAttribute(Qt::WA_StaticContents); + //setAttribute( Qt::WA_OpaquePaintEvent ); + setAttribute(Qt::WA_PaintOnScreen); + setAttribute(Qt::WA_PaintUnclipped); + //setAttribute(Qt::WA_PaintOutsidePaintEvent); +} + +Screen::~Screen() { +} + +void Screen::paintEvent( QPaintEvent * e ) { + //qDebug("Screen::paintEvent"); + QPainter painter(this); + painter.eraseRect( e->rect() ); + //painter.fillRect( e->rect(), QColor(255,0,0) ); +} + + +void Screen::checkMousePos() { + //qDebug("Screen::checkMousePos"); + + if ( cursor_pos == last_cursor_pos ) { + //qDebug(" same pos"); + if (cursor().shape() != Qt::BlankCursor) { + //qDebug(" hiding mouse cursor"); + setCursor(QCursor(Qt::BlankCursor)); + } + } else { + last_cursor_pos = cursor_pos; + } +} + +void Screen::mouseMoveEvent( QMouseEvent * e ) { + //qDebug("Screen::mouseMoveEvent"); + //qDebug(" pos: x: %d y: %d", e->pos().x(), e->pos().y() ); + cursor_pos = e->pos(); + + if (cursor().shape() != Qt::ArrowCursor) { + //qDebug(" showing mouse cursor" ); + setCursor(QCursor(Qt::ArrowCursor)); + } + + emit mouseMoved( e->pos() ); +} + +/* ---------------------------------------------------------------------- */ + +MplayerLayer::MplayerLayer(QWidget* parent, Qt::WindowFlags f) + : Screen(parent, f) +{ + allow_clearing = true; + playing = false; +} + +MplayerLayer::~MplayerLayer() { +} + +void MplayerLayer::allowClearingBackground(bool b) { + qDebug("MplayerLayer::allowClearingBackground: %d", b); + allow_clearing = b; +} + +void MplayerLayer::paintEvent( QPaintEvent * e ) { + //qDebug("MplayerLayer::paintEvent: allow_clearing: %d", allow_clearing); + if (allow_clearing || !playing) { + //qDebug("MplayerLayer::paintEvent: painting"); + Screen::paintEvent(e); + } +} + +void MplayerLayer::playingStarted() { + qDebug("MplayerLayer::playingStarted"); + repaint(); + playing = true; +} + +void MplayerLayer::playingStopped() { + qDebug("MplayerLayer::playingStopped"); + playing = false; + repaint(); +} + +/* ---------------------------------------------------------------------- */ + +MplayerWindow::MplayerWindow(QWidget* parent, Qt::WindowFlags f) + : Screen(parent, f) +{ + offset_x = 0; + offset_y = 0; + zoom_factor = 1.0; + + setAutoFillBackground(true); + Helper::setBackgroundColor( this, QColor(0,0,0) ); + + mplayerlayer = new MplayerLayer( this ); + mplayerlayer->setAutoFillBackground(TRUE); + + logo = new QLabel( mplayerlayer ); + logo->setAutoFillBackground(TRUE); + Helper::setBackgroundColor( logo, QColor(0,0,0) ); + + QVBoxLayout * mplayerlayerLayout = new QVBoxLayout( mplayerlayer ); + mplayerlayerLayout->addWidget( logo, 0, Qt::AlignHCenter | Qt::AlignVCenter ); + + aspect = (double) 4 / 3; + monitoraspect = 0; + + setSizePolicy( QSizePolicy::Expanding , QSizePolicy::Expanding ); + setFocusPolicy( Qt::StrongFocus ); + + connect( mplayerlayer, SIGNAL(mouseMoved(QPoint)), + this, SLOT(translatePos(QPoint)) ); + + retranslateStrings(); +} + +MplayerWindow::~MplayerWindow() { +} + +void MplayerWindow::setColorKey( QColor c ) { + Helper::setBackgroundColor( mplayerlayer, c ); +} + +void MplayerWindow::retranslateStrings() { + //qDebug("MplayerWindow::retranslateStrings"); + logo->setPixmap( Images::icon("background") ); +} + +void MplayerWindow::showLogo( bool b) +{ + if (b) logo->show(); else logo->hide(); +} + +/* +void MplayerWindow::changePolicy() { + setSizePolicy( QSizePolicy::Preferred , QSizePolicy::Preferred ); +} +*/ + +void MplayerWindow::setResolution( int w, int h) +{ + video_width = w; + video_height = h; + + //mplayerlayer->move(1,1); + updateVideoWindow(); +} + + +void MplayerWindow::resizeEvent( QResizeEvent * /* e */) +{ + /*qDebug("MplayerWindow::resizeEvent: %d, %d", + e->size().width(), e->size().height() );*/ + + offset_x = 0; + offset_y = 0; + + updateVideoWindow(); + setZoom(zoom_factor); +} + + +void MplayerWindow::setMonitorAspect(double asp) { + monitoraspect = asp; +} + +void MplayerWindow::setAspect( double asp) { + aspect = asp; + if (monitoraspect!=0) { + aspect = aspect / monitoraspect * DesktopInfo::desktop_aspectRatio(this); + } + updateVideoWindow(); +} + + +void MplayerWindow::updateVideoWindow() +{ + /* + mplayerlayer->resize(size()); + return; + */ + + //qDebug("MplayerWindow::updateVideoWindow"); + + //qDebug("aspect= %f", aspect); + + int w_width = size().width(); + int w_height = size().height(); + + int pos1_w = w_width; + int pos1_h = w_width / aspect + 0.5; + + int pos2_h = w_height; + int pos2_w = w_height * aspect + 0.5; + + //qDebug("pos1_w: %d, pos1_h: %d", pos1_w, pos1_h); + //qDebug("pos2_w: %d, pos2_h: %d", pos2_w, pos2_h); + + int w,h; + int x=0; + int y=0; + + if (pos1_h <= w_height) { + //qDebug("Pos1!"); + w = pos1_w; + h = pos1_h; + + y = (w_height - h) /2; + } else { + //qDebug("Pos2!"); + w = pos2_w; + h = pos2_h; + + x = (w_width - w) /2; + } + + mplayerlayer->move(x,y); + mplayerlayer->resize(w, h); + + orig_x = x; + orig_y = y; + orig_width = w; + orig_height = h; + + //qDebug( "w_width: %d, w_height: %d", w_width, w_height); + //qDebug("w: %d, h: %d", w,h); +} + + +void MplayerWindow::mouseReleaseEvent( QMouseEvent * e) { + qDebug( "MplayerWindow::mouseReleaseEvent" ); + + if (e->button() == Qt::LeftButton) { + e->accept(); + emit leftClicked(); + } + else + if (e->button() == Qt::RightButton) { + e->accept(); + emit rightButtonReleased( e->globalPos() ); + } + else { + e->ignore(); + } +} + +void MplayerWindow::mouseDoubleClickEvent( QMouseEvent * e ) { + e->accept(); + emit doubleClicked(); +} + +void MplayerWindow::wheelEvent( QWheelEvent * e ) { + qDebug("MplayerWindow::wheelEvent: delta: %d", e->delta()); + e->accept(); + + if (e->delta() >= 0) + emit wheelUp(); + else + emit wheelDown(); +} + + +QSize MplayerWindow::sizeHint() const { + //qDebug("MplayerWindow::sizeHint"); + return QSize( video_width, video_height ); +} + +QSize MplayerWindow::minimumSizeHint () const { + return QSize(0,0); +} + + +void MplayerWindow::translatePos(QPoint p ) { + int x = p.x() + mplayerlayer->x(); + int y = p.y() + mplayerlayer->y(); + + emit mouseMoved( QPoint(x,y) ); +} + +void MplayerWindow::setOffsetX( int d) { + offset_x = d; + mplayerlayer->move( orig_x + offset_x, mplayerlayer->y() ); +} + +int MplayerWindow::offsetX() { return offset_x; } + +void MplayerWindow::setOffsetY( int d) { + offset_y = d; + mplayerlayer->move( mplayerlayer->x(), orig_y + offset_y ); +} + +int MplayerWindow::offsetY() { return offset_y; } + +void MplayerWindow::setZoom( double d) { + zoom_factor = d; + offset_x = 0; + offset_y = 0; + + int x = orig_x; + int y = orig_y; + int w = orig_width; + int h = orig_height; + + if (zoom_factor > 1.0) { + w = w * zoom_factor; + h = h * zoom_factor; + + // Center + x = (width() - w) / 2; + y = (height() -h) / 2; + } + + mplayerlayer->move(x,y); + mplayerlayer->resize(w,h); +} + +double MplayerWindow::zoom() { return zoom_factor; } + +void MplayerWindow::moveLayer( int offset_x, int offset_y ) { + int x = mplayerlayer->x(); + int y = mplayerlayer->y(); + + mplayerlayer->move( x + offset_x, y + offset_y ); +} + +void MplayerWindow::moveLeft() { + if (mplayerlayer->x()+mplayerlayer->width() > width() ) + moveLayer( -16, 0 ); +} + +void MplayerWindow::moveRight() { + if ( mplayerlayer->x() < 0 ) + moveLayer( +16, 0 ); +} + +void MplayerWindow::moveUp() { + if (mplayerlayer->y()+mplayerlayer->height() > height() ) + moveLayer( 0, -16 ); +} + +void MplayerWindow::moveDown() { + if ( mplayerlayer->y() < 0 ) + moveLayer( 0, +16 ); +} + +void MplayerWindow::incZoom() { + setZoom( zoom_factor + 0.10 ); +} + +void MplayerWindow::decZoom() { + double zoom = zoom_factor - 0.10; + if (zoom < 1.0) zoom = 1.0; + setZoom( zoom ); +} + +// Language change stuff +void MplayerWindow::changeEvent(QEvent *e) { + if (e->type() == QEvent::LanguageChange) { + retranslateStrings(); + } else { + QWidget::changeEvent(e); + } +} + +#include "moc_mplayerwindow.cpp" diff --git a/retroshare-gui/src/apps/smplayer/mplayerwindow.h b/retroshare-gui/src/apps/smplayer/mplayerwindow.h new file mode 100644 index 000000000..d228fe780 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/mplayerwindow.h @@ -0,0 +1,183 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + + +#ifndef MPLAYERWINDOW_H +#define MPLAYERWINDOW_H + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "config.h" + +class QWidget; +class QLabel; +class QKeyEvent; + +#if USE_GL_WIDGET +#include +#define SC_WIDGET QGLWidget +#else +#define SC_WIDGET QWidget +#endif + +//! Screen is a widget that hides the mouse cursor after some seconds if not moved. + +class Screen : public SC_WIDGET +{ + Q_OBJECT + +public: + Screen(QWidget* parent = 0, Qt::WindowFlags f = 0); + ~Screen(); + +signals: + void mouseMoved(QPoint); + +protected: + virtual void mouseMoveEvent( QMouseEvent * e ); + virtual void paintEvent ( QPaintEvent * e ); + +protected slots: + virtual void checkMousePos(); + +private: + QPoint cursor_pos, last_cursor_pos; +}; + +//! MplayerLayer can be instructed to not delete the background. + +class MplayerLayer : public Screen +{ + Q_OBJECT + +public: + MplayerLayer(QWidget* parent = 0, Qt::WindowFlags f = 0); + ~MplayerLayer(); + + //! If b is true, the background of the widget will be repainted as usual. + /*! Otherwise the background will not repainted when a video is playing. */ + void allowClearingBackground(bool b); + + //! Return true if repainting the background is allowed. + bool isClearingBackgroundAllowed() { return allow_clearing; }; + +public slots: + //! Should be called when a file has started. + /*! It's needed to know if the background has to be cleared or not. */ + void playingStarted(); + //! Should be called when a file has stopped. + void playingStopped(); + +protected: + virtual void paintEvent ( QPaintEvent * e ); + +private: + bool allow_clearing; + bool playing; +}; + + +class MplayerWindow : public Screen +{ + Q_OBJECT + +public: + MplayerWindow( QWidget* parent = 0, Qt::WindowFlags f = 0); + ~MplayerWindow(); + + void showLogo( bool b); + + MplayerLayer * videoLayer() { return mplayerlayer; }; + + void setResolution( int w, int h); + void setAspect( double asp); + void setMonitorAspect(double asp); + void updateVideoWindow(); + + void setColorKey(QColor c); + + void setOffsetX( int ); + int offsetX(); + + void setOffsetY( int ); + int offsetY(); + + void setZoom( double ); + double zoom(); + + virtual QSize sizeHint () const; + virtual QSize minimumSizeHint() const; + +public slots: + void moveLeft(); + void moveRight(); + void moveUp(); + void moveDown(); + void incZoom(); + void decZoom(); + +protected: + virtual void retranslateStrings(); + virtual void changeEvent ( QEvent * event ) ; + + virtual void resizeEvent( QResizeEvent * e); + virtual void mouseReleaseEvent( QMouseEvent * e); + virtual void mouseDoubleClickEvent( QMouseEvent * e ); + virtual void wheelEvent( QWheelEvent * e ); + void moveLayer( int offset_x, int offset_y ); + +protected slots: + virtual void translatePos(QPoint p ); + +signals: + void rightButtonReleased( QPoint p ); + void doubleClicked(); + void leftClicked(); + void keyPressed(QKeyEvent * e); + void wheelUp(); + void wheelDown(); + +protected: + int video_width, video_height; + double aspect; + double monitoraspect; + + MplayerLayer * mplayerlayer; + QLabel * logo; + + // Zoom and moving + int offset_x, offset_y; + double zoom_factor; + + // Original pos and dimensions of the mplayerlayer + // before zooming or moving + int orig_x, orig_y; + int orig_width, orig_height; +}; + + +#endif + diff --git a/retroshare-gui/src/apps/smplayer/myaction.cpp b/retroshare-gui/src/apps/smplayer/myaction.cpp new file mode 100644 index 000000000..bcd11376b --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/myaction.cpp @@ -0,0 +1,101 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "myaction.h" +#include + +MyAction::MyAction ( QObject * parent, const char * name, bool autoadd ) + : QAction(parent) +{ + //qDebug("MyAction::MyAction: name: '%s'", name); + setObjectName(name); + if (autoadd) addActionToParent(); +} + + +MyAction::MyAction( QObject * parent, bool autoadd ) + : QAction(parent) +{ + //qDebug("MyAction::MyAction: QObject, bool"); + if (autoadd) addActionToParent(); +} + +MyAction::MyAction(const QString & text, QKeySequence accel, + QObject * parent, const char * name, bool autoadd ) + : QAction(parent) +{ + setObjectName(name); + setText(text); + setShortcut(accel); + if (autoadd) addActionToParent(); +} + +MyAction::MyAction(QKeySequence accel, QObject * parent, const char * name, + bool autoadd ) + : QAction(parent) +{ + setObjectName(name); + setShortcut(accel); + if (autoadd) addActionToParent(); +} + +MyAction::~MyAction() { +} + +void MyAction::addActionToParent() { + if (parent()) { + if (parent()->inherits("QWidget")) { + QWidget *w = static_cast (parent()); + w->addAction(this); + } + } +} + +void MyAction::change(const QIcon & icon, const QString & text) { + setIcon( icon ); + change(text); +} + +void MyAction::change(const QString & text ) { + setText( text ); + + QString accel_text = shortcut().toString(); + + QString s = text; + s.replace("&",""); + if (!accel_text.isEmpty()) { + setToolTip( s + " ("+ accel_text +")"); + setIconText( s ); + } + + /* + if (text.isEmpty()) { + QString s = menuText; + s = s.replace("&",""); + setText( s ); + + if (!accel_text.isEmpty()) + setToolTip( s + " ("+ accel_text +")"); + } else { + setText( text ); + if (!accel_text.isEmpty()) + setToolTip( text + " ("+ accel_text +")"); + } + */ +} + diff --git a/retroshare-gui/src/apps/smplayer/myaction.h b/retroshare-gui/src/apps/smplayer/myaction.h new file mode 100644 index 000000000..67ab2be29 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/myaction.h @@ -0,0 +1,60 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef _MYACTION_H_ +#define _MYACTION_H_ + +#include +#include +#include +#include + +class MyAction : public QAction +{ + +public: + //! Creates a new MyAction with name \a name. If \a autoadd is true + //! the action will be added to the parent + MyAction ( QObject * parent, const char * name, bool autoadd = true ); + + //! Creates a new MyAction. If \a autoadd is true + //! the action will be added to the parent + MyAction ( QObject * parent, bool autoadd = true ); + + MyAction ( const QString & text, QKeySequence accel, + QObject * parent, const char * name = "", + bool autoadd = true ); + + MyAction ( QKeySequence accel, QObject * parent, + const char * name = "", bool autoadd = true ); + + ~MyAction(); + + //! Change the icon and text of the action. + void change(const QIcon & icon, const QString & text ); + + //! Change the text of the action. + void change(const QString & text); + +protected: + //! Checks if the parent is a QWidget and adds the action to it. + void addActionToParent(); +}; + +#endif + diff --git a/retroshare-gui/src/apps/smplayer/myactiongroup.cpp b/retroshare-gui/src/apps/smplayer/myactiongroup.cpp new file mode 100644 index 000000000..6adfab1db --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/myactiongroup.cpp @@ -0,0 +1,110 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "myactiongroup.h" +#include +#include +#include + +MyActionGroupItem::MyActionGroupItem(QObject * parent, MyActionGroup *group, + const char * name, + int data, bool autoadd) + : MyAction(parent, name, autoadd) +{ + setData(data); + setCheckable(true); + if (group) group->addAction(this); +} + +MyActionGroupItem::MyActionGroupItem(QObject * parent, MyActionGroup *group, + const QString & text, + const char * name, + int data, bool autoadd) + : MyAction(parent, name, autoadd) +{ + setData(data); + setText(text); + setCheckable(true); + if (group) group->addAction(this); +} + + +MyActionGroup::MyActionGroup( QObject * parent ) : QActionGroup(parent) +{ + setExclusive(true); + connect( this, SIGNAL(triggered(QAction *)), + this, SLOT(itemTriggered(QAction *)) ); +} + +void MyActionGroup::setChecked(int ID) { + //qDebug("MyActionGroup::setChecked: ID: %d", ID); + + QList l = actions(); + for (int n=0; n < l.count(); n++) { + if (l[n]->data().toInt() == ID) { + l[n]->setChecked(true); + return; + } + } +} + +int MyActionGroup::checked() { + QAction * a = checkedAction(); + if (a) + return a->data().toInt(); + else + return -1; +} + +void MyActionGroup::uncheckAll() { + QList l = actions(); + for (int n=0; n < l.count(); n++) { + l[n]->setChecked(false); + } +} + +void MyActionGroup::clear(bool remove) { + while (actions().count() > 0) { + QAction * a = actions()[0]; + if (a) { + removeAction(a); + if (remove) a->deleteLater(); + } + } +} + +void MyActionGroup::itemTriggered(QAction *a) { + qDebug("MyActionGroup::itemTriggered: '%s'", a->objectName().toUtf8().data()); + int value = a->data().toInt(); + + qDebug("MyActionGroup::itemTriggered: ID: %d", value); + + emit activated(value); +} + +void MyActionGroup::addTo(QWidget *w) { + w->addActions( actions() ); +} + +void MyActionGroup::removeFrom(QWidget *w) { + for (int n=0; n < actions().count(); n++) { + w->removeAction( actions()[n] ); + } +} + +#include "moc_myactiongroup.cpp" diff --git a/retroshare-gui/src/apps/smplayer/myactiongroup.h b/retroshare-gui/src/apps/smplayer/myactiongroup.h new file mode 100644 index 000000000..5381b948f --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/myactiongroup.h @@ -0,0 +1,87 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef _MYACTIONGROUP_H_ +#define _MYACTIONGROUP_H_ + +#include +#include +#include "myaction.h" + +class MyActionGroup; + +//! This class makes easy to create actions for MyActionGroup + +class MyActionGroupItem : public MyAction +{ +public: + //! Creates a new item. + /*! \a group is the group where the action will be added, \a data is + the ID of the item. If \autoadd is true the action will be added to + the parent (if it's a QWidget), so the shortcut could work. */ + MyActionGroupItem( QObject * parent, MyActionGroup *group, + const char * name, int data, bool autoadd = true ); + + //! Creates a new item. + /*! \a text is the text that the item will have. */ + MyActionGroupItem( QObject * parent, MyActionGroup *group, + const QString & text, const char * name, + int data, bool autoadd = true ); +}; + +class QAction; + +//! MyActionGroup makes easier to create exclusive menus based on items +//! with an integer data. + + +class MyActionGroup : public QActionGroup +{ + Q_OBJECT + +public: + MyActionGroup ( QObject * parent ); + + //! Looks for the item which ID is \a ID and checks it + void setChecked(int ID); + + //! Returns the ID of the item checked or -1 if none + //! is checked + int checked(); + + //! Remove all items. If \a remove is true the actions are also deleted. + void clear(bool remove); + + //! Adds all actions to the widget + void addTo(QWidget *); + + //! Remove all actions from the widget + void removeFrom(QWidget *); + + //! unchecks all items + void uncheckAll(); + +signals: + //! Emitted when an item has been checked + void activated(int); + +protected slots: + void itemTriggered(QAction *); +}; + +#endif diff --git a/retroshare-gui/src/apps/smplayer/myclient.cpp b/retroshare-gui/src/apps/smplayer/myclient.cpp new file mode 100644 index 000000000..a512fafdd --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/myclient.cpp @@ -0,0 +1,119 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "myclient.h" +#include +#include +#include +#include + +MyClient::MyClient(quint16 port, QObject * parent) : QObject(parent) +{ + qDebug("MyClient::MyClient"); + + this->port = port; + timeout = 200; + + socket = new QTcpSocket(this); +} + +MyClient::~MyClient() { + delete socket; +} + +QString MyClient::readLine() { + QString line; + + int n = 0; + while (!socket->canReadLine() && n < 5) { + //qDebug("Bytes available: %d", (int) socket->bytesAvailable()); + socket->waitForReadyRead( timeout ); + n++; + } + if (socket->canReadLine()) { + line = QString::fromUtf8(socket->readLine()); + line.remove( QRegExp("[\r\n]") ); + qDebug("MyClient::readLine: '%s'", line.toUtf8().data()); + } + + return line; +} + +void MyClient::writeLine(QString l) { + socket->write( l.toUtf8() ); + socket->flush(); + socket->waitForBytesWritten( timeout ); +} + +bool MyClient::openConnection() { + socket->connectToHost( QHostAddress::LocalHost, port, QIODevice::ReadWrite); + if (!socket->waitForConnected( timeout )) return false; // Can't connect + + QString line = readLine(); + if (!line.startsWith("SMPlayer")) return false; + qDebug("MyClient::sendFiles: connected to a SMPlayer instance!"); + + line = readLine(); // Read help message + + return true; +} + + +bool MyClient::sendFiles( const QStringList & files, bool addToPlaylist) { + QString line; + + writeLine("open_files_start\r\n"); + line = readLine(); + if (!line.startsWith("OK")) return false; + + for (int n=0; n < files.count(); n++) { + writeLine("open_files " + files[n] + "\r\n"); + line = readLine(); + if (!line.startsWith("OK")) return false; + } + + if (!addToPlaylist) + writeLine("open_files_end\r\n"); + else + writeLine("add_files_end\r\n"); + + writeLine("quit\r\n"); + + do { + line = readLine(); + } while (!line.isNull()); + + + socket->disconnectFromHost(); + socket->waitForDisconnected( timeout ); + + return true; +} + +bool MyClient::sendAction( const QString & action ) { + QString line; + + writeLine("f " + action + "\r\n"); + line = readLine(); + if (!line.startsWith("OK")) return false; + + socket->disconnectFromHost(); + socket->waitForDisconnected( timeout ); + + return true; +} diff --git a/retroshare-gui/src/apps/smplayer/myclient.h b/retroshare-gui/src/apps/smplayer/myclient.h new file mode 100644 index 000000000..28f0cecb0 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/myclient.h @@ -0,0 +1,63 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef _MYCLIENT_H_ +#define _MYCLIENT_H_ + +#include + +class QTextStream; +class QTcpSocket; + + +//! MyClient communicates with other running instances. + +/*! + It can be used to know if there's another instance of smplayer running. + It also allows to send the file(s) that the user wants to open to + the other instance. +*/ + +class MyClient : public QObject +{ +public: + MyClient(quint16 port, QObject * parent = 0); + ~MyClient(); + + //! Sets the maximum time that should wait in the waitFor... functions. + void setTimeOut(int ms) { timeout = ms; }; + int timeOut() { return timeout; }; + + //! Return true if it can open a connection to another instance. + bool openConnection(); + //! Send the list of files to the other instance. Return true on success. + bool sendFiles( const QStringList & files, bool addToPlaylist = false); + //! Pass an action (pause, fullscreen...) to GUI. + bool sendAction( const QString & action ); + +protected: + QString readLine(); + void writeLine(QString); + +private: + quint16 port; + QTcpSocket * socket; + int timeout; +}; + +#endif diff --git a/retroshare-gui/src/apps/smplayer/mycombobox.cpp b/retroshare-gui/src/apps/smplayer/mycombobox.cpp new file mode 100644 index 000000000..da10eeafb --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/mycombobox.cpp @@ -0,0 +1,61 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "mycombobox.h" + +MyComboBox::MyComboBox( QWidget * parent ) : QComboBox(parent) +{ +} + +MyComboBox::~MyComboBox() +{ +} + +void MyComboBox::setCurrentText( const QString & text ) { + int i = findText(text); + if (i != -1) + setCurrentIndex(i); + else if (isEditable()) + setEditText(text); + else + setItemText(currentIndex(), text); +} + +void MyComboBox::insertStringList( const QStringList & list, int index ) { + insertItems((index < 0 ? count() : index), list); +} + + + +MyFontComboBox::MyFontComboBox( QWidget * parent ) : QFontComboBox(parent) +{ +} + +MyFontComboBox::~MyFontComboBox() +{ +} + +void MyFontComboBox::setCurrentText( const QString & text ) { + int i = findText(text); + if (i != -1) + setCurrentIndex(i); + else if (isEditable()) + setEditText(text); + else + setItemText(currentIndex(), text); +} diff --git a/retroshare-gui/src/apps/smplayer/mycombobox.h b/retroshare-gui/src/apps/smplayer/mycombobox.h new file mode 100644 index 000000000..ebea50861 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/mycombobox.h @@ -0,0 +1,48 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef _MYCOMBOBOX_H_ +#define _MYCOMBOBOX_H_ + +#include +#include + +//! This class adds some Qt 3 compatibility functions which don't have a +//! direct equivalent in Qt 4. + +class MyComboBox : public QComboBox +{ +public: + MyComboBox( QWidget * parent = 0 ); + ~MyComboBox(); + + void setCurrentText ( const QString & text ); + void insertStringList ( const QStringList & list, int index = -1 ); +}; + + +class MyFontComboBox : public QFontComboBox +{ +public: + MyFontComboBox( QWidget * parent = 0 ); + ~MyFontComboBox(); + + void setCurrentText ( const QString & text ); +}; + +#endif diff --git a/retroshare-gui/src/apps/smplayer/myprocess.cpp b/retroshare-gui/src/apps/smplayer/myprocess.cpp new file mode 100644 index 000000000..eac268326 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/myprocess.cpp @@ -0,0 +1,171 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "myprocess.h" + +#ifdef Q_OS_WIN + +#if QT_VERSION < 0x040300 +#define USE_TEMP_FILE 1 +#else +#define USE_TEMP_FILE 0 +#endif + +#else +#define USE_TEMP_FILE 0 +#endif + + +MyProcess::MyProcess(QObject * parent) : QProcess(parent) +{ + clearArguments(); + setProcessChannelMode( QProcess::MergedChannels ); + +#if USE_TEMP_FILE + temp_file.open(); // Create temporary file + QString filename = temp_file.fileName(); + setStandardOutputFile( filename ); + qDebug("MyProcess::MyProcess: temporary file: %s", filename.toUtf8().data()); + temp_file.close(); + + //connect(&temp_file, SIGNAL(readyRead()), this, SLOT(readTmpFile()) ); + connect(&timer, SIGNAL(timeout()), this, SLOT(readTmpFile()) ); +#else + connect(this, SIGNAL(readyReadStandardOutput()), this, SLOT(readStdOut()) ); +#endif + + connect(this, SIGNAL(finished(int, QProcess::ExitStatus)), + this, SLOT(procFinished()) ); +} + +void MyProcess::clearArguments() { + program = ""; + arg.clear(); +} + +bool MyProcess::isRunning() { + return (state() == QProcess::Running); +} + +void MyProcess::addArgument(const QString & a) { + if (program.isEmpty()) { + program = a; + } else { + arg.append(a); + } +} + +QStringList MyProcess::arguments() { + QStringList l = arg; + l.prepend(program); + return l; +} + +void MyProcess::start() { + remaining_output.clear(); + + QProcess::start(program, arg); + +#if USE_TEMP_FILE + //bool r = temp_file.open(QIODevice::ReadOnly); + bool r = temp_file.open(); + timer.start(50); + qDebug("MyProcess::start: r: %d", r); +#endif +} + +void MyProcess::readStdOut() { + genericRead( readAllStandardOutput() ); +} + + +void MyProcess::readTmpFile() { + genericRead( temp_file.readAll() ); +} + +void MyProcess::genericRead(QByteArray buffer) { + QByteArray ba = remaining_output + buffer; + int start = 0; + int from_pos = 0; + int pos = canReadLine(ba, from_pos); + + //qDebug("MyProcess::read: pos: %d", pos); + while ( pos > -1 ) { + // Readline + //QByteArray line = ba.left(pos); + QByteArray line = ba.mid(start, pos-start); + //ba = ba.mid(pos+1); + from_pos = pos + 1; +#ifdef Q_OS_WIN + if ((from_pos < ba.size()) && (ba.at(from_pos)=='\n')) from_pos++; +#endif + start = from_pos; + + emit lineAvailable(line); + + pos = canReadLine(ba, from_pos); + } + + remaining_output = ba.mid(from_pos); +} + +int MyProcess::canReadLine(const QByteArray & ba, int from) { + int pos1 = ba.indexOf('\n', from); + int pos2 = ba.indexOf('\r', from); + + //qDebug("MyProcess::canReadLine: pos2: %d", pos2); + + if ( (pos1 == -1) && (pos2 == -1) ) return -1; + + int pos = pos1; + if ( (pos1 != -1) && (pos2 != -1) ) { + /* + if (pos2 == (pos1+1)) pos = pos2; // \r\n + else + */ + if (pos1 < pos2) pos = pos1; else pos = pos2; + } else { + if (pos1 == -1) pos = pos2; + else + if (pos2 == -1) pos = pos1; + } + + return pos; +} + +/*! +Do some clean up, and be sure that all output has been read. +*/ +void MyProcess::procFinished() { + qDebug("MyProcess::procFinished"); + +#if !USE_TEMP_FILE + qDebug("MyProcess::procFinished: Bytes available: %ld", bytesAvailable()); + if ( bytesAvailable() > 0 ) readStdOut(); +#else + timer.stop(); + + qDebug("MyProcess::procFinished: Bytes available: %ld", temp_file.bytesAvailable()); + if ( temp_file.bytesAvailable() > 0 ) readTmpFile(); + qDebug("MyProcess::procFinished: Bytes available: %ld", temp_file.bytesAvailable()); + + temp_file.close(); +#endif +} + +#include "moc_myprocess.cpp" diff --git a/retroshare-gui/src/apps/smplayer/myprocess.h b/retroshare-gui/src/apps/smplayer/myprocess.h new file mode 100644 index 000000000..ffe5d3225 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/myprocess.h @@ -0,0 +1,79 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef _MY_PROCESS_H_ +#define _MY_PROCESS_H_ + +#include +#include +#include + +//! MyProcess is a specialized QProcess designed to properly work with mplayer. + +/*! + It can split the mplayer status line into lines. + It also provides some Qt 3 like functions like addArgument(). + + There are two working modes, controlled by the USE_TEMP_FILE define. + If USE_TEMP_FILE is 1 it will send the output of mplayer to a temporary + file, and then it will be read from it. Otherwise it will read from + standard ouput as usual. +*/ + +class MyProcess : public QProcess +{ + Q_OBJECT + +public: + MyProcess ( QObject * parent = 0 ); + + void addArgument(const QString & a); //!< Add an argument + + void clearArguments(); //!< Clear the list of arguments + QStringList arguments(); //!< Return the list of arguments + + void start(); //!< Start the process + bool isRunning(); //!< Return true if the process is running + +signals: + //! Emitted when there's a line available + void lineAvailable(QByteArray ba); + +protected slots: + void readStdOut(); //!< Called for reading from standard output + void readTmpFile(); //!< Called for reading from the temp file + void procFinished(); //!< Called when the process has finished + +protected: + //! Return true if it's possible to read an entire line. + /*! @param from specifies the position to begin. */ + int canReadLine(const QByteArray & ba, int from = 0); + //! Called from readStdOut() and readTmpFile() to do all the work + void genericRead(QByteArray buffer); + +private: + QString program; + QStringList arg; + + QByteArray remaining_output; + + QTemporaryFile temp_file; + QTimer timer; +}; + +#endif diff --git a/retroshare-gui/src/apps/smplayer/myserver.cpp b/retroshare-gui/src/apps/smplayer/myserver.cpp new file mode 100644 index 000000000..1838f1c7c --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/myserver.cpp @@ -0,0 +1,157 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "myserver.h" +#include "version.h" +#include +#include + +Connection::Connection(QTcpSocket * s) +{ + socket = s; + + //connect(s, SIGNAL(disconnected()), this, SLOT(deleteLater())); + connect(s, SIGNAL(readyRead()), this, SLOT(readData())); + + sendText(QString("SMPlayer %1").arg(smplayerVersion())); + sendText("Type help for a list of commands"); +} + +Connection::~Connection() { + delete socket; +} + +void Connection::sendText(QString l) { + qDebug("Connection::sendText: '%s'", l.toUtf8().data()); + + socket->write( l.toUtf8() + "\r\n" ); + socket->flush(); +} + +void Connection::readData() { + while (socket->canReadLine()) { + QString l = QString::fromUtf8( socket->readLine() ); + l.remove( QRegExp("[\r\n]") ); + parseLine( l ); + } +} + +void Connection::parseLine(QString str) { + qDebug("Connection::parseLine: '%s'", str.toUtf8().data()); + + QRegExp rx_open("^open (.*)"); + QRegExp rx_open_files("(^open_files|^add_files) (.*)"); + QRegExp rx_function("^(function|f) (.*)"); + + + if (str.toLower() == "hello") { + sendText(QString("Hello, this is SMPlayer %1").arg(smplayerVersion())); + } + else + if (str.toLower() == "help") { + sendText("Available commands:"); + sendText(" help"); + sendText(" quit"); + sendText(" list functions"); + sendText(" function [function_name]"); + sendText(" f [function_name]"); + sendText(" open [file]"); + } + else + if (str.toLower() == "quit") { + sendText("Goodbye"); + socket->disconnectFromHost(); + } + else + if (str.toLower() == "list functions") { + for (int n=0; n < actions_list.count(); n++) { + sendText( actions_list[n] ); + } + } + else + if (rx_open.indexIn(str) > -1) { + QString file = rx_open.cap(1); + qDebug("Connection::parseLine: asked to open '%s'", file.toUtf8().data()); + sendText("OK, file sent to GUI"); + emit receivedOpen(file); + } + else + if ( (str.toLower() == "open_files_start") || + (str.toLower() == "add_files_start") ) + { + files_to_open.clear(); + sendText("OK, send first file"); + } + else + if ( (str.toLower() == "open_files_end") || + (str.toLower() == "add_files_end") ) + { + qDebug("Connection::parseLine: files_to_open:"); + for (int n=0; n < files_to_open.count(); n++) + qDebug("Connection::parseLine: %d: '%s'", n, files_to_open[n].toUtf8().data()); + sendText("OK, sending files to GUI"); + + if (str.toLower() == "open_files_end") + emit receivedOpenFiles(files_to_open); + else + emit receivedAddFiles(files_to_open); + } + else + if (rx_open_files.indexIn(str) > -1) { + QString file = rx_open_files.cap(2); + qDebug("Connection::parseLine: file: '%s'", file.toUtf8().data()); + files_to_open.append(file); + sendText("OK, file received"); + } + else + if (rx_function.indexIn(str) > -1) { + QString function = rx_function.cap(2).toLower(); + qDebug("Connection::parseLine: asked to process function '%s'", function.toUtf8().data()); + sendText("OK, function sent to GUI"); + emit receivedFunction(function); + } + else { + sendText("Unknown command"); + } +} + + +MyServer::MyServer( QObject * parent ) : QTcpServer(parent) +{ + connect(this, SIGNAL(newConnection()), this, SLOT(newConnection_slot())); +} + +bool MyServer::listen( quint16 port ) { + return QTcpServer::listen(QHostAddress::LocalHost, port); +} + +void MyServer::newConnection_slot() { + Connection * c = new Connection( nextPendingConnection() ); + c->setActionsList( actionsList() ); + + connect(c, SIGNAL(receivedOpen(QString)), + this, SIGNAL(receivedOpen(QString))); + connect(c, SIGNAL(receivedOpenFiles(QStringList)), + this, SIGNAL(receivedOpenFiles(QStringList))); + connect(c, SIGNAL(receivedAddFiles(QStringList)), + this, SIGNAL(receivedAddFiles(QStringList))); + connect(c, SIGNAL(receivedFunction(QString)), + this, SIGNAL(receivedFunction(QString))); +} + +#include "moc_myserver.cpp" diff --git a/retroshare-gui/src/apps/smplayer/myserver.h b/retroshare-gui/src/apps/smplayer/myserver.h new file mode 100644 index 000000000..613db556b --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/myserver.h @@ -0,0 +1,110 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef _MYSERVER_H_ +#define _MYSERVER_H_ + +#include +#include +#include + +//! Connection holds a connection from MyServer to a client. + +/*! + Connection objects are created by MyServer every time a new + connection is made. + It reads the text sent by the client, parses it, respond, and send + signals to the server to report client requests. + This class is for private use by MyServer. +*/ + +class Connection : public QObject +{ + Q_OBJECT + +public: + Connection(QTcpSocket * s); + ~Connection(); + + void setActionsList(QStringList l) { actions_list = l; }; + QStringList actionsList() { return actions_list; }; + +signals: + void receivedOpen(QString); + void receivedOpenFiles(QStringList); + void receivedAddFiles(QStringList); + void receivedFunction(QString); + +protected slots: + void readData(); + +protected: + void sendText(QString l); + void parseLine(QString str); + +private: + QTcpSocket * socket; + QStringList actions_list; + QStringList files_to_open; +}; + +//! MyServer listens a port and waits for connections from other instances. + +/*! + MyServer will listen the specified port and will send signals + when another instance request something. +*/ + +class MyServer : public QTcpServer +{ + Q_OBJECT + +public: + MyServer( QObject * parent = 0 ); + + //! Tells the server to listen for incoming connections on port \a port. + bool listen( quint16 port ); + + //! Sets the list of actions. + //! The list is printed when the client requests it. + void setActionsList(QStringList l) { actions_list = l; }; + + //! Returns the list of actions. + QStringList actionsList() { return actions_list; }; + +signals: + //! Emitted when the client request to open a new file. + void receivedOpen(QString); + + //! Emitted when the client request to open a list of files. + void receivedOpenFiles(QStringList); + + //! Emitted when the client request to add a list of files to the playlist. + void receivedAddFiles(QStringList); + + //! Emitted when the client request to perform an action. + void receivedFunction(QString); + +protected slots: + void newConnection_slot(); + +private: + QStringList actions_list; +}; + +#endif diff --git a/retroshare-gui/src/apps/smplayer/mytablewidget.cpp b/retroshare-gui/src/apps/smplayer/mytablewidget.cpp new file mode 100644 index 000000000..5576ee372 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/mytablewidget.cpp @@ -0,0 +1,65 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "mytablewidget.h" +#include + +MyTableWidget::MyTableWidget( QWidget * parent ) : QTableWidget(parent) +{ +} + +MyTableWidget::MyTableWidget( int rows, int columns, QWidget * parent ) + : QTableWidget(rows, columns, parent) +{ +} + +QTableWidgetItem * MyTableWidget::getItem(int row, int column ) { + QTableWidgetItem * i = item(row, column); + if (i != 0) return i; else return createItem(column); +} + +QTableWidgetItem * MyTableWidget::createItem(int /*col*/) { + QTableWidgetItem * i = new QTableWidgetItem(); + i->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled); + return i; +} + +void MyTableWidget::setText(int row, int column, const QString & text ) { + QTableWidgetItem * i = getItem(row, column); + i->setText(text); + setItem(row, column, i); +} + +QString MyTableWidget::text(int row, int column) { + return getItem(row, column)->text(); +} + +void MyTableWidget::setIcon(int row, int column, const QIcon & icon ) { + QTableWidgetItem * i = getItem(row, column); + i->setIcon(icon); + setItem(row, column, i); +} + +QIcon MyTableWidget::icon(int row, int column) { + return getItem(row, column)->icon(); +} + +bool MyTableWidget::isSelected(int row, int column) { + return getItem(row, column)->isSelected(); +} + diff --git a/retroshare-gui/src/apps/smplayer/mytablewidget.h b/retroshare-gui/src/apps/smplayer/mytablewidget.h new file mode 100644 index 000000000..5d5e8d7c6 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/mytablewidget.h @@ -0,0 +1,48 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef _MYTABLEWIDGET_H_ +#define _MYTABLEWIDGET_H_ + +#include +#include + +class QTableWidgetItem; + +class MyTableWidget : public QTableWidget +{ +public: + MyTableWidget ( QWidget * parent = 0 ); + MyTableWidget ( int rows, int columns, QWidget * parent = 0 ); + + QTableWidgetItem * getItem(int row, int column ); + + void setText(int row, int column, const QString & text ); + QString text(int row, int column); + + void setIcon(int row, int column, const QIcon & icon ); + QIcon icon(int row, int column); + + bool isSelected(int row, int column); + +protected: + virtual QTableWidgetItem * createItem(int col); + +}; + +#endif diff --git a/retroshare-gui/src/apps/smplayer/playlist.cpp b/retroshare-gui/src/apps/smplayer/playlist.cpp new file mode 100644 index 000000000..713c60934 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/playlist.cpp @@ -0,0 +1,1105 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "playlist.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "mytablewidget.h" +#include "myaction.h" +#include "filedialog.h" +#include "helper.h" +#include "images.h" +#include "preferences.h" +#include "version.h" +#include "global.h" +#include "core.h" +#include "config.h" + +#include + + +#define DRAG_ITEMS 0 + +#define COL_PLAY 0 +#define COL_NAME 1 +#define COL_TIME 2 + + +Playlist::Playlist( Core *c, QWidget * parent, Qt::WindowFlags f) + : QWidget(parent,f) +{ + modified = false; + + core = c; + playlist_path = ""; + latest_dir = ""; + + createTable(); + createActions(); + createToolbar(); + + connect( core, SIGNAL(mediaFinished()), this, SLOT(playNext()) ); + connect( core, SIGNAL(mediaLoaded()), this, SLOT(getMediaInfo()) ); + + QVBoxLayout *layout = new QVBoxLayout; + layout->addWidget( listView ); + layout->addWidget( toolbar ); + setLayout(layout); + + clear(); + + retranslateStrings(); + +#if !DOCK_PLAYLIST + setSizePolicy( QSizePolicy::Minimum, QSizePolicy::Expanding ); + adjustSize(); +#else + //setSizePolicy( QSizePolicy::Maximum, QSizePolicy::Expanding ); + //setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ); + setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Preferred ); +#endif + + setAcceptDrops(true); + + // Random seed + QTime t; + t.start(); + srand( t.hour() * 3600 + t.minute() * 60 + t.second() ); + + loadSettings(); + + // Save config every 5 minutes. + save_timer = new QTimer(this); + connect( save_timer, SIGNAL(timeout()), this, SLOT(maybeSaveSettings()) ); + save_timer->start( 5 * 60000 ); +} + +Playlist::~Playlist() { + saveSettings(); +} + +void Playlist::setModified(bool mod) { + qDebug("Playlist::setModified: %d", mod); + + modified = mod; + emit modifiedChanged(modified); +} + +void Playlist::createTable() { + listView = new MyTableWidget( 0, COL_TIME + 1, this); + listView->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ); + listView->setSelectionBehavior(QAbstractItemView::SelectRows); + listView->setSelectionMode(QAbstractItemView::ExtendedSelection); + listView->setContextMenuPolicy( Qt::CustomContextMenu ); + listView->setShowGrid(false); + listView->setSortingEnabled(false); + //listView->setAlternatingRowColors(true); + listView->horizontalHeader()->setResizeMode(QHeaderView::Interactive); + listView->horizontalHeader()->setResizeMode(COL_NAME, QHeaderView::Stretch); + /* + listView->horizontalHeader()->setResizeMode(COL_TIME, QHeaderView::ResizeToContents); + listView->horizontalHeader()->setResizeMode(COL_PLAY, QHeaderView::ResizeToContents); + */ + listView->setIconSize( Images::icon("ok_small").size() ); + +#if DRAG_ITEMS + listView->setSelectionMode(QAbstractItemView::SingleSelection); + listView->setDragEnabled(true); + listView->setAcceptDrops(true); + listView->setDropIndicatorShown(true); + listView->setDragDropMode(QAbstractItemView::InternalMove); +#endif + + connect( listView, SIGNAL(cellActivated(int,int)), + this, SLOT(itemDoubleClicked(int)) ); +} + +void Playlist::createActions() { + openAct = new MyAction(this, "pl_open", false); + connect( openAct, SIGNAL(triggered()), this, SLOT(load()) ); + + saveAct = new MyAction(this, "pl_save", false); + connect( saveAct, SIGNAL(triggered()), this, SLOT(save()) ); + + playAct = new MyAction(this, "pl_play", false); + connect( playAct, SIGNAL(triggered()), this, SLOT(playCurrent()) ); + + nextAct = new MyAction(Qt::Key_N /*Qt::Key_Greater*/, this, "pl_next", false); + connect( nextAct, SIGNAL(triggered()), this, SLOT(playNext()) ); + + prevAct = new MyAction(Qt::Key_P /*Qt::Key_Less*/, this, "pl_prev", false); + connect( prevAct, SIGNAL(triggered()), this, SLOT(playPrev()) ); + + moveUpAct = new MyAction(this, "pl_move_up", false); + connect( moveUpAct, SIGNAL(triggered()), this, SLOT(upItem()) ); + + moveDownAct = new MyAction(this, "pl_move_down", false); + connect( moveDownAct, SIGNAL(triggered()), this, SLOT(downItem()) ); + + repeatAct = new MyAction(this, "pl_repeat", false); + repeatAct->setCheckable(true); + + shuffleAct = new MyAction(this, "pl_shuffle", false); + shuffleAct->setCheckable(true); + + // Add actions + addCurrentAct = new MyAction(this, "pl_add_current", false); + connect( addCurrentAct, SIGNAL(triggered()), this, SLOT(addCurrentFile()) ); + + addFilesAct = new MyAction(this, "pl_add_files", false); + connect( addFilesAct, SIGNAL(triggered()), this, SLOT(addFiles()) ); + + addDirectoryAct = new MyAction(this, "pl_add_directory", false); + connect( addDirectoryAct, SIGNAL(triggered()), this, SLOT(addDirectory()) ); + + // Remove actions + removeSelectedAct = new MyAction(this, "pl_remove_selected", false); + connect( removeSelectedAct, SIGNAL(triggered()), this, SLOT(removeSelected()) ); + + removeAllAct = new MyAction(this, "pl_remove_all", false); + connect( removeAllAct, SIGNAL(triggered()), this, SLOT(removeAll()) ); + + // Edit + editAct = new MyAction(this, "pl_edit", false); + connect( editAct, SIGNAL(triggered()), this, SLOT(editCurrentItem()) ); +} + +void Playlist::createToolbar() { + toolbar = new QToolBar(this); + toolbar->setSizePolicy( QSizePolicy::Minimum, QSizePolicy::Minimum ); + + toolbar->addAction(openAct); + toolbar->addAction(saveAct);; + toolbar->addSeparator(); + + add_menu = new QMenu( this ); + add_menu->addAction(addCurrentAct); + add_menu->addAction(addFilesAct ); + add_menu->addAction(addDirectoryAct); + + add_button = new QToolButton( this ); + add_button->setMenu( add_menu ); + add_button->setPopupMode(QToolButton::InstantPopup); + + remove_menu = new QMenu( this ); + remove_menu->addAction(removeSelectedAct); + remove_menu->addAction(removeAllAct); + + remove_button = new QToolButton( this ); + remove_button->setMenu( remove_menu ); + remove_button->setPopupMode(QToolButton::InstantPopup); + + toolbar->addWidget(add_button); + toolbar->addWidget(remove_button); + + toolbar->addSeparator(); + toolbar->addAction(playAct); + toolbar->addSeparator(); + toolbar->addAction(prevAct); + toolbar->addAction(nextAct); + toolbar->addSeparator(); + toolbar->addAction(repeatAct); + toolbar->addAction(shuffleAct); + toolbar->addSeparator(); + toolbar->addAction(moveUpAct); + toolbar->addAction(moveDownAct); + + // Popup menu + popup = new QMenu(this); + popup->addAction(playAct); + popup->addAction(removeSelectedAct); + popup->addAction(editAct); + + connect( listView, SIGNAL(customContextMenuRequested(const QPoint &)), + this, SLOT(showPopup(const QPoint &)) ); +} + +void Playlist::retranslateStrings() { + listView->setHorizontalHeaderLabels( QStringList() << " " << + tr("Name") << tr("Length") ); + + openAct->change( Images::icon("open"), tr("&Load") ); + saveAct->change( Images::icon("save"), tr("&Save") ); + + playAct->change( tr("&Play") ); + + nextAct->change( tr("&Next") ); + prevAct->change( tr("Pre&vious") ); + + if (qApp->isLeftToRight()) { + playAct->setIcon( Images::icon("play") ); + nextAct->setIcon( Images::icon("next") ); + prevAct->setIcon( Images::icon("previous") ); + } else { + playAct->setIcon( Images::flippedIcon("play") ); + nextAct->setIcon( Images::flippedIcon("next") ); + prevAct->setIcon( Images::flippedIcon("previous") ); + } + + moveUpAct->change( Images::icon("up"), tr("Move &up") ); + moveDownAct->change( Images::icon("down"), tr("Move &down") ); + + repeatAct->change( Images::icon("repeat"), tr("&Repeat") ); + shuffleAct->change( Images::icon("shuffle"), tr("S&huffle") ); + + // Add actions + addCurrentAct->change( tr("Add ¤t file") ); + addFilesAct->change( tr("Add &file(s)") ); + addDirectoryAct->change( tr("Add &directory") ); + + // Remove actions + removeSelectedAct->change( tr("Remove &selected") ); + removeAllAct->change( tr("Remove &all") ); + + // Edit + editAct->change( tr("&Edit") ); + + // Tool buttons + add_button->setIcon( Images::icon("plus") ); + add_button->setToolTip( tr("Add...") ); + remove_button->setIcon( Images::icon("minus") ); + remove_button->setToolTip( tr("Remove...") ); + + // Icon + setWindowIcon( Images::icon("logo", 64) ); + setWindowTitle( tr( "SMPlayer - Playlist" ) ); +} + +void Playlist::list() { + qDebug("Playlist::list"); + + PlaylistItemList::iterator it; + for ( it = pl.begin(); it != pl.end(); ++it ) { + qDebug( "filename: '%s', name: '%s' duration: %f", + (*it).filename().toUtf8().data(), (*it).name().toUtf8().data(), + (*it).duration() ); + } +} + +void Playlist::updateView() { + listView->setRowCount( pl.count() ); + + //QString number; + QString name; + QString time; + + for (int n=0; n < pl.count(); n++) { + name = pl[n].name(); + if (name.isEmpty()) name = pl[n].filename(); + time = Helper::formatTime( (int) pl[n].duration() ); + + //listView->setText(n, COL_POS, number); + qDebug("name: '%s'", name.toUtf8().data()); + listView->setText(n, COL_NAME, name); + listView->setText(n, COL_TIME, time); + + if (pl[n].played()) { + listView->setIcon(n, COL_PLAY, Images::icon("ok_small") ); + } else { + listView->setIcon(n, COL_PLAY, QPixmap() ); + } + } + //listView->resizeColumnsToContents(); + listView->resizeColumnToContents(COL_PLAY); + listView->resizeColumnToContents(COL_TIME); + + setCurrentItem(current_item); + + //adjustSize(); +} + +void Playlist::setCurrentItem(int current) { + QIcon play_icon; + if (qApp->isLeftToRight()) { + play_icon = Images::icon("play"); + } else { + play_icon = Images::flippedIcon("play"); + } + + int old_current = current_item; + current_item = current; + + if ((current_item > -1) && (current_item < pl.count())) { + pl[current_item].setPlayed(TRUE); + } + + if ( (old_current >= 0) && (old_current < listView->rowCount()) ) { + listView->setIcon(old_current, COL_PLAY, QPixmap() ); + } + + if ( (current_item >= 0) && (current_item < listView->rowCount()) ) { + listView->setIcon(current_item, COL_PLAY, play_icon ); + } + //if (current_item >= 0) listView->selectRow(current_item); + if (current_item >= 0) { + listView->clearSelection(); + listView->setCurrentCell( current_item, 0); + } +} + +void Playlist::clear() { + pl.clear(); + + listView->clearContents(); + listView->setRowCount(0); + + setCurrentItem(0); + + setModified( false ); +} + +int Playlist::count() { + return pl.count(); +} + +bool Playlist::isEmpty() { + return pl.isEmpty(); +} + +void Playlist::addItem(QString filename, QString name, double duration) { + qDebug("Playlist::addItem: '%s'", filename.toUtf8().data()); + + #ifdef Q_OS_WIN + filename = Helper::changeSlashes(filename); + #endif + + // Test if already is in the list + bool exists = FALSE; + PlaylistItemList::iterator it; + for ( it = pl.begin(); it != pl.end(); ++it ) { + if ( (*it).filename() == filename ) { + exists = TRUE; + break; + } + } + + if (!exists) { + if (name.isEmpty()) { + QFileInfo fi(filename); + if (fi.exists()) { + // Local file + name = fi.fileName(); //fi.baseName(TRUE); + } else { + // Stream + name = filename; + } + } + pl.append( PlaylistItem(filename, name, duration) ); + //setModified( true ); // Better set the modified on a higher level + } else { + qDebug(" Not added. File already in the list"); + } +} + +void Playlist::load_m3u(QString file) { + qDebug("Playlist::load_m3u"); + + bool utf8 = (QFileInfo(file).suffix().toLower() == "m3u8"); + + QRegExp m3u_id("^#EXTM3U|^#M3U"); + QRegExp info("^#EXTINF:(.*),(.*)"); + + QFile f( file ); + if ( f.open( QIODevice::ReadOnly ) ) { + playlist_path = QFileInfo(file).path(); + + clear(); + QString filename=""; + QString name=""; + double duration=0; + + QTextStream stream( &f ); + + if (utf8) + stream.setCodec("UTF-8"); + else + stream.setCodec(QTextCodec::codecForLocale()); + + QString line; + while ( !stream.atEnd() ) { + line = stream.readLine(); // line of text excluding '\n' + qDebug( " * line: '%s'", line.toUtf8().data() ); + if (m3u_id.indexIn(line)!=-1) { + //#EXTM3U + // Ignore line + } + else + if (info.indexIn(line)!=-1) { + duration = info.cap(1).toDouble(); + name = info.cap(2); + qDebug(" * name: '%s', duration: %f", name.toUtf8().data(), duration ); + } + else + if (line.startsWith("#")) { + // Comment + // Ignore + } else { + filename = line; + QFileInfo fi(filename); + if (fi.exists()) { + filename = fi.absoluteFilePath(); + } + if (!fi.exists()) { + if (QFileInfo( playlist_path + "/" + filename).exists() ) { + filename = playlist_path + "/" + filename; + } + } + addItem( filename, name, duration ); + name=""; + duration = 0; + } + } + f.close(); + list(); + updateView(); + + setModified( false ); + + startPlay(); + } +} + +bool Playlist::save_m3u(QString file) { + qDebug("Playlist::save_m3u: '%s'", file.toUtf8().data()); + + QString dir_path = QFileInfo(file).path(); + if (!dir_path.endsWith("/")) dir_path += "/"; + + #ifdef Q_OS_WIN + dir_path = Helper::changeSlashes(dir_path); + #endif + + qDebug(" * dirPath: '%s'", dir_path.toUtf8().data()); + + bool utf8 = (QFileInfo(file).suffix().toLower() == "m3u8"); + + QFile f( file ); + if ( f.open( QIODevice::WriteOnly ) ) { + QTextStream stream( &f ); + + if (utf8) + stream.setCodec("UTF-8"); + else + stream.setCodec(QTextCodec::codecForLocale()); + + QString filename; + + stream << "#EXTM3U" << "\n"; + stream << "# Playlist created by SMPlayer " << smplayerVersion() << " \n"; + + PlaylistItemList::iterator it; + for ( it = pl.begin(); it != pl.end(); ++it ) { + filename = (*it).filename(); + #ifdef Q_OS_WIN + filename = Helper::changeSlashes(filename); + #endif + stream << "#EXTINF:"; + stream << (*it).duration() << ","; + stream << (*it).name() << "\n"; + // Try to save the filename as relative instead of absolute + if (filename.startsWith( dir_path )) { + filename = filename.mid( dir_path.length() ); + } + stream << filename << "\n"; + } + f.close(); + + setModified( false ); + return true; + } else { + return false; + } +} + +void Playlist::load() { + if (maybeSave()) { + QString s = MyFileDialog::getOpenFileName( + this, tr("Choose a file"), + lastDir(), + tr("Playlists") +" (*.m3u *.m3u8)"); + + if (!s.isEmpty()) { + latest_dir = QFileInfo(s).absolutePath(); + load_m3u(s); + } + } +} + +bool Playlist::save() { + QString s = MyFileDialog::getSaveFileName( + this, tr("Choose a filename"), + lastDir(), + tr("Playlists") +" (*.m3u *.m3u8)" ); + + if (!s.isEmpty()) { + // If filename has no extension, add it + if (QFileInfo(s).suffix().isEmpty()) { + s = s + ".m3u"; + } + if (QFileInfo(s).exists()) { + int res = QMessageBox::question( this, + tr("Confirm overwrite?"), + tr("The file %1 already exists.\n" + "Do you want to overwrite?").arg(s), + QMessageBox::Yes, + QMessageBox::No, + QMessageBox::NoButton); + if (res == QMessageBox::No ) { + return false; + } + } + latest_dir = QFileInfo(s).absolutePath(); + return save_m3u(s); + } else { + return false; + } +} + +bool Playlist::maybeSave() { + if (!isModified()) return true; + + int res = QMessageBox::question( this, + tr("Playlist modified"), + tr("There are unsaved changes, do you want to save the playlist?"), + QMessageBox::Yes, + QMessageBox::No, + QMessageBox::Cancel); + + switch (res) { + case QMessageBox::No : return true; // Discard changes + case QMessageBox::Cancel : return false; // Cancel operation + default : return save(); + } +} + +void Playlist::playCurrent() { + int current = listView->currentRow(); + if (current > -1) { + playItem(current); + } +} + +void Playlist::itemDoubleClicked(int row) { + qDebug("Playlist::itemDoubleClicked: row: %d", row ); + playItem(row); +} + +void Playlist::showPopup(const QPoint & pos) { + qDebug("Playlist::showPopup: x: %d y: %d", pos.x(), pos.y() ); + + if (!popup->isVisible()) { + popup->move( listView->viewport()->mapToGlobal(pos) ); + popup->show(); + } +} + +void Playlist::startPlay() { + // Start to play + if ( shuffleAct->isChecked() ) + playItem( chooseRandomItem() ); + else + playItem(0); +} + +void Playlist::playItem( int n ) { + qDebug("Playlist::playItem: %d (count:%d)", n, pl.count()); + + if ( (n >= pl.count()) || (n < 0) ) { + qDebug(" out of range"); + emit playlistEnded(); + return; + } + + qDebug(" playlist_path: '%s'", playlist_path.toUtf8().data() ); + + QString filename = pl[n].filename(); + QString filename_with_path = playlist_path + "/" + filename; + + if (!filename.isEmpty()) { + //pl[n].setPlayed(TRUE); + setCurrentItem(n); + core->open(filename, 0); + } + +} + +void Playlist::playNext() { + qDebug("Playlist::playNext"); + + if (shuffleAct->isChecked()) { + // Shuffle + int chosen_item = chooseRandomItem(); + if (chosen_item == -1) { + clearPlayedTag(); + if (repeatAct->isChecked()) chosen_item = chooseRandomItem(); + } + playItem( chosen_item ); + } else { + bool finished_list = (current_item+1 >= pl.count()); + if (finished_list) clearPlayedTag(); + + if ( (repeatAct->isChecked()) && (finished_list) ) { + playItem(0); + } else { + playItem( current_item+1 ); + } + } +} + +void Playlist::playPrev() { + qDebug("Playlist::playPrev"); + playItem( current_item-1 ); +} + +void Playlist::getMediaInfo() { + qDebug("Playlist:: getMediaInfo"); + + QString filename = core->mdat.filename; + double duration = core->mdat.duration; + QString name = core->mdat.clip_name; + QString artist = core->mdat.clip_artist; + + #ifdef Q_OS_WIN + filename = Helper::changeSlashes(filename); + #endif + + if (name.isEmpty()) { + QFileInfo fi(filename); + if (fi.exists()) { + // Local file + name = fi.fileName(); + } else { + // Stream + name = filename; + } + } + if (!artist.isEmpty()) name = artist + " - " + name; + + int pos=0; + PlaylistItemList::iterator it; + for ( it = pl.begin(); it != pl.end(); ++it ) { + if ( (*it).filename() == filename ) { + if ((*it).duration()<1) { + if (!name.isEmpty()) { + (*it).setName(name); + } + (*it).setDuration(duration); + //setModified( true ); + } + else + // Edited name (sets duration to 1) + if ((*it).duration()==1) { + (*it).setDuration(duration); + //setModified( true ); + } + setCurrentItem(pos); + } + pos++; + } + updateView(); +} + +// Add current file to playlist +void Playlist::addCurrentFile() { + qDebug("Playlist::addCurrentFile"); + if (!core->mdat.filename.isEmpty()) { + addItem( core->mdat.filename, "", 0 ); + getMediaInfo(); + } +} + +void Playlist::addFiles() { + QStringList files = MyFileDialog::getOpenFileNames( + this, tr("Select one or more files to open"), + lastDir(), + tr("All files") +" (*.*)" ); + + if (files.count()!=0) addFiles(files); +} + +void Playlist::addFiles(QStringList files) { + qDebug("Playlist::addFiles"); + + QStringList::Iterator it = files.begin(); + while( it != files.end() ) { + addItem( (*it), "", 0 ); + // FIXME: set latest_dir only if the file is a local file, + // to avoid that dvd:, vcd: and so on will be used. + /* latest_dir = QFileInfo((*it)).dirPath(TRUE); */ + ++it; + } + updateView(); + + qDebug( " * latest_dir: '%s'", latest_dir.toUtf8().data() ); +} + +void Playlist::addFile(QString file) { + addFiles( QStringList() << file ); +} + +void Playlist::addDirectory() { + QString s = MyFileDialog::getExistingDirectory( + this, tr("Choose a directory"), + lastDir() ); + + if (!s.isEmpty()) { + addDirectory(s); + latest_dir = s; + } +} + +void Playlist::addDirectory(QString dir) { + QStringList dir_list = QDir(dir).entryList(); + + QString filename; + QStringList::Iterator it = dir_list.begin(); + while( it != dir_list.end() ) { + filename = dir; + if (filename.right(1)!="/") filename += "/"; + filename += (*it); + if (!QFileInfo(filename).isDir()) { + addItem( filename, "", 0 ); + } + ++it; + } + updateView(); +} + +// Remove selected items +void Playlist::removeSelected() { + qDebug("Playlist::removeSelected"); + + int first_selected = -1; + + for (int n=0; n < listView->rowCount(); n++) { + if (listView->isSelected(n, 0)) { + qDebug(" row %d selected", n); + pl[n].setMarkForDeletion(TRUE); + if (first_selected == -1) first_selected = n; + } + } + + PlaylistItemList::iterator it; + for ( it = pl.begin(); it != pl.end(); ++it ) { + if ( (*it).markedForDeletion() ) { + qDebug("Remove '%s'", (*it).filename().toUtf8().data()); + it = pl.erase(it); + it--; + setModified( true ); + } + } + + if (isEmpty()) setModified(false); + updateView(); + + if (first_selected >= listView->rowCount()) + first_selected = listView->rowCount() - 1; + + if ( ( first_selected > -1) && ( first_selected < listView->rowCount() ) ) { + listView->clearSelection(); + listView->setCurrentCell( first_selected, 0); + //listView->selectRow( first_selected ); + } +} + +void Playlist::removeAll() { + /* + pl.clear(); + updateView(); + setModified( false ); + */ + clear(); +} + +void Playlist::clearPlayedTag() { + PlaylistItemList::iterator it; + for ( it = pl.begin(); it != pl.end(); ++it ) { + (*it).setPlayed(FALSE); + } + updateView(); +} + +int Playlist::chooseRandomItem() { + qDebug( "Playlist::chooseRandomItem"); + QList fi; //List of not played items (free items) + + int n=0; + PlaylistItemList::iterator it; + for ( it = pl.begin(); it != pl.end(); ++it ) { + if (! (*it).played() ) fi.append(n); + n++; + } + + qDebug(" * free items: %d", fi.count() ); + + if (fi.count()==0) return -1; // none free + + qDebug(" * items: "); + for (int i=0; i < fi.count(); i++) { + qDebug(" * item: %d", fi[i]); + } + + int selected = (int) ((double) fi.count() * rand()/(RAND_MAX+1.0)); + qDebug(" * selected item: %d (%d)", selected, fi[selected]); + return fi[selected]; +} + +void Playlist::swapItems(int item1, int item2 ) { + PlaylistItem it1 = pl[item1]; + pl[item1] = pl[item2]; + pl[item2] = it1; + setModified( true ); +} + + +void Playlist::upItem() { + qDebug("Playlist::upItem"); + + int current = listView->currentRow(); + qDebug(" currentRow: %d", current ); + + if (current >= 1) { + swapItems( current, current-1 ); + if (current_item == (current-1)) current_item = current; + else + if (current_item == current) current_item = current-1; + updateView(); + listView->clearSelection(); + listView->setCurrentCell( current-1, 0); + } +} + +void Playlist::downItem() { + qDebug("Playlist::downItem"); + + int current = listView->currentRow(); + qDebug(" currentRow: %d", current ); + + if ( (current > -1) && (current < (pl.count()-1)) ) { + swapItems( current, current+1 ); + if (current_item == (current+1)) current_item = current; + else + if (current_item == current) current_item = current+1; + updateView(); + listView->clearSelection(); + listView->setCurrentCell( current+1, 0); + } +} + +void Playlist::editCurrentItem() { + int current = listView->currentRow(); + if (current > -1) editItem(current); +} + +void Playlist::editItem(int item) { + QString current_name = pl[item].name(); + if (current_name.isEmpty()) current_name = pl[item].filename(); + + bool ok; + QString text = QInputDialog::getText( this, + tr("Edit name"), + tr("Type the name that will be displayed in the playlist for this file:"), + QLineEdit::Normal, + current_name, &ok ); + if ( ok && !text.isEmpty() ) { + // user entered something and pressed OK + pl[item].setName(text); + + // If duration == 0 the name will be overwritten! + if (pl[item].duration()<1) pl[item].setDuration(1); + updateView(); + + setModified( true ); + } +} + +// Drag&drop +void Playlist::dragEnterEvent( QDragEnterEvent *e ) { + qDebug("Playlist::dragEnterEvent"); + + if (e->mimeData()->hasUrls()) { + e->acceptProposedAction(); + } +} + +void Playlist::dropEvent( QDropEvent *e ) { + qDebug("Playlist::dropEvent"); + + QStringList files; + + if (e->mimeData()->hasUrls()) { + QList l = e->mimeData()->urls(); + QString s; + for (int n=0; n < l.count(); n++) { + if (l[n].isValid()) { + qDebug("Playlist::dropEvent: scheme: '%s'", l[n].scheme().toUtf8().data()); + if (l[n].scheme() == "file") + s = l[n].toLocalFile(); + else + s = l[n].toString(); + /* + qDebug(" * '%s'", l[n].toString().toUtf8().data()); + qDebug(" * '%s'", l[n].toLocalFile().toUtf8().data()); + */ + qDebug("Playlist::dropEvent: file: '%s'", s.toUtf8().data()); + files.append(s); + } + } + } + + + QStringList only_files; + for (int n = 0; n < files.count(); n++) { + if ( QFileInfo( files[n] ).isDir() ) { + addDirectory( files[n] ); + } else { + only_files.append( files[n] ); + } + } + addFiles( only_files ); +} + + +void Playlist::hideEvent( QHideEvent * ) { + emit visibilityChanged(false); +} + +void Playlist::showEvent( QShowEvent * ) { + emit visibilityChanged(true); +} + +void Playlist::closeEvent( QCloseEvent * e ) { + saveSettings(); + e->accept(); +} + + +void Playlist::maybeSaveSettings() { + qDebug("Playlist::maybeSaveSettings"); + if (isModified()) saveSettings(); +} + +void Playlist::saveSettings() { + qDebug("Playlist::saveSettings"); + + QSettings * set = settings; + + set->beginGroup( "playlist"); + + set->setValue( "repeat", repeatAct->isChecked() ); + set->setValue( "shuffle", shuffleAct->isChecked() ); +//#if !DOCK_PLAYLIST + set->setValue( "window_width", size().width() ); + set->setValue( "window_height", size().height() ); +//#endif + set->setValue( "latest_dir", latest_dir ); + + set->endGroup(); + + //Save current list + set->beginGroup( "playlist_contents"); + + set->setValue( "count", (int) pl.count() ); + for ( int n=0; n < pl.count(); n++ ) { + set->setValue( QString("item_%1_filename").arg(n), pl[n].filename() ); + set->setValue( QString("item_%1_duration").arg(n), pl[n].duration() ); + set->setValue( QString("item_%1_name").arg(n), pl[n].name() ); + } + set->setValue( "current_item", current_item ); + set->setValue( "modified", modified ); + + set->endGroup(); +} + +void Playlist::loadSettings() { + qDebug("Playlist::loadSettings"); + + QSettings * set = settings; + + set->beginGroup( "playlist"); + + repeatAct->setChecked( set->value( "repeat", repeatAct->isChecked() ).toBool() ); + shuffleAct->setChecked( set->value( "shuffle", shuffleAct->isChecked() ).toBool() ); + +//#if !DOCK_PLAYLIST + QSize s; + s.setWidth( set->value( "window_width", size().width() ).toInt() ); + s.setHeight( set->value( "window_height", size().height() ).toInt() ); + resize( s ); +//#endif + + latest_dir = set->value( "latest_dir", latest_dir ).toString(); + + set->endGroup(); + + //Load latest list + set->beginGroup( "playlist_contents"); + + int count = set->value( "count", 0 ).toInt(); + QString filename, name; + double duration; + for ( int n=0; n < count; n++ ) { + filename = set->value( QString("item_%1_filename").arg(n), "" ).toString(); + duration = set->value( QString("item_%1_duration").arg(n), -1 ).toDouble(); + name = set->value( QString("item_%1_name").arg(n), "" ).toString(); + addItem( filename, name, duration ); + } + setCurrentItem( set->value( "current_item", -1 ).toInt() ); + setModified( set->value( "modified", false ).toBool() ); + updateView(); + + set->endGroup(); +} + +QString Playlist::lastDir() { + QString last_dir = latest_dir; + if (last_dir.isEmpty()) last_dir = pref->latest_dir; + return last_dir; +} + +// Language change stuff +void Playlist::changeEvent(QEvent *e) { + if (e->type() == QEvent::LanguageChange) { + retranslateStrings(); + } else { + QWidget::changeEvent(e); + } +} + +#include "moc_playlist.cpp" diff --git a/retroshare-gui/src/apps/smplayer/playlist.h b/retroshare-gui/src/apps/smplayer/playlist.h new file mode 100644 index 000000000..6cdf4cb79 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/playlist.h @@ -0,0 +1,204 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + + +#ifndef _PLAYLIST_H_ +#define _PLAYLIST_H_ + +#include +#include +#include + +class PlaylistItem { + +public: + PlaylistItem() { _filename=""; _name=""; _duration=0; + _played = FALSE; _deleted=FALSE; }; + PlaylistItem(QString filename, QString name, double duration) { + _filename = filename; _name = name; _duration = duration; + _played = FALSE; _deleted = FALSE; }; + ~PlaylistItem() {}; + + void setFilename(QString filename) { _filename = filename; }; + void setName(QString name) { _name = name; }; + void setDuration(double duration) { _duration = duration; }; + void setPlayed(bool b) { _played = b; }; + void setMarkForDeletion(bool b) { _deleted = b; }; + + QString filename() { return _filename; }; + QString name() { return _name; }; + double duration() { return _duration; }; + bool played() { return _played; }; + bool markedForDeletion() { return _deleted; }; + +private: + QString _filename, _name; + double _duration; + bool _played, _deleted; +}; + +class MyTableWidget; +class QToolBar; +class MyAction; +class Core; +class QMenu; +class QSettings; +class QToolButton; +class QTimer; + +class Playlist : public QWidget +{ + Q_OBJECT + +public: + Playlist( Core *c, QWidget * parent = 0, Qt::WindowFlags f = Qt::Window ); + ~Playlist(); + + void clear(); + void list(); + int count(); + bool isEmpty(); + + bool isModified() { return modified; }; + +public slots: + void addItem(QString filename, QString name, double duration); + + // Start playing, from item 0 if shuffle is off, or from + // a random item otherwise + void startPlay(); + + void playItem(int n); + + virtual void playNext(); + virtual void playPrev(); + + virtual void removeSelected(); + virtual void removeAll(); + + virtual void addCurrentFile(); + virtual void addFiles(); + virtual void addDirectory(); + + virtual void addFile(QString file); + virtual void addFiles(QStringList files); + virtual void addDirectory(QString dir); + + virtual bool maybeSave(); + virtual void load(); + virtual bool save(); + + virtual void load_m3u(QString file); + virtual bool save_m3u(QString file); + + virtual void getMediaInfo(); + + void setModified(bool); + +/* +public: + MyAction * playPrevAct() { return prevAct; }; + MyAction * playNextAct() { return nextAct; }; +*/ + +signals: + void playlistEnded(); + void visibilityChanged(bool visible); + void modifiedChanged(bool); + +protected: + void updateView(); + void setCurrentItem(int current); + void clearPlayedTag(); + int chooseRandomItem(); + void swapItems(int item1, int item2 ); + QString lastDir(); + +protected slots: + virtual void playCurrent(); + virtual void itemDoubleClicked(int row); + virtual void showPopup(const QPoint & pos); + virtual void upItem(); + virtual void downItem(); + virtual void editCurrentItem(); + virtual void editItem(int item); + + virtual void saveSettings(); + virtual void loadSettings(); + + virtual void maybeSaveSettings(); + +protected: + void createTable(); + void createActions(); + void createToolbar(); + +protected: + void retranslateStrings(); + virtual void changeEvent ( QEvent * event ) ; + virtual void dragEnterEvent( QDragEnterEvent * ) ; + virtual void dropEvent ( QDropEvent * ); + virtual void hideEvent ( QHideEvent * ); + virtual void showEvent ( QShowEvent * ); + virtual void closeEvent( QCloseEvent * e ); + +protected: + typedef QList PlaylistItemList; + PlaylistItemList pl; + int current_item; + + QString playlist_path; + QString latest_dir; + + Core * core; + QMenu * add_menu; + QMenu * remove_menu; + QMenu * popup; + + MyTableWidget * listView; + + QToolBar * toolbar; + QToolButton * add_button; + QToolButton * remove_button; + + MyAction * openAct; + MyAction * saveAct; + MyAction * playAct; + MyAction * prevAct; + MyAction * nextAct; + MyAction * repeatAct; + MyAction * shuffleAct; + MyAction * moveUpAct; + MyAction * moveDownAct; + MyAction * editAct; + + MyAction * addCurrentAct; + MyAction * addFilesAct; + MyAction * addDirectoryAct; + + MyAction * removeSelectedAct; + MyAction * removeAllAct; + +private: + bool modified; + QTimer * save_timer; +}; + + +#endif + diff --git a/retroshare-gui/src/apps/smplayer/playlistdock.cpp b/retroshare-gui/src/apps/smplayer/playlistdock.cpp new file mode 100644 index 000000000..bbbc30b57 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/playlistdock.cpp @@ -0,0 +1,55 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "playlistdock.h" + +PlaylistDock::PlaylistDock(QWidget * parent, Qt::WindowFlags flags) + : QDockWidget(parent, flags) +{ + //setSizePolicy( QSizePolicy::Maximum, QSizePolicy::Expanding ); +} + +PlaylistDock::~PlaylistDock() { +} + +void PlaylistDock::closeEvent( QCloseEvent * /*event*/ ) { + qDebug("PlaylistDock::closeEvent"); + emit closed(); +} + +void PlaylistDock::showEvent( QShowEvent * /* event */ ) { + qDebug("PlaylistDock::showEvent: isFloating: %d", isFloating() ); + + if (!isFloating()) { + qDebug(" docked"); + emit docked(); + } +} + +void PlaylistDock::hideEvent( QHideEvent * /* event */ ) { + qDebug("PlaylistDock::hideEvent: isFloating: %d", isFloating() ); + + if (!isFloating()) { + qDebug(" undocked"); + emit undocked(); + } +} + + +#include "moc_playlistdock.cpp" + diff --git a/retroshare-gui/src/apps/smplayer/playlistdock.h b/retroshare-gui/src/apps/smplayer/playlistdock.h new file mode 100644 index 000000000..4adf40582 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/playlistdock.h @@ -0,0 +1,43 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef _PLAYLIST_DOCK_H_ +#define _PLAYLIST_DOCK_H_ + +#include + +class PlaylistDock : public QDockWidget +{ + Q_OBJECT + +public: + PlaylistDock ( QWidget * parent = 0, Qt::WindowFlags flags = 0 ); + ~PlaylistDock(); + +signals: + void closed(); + void docked(); + void undocked(); + +protected: + virtual void closeEvent( QCloseEvent * event ); + virtual void showEvent ( QShowEvent * event ); + virtual void hideEvent ( QHideEvent * event ); +}; + +#endif diff --git a/retroshare-gui/src/apps/smplayer/prefadvanced.cpp b/retroshare-gui/src/apps/smplayer/prefadvanced.cpp new file mode 100644 index 000000000..33c5c69f5 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/prefadvanced.cpp @@ -0,0 +1,290 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + + +#include "prefadvanced.h" +#include "images.h" +#include "preferences.h" + +#include + +PrefAdvanced::PrefAdvanced(QWidget * parent, Qt::WindowFlags f) + : PrefWidget(parent, f ) +{ + setupUi(this); + + // Monitor aspect + monitoraspect_combo->addItem("Auto"); + monitoraspect_combo->addItem("4:3"); + monitoraspect_combo->addItem("16:9"); + monitoraspect_combo->addItem("5:4"); + monitoraspect_combo->addItem("16:10"); + + // MPlayer language combos. + endoffile_combo->addItem( "Exiting... \\(End of file\\)" ); + endoffile_combo->addItem( "Saliendo... \\(Fin de archivo\\.\\)" ); + endoffile_combo->addItem( "Beenden... \\(Dateiende erreicht\\)" ); + endoffile_combo->addItem( "Sortie... \\(Fin du fichier\\)" ); + endoffile_combo->addItem( "In uscita... \\(Fine del file\\)" ); + + novideo_combo->addItem( "Video: no video" ); + novideo_combo->addItem( QString::fromLatin1("Vídeo: no hay video") ); + novideo_combo->addItem( "Video: kein Video" ); + novideo_combo->addItem( QString::fromLatin1("Vidéo : pas de vidéo") ); + novideo_combo->addItem( "Video: nessun video" ); + + retranslateStrings(); +} + +PrefAdvanced::~PrefAdvanced() +{ +} + +QString PrefAdvanced::sectionName() { + return tr("Advanced"); +} + +QPixmap PrefAdvanced::sectionIcon() { + return Images::icon("pref_advanced"); +} + + +void PrefAdvanced::retranslateStrings() { + retranslateUi(this); + + monitor_aspect_icon->setPixmap( Images::icon("monitor") ); + + monitoraspect_combo->setItemText(0, tr("Auto") ); + + createHelp(); +} + +void PrefAdvanced::setData(Preferences * pref) { + setMonitorAspect( pref->monitor_aspect ); + + setClearBackground( pref->always_clear_video_background ); + setUseMplayerWindow( pref->use_mplayer_window ); + setMplayerAdditionalArguments( pref->mplayer_additional_options ); + setMplayerAdditionalVideoFilters( pref->mplayer_additional_video_filters ); + setMplayerAdditionalAudioFilters( pref->mplayer_additional_audio_filters ); + setColorKey( pref->color_key ); + + setLogMplayer( pref->log_mplayer ); + setLogSmplayer( pref->log_smplayer ); + setLogFilter( pref->log_filter ); + + setEndOfFileText( pref->rx_endoffile ); + setNoVideoText( pref->rx_novideo ); +} + +void PrefAdvanced::getData(Preferences * pref) { + requires_restart = false; + clearing_background_changed = false; + colorkey_changed = false; + monitor_aspect_changed = false; + + if (pref->monitor_aspect != monitorAspect()) { + pref->monitor_aspect = monitorAspect(); + monitor_aspect_changed = true; + requires_restart = true; + } + + if (pref->always_clear_video_background != clearBackground()) { + pref->always_clear_video_background = clearBackground(); + clearing_background_changed = true; + } + + TEST_AND_SET(pref->use_mplayer_window, useMplayerWindow()); + TEST_AND_SET(pref->mplayer_additional_options, mplayerAdditionalArguments()); + TEST_AND_SET(pref->mplayer_additional_video_filters, mplayerAdditionalVideoFilters()); + TEST_AND_SET(pref->mplayer_additional_audio_filters, mplayerAdditionalAudioFilters()); + if (pref->color_key != colorKey()) { + pref->color_key = colorKey(); + colorkey_changed = true; + requires_restart = true; + } + + pref->log_mplayer = logMplayer(); + pref->log_smplayer = logSmplayer(); + pref->log_filter = logFilter(); + + TEST_AND_SET(pref->rx_endoffile, endOfFileText()); + TEST_AND_SET(pref->rx_novideo, noVideoText()); +} + +void PrefAdvanced::setMonitorAspect(QString asp) { + if (asp.isEmpty()) + monitoraspect_combo->setCurrentIndex( 0 ); + else + monitoraspect_combo->setCurrentText(asp); + //monitoraspect_combo->setEditText(asp); +} + +QString PrefAdvanced::monitorAspect() { + if (monitoraspect_combo->currentIndex() == 0 ) + return ""; + else + return monitoraspect_combo->currentText(); +} + +void PrefAdvanced::setClearBackground(bool b) { + not_clear_background_check->setChecked(!b); +} + +bool PrefAdvanced::clearBackground() { + return !not_clear_background_check->isChecked(); +} + +void PrefAdvanced::setUseMplayerWindow(bool v) { + mplayer_use_window_check->setChecked(v); +} + +bool PrefAdvanced::useMplayerWindow() { + return mplayer_use_window_check->isChecked(); +} + +void PrefAdvanced::setMplayerAdditionalArguments(QString args) { + mplayer_args_edit->setText(args); +} + +QString PrefAdvanced::mplayerAdditionalArguments() { + return mplayer_args_edit->text(); +} + +void PrefAdvanced::setMplayerAdditionalVideoFilters(QString s) { + mplayer_vfilters_edit->setText(s); +} + +QString PrefAdvanced::mplayerAdditionalVideoFilters() { + return mplayer_vfilters_edit->text(); +} + +void PrefAdvanced::setMplayerAdditionalAudioFilters(QString s) { + mplayer_afilters_edit->setText(s); +} + +QString PrefAdvanced::mplayerAdditionalAudioFilters() { + return mplayer_afilters_edit->text(); +} + +void PrefAdvanced::setColorKey(unsigned int c) { + QString color = QString::number(c, 16); + while (color.length() < 6) color = "0"+color; + colorkey_view->setText( "#" + color ); +} + +unsigned int PrefAdvanced::colorKey() { + QString c = colorkey_view->text(); + if (c.startsWith("#")) c = c.mid(1); + + bool ok; + unsigned int color = c.toUInt(&ok, 16); + + if (!ok) + qWarning("PrefAdvanced::colorKey: cannot convert color to uint"); + + qDebug("PrefAdvanced::colorKey: color: %s", QString::number(color,16).toUtf8().data() ); + + return color; +} + +void PrefAdvanced::on_changeButton_clicked() { + //bool ok; + //int color = colorkey_view->text().toUInt(&ok, 16); + QColor color( colorkey_view->text() ); + QColor c = QColorDialog::getColor ( color, this ); + if (c.isValid()) { + //colorkey_view->setText( QString::number( c.rgb(), 16 ) ); + colorkey_view->setText( c.name() ); + } +} + +// Log options +void PrefAdvanced::setLogMplayer(bool b) { + log_mplayer_check->setChecked(b); +} + +bool PrefAdvanced::logMplayer() { + return log_mplayer_check->isChecked(); +} + +void PrefAdvanced::setLogSmplayer(bool b) { + log_smplayer_check->setChecked(b); +} + +bool PrefAdvanced::logSmplayer() { + return log_smplayer_check->isChecked(); +} + +void PrefAdvanced::setLogFilter(QString filter) { + log_filter_edit->setText(filter); +} + +QString PrefAdvanced::logFilter() { + return log_filter_edit->text(); +} + + +// MPlayer language page +void PrefAdvanced::setEndOfFileText(QString t) { + endoffile_combo->setCurrentText(t); +} + +QString PrefAdvanced::endOfFileText() { + return endoffile_combo->currentText(); +} + +void PrefAdvanced::setNoVideoText(QString t) { + novideo_combo->setCurrentText(t); +} + +QString PrefAdvanced::noVideoText() { + return novideo_combo->currentText(); +} + +void PrefAdvanced::createHelp() { + clearHelp(); + + // Advanced tab + setWhatsThis(not_clear_background_check, + tr("Don't repaint the background of the video window"), + tr("Checking this option may reduce flickering, but it also might " + "produce that the video won't be displayed properly.") ); + + // Log tab + setWhatsThis(log_mplayer_check, tr("Log MPlayer output"), + tr("If checked, smplayer will store the output of mplayer " + "(you can see it in Options->View logs->mplayer). " + "In case of problems this log can contain important information, " + "so it's recommended to keep this option checked.") ); + + setWhatsThis(log_smplayer_check, tr("Log SMPlayer output"), + tr("If this option is checked, smplayer will store the debugging " + "messages that smplayer outputs " + "(you can see the log in Options->View logs->smplayer). " + "This information can be very useful for the developer in case " + "you find a bug." ) ); + + setWhatsThis(log_filter_edit, tr("Filter for SMPlayer logs"), + tr("This option allows to filter the smplayer messages that will " + "be stored in the log. Here you can write any regular expression.
    " + "For instance: ^Core::.* will display only the lines " + "starting with Core::") ); +} + +#include "moc_prefadvanced.cpp" diff --git a/retroshare-gui/src/apps/smplayer/prefadvanced.h b/retroshare-gui/src/apps/smplayer/prefadvanced.h new file mode 100644 index 000000000..bf25bdb23 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/prefadvanced.h @@ -0,0 +1,102 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef _PREFADVANCED_H_ +#define _PREFADVANCED_H_ + +#include "ui_prefadvanced.h" +#include "prefwidget.h" + +class Preferences; + +class PrefAdvanced : public PrefWidget, public Ui::PrefAdvanced +{ + Q_OBJECT + +public: + PrefAdvanced( QWidget * parent = 0, Qt::WindowFlags f = 0 ); + ~PrefAdvanced(); + + virtual QString sectionName(); + virtual QPixmap sectionIcon(); + + // Pass data to the dialog + void setData(Preferences * pref); + + // Apply changes + void getData(Preferences * pref); + + bool clearingBackgroundChanged() { return clearing_background_changed; }; + bool colorkeyChanged() { return colorkey_changed; }; + bool monitorAspectChanged() { return monitor_aspect_changed; }; + +protected: + virtual void createHelp(); + + // Advanced + void setMonitorAspect(QString asp); + QString monitorAspect(); + + void setClearBackground(bool b); + bool clearBackground(); + + void setUseMplayerWindow(bool v); + bool useMplayerWindow(); + + void setMplayerAdditionalArguments(QString args); + QString mplayerAdditionalArguments(); + + void setMplayerAdditionalVideoFilters(QString s); + QString mplayerAdditionalVideoFilters(); + + void setMplayerAdditionalAudioFilters(QString s); + QString mplayerAdditionalAudioFilters(); + + void setColorKey(unsigned int c); + unsigned int colorKey(); + + // Log options + void setLogMplayer(bool b); + bool logMplayer(); + + void setLogSmplayer(bool b); + bool logSmplayer(); + + void setLogFilter(QString filter); + QString logFilter(); + + // MPlayer language + void setEndOfFileText(QString t); + QString endOfFileText(); + + void setNoVideoText(QString t); + QString noVideoText(); + +protected: + virtual void retranslateStrings(); + +protected slots: + void on_changeButton_clicked(); + +private: + bool clearing_background_changed; + bool colorkey_changed; + bool monitor_aspect_changed; +}; + +#endif diff --git a/retroshare-gui/src/apps/smplayer/prefadvanced.ui b/retroshare-gui/src/apps/smplayer/prefadvanced.ui new file mode 100644 index 000000000..a6779f7d9 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/prefadvanced.ui @@ -0,0 +1,589 @@ + + PrefAdvanced + + + + 0 + 0 + 494 + 570 + + + + + + + + 0 + + + 6 + + + + + 0 + + + + &Advanced + + + + 9 + + + 6 + + + + + 0 + + + 6 + + + + + icon + + + false + + + + + + + &Monitor aspect: + + + false + + + monitoraspect_combo + + + + + + + + 5 + 0 + 0 + 0 + + + + true + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 190 + 21 + + + + + + + + + + &Run MPlayer in its own window + + + + + + + Additional Options for MPlayer + + + + 9 + + + 6 + + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + + + Qt::AlignVCenter + + + false + + + + + + + 0 + + + 6 + + + + + &Options: + + + false + + + mplayer_args_edit + + + + + + + + + + + + + 7 + 0 + 0 + 0 + + + + QFrame::HLine + + + QFrame::Sunken + + + Qt::Horizontal + + + + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + + + Qt::AlignVCenter + + + false + + + + + + + 0 + + + 6 + + + + + V&ideo filters: + + + false + + + mplayer_vfilters_edit + + + + + + + + + + + + + 7 + 0 + 0 + 0 + + + + QFrame::HLine + + + QFrame::Sunken + + + Qt::Horizontal + + + + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + + + Qt::AlignVCenter + + + false + + + + + + + 0 + + + 6 + + + + + Audio &filters: + + + false + + + mplayer_afilters_edit + + + + + + + + + + + + + + + 0 + + + 6 + + + + + &Colorkey: + + + false + + + colorkey_view + + + + + + + + 1 + 0 + 0 + 0 + + + + + + + + C&hange... + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 131 + 21 + + + + + + + + + + &Don't repaint the background of the video window + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + &Logs + + + + 6 + + + 6 + + + + + Log &MPlayer output + + + + + + + Log &SMPlayer output + + + + + + + + 7 + 0 + 0 + 0 + + + + QFrame::HLine + + + QFrame::Sunken + + + Qt::Horizontal + + + + + + + This option is mainly intended for debugging the application. + + + false + + + + + + + &Filter for SMPlayer logs: + + + false + + + log_filter_edit + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + &MPlayer language + + + + 6 + + + 6 + + + + + SMPlayer needs to read and parse the output of MPlayer and sometimes it relies on English text. If you are using a MPlayer translated into another language, then you need to change the texts that SMPlayer looks for. (Technically you should enter regular expressions)<br><br> +The drop-down lists may provide already made regular expression for several languages. + + + Qt::AlignVCenter + + + true + + + + + + + &End of file: + + + false + + + endoffile_combo + + + + + + + &No video: + + + false + + + novideo_combo + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + 7 + 0 + 0 + 0 + + + + true + + + + + + + + 7 + 0 + 0 + 0 + + + + true + + + + + + + + + + + + MyComboBox + QComboBox +
    mycombobox.h
    +
    +
    + + advanced_tab + monitoraspect_combo + mplayer_use_window_check + mplayer_args_edit + mplayer_vfilters_edit + mplayer_afilters_edit + colorkey_view + changeButton + not_clear_background_check + log_mplayer_check + log_smplayer_check + log_filter_edit + endoffile_combo + novideo_combo + + + +
    diff --git a/retroshare-gui/src/apps/smplayer/prefassociations.cpp b/retroshare-gui/src/apps/smplayer/prefassociations.cpp new file mode 100644 index 000000000..512cd6bd7 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/prefassociations.cpp @@ -0,0 +1,250 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + prefassociations.cpp + Handles file associations in Windows + Author: Florin Braghis (florin@libertv.ro) +*/ + + +#include "prefassociations.h" +#include "images.h" +#include "preferences.h" +#include +#include +#include +#include "winfileassoc.h" + + +static Qt::CheckState CurItemCheckState = Qt::Unchecked; + +PrefAssociations::PrefAssociations(QWidget * parent, Qt::WindowFlags f) +: PrefWidget(parent, f ) +{ + setupUi(this); + + connect(selectAll, SIGNAL(clicked(bool)), this, SLOT(selectAllClicked(bool))); + connect(selectNone, SIGNAL(clicked(bool)), this, SLOT(selectNoneClicked(bool))); + connect(listWidget, SIGNAL(itemClicked(QListWidgetItem*)), this, SLOT(listItemClicked(QListWidgetItem*))); + connect(listWidget, SIGNAL(itemPressed(QListWidgetItem*)), this, SLOT(listItemPressed(QListWidgetItem*))); + + //Video for windows + addItem("avi"); + addItem("vfw"); + addItem("divx"); + + //MPEG + addItem("mpg"); + addItem("mpeg"); + addItem("m1v"); + addItem("m2v"); + addItem("mpv"); + addItem("dv"); + addItem("3gp"); + + //QT + addItem("mov"); + addItem("mp4"); + addItem("m4v"); + addItem("mqv"); + + //VCD + addItem("dat"); + addItem("vcd"); + + //OGG + addItem("ogg"); + addItem("ogm"); + + //WMV + addItem("asf"); + addItem("wmv"); + + //Matroska + addItem("mkv"); + + //NSV + addItem("nsv"); + + //REAL + addItem("ram"); + + //DVD + addItem("bin"); + addItem("iso"); + addItem("vob"); + + //FLV + addItem("flv"); + retranslateStrings(); +} + +PrefAssociations::~PrefAssociations() +{ + +} + +void PrefAssociations::selectAllClicked(bool) +{ + for (int k = 0; k < listWidget->count(); k++) + listWidget->item(k)->setCheckState(Qt::Checked); + listWidget->setFocus(); +} + +void PrefAssociations::selectNoneClicked(bool) +{ + for (int k = 0; k < listWidget->count(); k++) + listWidget->item(k)->setCheckState(Qt::Unchecked); + listWidget->setFocus(); +} + +void PrefAssociations::listItemClicked(QListWidgetItem* item) +{ + if (item->checkState() == CurItemCheckState) + { + //Clicked on the list item (not checkbox) + if (item->checkState() == Qt::Checked) + item->setCheckState(Qt::Unchecked); + else + item->setCheckState(Qt::Checked); + } + //else - clicked on the checkbox itself, do nothing +} + +void PrefAssociations::listItemPressed(QListWidgetItem* item) +{ + CurItemCheckState = item->checkState(); +} + +void PrefAssociations::addItem(const char* label) +{ + QListWidgetItem* item = new QListWidgetItem(listWidget); + item->setText(label); + item->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled); +} + +void PrefAssociations::setData(Preferences * pref) +{ + QStringList extensions = pref->extensions.split(","); + for (int k = 0; k < listWidget->count(); k++) + { + QListWidgetItem* pItem = listWidget->item(k); + if (pItem) + { + //pItem->setSelected(extensions.contains(pItem->text())); + if (extensions.contains(pItem->text())) + pItem->setCheckState(Qt::Checked); + else + pItem->setCheckState(Qt::Unchecked); + + } + } +} + +int PrefAssociations::ProcessAssociations(QStringList& current, QStringList& old) +{ + int processed = 0; + + WinFileAssoc RegAssoc("SMPlayer.exe"); + + //Restore unselected associations + for (int k = 0; k < old.count(); k++) + { + const QString& ext = old[k]; + if (!current.contains(ext)) + { + RegAssoc.RestoreFileAssociation(ext); + } + } + + //Set current associations + if (current.count() > 0) + { + RegAssoc.CreateClassId(QApplication::applicationFilePath(), "SMPlayer Video Player"); + + for (int k = 0; k < current.count(); k++) + { + if (RegAssoc.CreateFileAssociation(current[k])) + processed++; + } + } + else + RegAssoc.RemoveClassId(); + + return processed; +} + +void PrefAssociations::getData(Preferences * pref) +{ + QStringList extensions; + + for (int k = 0; k < listWidget->count(); k++) + { + QListWidgetItem* pItem = listWidget->item(k); + if (pItem && pItem->checkState() == Qt::Checked) + extensions.append(pItem->text()); + } + + QStringList old = pref->extensions.split(","); + + int processed = ProcessAssociations(extensions, old); + + //Save the new associations + pref->extensions = extensions.join(","); + + if (processed != extensions.count()) + { + QMessageBox::warning(this, tr("Warning"), + tr("Not all files could be associated. Please check your " + "security permissions and retry."), QMessageBox::Ok); + } + +} + +QString PrefAssociations::sectionName() { + return tr("File Types"); +} + +QPixmap PrefAssociations::sectionIcon() { + return Images::icon("pref_associations"); +} + +void PrefAssociations::retranslateStrings() { + retranslateUi(this); + createHelp(); +} + +void PrefAssociations::createHelp() +{ + clearHelp(); + + setWhatsThis(selectAll, tr("Select all"), + tr("Check all file types in the list")); + + setWhatsThis(selectNone, tr("Select none"), + tr("Uncheck all file types in the list")); + + setWhatsThis(listWidget, tr("List of file types"), + tr("Check the media file extensions you would like SMPlayer to handle. " + "When you click Apply, the checked files will be associated with " + "SMPlayer. If you uncheck a media type, the file association will " + "be restored.")); +} + +#include "moc_prefassociations.cpp" + diff --git a/retroshare-gui/src/apps/smplayer/prefassociations.h b/retroshare-gui/src/apps/smplayer/prefassociations.h new file mode 100644 index 000000000..93a79c999 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/prefassociations.h @@ -0,0 +1,66 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + prefassociations.h + Handles file associations in Windows + Author: Florin Braghis (florin@libertv.ro) +*/ + +#ifndef _PREFASSOCIATIONS_H_ +#define _PREFASSOCIATIONS_H_ + +#include "ui_prefassociations.h" +#include "prefwidget.h" + +class Preferences; + +class PrefAssociations : public PrefWidget, public Ui::PrefAssociations +{ + Q_OBJECT + +public: + PrefAssociations( QWidget * parent = 0, Qt::WindowFlags f = 0 ); + ~PrefAssociations(); + + virtual QString sectionName(); + virtual QPixmap sectionIcon(); + + // Pass data to the dialog + void setData(Preferences * pref); + + // Apply changes + void getData(Preferences * pref); + void addItem(const char* label); + int ProcessAssociations(QStringList& current, QStringList& old); +protected: + virtual void createHelp(); + + + +protected: + virtual void retranslateStrings(); + +public slots: + void selectAllClicked(bool); + void selectNoneClicked(bool); + void listItemClicked(QListWidgetItem* item); + void listItemPressed(QListWidgetItem* item); + +}; + +#endif diff --git a/retroshare-gui/src/apps/smplayer/prefassociations.ui b/retroshare-gui/src/apps/smplayer/prefassociations.ui new file mode 100644 index 000000000..bb42970a0 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/prefassociations.ui @@ -0,0 +1,115 @@ + + PrefAssociations + + + + 0 + 0 + 531 + 489 + + + + + + + + 0 + + + 0 + + + + + 0 + + + + File types + + + + 9 + + + 6 + + + + + Media files handled by SMPlayer: + + + Qt::AlignVCenter + + + true + + + + + + + QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed|QAbstractItemView::NoEditTriggers + + + QAbstractItemView::MultiSelection + + + QListView::ListMode + + + true + + + true + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + + 311 + 20 + + + + + + + + Select All + + + + + + + Select None + + + + + + + + + + + + + + diff --git a/retroshare-gui/src/apps/smplayer/prefdrives.cpp b/retroshare-gui/src/apps/smplayer/prefdrives.cpp new file mode 100644 index 000000000..b3c3da61b --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/prefdrives.cpp @@ -0,0 +1,120 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + + +#include "prefdrives.h" +#include "images.h" +#include "preferences.h" + +#include +#include +#include + +PrefDrives::PrefDrives(QWidget * parent, Qt::WindowFlags f) + : PrefWidget(parent, f ) +{ + setupUi(this); + + // DVD device combo + // In windows, insert the drives letters +#ifdef Q_OS_WIN + QFileInfoList list = QDir::drives(); + for (int n = 0; n < list.size(); n++) { + QString s = list[n].filePath(); + if (s.endsWith("/")) s = s.remove( s.length()-1,1); + dvd_device_combo->addItem( s ); + cdrom_device_combo->addItem( s ); + } +#else +#define ADD_IF_EXISTS( string ) \ + if (QFile::exists( string )) { \ + dvd_device_combo->addItem( string ); \ + cdrom_device_combo->addItem( string ); \ + } + + ADD_IF_EXISTS("/dev/dvd"); + ADD_IF_EXISTS("/dev/dvdrecorder"); + ADD_IF_EXISTS("/dev/cdrom"); + ADD_IF_EXISTS("/dev/cdrecorder"); +#endif + + retranslateStrings(); +} + +PrefDrives::~PrefDrives() +{ +} + +QString PrefDrives::sectionName() { + return tr("Drives"); +} + +QPixmap PrefDrives::sectionIcon() { + return Images::icon("pref_devices"); +} + + +void PrefDrives::retranslateStrings() { + retranslateUi(this); + + cdrom_drive_icon->setPixmap( Images::icon("cdrom_drive") ); + dvd_drive_icon->setPixmap( Images::icon("dvd_drive") ); + + createHelp(); +} + +void PrefDrives::setData(Preferences * pref) { + setDVDDevice( pref->dvd_device ); + setCDRomDevice( pref->cdrom_device ); +} + +void PrefDrives::getData(Preferences * pref) { + requires_restart = false; + + pref->dvd_device = dvdDevice(); + pref->cdrom_device = cdromDevice(); +} + +void PrefDrives::setDVDDevice( QString dir ) { + dvd_device_combo->setCurrentText( dir ); +} + +QString PrefDrives::dvdDevice() { + return dvd_device_combo->currentText(); +} + +void PrefDrives::setCDRomDevice( QString dir ) { + cdrom_device_combo->setCurrentText( dir ); +} + +QString PrefDrives::cdromDevice() { + return cdrom_device_combo->currentText(); +} + +void PrefDrives::createHelp() { + clearHelp(); + + setWhatsThis(cdrom_device_combo, tr("CD device"), + tr("Choose your CDROM device. It will be used to play " + "VCDs and Audio CDs.") ); + + setWhatsThis(dvd_device_combo, tr("DVD device"), + tr("Choose your DVD device. It will be used to play DVDs.") ); +} + +#include "moc_prefdrives.cpp" diff --git a/retroshare-gui/src/apps/smplayer/prefdrives.h b/retroshare-gui/src/apps/smplayer/prefdrives.h new file mode 100644 index 000000000..12439089a --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/prefdrives.h @@ -0,0 +1,57 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef _PREFDRIVES_H_ +#define _PREFDRIVES_H_ + +#include "ui_prefdrives.h" +#include "prefwidget.h" + +class Preferences; + +class PrefDrives : public PrefWidget, public Ui::PrefDrives +{ + Q_OBJECT + +public: + PrefDrives( QWidget * parent = 0, Qt::WindowFlags f = 0 ); + ~PrefDrives(); + + virtual QString sectionName(); + virtual QPixmap sectionIcon(); + + // Pass data to the dialog + void setData(Preferences * pref); + + // Apply changes + void getData(Preferences * pref); + +protected: + virtual void createHelp(); + + void setDVDDevice( QString dir ); + QString dvdDevice(); + + void setCDRomDevice( QString dir ); + QString cdromDevice(); + +protected: + virtual void retranslateStrings(); +}; + +#endif diff --git a/retroshare-gui/src/apps/smplayer/prefdrives.ui b/retroshare-gui/src/apps/smplayer/prefdrives.ui new file mode 100644 index 000000000..1cc647547 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/prefdrives.ui @@ -0,0 +1,257 @@ + + PrefDrives + + + + 0 + 0 + 531 + 489 + + + + + + + + 0 + + + 0 + + + + + 0 + + + + Drives + + + + 9 + + + 6 + + + + + Currently SMPlayer does not autodetect cdrom or dvd devices. So in order to play cdroms or dvds you must first select here your cdrom and dvd drives (can be the same). + + + Qt::AlignVCenter + + + true + + + + + + + 0 + + + 6 + + + + + icon + + + false + + + + + + + 0 + + + 6 + + + + + Select your &CD device: + + + false + + + cdrom_device_combo + + + + + + + + 5 + 0 + 0 + 0 + + + + true + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 366 + 70 + + + + + + + + + + + 7 + 0 + 0 + 0 + + + + QFrame::HLine + + + QFrame::Sunken + + + Qt::Horizontal + + + + + + + 0 + + + 6 + + + + + icon + + + false + + + + + + + 0 + + + 6 + + + + + Select your &DVD device: + + + false + + + dvd_device_combo + + + + + + + + 5 + 0 + 0 + 0 + + + + true + + + false + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 355 + 70 + + + + + + + + + + Qt::Vertical + + + + 231 + 171 + + + + + + + + + + + + + + MyComboBox + QComboBox +
    mycombobox.h
    +
    +
    + + tabWidget + cdrom_device_combo + dvd_device_combo + + + +
    diff --git a/retroshare-gui/src/apps/smplayer/preferences.cpp b/retroshare-gui/src/apps/smplayer/preferences.cpp new file mode 100644 index 000000000..a99dcca2e --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/preferences.cpp @@ -0,0 +1,624 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "preferences.h" +#include "global.h" +#include "helper.h" +#include "mediasettings.h" + +#include +#include +#include + +Preferences::Preferences() { + reset(); + load(); +} + +Preferences::~Preferences() { + save(); +} + +void Preferences::reset() { +#ifdef Q_OS_WIN + mplayer_bin= "mplayer/mplayer.exe"; +#else + mplayer_bin = "mplayer"; +#endif + + /* + QFileInfo fi(mplayer_bin); + if (fi.exists()) { + mplayer_bin = fi.absFilePath(); + qDebug("mplayer_bin: '%s'", mplayer_bin.toUtf8().data()); + } + */ + + use_fontconfig = FALSE; + use_ass_subtitles = FALSE; + font_file = ""; + font_name = ""; + subcp = "ISO-8859-1"; + font_autoscale = 1; + font_textscale = 5; + autoload_sub = TRUE; + subfuzziness = 1; + ass_color = 0xFFFF00; + ass_border_color = 0x000000; + //ass_styles = "Bold=1,Outline=2,Shadow=2"; + ass_styles = ""; + + osd = None; + + vo = ""; + ao = ""; + + color_key = 0x020202; + +/* +#ifdef Q_OS_WIN + dvd_device="E:"; + cdrom_device="E:"; +#else + dvd_device="/dev/dvd"; + cdrom_device="/dev/cdrom"; +#endif +*/ + + dvd_device = ""; + cdrom_device = ""; + + // MPlayer 1.0rc1 require restart, new versions don't + audio_change_requires_restart = FALSE; // Now we need a svn mplayer + fast_chapter_change = FALSE; + + use_cache = false; + cache = 2000; + + use_mplayer_window = FALSE; + + monitor_aspect=""; // Autodetect + + latest_dir=""; + last_url=""; + last_dvd_directory=""; + + mplayer_verbose=""; + + resize_method = Always; + disable_screensaver = true; + + use_direct_rendering = false; + use_double_buffer = true; + + screenshot_directory=""; + if (QFile::exists(Helper::appHomePath() + "/screenshots")) { + screenshot_directory = Helper::appHomePath() + "/screenshots"; + } + subtitles_on_screenshots = TRUE; + + use_soft_video_eq = FALSE; + use_soft_vol = FALSE; + softvol_max = 110; // 110 = default value in mplayer + + audio_lang = ""; + subtitle_lang = ""; + + use_idx = false; + + dont_change_volume = false; + + use_hwac3 = false; + + mplayer_additional_options=""; + mplayer_additional_video_filters=""; + mplayer_additional_audio_filters=""; + + priority = AboveNormal; // Option only for windows + frame_drop = FALSE; + hard_frame_drop = FALSE; + autosync = FALSE; + autosync_factor = 100; + + dont_remember_media_settings = FALSE; + dont_remember_time_pos = FALSE; + +#if STYLE_SWITCHING + style=""; +#endif + + fullscreen = FALSE; + start_in_fullscreen = FALSE; + + compact_mode = FALSE; + stay_on_top = FALSE; + size_factor = 100; // 100% + + show_frame_counter = FALSE; + + autoq = 6; + + loop = FALSE; + + use_single_instance = FALSE; + connection_port = 8000; + + mouse_left_click_function = ""; + mouse_double_click_function = "fullscreen"; + wheel_function = Seeking; + + recents_max_items = 10; + + seeking1 = 10; + seeking2 = 60; + seeking3 = 10*60; + seeking4 = 30; + + log_mplayer = TRUE; + log_smplayer = TRUE; + log_filter = ".*"; + + language = ""; + iconset = ""; + + // "Don't repaint video background" in the preferences dialog +#ifdef Q_OS_WIN + always_clear_video_background = true; +#else + always_clear_video_background = false; +#endif + + rx_endoffile = "Exiting... \\(End of file\\)"; + rx_novideo = "Video: no video"; + + balloon_count = 5; + + dont_use_eq_options = false; + +#if USE_SUBFONT + use_subfont = false; +#endif + +#ifdef Q_OS_WIN + restore_pos_after_fullscreen = true; +#else + restore_pos_after_fullscreen = false; +#endif + + save_window_size_on_exit = true; + + enable_vcd_on_windows = false; + enable_audiocd_on_windows = false; + + close_on_finish = false; + + default_font = ""; + + pause_when_hidden = false; + + + vcd_initial_title = 2; // Most VCD's start at title #2 + + initial_volume = 40; + initial_contrast = 0; + initial_brightness = 0; + initial_hue = 0; + initial_saturation = 0; + initial_gamma = 0; + + initial_panscan_factor = 1.0; + initial_sub_pos = 100; // 100% + + initial_postprocessing = false; + initial_volnorm = false; + + initial_audio_channels = MediaSettings::ChDefault; + + initial_audio_track = 0; + initial_subtitle_track = 0; +} + +void Preferences::save() { + qDebug("Preferences::save"); + + QSettings * set = settings; + + set->beginGroup( "preferences"); + + set->setValue("mplayer_bin", mplayer_bin); + set->setValue("use_fontconfig", use_fontconfig); + set->setValue("font_file", font_file); + set->setValue("font_name", font_name); + set->setValue("font_autoscale", font_autoscale); + set->setValue("font_textscale", font_textscale); + set->setValue("subcp", subcp); + set->setValue("use_ass_subtitles", use_ass_subtitles); + set->setValue("autoload_sub", autoload_sub); + set->setValue("subfuzziness", subfuzziness); + set->setValue("ass_color", (int) ass_color); + set->setValue("ass_border_color", (int) ass_border_color); + set->setValue("ass_styles", ass_styles); + + set->setValue("osd", osd); + set->setValue("vo", vo); + set->setValue("ao", ao); + + set->setValue("color_key", QString::number(color_key,16)); + + set->setValue("audio_change_requires_restart", audio_change_requires_restart); + set->setValue("fast_chapter_change", fast_chapter_change); + + set->setValue("dvd_device", dvd_device); + set->setValue("cdrom_device", cdrom_device); + + set->setValue("use_cache", use_cache); + set->setValue("cache", cache); + set->setValue("use_mplayer_window", use_mplayer_window); + + set->setValue("monitor_aspect", monitor_aspect); + + set->setValue("latest_dir", latest_dir); + set->setValue("last_url", last_url); + set->setValue("last_dvd_directory", last_dvd_directory); + + set->setValue("mplayer_verbose", mplayer_verbose); + set->setValue("resize_method", resize_method); + set->setValue("disable_screensaver", disable_screensaver); + + set->setValue("use_direct_rendering", use_direct_rendering); + set->setValue("use_double_buffer", use_double_buffer); + + set->setValue("screenshot_directory", screenshot_directory); + set->setValue("subtitles_on_screenshots", subtitles_on_screenshots); + + set->setValue("use_soft_video_eq", use_soft_video_eq); + set->setValue("use_soft_vol", use_soft_vol); + set->setValue("softvol_max", softvol_max); + + + set->setValue("audio_lang", audio_lang); + set->setValue("subtitle_lang", subtitle_lang); + + set->setValue("use_idx", use_idx); + + set->setValue("dont_change_volume", dont_change_volume ); + + set->setValue("use_hwac3", use_hwac3 ); + + set->setValue("vcd_initial_title", vcd_initial_title); + + + set->setValue("mplayer_additional_options", mplayer_additional_options); + set->setValue("mplayer_additional_video_filters", mplayer_additional_video_filters); + set->setValue("mplayer_additional_audio_filters", mplayer_additional_audio_filters); + + set->setValue("priority", priority); + set->setValue("frame_drop", frame_drop); + set->setValue("hard_frame_drop", hard_frame_drop); + set->setValue("autosync", autosync); + set->setValue("autosync_factor", autosync_factor); + + set->setValue("dont_remember_media_settings", dont_remember_media_settings); + set->setValue("dont_remember_time_pos", dont_remember_time_pos); + +#if STYLE_SWITCHING + set->setValue("style", style); +#endif + + set->setValue("fullscreen", fullscreen); + set->setValue("start_in_fullscreen", start_in_fullscreen); + + set->setValue("compact_mode", compact_mode); + set->setValue("stay_on_top", stay_on_top); + set->setValue("size_factor", size_factor); + + set->setValue("show_frame_counter", show_frame_counter); + + set->setValue("autoq", autoq); + + set->setValue("loop", loop); + + set->setValue("use_single_instance", use_single_instance); + set->setValue("connection_port", connection_port); + + set->setValue("mouse_left_click_function", mouse_left_click_function); + set->setValue("mouse_double_click_function", mouse_double_click_function); + set->setValue("wheel_function", wheel_function); + + set->setValue("recents_max_items", recents_max_items); + + set->setValue("seeking1", seeking1); + set->setValue("seeking2", seeking2); + set->setValue("seeking3", seeking3); + set->setValue("seeking4", seeking4); + + set->setValue("log_mplayer", log_mplayer); + set->setValue("log_smplayer", log_smplayer); + set->setValue("log_filter", log_filter); + + set->setValue("language", language); + set->setValue("iconset", iconset); + + set->setValue("always_clear_video_background", always_clear_video_background); + + set->setValue("rx_endoffile", rx_endoffile); + set->setValue("rx_novideo", rx_novideo); + + set->setValue("balloon_count", balloon_count); + + set->setValue("dont_use_eq_options", dont_use_eq_options); + +#if USE_SUBFONT + set->setValue("use_subfont", use_subfont); +#endif + + set->setValue("restore_pos_after_fullscreen", restore_pos_after_fullscreen); + set->setValue("save_window_size_on_exit", save_window_size_on_exit); + + set->setValue("enable_vcd_on_windows", enable_vcd_on_windows); + set->setValue("enable_audiocd_on_windows", enable_audiocd_on_windows); + + set->setValue("close_on_finish", close_on_finish); + + set->setValue("default_font", default_font); + + set->setValue("pause_when_hidden", pause_when_hidden); + + set->endGroup(); + + + set->beginGroup( "defaults"); + + set->setValue("initial_volume", initial_volume); + set->setValue("initial_contrast", initial_contrast); + set->setValue("initial_brightness", initial_brightness); + set->setValue("initial_hue", initial_hue); + set->setValue("initial_saturation", initial_saturation); + set->setValue("initial_gamma", initial_gamma); + + set->setValue("initial_panscan_factor", initial_panscan_factor); + set->setValue("initial_sub_pos", initial_sub_pos); + + set->setValue("initial_volnorm", initial_volnorm); + set->setValue("initial_postprocessing", initial_postprocessing); + + set->setValue("initial_audio_channels", initial_audio_channels); + + set->setValue("initial_audio_track", initial_audio_track); + set->setValue("initial_subtitle_track", initial_subtitle_track); + + set->endGroup(); + + + set->beginGroup("associations"); + set->setValue("extensions", extensions); + set->endGroup(); +} + +void Preferences::load() { + qDebug("Preferences::load"); + + QSettings * set = settings; + + set->beginGroup( "preferences"); + + mplayer_bin = set->value("mplayer_bin", mplayer_bin).toString(); + + use_fontconfig = set->value("use_fontconfig", use_fontconfig).toBool(); + font_file = set->value("font_file", font_file).toString(); + font_name = set->value("font_name", font_name).toString(); + font_autoscale = set->value("font_autoscale", font_autoscale).toInt(); + font_textscale = set->value("font_textscale", font_textscale).toInt(); + subcp = set->value("subcp", subcp).toString(); + subfuzziness = set->value("subfuzziness", subfuzziness).toInt(); + use_ass_subtitles = set->value("use_ass_subtitles", use_ass_subtitles).toBool(); + autoload_sub = set->value("autoload_sub", autoload_sub).toBool(); + ass_color = set->value("ass_color", ass_color).toInt(); + ass_border_color = set->value("ass_border_color", ass_border_color).toInt(); + ass_styles = set->value("ass_styles", ass_styles).toString(); + + osd = set->value("osd", osd).toInt(); + vo = set->value("vo", vo).toString(); + ao = set->value("ao", ao).toString(); + + bool ok; + QString color = set->value("color_key", QString::number(color_key,16)).toString(); + unsigned int temp_color_key = color.toUInt(&ok, 16); + if (ok) + color_key = temp_color_key; + //color_key = set->value("color_key", color_key).toInt(); + + audio_change_requires_restart = set->value("audio_change_requires_restart", audio_change_requires_restart).toBool(); + fast_chapter_change = set->value("fast_chapter_change", fast_chapter_change).toBool(); + + dvd_device = set->value("dvd_device", dvd_device).toString(); + cdrom_device = set->value("cdrom_device", cdrom_device).toString(); + + use_cache = set->value("use_cache", use_cache).toBool(); + cache = set->value("cache", cache).toInt(); + use_mplayer_window = set->value("use_mplayer_window", use_mplayer_window).toBool(); + + monitor_aspect = set->value("monitor_aspect", monitor_aspect).toString(); + + latest_dir = set->value("latest_dir", latest_dir).toString(); + last_url = set->value("last_url", last_url).toString(); + last_dvd_directory = set->value("last_dvd_directory", last_dvd_directory).toString(); + + mplayer_verbose = set->value("mplayer_verbose", mplayer_verbose).toString(); + resize_method = set->value("resize_method", resize_method).toInt(); + disable_screensaver = set->value("disable_screensaver", disable_screensaver).toBool(); + + use_direct_rendering = set->value("use_direct_rendering", use_direct_rendering).toBool(); + use_double_buffer = set->value("use_double_buffer", use_double_buffer).toBool(); + + screenshot_directory = set->value("screenshot_directory", screenshot_directory).toString(); + subtitles_on_screenshots = set->value("subtitles_on_screenshots", subtitles_on_screenshots).toBool(); + + use_soft_video_eq = set->value("use_soft_video_eq", use_soft_video_eq).toBool(); + use_soft_vol = set->value("use_soft_vol", use_soft_vol).toBool(); + softvol_max = set->value("softvol_max", softvol_max).toInt(); + + audio_lang = set->value("audio_lang", audio_lang).toString(); + subtitle_lang = set->value("subtitle_lang", subtitle_lang).toString(); + + use_idx = set->value("use_idx", use_idx).toBool(); + + dont_change_volume = set->value("dont_change_volume", dont_change_volume ).toBool(); + + use_hwac3 = set->value("use_hwac3", use_hwac3 ).toBool(); + + vcd_initial_title = set->value("vcd_initial_title", vcd_initial_title ).toInt(); + + + mplayer_additional_options = set->value("mplayer_additional_options", mplayer_additional_options).toString(); + mplayer_additional_video_filters = set->value("mplayer_additional_video_filters", mplayer_additional_video_filters).toString(); + mplayer_additional_audio_filters = set->value("mplayer_additional_audio_filters", mplayer_additional_audio_filters).toString(); + + priority = set->value("priority", priority).toInt(); + frame_drop = set->value("frame_drop", frame_drop).toBool(); + hard_frame_drop = set->value("hard_frame_drop", hard_frame_drop).toBool(); + autosync = set->value("autosync", autosync).toBool(); + autosync_factor = set->value("autosync_factor", autosync_factor).toInt(); + + dont_remember_media_settings = set->value("dont_remember_media_settings", dont_remember_media_settings).toBool(); + dont_remember_time_pos = set->value("dont_remember_time_pos", dont_remember_time_pos).toBool(); + +#if STYLE_SWITCHING + style = set->value("style", style).toString(); +#endif + + fullscreen = set->value("fullscreen", fullscreen).toBool(); + start_in_fullscreen = set->value("start_in_fullscreen", start_in_fullscreen).toBool(); + + compact_mode = set->value("compact_mode", compact_mode).toBool(); + stay_on_top = set->value("stay_on_top", stay_on_top).toBool(); + size_factor = set->value("size_factor", size_factor).toInt(); + + show_frame_counter = set->value("show_frame_counter", show_frame_counter).toBool(); + + autoq = set->value("autoq", autoq).toInt(); + + loop = set->value("loop", loop).toBool(); + + use_single_instance = set->value("use_single_instance", use_single_instance).toBool(); + connection_port = set->value("connection_port", connection_port).toInt(); + + mouse_left_click_function = set->value("mouse_left_click_function", mouse_left_click_function).toString(); + mouse_double_click_function = set->value("mouse_double_click_function", mouse_double_click_function).toString(); + wheel_function = set->value("wheel_function", wheel_function).toInt(); + + recents_max_items = set->value("recents_max_items", recents_max_items).toInt(); + + seeking1 = set->value("seeking1", seeking1).toInt(); + seeking2 = set->value("seeking2", seeking2).toInt(); + seeking3 = set->value("seeking3", seeking3).toInt(); + seeking4 = set->value("seeking4", seeking4).toInt(); + + language = set->value("language", language).toString(); + iconset= set->value("iconset", iconset).toString(); + + log_mplayer = set->value("log_mplayer", log_mplayer).toBool(); + log_smplayer = set->value("log_smplayer", log_smplayer).toBool(); + log_filter = set->value("log_filter", log_filter).toString(); + + always_clear_video_background = set->value("always_clear_video_background", always_clear_video_background).toBool(); + + rx_endoffile = set->value("rx_endoffile", rx_endoffile).toString(); + rx_novideo = set->value("rx_novideo", rx_novideo).toString(); + + balloon_count = set->value("balloon_count", balloon_count).toInt(); + + dont_use_eq_options = set->value("dont_use_eq_options", dont_use_eq_options).toBool(); + +#if USE_SUBFONT + use_subfont = set->value("use_subfont", use_subfont).toBool(); +#endif + + restore_pos_after_fullscreen = set->value("restore_pos_after_fullscreen", restore_pos_after_fullscreen).toBool(); + save_window_size_on_exit = set->value("save_window_size_on_exit", save_window_size_on_exit).toBool(); + + enable_vcd_on_windows = set->value("enable_vcd_on_windows", enable_vcd_on_windows).toBool(); + enable_audiocd_on_windows = set->value("enable_audiocd_on_windows", enable_audiocd_on_windows).toBool(); + + close_on_finish = set->value("close_on_finish", close_on_finish).toBool(); + + default_font = set->value("default_font", default_font).toString(); + + pause_when_hidden = set->value("pause_when_hidden", pause_when_hidden).toBool(); + + set->endGroup(); + + + set->beginGroup( "defaults"); + + initial_volume = set->value("initial_volume", initial_volume).toInt(); + initial_contrast = set->value("initial_contrast", initial_contrast).toInt(); + initial_brightness = set->value("initial_brightness", initial_brightness).toInt(); + initial_hue = set->value("initial_hue", initial_hue).toInt(); + initial_saturation = set->value("initial_saturation", initial_saturation).toInt(); + initial_gamma = set->value("initial_gamma", initial_gamma).toInt(); + + initial_panscan_factor = set->value("initial_panscan_factor", initial_panscan_factor).toDouble(); + initial_sub_pos = set->value("initial_sub_pos", initial_sub_pos).toInt(); + + initial_volnorm = set->value("initial_volnorm", initial_volnorm).toBool(); + initial_postprocessing = set->value("initial_postprocessing", initial_postprocessing).toBool(); + + initial_audio_channels = set->value("initial_audio_channels", initial_audio_channels).toInt(); + + initial_audio_track = set->value("initial_audio_track", initial_audio_track).toInt(); + initial_subtitle_track = set->value("initial_subtitle_track", initial_subtitle_track).toInt(); + + set->endGroup(); + + + set->beginGroup("associations"); + extensions = set->value("extensions").toString(); + set->endGroup(); + + /* + QFileInfo fi(mplayer_bin); + if (fi.exists()) { + mplayer_bin = fi.absFilePath(); + qDebug("mplayer_bin: '%s'", mplayer_bin.toUtf8().data()); + } + */ +} + +double Preferences::monitor_aspect_double() { + qDebug("Preferences::monitor_aspect_double"); + + QRegExp exp("(\\d+)[:/](\\d+)"); + if (exp.indexIn( monitor_aspect ) != -1) { + int w = exp.cap(1).toInt(); + int h = exp.cap(2).toInt(); + qDebug(" monitor_aspect parsed successfully: %d:%d", w, h); + return (double) w/h; + } + + bool ok; + double res = monitor_aspect.toDouble(&ok); + if (ok) { + qDebug(" monitor_aspect parsed successfully: %f", res); + return res; + } else { + qDebug(" warning: monitor_aspect couldn't be parsed!"); + qDebug(" monitor_aspect set to 0"); + return 0; + } +} diff --git a/retroshare-gui/src/apps/smplayer/preferences.h b/retroshare-gui/src/apps/smplayer/preferences.h new file mode 100644 index 000000000..2ccb76899 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/preferences.h @@ -0,0 +1,244 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + + +#ifndef _PREFERENCES_H_ +#define _PREFERENCES_H_ + +/* Global settings */ + +#include +#include "config.h" + +class Preferences { + +public: + enum OSD { None = 0, Seek = 1, SeekTimer = 2, SeekTimerTotal = 3 }; + enum Resize { Never = 0, Always = 1, Afterload = 2 }; + enum Priority { Realtime = 0, High = 1, AboveNormal = 2, Normal = 3, + BelowNormal = 4, Idle = 5 }; + enum WheelFunction { Seeking = 0, Volume = 1, Zoom = 2 }; + + Preferences(); + virtual ~Preferences(); + + virtual void reset(); + + void save(); + void load(); + + QString mplayer_bin; + QString vo; // video output + QString ao; // audio output + + unsigned int color_key; + + // Subtitles font + bool use_fontconfig; + QString font_file; + QString font_name; + QString subcp; // -subcp + int font_autoscale; // -subfont-autoscale + int font_textscale; // -subfont-text-scale + bool use_ass_subtitles; + bool autoload_sub; + int subfuzziness; + unsigned int ass_color; + unsigned int ass_border_color; + QString ass_styles; + + int osd; + + bool audio_change_requires_restart; + bool fast_chapter_change; + + QString dvd_device; + QString cdrom_device; + + bool use_cache; + int cache; + + bool use_mplayer_window; + + QString monitor_aspect; + double monitor_aspect_double(); + + //! Directory of the latest file loaded + QString latest_dir; + QString last_url; + QString last_dvd_directory; + + QString mplayer_verbose; + + //! Mainwindow resize method + int resize_method; + + bool disable_screensaver; + bool use_direct_rendering; + bool use_double_buffer; + + QString screenshot_directory; + bool subtitles_on_screenshots; + + bool use_soft_video_eq; + bool use_soft_vol; + + int softvol_max; + + QString audio_lang; // Preferred audio language + QString subtitle_lang; // Preferred subtitle language + + bool use_idx; //!< Use -idx + + bool dont_change_volume; // Don't change volume on startup + + bool use_hwac3; // -afm hwac3 + + int vcd_initial_title; + + + // Let the user pass options to mplayer + QString mplayer_additional_options; + QString mplayer_additional_video_filters; + QString mplayer_additional_audio_filters; + + // Performance + int priority; + bool frame_drop; + bool hard_frame_drop; + bool autosync; + int autosync_factor; + + // SMPlayer will remember all media settings for all videos. + // This options allow to disable it: + bool dont_remember_media_settings; // Will not remember anything + bool dont_remember_time_pos; // Will not remember time pos + +#if STYLE_SWITCHING + // SMPlayer look + QString style; +#endif + + bool fullscreen; + bool start_in_fullscreen; + + bool compact_mode; + bool stay_on_top; + int size_factor; + + bool show_frame_counter; + + + //! Postprocessing quality + int autoq; + + //! Loop. If true repeat the file + bool loop; + + bool use_single_instance; + int connection_port; + + // Function of mouse buttons: + QString mouse_left_click_function; + QString mouse_double_click_function; + int wheel_function; + + //! Max items in recent's list + int recents_max_items; + + // Configurable seeking + int seeking1; // By default 10s + int seeking2; // By default 1m + int seeking3; // By default 10m + int seeking4; // For mouse wheel, by default 30s + + // Logs + bool log_mplayer; + bool log_smplayer; + QString log_filter; + + QString language; + + QString iconset; + + //! If true, mplayerlayer erases its background + bool always_clear_video_background; + + //! Make configurable some of the mplayerprocess regular expressions + QString rx_endoffile; + QString rx_novideo; + + //! Number of times to show the balloon remembering that the program + //! is still running in the system tray. + int balloon_count; + + //! If true, -brightness, -contrast and so on, won't be passed to + //! mplayer. It seems that some graphic cards don't support those options. + bool dont_use_eq_options; + +#if USE_SUBFONT + //! Recent releases of MPlayer need the font for subtitles passed + //! through the -subfont option. + bool use_subfont; +#endif + + //! If true, the position of the main window will be saved before + //! entering in fullscreen and will restore when going back to + //! window mode. + bool restore_pos_after_fullscreen; + + bool save_window_size_on_exit; + + bool enable_vcd_on_windows; + bool enable_audiocd_on_windows; + + //! Close the main window when a file or playlist finish + bool close_on_finish; + + QString default_font; + + //!< Pause the current file when the main window is not visible + bool pause_when_hidden; + + // Initial values for some options + int initial_volume; + int initial_contrast; + int initial_brightness; + int initial_hue; + int initial_saturation; + int initial_gamma; + + //! Default value for panscan (1.0 = no zoom) + double initial_panscan_factor; + + //! Default value for position of subtitles on screen + //! 100 = 100% at the bottom + int initial_sub_pos; + + bool initial_postprocessing; // global postprocessing filter + bool initial_volnorm; + + int initial_audio_channels; + + int initial_audio_track; + int initial_subtitle_track; + + QString extensions; //registered extensions; comma-separated. eg. "avi,mpg,mpeg,mov,mkv" +}; + +#endif diff --git a/retroshare-gui/src/apps/smplayer/preferencesdialog.cpp b/retroshare-gui/src/apps/smplayer/preferencesdialog.cpp new file mode 100644 index 000000000..9acdfc50c --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/preferencesdialog.cpp @@ -0,0 +1,214 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + + +#include "preferencesdialog.h" + +#include "prefwidget.h" +#include "prefgeneral.h" +#include "prefdrives.h" +#include "prefinterface.h" +#include "prefperformance.h" +#include "prefinput.h" +#include "prefsubtitles.h" +#include "prefadvanced.h" + +#if USE_ASSOCIATIONS +#include "prefassociations.h" +#endif + +#include "preferences.h" + +#include +#include + +#include "images.h" + +PreferencesDialog::PreferencesDialog(QWidget * parent, Qt::WindowFlags f) + : QDialog(parent, f ) +{ + setupUi(this); + + // Setup buttons + okButton = buttonBox->button(QDialogButtonBox::Ok); + cancelButton = buttonBox->button(QDialogButtonBox::Cancel); + applyButton = buttonBox->button(QDialogButtonBox::Apply); + helpButton = buttonBox->button(QDialogButtonBox::Help); + connect( applyButton, SIGNAL(clicked()), this, SLOT(apply()) ); + connect( helpButton, SIGNAL(clicked()), this, SLOT(showHelp()) ); + + + setWindowIcon( Images::icon("logo") ); + + help_window = new QTextBrowser(this); + help_window->setWindowFlags(Qt::Window); + help_window->resize(300, 450); + //help_window->adjustSize(); + help_window->setWindowTitle( tr("SMPlayer - Help") ); + help_window->setWindowIcon( Images::icon("logo") ); + + page_general = new PrefGeneral; + addSection( page_general ); + + page_drives = new PrefDrives; + addSection( page_drives ); + + page_performance = new PrefPerformance; + addSection( page_performance ); + + page_subtitles = new PrefSubtitles; + addSection( page_subtitles ); + + page_interface = new PrefInterface; + addSection( page_interface ); + + page_input = new PrefInput; + addSection( page_input ); + +#if USE_ASSOCIATIONS + page_associations = new PrefAssociations; + addSection(page_associations); +#endif + + page_advanced = new PrefAdvanced; + addSection( page_advanced ); + + sections->setCurrentRow(General); + + //adjustSize(); + retranslateStrings(); +} + +PreferencesDialog::~PreferencesDialog() +{ +} + +void PreferencesDialog::showSection(Section s) { + qDebug("PreferencesDialog::showSection: %d", s); + + sections->setCurrentRow(s); +} + +void PreferencesDialog::retranslateStrings() { + retranslateUi(this); + + for (int n=0; n < pages->count(); n++) { + PrefWidget * w = (PrefWidget*) pages->widget(n); + sections->item(n)->setText( w->sectionName() ); + sections->item(n)->setIcon( w->sectionIcon() ); + } + + if (help_window->isVisible()) { + // Makes the help to retranslate + showHelp(); + } + + help_window->setWindowTitle( tr("SMPlayer - Help") ); + + // Qt 4.2 doesn't update the buttons' text +#if QT_VERSION < 0x040300 + okButton->setText( tr("OK") ); + cancelButton->setText( tr("Cancel") ); + applyButton->setText( tr("Apply") ); + helpButton->setText( tr("Help") ); +#endif +} + +void PreferencesDialog::accept() { + hide(); + help_window->hide(); + setResult( QDialog::Accepted ); + emit applied(); +} + +void PreferencesDialog::apply() { + setResult( QDialog::Accepted ); + emit applied(); +} + +void PreferencesDialog::reject() { + hide(); + help_window->hide(); + setResult( QDialog::Rejected ); + + setResult( QDialog::Accepted ); +} + +void PreferencesDialog::addSection(PrefWidget *w) { + QListWidgetItem *i = new QListWidgetItem( w->sectionIcon(), w->sectionName() ); + sections->addItem( i ); + pages->addWidget(w); +} + +void PreferencesDialog::setData(Preferences * pref) { + page_general->setData(pref); + page_drives->setData(pref); + page_interface->setData(pref); + page_performance->setData(pref); + page_input->setData(pref); + page_subtitles->setData(pref); + page_advanced->setData(pref); + +#if USE_ASSOCIATIONS + page_associations->setData(pref); +#endif +} + +void PreferencesDialog::getData(Preferences * pref) { + page_general->getData(pref); + page_drives->getData(pref); + page_interface->getData(pref); + page_performance->getData(pref); + page_input->getData(pref); + page_subtitles->getData(pref); + page_advanced->getData(pref); + +#if USE_ASSOCIATIONS + page_associations->getData(pref); +#endif +} + +bool PreferencesDialog::requiresRestart() { + bool need_restart = page_general->requiresRestart(); + if (!need_restart) need_restart = page_drives->requiresRestart(); + if (!need_restart) need_restart = page_interface->requiresRestart(); + if (!need_restart) need_restart = page_performance->requiresRestart(); + if (!need_restart) need_restart = page_input->requiresRestart(); + if (!need_restart) need_restart = page_subtitles->requiresRestart(); + if (!need_restart) need_restart = page_advanced->requiresRestart(); + + return need_restart; +} + +void PreferencesDialog::showHelp() { + PrefWidget * w = (PrefWidget*) pages->currentWidget(); + help_window->setHtml( w->help() ); + help_window->show(); + help_window->raise(); +} + +// Language change stuff +void PreferencesDialog::changeEvent(QEvent *e) { + if (e->type() == QEvent::LanguageChange) { + retranslateStrings(); + } else { + QWidget::changeEvent(e); + } +} + +#include "moc_preferencesdialog.cpp" diff --git a/retroshare-gui/src/apps/smplayer/preferencesdialog.h b/retroshare-gui/src/apps/smplayer/preferencesdialog.h new file mode 100644 index 000000000..1a5c46982 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/preferencesdialog.h @@ -0,0 +1,109 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef _PREFERENCESDIALOG_H_ +#define _PREFERENCESDIALOG_H_ + +#include "ui_preferencesdialog.h" + +#ifdef Q_OS_WIN +#define USE_ASSOCIATIONS 1 +#endif + +class QTextBrowser; +class QPushButton; + +class PrefWidget; +class PrefGeneral; +class PrefDrives; +class PrefPerformance; +class PrefSubtitles; +class PrefInterface; +class PrefInput; +class PrefAdvanced; +class PrefAssociations; + +class Preferences; + + +class PreferencesDialog : public QDialog, public Ui::PreferencesDialog +{ + Q_OBJECT + +public: + enum Section { General=0, Drives=1, Performance=2, + Subtitles=3, Gui=4, Mouse=5, Advanced=6, Associations=7 }; + + PreferencesDialog( QWidget * parent = 0, Qt::WindowFlags f = 0 ); + ~PreferencesDialog(); + + PrefInterface * mod_interface() { return page_interface; }; + PrefInput * mod_input() { return page_input; }; + PrefAdvanced * mod_advanced() { return page_advanced; }; + + void addSection(PrefWidget *w); + + // Pass data to the standard dialogs + void setData(Preferences * pref); + + // Apply changes + void getData(Preferences * pref); + + // Return true if the mplayer process should be restarted. + bool requiresRestart(); + +public slots: + void showSection(Section s); + + virtual void accept(); // Reimplemented to send a signal + virtual void reject(); + +signals: + void applied(); + +protected: + virtual void retranslateStrings(); + virtual void changeEvent ( QEvent * event ) ; + +protected slots: + void apply(); + void showHelp(); + +protected: + PrefGeneral * page_general; + PrefDrives * page_drives; + PrefPerformance * page_performance; + PrefSubtitles * page_subtitles; + PrefInterface * page_interface; + PrefInput * page_input; + PrefAdvanced * page_advanced; + +#if USE_ASSOCIATIONS + PrefAssociations* page_associations; +#endif + + QTextBrowser * help_window; + +private: + QPushButton * okButton; + QPushButton * cancelButton; + QPushButton * applyButton; + QPushButton * helpButton; +}; + +#endif diff --git a/retroshare-gui/src/apps/smplayer/preferencesdialog.ui b/retroshare-gui/src/apps/smplayer/preferencesdialog.ui new file mode 100644 index 000000000..1047cb406 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/preferencesdialog.ui @@ -0,0 +1,121 @@ + + PreferencesDialog + + + + 0 + 0 + 532 + 425 + + + + SMPlayer - Preferences + + + + + + + 9 + + + 6 + + + + + + 7 + 5 + 0 + 0 + + + + -1 + + + + + + + + 3 + 7 + 0 + 0 + + + + + 150 + 0 + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Help|QDialogButtonBox::NoButton|QDialogButtonBox::Ok + + + + + + + + + sections + currentRowChanged(int) + pages + setCurrentIndex(int) + + + 145 + 202 + + + 372 + 231 + + + + + buttonBox + accepted() + PreferencesDialog + accept() + + + 259 + 401 + + + 259 + 212 + + + + + buttonBox + rejected() + PreferencesDialog + reject() + + + 259 + 401 + + + 259 + 212 + + + + + diff --git a/retroshare-gui/src/apps/smplayer/prefgeneral.cpp b/retroshare-gui/src/apps/smplayer/prefgeneral.cpp new file mode 100644 index 000000000..7f24b7630 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/prefgeneral.cpp @@ -0,0 +1,516 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + + +#include "prefgeneral.h" +#include "preferences.h" +#include "filedialog.h" +#include "images.h" +#include "mediasettings.h" + +PrefGeneral::PrefGeneral(QWidget * parent, Qt::WindowFlags f) + : PrefWidget(parent, f ) +{ + setupUi(this); + + // Read driver info from InfoReader: + InfoReader * i = InfoReader::obj(); + setDrivers( i->voList(), i->aoList() ); + + // Channels combo + channels_combo->addItem( "2", MediaSettings::ChStereo ); + channels_combo->addItem( "4", MediaSettings::ChSurround ); + channels_combo->addItem( "6", MediaSettings::ChFull51 ); + + //createHelp(); + retranslateStrings(); +} + +PrefGeneral::~PrefGeneral() +{ +} + +QString PrefGeneral::sectionName() { + return tr("General"); +} + +QPixmap PrefGeneral::sectionIcon() { + return Images::icon("pref_general"); +} + +void PrefGeneral::retranslateStrings() { + retranslateUi(this); + + initial_volume_label->setNum( initial_volume_slider->value() ); + + channels_combo->setItemText(0, tr("2 (Stereo)") ); + channels_combo->setItemText(1, tr("4 (4.0 Surround)") ); + channels_combo->setItemText(2, tr("6 (5.1 Surround)") ); + + // Icons + /* + resize_window_icon->setPixmap( Images::icon("resize_window") ); + volume_icon->setPixmap( Images::icon("speaker") ); + */ + + createHelp(); +} + +void PrefGeneral::setData(Preferences * pref) { + setMplayerPath( pref->mplayer_bin ); + setScreenshotDir( pref->screenshot_directory ); + setVO( pref->vo ); + setAO( pref->ao ); + setRememberSettings( !pref->dont_remember_media_settings ); + setDontRememberTimePos( pref->dont_remember_time_pos ); + setAudioLang( pref->audio_lang ); + setSubtitleLang( pref->subtitle_lang ); + setCloseOnFinish( pref->close_on_finish ); + setPauseWhenHidden( pref->pause_when_hidden ); + + setEq2( pref->use_soft_video_eq ); + setSoftVol( pref->use_soft_vol ); + setAc3DTSPassthrough( pref->use_hwac3 ); + setInitialVolNorm( pref->initial_volnorm ); + setAmplification( pref->softvol_max ); + setInitialPostprocessing( pref->initial_postprocessing ); + setDirectRendering( pref->use_direct_rendering ); + setDoubleBuffer( pref->use_double_buffer ); + setStartInFullscreen( pref->start_in_fullscreen ); + setDisableScreensaver( pref->disable_screensaver ); + setAutoq( pref->autoq ); + + setInitialVolume( pref->initial_volume ); + setDontChangeVolume( pref->dont_change_volume ); + setAudioChannels( pref->initial_audio_channels ); +} + +void PrefGeneral::getData(Preferences * pref) { + requires_restart = false; + + TEST_AND_SET(pref->mplayer_bin, mplayerPath()); + TEST_AND_SET(pref->screenshot_directory, screenshotDir()); + TEST_AND_SET(pref->vo, VO()); + TEST_AND_SET(pref->ao, AO()); + + bool dont_remember_ms = !rememberSettings(); + TEST_AND_SET(pref->dont_remember_media_settings, dont_remember_ms); + TEST_AND_SET(pref->dont_remember_time_pos, dontRememberTimePos()); + + pref->audio_lang = audioLang(); + pref->subtitle_lang = subtitleLang(); + + pref->close_on_finish = closeOnFinish(); + pref->pause_when_hidden = pauseWhenHidden(); + + TEST_AND_SET(pref->use_soft_video_eq, eq2()); + TEST_AND_SET(pref->use_soft_vol, softVol()); + TEST_AND_SET(pref->use_hwac3, Ac3DTSPassthrough()); + pref->initial_volnorm = initialVolNorm(); + TEST_AND_SET(pref->softvol_max, amplification()); + pref->initial_postprocessing = initialPostprocessing(); + TEST_AND_SET(pref->use_direct_rendering, directRendering()); + TEST_AND_SET(pref->use_double_buffer, doubleBuffer()); + pref->start_in_fullscreen = startInFullscreen(); + TEST_AND_SET(pref->disable_screensaver, disableScreensaver()); + TEST_AND_SET(pref->autoq, autoq()); + + pref->initial_volume = initialVolume(); + pref->dont_change_volume = dontChangeVolume(); + pref->initial_audio_channels = audioChannels(); +} + +void PrefGeneral::setDrivers(InfoList vo_list, InfoList ao_list) { + InfoList::iterator it; + + for ( it = vo_list.begin(); it != vo_list.end(); ++it ) { + vo_combo->addItem( (*it).name() ); + // Add directx:noaccel + if ( (*it).name() == "directx" ) { + vo_combo->addItem( "directx:noaccel" ); + } + } + + for ( it = ao_list.begin(); it != ao_list.end(); ++it ) { + ao_combo->addItem( (*it).name() ); + } +} + +void PrefGeneral::setMplayerPath( QString path ) { + mplayerbin_edit->setText( path ); +} + +QString PrefGeneral::mplayerPath() { + return mplayerbin_edit->text(); +} + +void PrefGeneral::setScreenshotDir( QString path ) { + screenshot_edit->setText( path ); +} + +QString PrefGeneral::screenshotDir() { + return screenshot_edit->text(); +} + +void PrefGeneral::setVO( QString vo_driver ) { + vo_combo->setCurrentText( vo_driver ); +} + +void PrefGeneral::setAO( QString ao_driver ) { + ao_combo->setCurrentText( ao_driver ); +} + +QString PrefGeneral::VO() { + return vo_combo->currentText(); +} + +QString PrefGeneral::AO() { + return ao_combo->currentText(); +} + +void PrefGeneral::setRememberSettings(bool b) { + remember_all_check->setChecked(b); + //rememberAllButtonToggled(b); +} + +bool PrefGeneral::rememberSettings() { + return remember_all_check->isChecked(); +} + +void PrefGeneral::setDontRememberTimePos(bool b) { + dont_remember_time_check->setChecked(b); +} + +bool PrefGeneral::dontRememberTimePos() { + return dont_remember_time_check->isChecked(); +} + +void PrefGeneral::setAudioLang(QString lang) { + audio_lang_edit->setText(lang); +} + +QString PrefGeneral::audioLang() { + return audio_lang_edit->text(); +} + +void PrefGeneral::setSubtitleLang(QString lang) { + subtitle_lang_edit->setText(lang); +} + +QString PrefGeneral::subtitleLang() { + return subtitle_lang_edit->text(); +} + +void PrefGeneral::setCloseOnFinish(bool b) { + close_on_finish_check->setChecked(b); +} + +bool PrefGeneral::closeOnFinish() { + return close_on_finish_check->isChecked(); +} + +void PrefGeneral::setPauseWhenHidden(bool b) { + pause_if_hidden_check->setChecked(b); +} + +bool PrefGeneral::pauseWhenHidden() { + return pause_if_hidden_check->isChecked(); +} + + +void PrefGeneral::setEq2(bool b) { + eq2_check->setChecked(b); +} + +bool PrefGeneral::eq2() { + return eq2_check->isChecked(); +} + +void PrefGeneral::setSoftVol(bool b) { + softvol_check->setChecked(b); +} + +bool PrefGeneral::softVol() { + return softvol_check->isChecked(); +} + +void PrefGeneral::setAc3DTSPassthrough(bool b) { + hwac3_check->setChecked(b); +} + +bool PrefGeneral::Ac3DTSPassthrough() { + return hwac3_check->isChecked(); +} + +void PrefGeneral::setInitialVolNorm(bool b) { + volnorm_check->setChecked(b); +} + +bool PrefGeneral::initialVolNorm() { + return volnorm_check->isChecked(); +} + +void PrefGeneral::setInitialPostprocessing(bool b) { + postprocessing_check->setChecked(b); +} + +bool PrefGeneral::initialPostprocessing() { + return postprocessing_check->isChecked(); +} + +void PrefGeneral::setDirectRendering(bool b) { + direct_rendering_check->setChecked(b); +} + +bool PrefGeneral::directRendering() { + return direct_rendering_check->isChecked(); +} + +void PrefGeneral::setDoubleBuffer(bool b) { + double_buffer_check->setChecked(b); +} + +bool PrefGeneral::doubleBuffer() { + return double_buffer_check->isChecked(); +} + +void PrefGeneral::setAmplification(int n) { + softvol_max_spin->setValue(n); +} + +int PrefGeneral::amplification() { + return softvol_max_spin->value(); +} + +void PrefGeneral::setInitialVolume(int v) { + initial_volume_slider->setValue(v); +} + +int PrefGeneral::initialVolume() { + return initial_volume_slider->value(); +} + +void PrefGeneral::setAudioChannels(int ID) { + int pos = channels_combo->findData(ID); + if (pos != -1) { + channels_combo->setCurrentIndex(pos); + } else { + qWarning("PrefGeneral::setAudioChannels: ID: %d not found in combo", ID); + } +} + +int PrefGeneral::audioChannels() { + if (channels_combo->currentIndex() != -1) { + return channels_combo->itemData( channels_combo->currentIndex() ).toInt(); + } else { + qWarning("PrefGeneral::audioChannels: no item selected"); + return 0; + } +} + +void PrefGeneral::setDontChangeVolume(bool b) { + change_volume_check->setChecked(!b); +} + +bool PrefGeneral::dontChangeVolume() { + return !change_volume_check->isChecked(); +} + +void PrefGeneral::setStartInFullscreen(bool b) { + start_fullscreen_check->setChecked(b); +} + +bool PrefGeneral::startInFullscreen() { + return start_fullscreen_check->isChecked(); +} + +void PrefGeneral::setDisableScreensaver(bool b) { + screensaver_check->setChecked(b); +} + +bool PrefGeneral::disableScreensaver() { + return screensaver_check->isChecked(); +} + +void PrefGeneral::setAutoq(int n) { + autoq_spin->setValue(n); +} + +int PrefGeneral::autoq() { + return autoq_spin->value(); +} + + +// Search mplayer executable +void PrefGeneral::on_searchButton_clicked() { + QString s = MyFileDialog::getOpenFileName( + this, tr("Select the mplayer executable"), + mplayerbin_edit->text(), +#ifdef Q_OS_WIN + tr("Executables") +" (*.exe)" +#else + tr("All files") +" (*)" +#endif + ); + + if (!s.isEmpty()) { + mplayerbin_edit->setText(s); + } +} + +void PrefGeneral::on_selectButton_clicked() { + QString s = MyFileDialog::getExistingDirectory( + this, tr("Select a directory"), + screenshot_edit->text() ); + if (!s.isEmpty()) { + screenshot_edit->setText(s); + } +} + +void PrefGeneral::createHelp() { + clearHelp(); + + setWhatsThis(mplayerbin_edit, tr("MPlayer executable"), + tr("Here you must specify the mplayer " + "executable that smplayer will use.
    " + "smplayer requires at least mplayer 1.0rc1 (svn recommended).
    " + "If this setting is wrong, smplayer won't " + "be able to play anything!") ); + + setWhatsThis(screenshot_edit, tr("Screenshots folder"), + tr("Here you can specify a folder where the screenshots taken by " + "smplayer will be stored. If this field is empty the " + "screenshot feature will be disabled.") ); + + setWhatsThis(vo_combo, tr("Video output driver"), + tr("Select the video output driver. Usually xv (linux) " + "and directx (windows) provide the best performance.") ); + + setWhatsThis(ao_combo, tr("Audio output driver"), + tr("Select the audio output driver.") ); + + setWhatsThis(remember_all_check, tr("Remember settings"), + tr("Usually smplayer will remember the settings for each file you " + "play (audio track selected, volume, filters...). Uncheck this " + "option if you don't like this feature.") ); + + setWhatsThis(dont_remember_time_check, tr("Don't remember time position"), + tr("If you check this option, smplayer will play all files from " + "the beginning.") ); + + setWhatsThis(audio_lang_edit, tr("Preferred audio language"), + tr("Here you can type your preferred language for the audio streams. " + "When a media with multiple audio streams is found, smplayer will " + "try to use your preferred language.
    " + "This only will work with media that offer info about the language " + "of the audio streams, like DVDs or mkv files.
    " + "This field accepts regular expressions. Example: es|esp|spa " + "will select the audio track if it matches with es, " + "esp or spa.") ); + + setWhatsThis(subtitle_lang_edit, tr("Preferred subtitle language"), + tr("Here you can type your preferred language for the subtitle stream. " + "When a media with multiple subtitle streams is found, smplayer will " + "try to use your preferred language.
    " + "This only will work with media that offer info about the language " + "of the subtitle streams, like DVDs or mkv files.
    " + "This field accepts regular expressions. Example: es|esp|spa " + "will select the subtitle stream if it matches with es, " + "esp or spa.") ); + + setWhatsThis(close_on_finish_check, tr("Close when finished"), + tr("If this option is checked, the main window will be automatically " + "closed when the current file/playlist finishes.") ); + + setWhatsThis(pause_if_hidden_check, tr("Pause when minimized"), + tr("If this option is enabled, the file will be paused when the " + "main window is hidden. When the window is restored, play will be " + "resumed.") ); + + // Video/audio tab + setWhatsThis(eq2_check, tr("Software video equalizer"), + tr("You can check this option if video equalizer is not supported by " + "your graphic card or the selected video output driver.
    " + "Note: this option can be incompatible " + "with some video output drivers.") ); + + setWhatsThis(postprocessing_check, tr("Enable postprocessing by default"), + tr("Postprocessing will be used by default on new opened files.") ); + + setWhatsThis(autoq_spin, tr("Postprocessing quality"), + tr("Dynamically changes the level of postprocessing depending on the " + "available spare CPU time. The number you specify will be the " + "maximum level used. Usually you can use some big number.") ); + + setWhatsThis(direct_rendering_check, tr("Direct rendering"), + tr("If checked, turns on direct rendering (not supported by all " + "codecs and video outputs)
    " + "WARNING: May cause OSD/SUB corruption!") ); + + setWhatsThis(double_buffer_check, tr("Double buffering"), + tr("Double buffering fixes flicker by storing two frames in memory, " + "and displaying one while decoding another. If disabled it can " + "affect OSD negatively, but often removes OSD flickering.") ); + + setWhatsThis(start_fullscreen_check, tr("Start videos in fullscreen"), + tr("If this option is checked, all videos will start to play in " + "fullscreen mode.") ); + + setWhatsThis(screensaver_check, tr("Disable screensaver"), + tr("Check this option to disable the screensaver while playing.
    " + "The screensaver will enabled again when play finishes.
    " + "Note: This option works only in X11 and Windows.") ); + + setWhatsThis(softvol_check, tr("Software volume control"), + tr("Check this option to use the software mixer, instead of " + "using the sound card mixer.") ); + + setWhatsThis(softvol_max_spin, tr("Max. Amplification"), + tr("Sets the maximum amplification level in percent (default: 110). " + "A value of 200 will allow you to adjust the volume up to a " + "maximum of double the current level. With values below 100 the " + "initial volume (which is 100%) will be above the maximum, which " + "e.g. the OSD cannot display correctly.") ); + + setWhatsThis(hwac3_check, tr("AC3/DTS pass-through S/PDIF"), + tr("Uses hardware AC3 passthrough") ); + + setWhatsThis(volnorm_check, tr("Volume normalization by default"), + tr("Maximizes the volume without distorting the sound.") ); + + setWhatsThis(change_volume_check, tr("Change volume"), + tr("If checked, SMPlayer will remember the volume for every file " + "and will restore it when played again. For new files the default " + "volume will be used.") ); + + setWhatsThis(initial_volume_slider, tr("Default volume"), + tr("Sets the initial volume that new files will use.") ); + + setWhatsThis(channels_combo, tr("Channels by default"), + tr("Requests the number of playback channels. MPlayer " + "asks the decoder to decode the audio into as many channels as " + "specified. Then it is up to the decoder to fulfill the " + "requirement. This is usually only important when playing " + "videos with AC3 audio (like DVDs). In that case liba52 does " + "the decoding by default and correctly downmixes the audio " + "into the requested number of channels. " + "NOTE: This option is honored by codecs (AC3 only), " + "filters (surround) and audio output drivers (OSS at least).") ); +} + +#include "moc_prefgeneral.cpp" diff --git a/retroshare-gui/src/apps/smplayer/prefgeneral.h b/retroshare-gui/src/apps/smplayer/prefgeneral.h new file mode 100644 index 000000000..5e6f19bc5 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/prefgeneral.h @@ -0,0 +1,134 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef _PREFGENERAL_H_ +#define _PREFGENERAL_H_ + +#include "ui_prefgeneral.h" +#include "prefwidget.h" +#include "inforeader.h" + +class Preferences; + +class PrefGeneral : public PrefWidget, public Ui::PrefGeneral +{ + Q_OBJECT + +public: + PrefGeneral( QWidget * parent = 0, Qt::WindowFlags f = 0 ); + ~PrefGeneral(); + + // Return the name of the section + virtual QString sectionName(); + // Return the icon of the section + virtual QPixmap sectionIcon(); + + // Pass data to the dialog + void setData(Preferences * pref); + + // Apply changes + void getData(Preferences * pref); + +protected: + virtual void createHelp(); + + void setDrivers(InfoList vo_list, InfoList ao_list); + + // Tab General + void setMplayerPath( QString path ); + QString mplayerPath(); + + void setScreenshotDir( QString path ); + QString screenshotDir(); + + void setVO( QString vo_driver ); + QString VO(); + + void setAO( QString ao_driver ); + QString AO(); + + void setRememberSettings(bool b); + bool rememberSettings(); + + void setDontRememberTimePos(bool b); + bool dontRememberTimePos(); + + void setAudioLang(QString lang); + QString audioLang(); + + void setSubtitleLang(QString lang); + QString subtitleLang(); + + void setCloseOnFinish(bool b); + bool closeOnFinish(); + + void setPauseWhenHidden(bool b); + bool pauseWhenHidden(); + + // Tab video and audio + void setEq2(bool b); + bool eq2(); + + void setStartInFullscreen(bool b); + bool startInFullscreen(); + + void setDisableScreensaver(bool b); + bool disableScreensaver(); + + void setAutoq(int n); + int autoq(); + + void setSoftVol(bool b); + bool softVol(); + + void setAc3DTSPassthrough(bool b); + bool Ac3DTSPassthrough(); + + void setInitialVolNorm(bool b); + bool initialVolNorm(); + + void setInitialPostprocessing(bool b); + bool initialPostprocessing(); + + void setDirectRendering(bool b); + bool directRendering(); + + void setDoubleBuffer(bool b); + bool doubleBuffer(); + + void setAmplification(int n); + int amplification(); + + void setInitialVolume(int v); + int initialVolume(); + + void setDontChangeVolume(bool b); + bool dontChangeVolume(); + + void setAudioChannels(int ID); + int audioChannels(); + +protected: + virtual void retranslateStrings(); + +protected slots: + void on_searchButton_clicked(); + void on_selectButton_clicked(); +}; + +#endif diff --git a/retroshare-gui/src/apps/smplayer/prefgeneral.ui b/retroshare-gui/src/apps/smplayer/prefgeneral.ui new file mode 100644 index 000000000..509c524ea --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/prefgeneral.ui @@ -0,0 +1,832 @@ + + PrefGeneral + + + + 0 + 0 + 543 + 587 + + + + + + + + 0 + + + 0 + + + + + 0 + + + + &General + + + + 9 + + + 6 + + + + + Paths + + + + 9 + + + 6 + + + + + Qt::Horizontal + + + QSizePolicy::Preferred + + + + 211 + 21 + + + + + + + + &Search... + + + + + + + S&elect... + + + + + + + Select the &MPlayer executable: + + + false + + + mplayerbin_edit + + + + + + + + + + &Folder for storing screenshots: + + + false + + + screenshot_edit + + + + + + + + + + + + + Output drivers + + + + 9 + + + 6 + + + + + V&ideo: + + + false + + + vo_combo + + + + + + + + 7 + 0 + 0 + 0 + + + + true + + + + + + + Qt::Horizontal + + + QSizePolicy::Preferred + + + + 61 + 21 + + + + + + + + &Audio: + + + false + + + ao_combo + + + + + + + + 7 + 0 + 0 + 0 + + + + true + + + + + + + + + + Media settings + + + + 9 + + + 6 + + + + + Qt::Horizontal + + + QSizePolicy::Minimum + + + + 20 + 20 + + + + + + + + false + + + + 3 + 0 + 0 + 0 + + + + &Don't remember time position (files start playing from the beginning) + + + + + + + &Remember settings for all files (audio track, subtitles...) + + + + + + + + + + Preferred audio and subtitles + + + + 9 + + + 6 + + + + + A&udio: + + + false + + + audio_lang_edit + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 31 + 21 + + + + + + + + Su&btitles: + + + false + + + subtitle_lang_edit + + + + + + + + + + + + + &Close when finished + + + + + + + &Pause when minimized + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 31 + 61 + + + + + + + + + &Video and audio + + + + 9 + + + 6 + + + + + Video + + + + 9 + + + 6 + + + + + &Use software video equalizer + + + + + + + 0 + + + 6 + + + + + &Enable postprocessing by default + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 51 + 21 + + + + + + + + &Quality: + + + false + + + autoq_spin + + + + + + + 6 + + + 1 + + + + + + + + + D&irect rendering + + + + + + + Dou&ble buffering + + + + + + + Start videos in &fullscreen + + + + + + + Disable &screensaver + + + + + + + + + + Audio + + + + 9 + + + 6 + + + + + 0 + + + 6 + + + + + C&hannels by default: + + + channels_combo + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + 0 + + + 6 + + + + + Use s&oftware volume control + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 70 + 21 + + + + + + + + false + + + Ma&x. Amplification: + + + false + + + softvol_max_spin + + + + + + + false + + + 10000 + + + 10 + + + + + + + + + &AC3/DTS pass-through S/PDIF + + + + + + + Volume &normalization by default + + + + + + + 0 + + + 6 + + + + + false + + + &Default volume: + + + false + + + initial_volume_slider + + + + + + + false + + + 100 + + + Qt::Horizontal + + + + + + + false + + + 0 + + + + + + + + + &Change volume on every file + + + + + + + Qt::Horizontal + + + + 31 + 20 + + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + + + + + MyComboBox + QComboBox +
    mycombobox.h
    +
    +
    + + general_tab + mplayerbin_edit + searchButton + screenshot_edit + selectButton + vo_combo + ao_combo + remember_all_check + dont_remember_time_check + audio_lang_edit + subtitle_lang_edit + eq2_check + postprocessing_check + autoq_spin + start_fullscreen_check + screensaver_check + softvol_check + softvol_max_spin + hwac3_check + volnorm_check + + + + + softvol_check + toggled(bool) + softvol_max_spin + setEnabled(bool) + + + 124 + 256 + + + 504 + 256 + + + + + softvol_check + toggled(bool) + amplification_label + setEnabled(bool) + + + 124 + 256 + + + 405 + 256 + + + + + remember_all_check + toggled(bool) + dont_remember_time_check + setEnabled(bool) + + + 280 + 323 + + + 293 + 355 + + + + + change_volume_check + toggled(bool) + default_volume_label + setEnabled(bool) + + + 211 + 342 + + + 305 + 344 + + + + + change_volume_check + toggled(bool) + initial_volume_slider + setEnabled(bool) + + + 118 + 341 + + + 431 + 345 + + + + + change_volume_check + toggled(bool) + initial_volume_label + setEnabled(bool) + + + 231 + 349 + + + 524 + 341 + + + + + initial_volume_slider + valueChanged(int) + initial_volume_label + setNum(int) + + + 463 + 338 + + + 515 + 338 + + + + +
    diff --git a/retroshare-gui/src/apps/smplayer/prefinput.cpp b/retroshare-gui/src/apps/smplayer/prefinput.cpp new file mode 100644 index 000000000..172b1bb82 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/prefinput.cpp @@ -0,0 +1,159 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + + +#include "prefinput.h" +#include "images.h" +#include "preferences.h" + +#include "config.h" + +PrefInput::PrefInput(QWidget * parent, Qt::WindowFlags f) + : PrefWidget(parent, f ) +{ + setupUi(this); + + // Mouse function combos + left_click_combo->addItem( "None" ); + double_click_combo->addItem( "None" ); + + retranslateStrings(); +} + +PrefInput::~PrefInput() +{ +} + +QString PrefInput::sectionName() { + return tr("Keyboard and mouse"); +} + +QPixmap PrefInput::sectionIcon() { + return Images::icon("input_devices"); +} + + +void PrefInput::retranslateStrings() { + int wheel_function = wheel_function_combo->currentIndex(); + + retranslateUi(this); + + wheel_function_combo->setCurrentIndex(wheel_function); + + keyboard_icon->setPixmap( Images::icon("keyboard") ); + mouse_icon->setPixmap( Images::icon("mouse") ); + + // Mouse function combos + left_click_combo->setItemText( 0, tr("None") ); + double_click_combo->setItemText( 0, tr("None") ); + +#if !USE_SHORTCUTGETTER + actioneditor_desc->setText( + tr("Here you can change any key shortcut. To do it double click or " + "start typing over a shortcut cell. Optionally you can also save " + "the list to share it with other people or load it in another " + "computer.") ); +#endif + + createHelp(); +} + +void PrefInput::setData(Preferences * pref) { + setLeftClickFunction( pref->mouse_left_click_function ); + setDoubleClickFunction( pref->mouse_double_click_function ); + setWheelFunction( pref->wheel_function ); +} + +void PrefInput::getData(Preferences * pref) { + requires_restart = false; + + pref->mouse_left_click_function = leftClickFunction(); + pref->mouse_double_click_function = doubleClickFunction(); + pref->wheel_function = wheelFunction(); +} + +void PrefInput::setActionsList(QStringList l) { + left_click_combo->insertStringList( l ); + double_click_combo->insertStringList( l ); +} + +void PrefInput::setLeftClickFunction(QString f) { + if (f.isEmpty()) { + left_click_combo->setCurrentIndex(0); + } else { + left_click_combo->setCurrentText(f); + } +} + +QString PrefInput::leftClickFunction() { + if (left_click_combo->currentIndex()==0) { + return ""; + } else { + return left_click_combo->currentText(); + } +} + +void PrefInput::setDoubleClickFunction(QString f) { + if (f.isEmpty()) { + double_click_combo->setCurrentIndex(0); + } else { + double_click_combo->setCurrentText(f); + } +} + +QString PrefInput::doubleClickFunction() { + if (double_click_combo->currentIndex()==0) { + return ""; + } else { + return double_click_combo->currentText(); + } +} + +void PrefInput::setWheelFunction(int function) { + wheel_function_combo->setCurrentIndex(function); +} + +int PrefInput::wheelFunction() { + return wheel_function_combo->currentIndex(); +} + +void PrefInput::createHelp() { + clearHelp(); + + setWhatsThis(actions_editor, tr("Shortcut editor"), + tr("This table allows you to change the key shortcuts of most " + "available actions. Double click or press enter on a item, or " + "press the Change shortcut button to enter in the " + "Modify shortcut dialog. There are two ways to change a " + "shortcut: if the Capture button is on then just " + "press the new key or combination of keys that you want to " + "assign for the action (unfortunately this doesn't work for all " + "keys). If the Capture button is off " + "then you could enter the full name of the key.") ); + + setWhatsThis(left_click_combo, tr("Left click"), + tr("Select the action for left click on the mouse.") ); + + setWhatsThis(double_click_combo, tr("Double click"), + tr("Select the action for double click on the mouse.") ); + + setWhatsThis(wheel_function_combo, tr("Wheel function"), + tr("Select the action for the mouse wheel.") ); +} + +#include "moc_prefinput.cpp" diff --git a/retroshare-gui/src/apps/smplayer/prefinput.h b/retroshare-gui/src/apps/smplayer/prefinput.h new file mode 100644 index 000000000..4169d6b6d --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/prefinput.h @@ -0,0 +1,64 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef _PREFINPUT_H_ +#define _PREFINPUT_H_ + +#include "ui_prefinput.h" +#include "prefwidget.h" +#include + +class Preferences; + +class PrefInput : public PrefWidget, public Ui::PrefInput +{ + Q_OBJECT + +public: + PrefInput( QWidget * parent = 0, Qt::WindowFlags f = 0 ); + ~PrefInput(); + + virtual QString sectionName(); + virtual QPixmap sectionIcon(); + + // Pass data to the dialog + void setData(Preferences * pref); + + // Apply changes + void getData(Preferences * pref); + + // Pass action's list to dialog + void setActionsList(QStringList l); + +protected: + virtual void createHelp(); + + void setLeftClickFunction(QString f); + QString leftClickFunction(); + + void setDoubleClickFunction(QString f); + QString doubleClickFunction(); + + void setWheelFunction(int function); + int wheelFunction(); + +protected: + virtual void retranslateStrings(); +}; + +#endif diff --git a/retroshare-gui/src/apps/smplayer/prefinput.ui b/retroshare-gui/src/apps/smplayer/prefinput.ui new file mode 100644 index 000000000..e6594479f --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/prefinput.ui @@ -0,0 +1,375 @@ + + PrefInput + + + + 0 + 0 + 522 + 496 + + + + + + + + 0 + + + 6 + + + + + 0 + + + + &Keyboard + + + + 6 + + + 6 + + + + + 0 + + + 6 + + + + + icon + + + false + + + + + + + + 7 + 5 + 0 + 0 + + + + Here you can change any key shortcut. To do it double click or press enter over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + + + Qt::AlignVCenter + + + true + + + + + + + + + + 7 + 7 + 0 + 0 + + + + + + + + + &Mouse + + + + 6 + + + 6 + + + + + 0 + + + 6 + + + + + icon + + + false + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + + 0 + + + 6 + + + + + Button functions: + + + false + + + + + + + 0 + + + 6 + + + + + &Left click + + + false + + + left_click_combo + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 81 + 31 + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 111 + 31 + + + + + + + + &Double click + + + false + + + double_click_combo + + + + + + + + 7 + 0 + 0 + 0 + + + + + + + + + 7 + 0 + 0 + 0 + + + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + 7 + 0 + 0 + 0 + + + + QFrame::HLine + + + QFrame::Sunken + + + Qt::Horizontal + + + + + + + 0 + + + 6 + + + + + &Wheel function: + + + false + + + wheel_function_combo + + + + + + + + 7 + 0 + 0 + 0 + + + + + Media seeking + + + + + Volume control + + + + + Zoom video + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 121 + 31 + + + + + + + + + + + + + + + ActionsEditor + QWidget +
    actionseditor.h
    +
    + + MyComboBox + QComboBox +
    mycombobox.h
    +
    +
    + + +
    diff --git a/retroshare-gui/src/apps/smplayer/prefinterface.cpp b/retroshare-gui/src/apps/smplayer/prefinterface.cpp new file mode 100644 index 000000000..ec9305b82 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/prefinterface.cpp @@ -0,0 +1,392 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + + +#include "prefinterface.h" +#include "images.h" +#include "preferences.h" +#include "helper.h" +#include "config.h" + +#include +#include +#include + +PrefInterface::PrefInterface(QWidget * parent, Qt::WindowFlags f) + : PrefWidget(parent, f ) +{ + setupUi(this); + /* volume_icon->hide(); */ + + // Style combo +#if !STYLE_SWITCHING + style_label->hide(); + style_combo->hide(); +#else + style_combo->addItem( "" ); + style_combo->addItems( QStyleFactory::keys() ); +#endif + + // Icon set combo + iconset_combo->addItem( "Default" ); + + // User + QDir icon_dir = Helper::appHomePath() + "/themes"; + qDebug("icon_dir: %s", icon_dir.absolutePath().toUtf8().data()); + QStringList iconsets = icon_dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot); + for (int n=0; n < iconsets.count(); n++) { + iconset_combo->addItem( iconsets[n] ); + } + // Global + icon_dir = Helper::themesPath(); + qDebug("icon_dir: %s", icon_dir.absolutePath().toUtf8().data()); + iconsets = icon_dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot); + for (int n=0; n < iconsets.count(); n++) { + if (iconset_combo->findText( iconsets[n] ) == -1) { + iconset_combo->addItem( iconsets[n] ); + } + } + + retranslateStrings(); +} + +PrefInterface::~PrefInterface() +{ +} + +QString PrefInterface::sectionName() { + return tr("Interface"); +} + +QPixmap PrefInterface::sectionIcon() { + return Images::icon("pref_gui"); +} + +void PrefInterface::createLanguageCombo() { + QMap m; + m["bg"] = tr("Bulgarian"); + m["ca"] = tr("Catalan"); + m["cs"] = tr("Czech"); + m["de"] = tr("German"); + m["el"] = tr("Greek"); + m["en_US"] = tr("English"); + m["es"] = tr("Spanish"); + m["eu"] = tr("Basque"); + m["fi"] = tr("Finnish"); + m["fr"] = tr("French"); + m["gl"] = tr("Galician"); + m["hu"] = tr("Hungarian"); + m["it"] = tr("Italian"); + m["ja"] = tr("Japanese"); + m["ka"] = tr("Georgian"); + m["nl"] = tr("Dutch"); + m["pl"] = tr("Polish"); + m["pt_BR"] = tr("Portuguese - Brazil"); + m["pt_PT"] = tr("Portuguese - Portugal"); + m["ro_RO"] = tr("Romanian"); + m["ru_RU"] = tr("Russian"); + m["sk"] = tr("Slovak"); + m["sr"] = tr("Serbian"); + m["sv"] = tr("Swedish"); + m["tr"] = tr("Turkish"); + m["uk_UA"] = tr("Ukrainian"); + m["zh_CN"] = tr("Simplified-Chinese"); + m["zh_TW"] = tr("Traditional Chinese"); + + // Language combo + QDir translation_dir = Helper::translationPath(); + QStringList languages = translation_dir.entryList( QStringList() << "*.qm"); + QRegExp rx_lang("smplayer_(.*)\\.qm"); + language_combo->clear(); + language_combo->addItem( tr("") ); + for (int n=0; n < languages.count(); n++) { + if (rx_lang.indexIn(languages[n]) > -1) { + QString l = rx_lang.cap(1); + QString text = l; + if (m.contains(l)) text = m[l] + " ("+l+")"; + language_combo->addItem( text, l ); + } + } +} + +void PrefInterface::retranslateStrings() { + int mainwindow_resize = mainwindow_resize_combo->currentIndex(); + + retranslateUi(this); + + mainwindow_resize_combo->setCurrentIndex(mainwindow_resize); + + // Icons + /* resize_window_icon->setPixmap( Images::icon("resize_window") ); */ + /* volume_icon->setPixmap( Images::icon("speaker") ); */ + + // Seek widgets + seek1->setLabel( tr("&Short jump") ); + seek2->setLabel( tr("&Medium jump") ); + seek3->setLabel( tr("&Long jump") ); + seek4->setLabel( tr("Mouse &wheel jump") ); + + if (qApp->isLeftToRight()) { + seek1->setIcon( Images::icon("forward10s") ); + seek2->setIcon( Images::icon("forward1m") ); + seek3->setIcon( Images::icon("forward10m") ); + } else { + seek1->setIcon( Images::flippedIcon("forward10s") ); + seek2->setIcon( Images::flippedIcon("forward1m") ); + seek3->setIcon( Images::flippedIcon("forward10m") ); + } + seek4->setIcon( Images::icon("mouse_small") ); + + // Language combo + int language_item = language_combo->currentIndex(); + createLanguageCombo(); + language_combo->setCurrentIndex( language_item ); + + // Iconset combo + iconset_combo->setItemText( 0, tr("Default") ); + +#if STYLE_SWITCHING + style_combo->setItemText( 0, tr("Default") ); +#endif + + createHelp(); +} + +void PrefInterface::setData(Preferences * pref) { + setLanguage( pref->language ); + setIconSet( pref->iconset ); + + setResizeMethod( pref->resize_method ); + setSaveSize( pref->save_window_size_on_exit ); + setUseSingleInstance(pref->use_single_instance); + setServerPort(pref->connection_port); + setRecentsMaxItems(pref->recents_max_items); + + setSeeking1(pref->seeking1); + setSeeking2(pref->seeking2); + setSeeking3(pref->seeking3); + setSeeking4(pref->seeking4); + + setDefaultFont(pref->default_font); + +#if STYLE_SWITCHING + setStyle( pref->style ); +#endif +} + +void PrefInterface::getData(Preferences * pref) { + requires_restart = false; + language_changed = false; + iconset_changed = false; + recents_changed = false; + port_changed = false; + style_changed = false; + + if (pref->language != language()) { + pref->language = language(); + language_changed = true; + qDebug("PrefInterface::getData: chosen language: '%s'", pref->language.toUtf8().data()); + } + + if (pref->iconset != iconSet()) { + pref->iconset = iconSet(); + iconset_changed = true; + } + + pref->resize_method = resizeMethod(); + pref->save_window_size_on_exit = saveSize(); + + pref->use_single_instance = useSingleInstance(); + if (pref->connection_port != serverPort()) { + pref->connection_port = serverPort(); + port_changed = true; + } + + if (pref->recents_max_items != recentsMaxItems()) { + pref->recents_max_items = recentsMaxItems(); + recents_changed = true; + } + + pref->seeking1 = seeking1(); + pref->seeking2 = seeking2(); + pref->seeking3 = seeking3(); + pref->seeking4 = seeking4(); + + pref->default_font = defaultFont(); + +#if STYLE_SWITCHING + if ( pref->style != style() ) { + pref->style = style(); + style_changed = true; + } +#endif +} + +void PrefInterface::setLanguage(QString lang) { + if (lang.isEmpty()) { + language_combo->setCurrentIndex(0); + } + else { + int pos = language_combo->findData(lang); + if (pos != -1) + language_combo->setCurrentIndex( pos ); + else + language_combo->setCurrentText(lang); + } +} + +QString PrefInterface::language() { + if (language_combo->currentIndex()==0) + return ""; + else + return language_combo->itemData( language_combo->currentIndex() ).toString(); +} + +void PrefInterface::setIconSet(QString set) { + if (set.isEmpty()) + iconset_combo->setCurrentIndex(0); + else + iconset_combo->setCurrentText(set); +} + +QString PrefInterface::iconSet() { + if (iconset_combo->currentIndex()==0) + return ""; + else + return iconset_combo->currentText(); +} + +void PrefInterface::setResizeMethod(int v) { + mainwindow_resize_combo->setCurrentIndex(v); +} + +int PrefInterface::resizeMethod() { + return mainwindow_resize_combo->currentIndex(); +} + +void PrefInterface::setSaveSize(bool b) { + save_size_check->setChecked(b); +} + +bool PrefInterface::saveSize() { + return save_size_check->isChecked(); +} + + +void PrefInterface::setStyle(QString style) { + if (style.isEmpty()) + style_combo->setCurrentIndex(0); + else + style_combo->setCurrentText(style); +} + +QString PrefInterface::style() { + if (style_combo->currentIndex()==0) + return ""; + else + return style_combo->currentText(); +} + +void PrefInterface::setUseSingleInstance(bool b) { + single_instance_check->setChecked(b); + //singleInstanceButtonToggled(b); +} + +bool PrefInterface::useSingleInstance() { + return single_instance_check->isChecked(); +} + +void PrefInterface::setServerPort(int port) { + server_port_spin->setValue(port); +} + +int PrefInterface::serverPort() { + return server_port_spin->value(); +} + +void PrefInterface::setRecentsMaxItems(int n) { + recents_max_items_spin->setValue(n); +} + +int PrefInterface::recentsMaxItems() { + return recents_max_items_spin->value(); +} + +void PrefInterface::setSeeking1(int n) { + seek1->setTime(n); +} + +int PrefInterface::seeking1() { + return seek1->time(); +} + +void PrefInterface::setSeeking2(int n) { + seek2->setTime(n); +} + +int PrefInterface::seeking2() { + return seek2->time(); +} + +void PrefInterface::setSeeking3(int n) { + seek3->setTime(n); +} + +int PrefInterface::seeking3() { + return seek3->time(); +} + +void PrefInterface::setSeeking4(int n) { + seek4->setTime(n); +} + +int PrefInterface::seeking4() { + return seek4->time(); +} + +void PrefInterface::setDefaultFont(QString font_desc) { + default_font_edit->setText(font_desc); +} + +QString PrefInterface::defaultFont() { + return default_font_edit->text(); +} + +void PrefInterface::on_changeFontButton_clicked() { + QFont f = qApp->font(); + + if (!default_font_edit->text().isEmpty()) { + f.fromString(default_font_edit->text()); + } + + bool ok; + f = QFontDialog::getFont( &ok, f, this); + + if (ok) { + default_font_edit->setText( f.toString() ); + } +} + +void PrefInterface::createHelp() { + clearHelp(); + + setWhatsThis(language_combo, tr("Language"), + tr("Here you can change the language of the application.") ); +} + +#include "moc_prefinterface.cpp" diff --git a/retroshare-gui/src/apps/smplayer/prefinterface.h b/retroshare-gui/src/apps/smplayer/prefinterface.h new file mode 100644 index 000000000..b5d098425 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/prefinterface.h @@ -0,0 +1,107 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef _PREFINTERFACE_H_ +#define _PREFINTERFACE_H_ + +#include "ui_prefinterface.h" +#include "prefwidget.h" + +class Preferences; + +class PrefInterface : public PrefWidget, public Ui::PrefInterface +{ + Q_OBJECT + +public: + PrefInterface( QWidget * parent = 0, Qt::WindowFlags f = 0 ); + ~PrefInterface(); + + virtual QString sectionName(); + virtual QPixmap sectionIcon(); + + // Pass data to the dialog + void setData(Preferences * pref); + + // Apply changes + void getData(Preferences * pref); + + bool languageChanged() { return language_changed; }; + bool iconsetChanged() { return iconset_changed; }; + bool recentsChanged() { return recents_changed; }; + bool styleChanged() { return style_changed; }; + bool serverPortChanged() { return port_changed; }; + +protected: + virtual void createHelp(); + void createLanguageCombo(); + + void setLanguage(QString lang); + QString language(); + + void setIconSet(QString set); + QString iconSet(); + + void setResizeMethod(int v); + int resizeMethod(); + + void setSaveSize(bool b); + bool saveSize(); + + void setStyle(QString style); + QString style(); + + void setUseSingleInstance(bool b); + bool useSingleInstance(); + + void setServerPort(int port); + int serverPort(); + + void setRecentsMaxItems(int n); + int recentsMaxItems(); + + void setSeeking1(int n); + int seeking1(); + + void setSeeking2(int n); + int seeking2(); + + void setSeeking3(int n); + int seeking3(); + + void setSeeking4(int n); + int seeking4(); + + void setDefaultFont(QString font_desc); + QString defaultFont(); + +protected slots: + void on_changeFontButton_clicked(); + +protected: + virtual void retranslateStrings(); + +private: + bool language_changed; + bool iconset_changed; + bool recents_changed; + bool style_changed; + bool port_changed; +}; + +#endif diff --git a/retroshare-gui/src/apps/smplayer/prefinterface.ui b/retroshare-gui/src/apps/smplayer/prefinterface.ui new file mode 100644 index 000000000..c53bce1e8 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/prefinterface.ui @@ -0,0 +1,506 @@ + + PrefInterface + + + + 0 + 0 + 529 + 586 + + + + + + + + 0 + + + 0 + + + + + 0 + + + + &Interface + + + + 9 + + + 6 + + + + + Qt::Horizontal + + + + + + + Instances + + + + 9 + + + 6 + + + + + &Use only one running instance of SMPlayer + + + + + + + false + + + SMPlayer will listen to this &port to receive commands from other instances: + + + Qt::AlignVCenter + + + true + + + server_port_spin + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 61 + 31 + + + + + + + + false + + + 10000 + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 270 + 31 + + + + + + + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + St&yle: + + + false + + + style_combo + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + L&anguage: + + + false + + + language_combo + + + + + + + Ico&n set: + + + false + + + iconset_combo + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 5 + 0 + 0 + 0 + + + + + + + + + 5 + 0 + 0 + 0 + + + + + + + + + 5 + 0 + 0 + 0 + + + + + + + + + + Seeking + + + + 9 + + + 6 + + + + + 0 + + + 6 + + + + + + + + + + + + + + + + + + + + + + Recent files + + + + 9 + + + 6 + + + + + Ma&x. items + + + false + + + recents_max_items_spin + + + + + + + 20 + + + 0 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + Main window + + + + 9 + + + 6 + + + + + Auto&resize: + + + mainwindow_resize_combo + + + + + + + + 5 + 0 + 0 + 0 + + + + + Never + + + + + Whenever it's needed + + + + + Only after loading a new video + + + + + + + + R&emember position and size + + + + + + + + + + 0 + + + 6 + + + + + Default font: + + + + + + + true + + + + + + + &Change... + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + MyComboBox + QComboBox +
    mycombobox.h
    +
    + + SeekWidget + QWidget +
    seekwidget.h
    +
    +
    + + + + single_instance_check + toggled(bool) + port_label + setEnabled(bool) + + + 116 + 231 + + + 126 + 245 + + + + + single_instance_check + toggled(bool) + server_port_spin + setEnabled(bool) + + + 55 + 227 + + + 98 + 277 + + + + +
    diff --git a/retroshare-gui/src/apps/smplayer/prefperformance.cpp b/retroshare-gui/src/apps/smplayer/prefperformance.cpp new file mode 100644 index 000000000..0be2fdd34 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/prefperformance.cpp @@ -0,0 +1,214 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + + +#include "prefperformance.h" +#include "images.h" +#include "preferences.h" + + +PrefPerformance::PrefPerformance(QWidget * parent, Qt::WindowFlags f) + : PrefWidget(parent, f ) +{ + setupUi(this); + + // Priority is only for windows, so we disable for other systems +#ifndef Q_OS_WIN + priority_group->hide(); +#endif + + createHelp(); +} + +PrefPerformance::~PrefPerformance() +{ +} + +QString PrefPerformance::sectionName() { + return tr("Performance"); +} + +QPixmap PrefPerformance::sectionIcon() { + return Images::icon("pref_performance"); +} + + +void PrefPerformance::retranslateStrings() { + int priority = priority_combo->currentIndex(); + + retranslateUi(this); + + priority_combo->setCurrentIndex(priority); + + createHelp(); +} + +void PrefPerformance::setData(Preferences * pref) { + setCacheEnabled( pref->use_cache ); + setCache( pref->cache ); + setPriority( pref->priority ); + setFrameDrop( pref->frame_drop ); + setHardFrameDrop( pref->hard_frame_drop ); + setAutoSyncActivated( pref->autosync ); + setAutoSyncFactor( pref->autosync_factor ); + setFastChapterSeeking( pref->fast_chapter_change ); + setFastAudioSwitching( !pref->audio_change_requires_restart ); + setUseIdx( pref->use_idx ); +} + +void PrefPerformance::getData(Preferences * pref) { + requires_restart = false; + + TEST_AND_SET(pref->use_cache, cacheEnabled()); + TEST_AND_SET(pref->cache, cache()); + TEST_AND_SET(pref->priority, priority()); + TEST_AND_SET(pref->frame_drop, frameDrop()); + TEST_AND_SET(pref->hard_frame_drop, hardFrameDrop()); + TEST_AND_SET(pref->autosync, autoSyncActivated()); + TEST_AND_SET(pref->autosync_factor, autoSyncFactor()); + TEST_AND_SET(pref->fast_chapter_change, fastChapterSeeking()); + pref->audio_change_requires_restart = !fastAudioSwitching(); + TEST_AND_SET(pref->use_idx, useIdx()); +} + +void PrefPerformance::setCacheEnabled(bool b) { + use_cache_check->setChecked(b); +} + +bool PrefPerformance::cacheEnabled() { + return use_cache_check->isChecked(); +} + +void PrefPerformance::setCache(int n) { + cache_spin->setValue(n); +} + +int PrefPerformance::cache() { + return cache_spin->value(); +} + +void PrefPerformance::setPriority(int n) { + priority_combo->setCurrentIndex(n); +} + +int PrefPerformance::priority() { + return priority_combo->currentIndex(); +} + +void PrefPerformance::setFrameDrop(bool b) { + framedrop_check->setChecked(b); +} + +bool PrefPerformance::frameDrop() { + return framedrop_check->isChecked(); +} + +void PrefPerformance::setHardFrameDrop(bool b) { + hardframedrop_check->setChecked(b); +} + +bool PrefPerformance::hardFrameDrop() { + return hardframedrop_check->isChecked(); +} + +void PrefPerformance::setAutoSyncFactor(int factor) { + autosync_spin->setValue(factor); +} + +int PrefPerformance::autoSyncFactor() { + return autosync_spin->value(); +} + +void PrefPerformance::setAutoSyncActivated(bool b) { + autosync_check->setChecked(b); +} + +bool PrefPerformance::autoSyncActivated() { + return autosync_check->isChecked(); +} + +void PrefPerformance::setFastChapterSeeking(bool b) { + fast_chapter_check->setChecked(b); +} + +bool PrefPerformance::fastChapterSeeking() { + return fast_chapter_check->isChecked(); +} + +void PrefPerformance::setFastAudioSwitching(bool b) { + fastaudioswitching_check->setChecked(b); +} + +bool PrefPerformance::fastAudioSwitching() { + return fastaudioswitching_check->isChecked(); +} + +void PrefPerformance::setUseIdx(bool b) { + idx_check->setChecked(b); +} + +bool PrefPerformance::useIdx() { + return idx_check->isChecked(); +} + +void PrefPerformance::createHelp() { + clearHelp(); + + // Performance tab + setWhatsThis(priority_combo, tr("Priority"), + tr("Set process priority for mplayer according to the predefined " + "priorities available under Windows.
    " + "WARNING: Using realtime priority can cause system lockup.") +#ifndef Q_OS_WIN + + tr("
    Note: This option is for Windows only.") +#endif + ); + + setWhatsThis(cache_spin, tr("Cache"), + tr("This option specifies how much memory (in kBytes) to use when " + "precaching a file or URL. Especially useful on slow media.") ); + + setWhatsThis(framedrop_check, tr("Allow frame drop"), + tr("Skip displaying some frames to maintain A/V sync on slow systems." ) ); + + setWhatsThis(hardframedrop_check, tr("Allow hard frame drop"), + tr("More intense frame dropping (breaks decoding). " + "Leads to image distortion!") ); + + setWhatsThis(autosync_check, tr("Audio/video auto synchronization"), + tr("Gradually adjusts the A/V sync based on audio delay " + "measurements.") ); + + setWhatsThis(fastaudioswitching_check, tr("Fast audio track switching"), + tr("If checked, it will try the fastest method to switch audio " + "tracks but might not work with some formats.") ); + + setWhatsThis(fast_chapter_check, tr("Fast seek to chapters in dvds"), + tr("If checked, it will try the fastest method to seek to chapters " + "but it might not work with some discs.") ); + + setWhatsThis(idx_check, tr("Create index if needed"), + tr("Rebuilds index of files if no index was found, allowing seeking. " + "Useful with broken/incomplete downloads, or badly created files. " + "This option only works if the underlying media supports " + "seeking (i.e. not with stdin, pipe, etc).
    " + "Note: the creation of the index may take some time.") ); + +} + +#include "moc_prefperformance.cpp" diff --git a/retroshare-gui/src/apps/smplayer/prefperformance.h b/retroshare-gui/src/apps/smplayer/prefperformance.h new file mode 100644 index 000000000..2b499278d --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/prefperformance.h @@ -0,0 +1,81 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef _PREFPERFORMANCE_H_ +#define _PREFPERFORMANCE_H_ + +#include "ui_prefperformance.h" +#include "prefwidget.h" + +class Preferences; + +class PrefPerformance : public PrefWidget, public Ui::PrefPerformance +{ + Q_OBJECT + +public: + PrefPerformance( QWidget * parent = 0, Qt::WindowFlags f = 0 ); + ~PrefPerformance(); + + virtual QString sectionName(); + virtual QPixmap sectionIcon(); + + // Pass data to the dialog + void setData(Preferences * pref); + + // Apply changes + void getData(Preferences * pref); + +protected: + virtual void createHelp(); + + void setCacheEnabled(bool b); + bool cacheEnabled(); + + void setCache(int n); + int cache(); + + void setPriority(int n); + int priority(); + + void setFrameDrop(bool b); + bool frameDrop(); + + void setHardFrameDrop(bool b); + bool hardFrameDrop(); + + void setAutoSyncFactor(int factor); + int autoSyncFactor(); + + void setAutoSyncActivated(bool b); + bool autoSyncActivated(); + + void setFastChapterSeeking(bool b); + bool fastChapterSeeking(); + + void setFastAudioSwitching(bool b); + bool fastAudioSwitching(); + + void setUseIdx(bool); + bool useIdx(); + +protected: + virtual void retranslateStrings(); +}; + +#endif diff --git a/retroshare-gui/src/apps/smplayer/prefperformance.ui b/retroshare-gui/src/apps/smplayer/prefperformance.ui new file mode 100644 index 000000000..d7719e8ca --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/prefperformance.ui @@ -0,0 +1,498 @@ + + PrefPerformance + + + + 0 + 0 + 541 + 601 + + + + + + + + 0 + + + 6 + + + + + 0 + + + + &Performance + + + + 9 + + + 6 + + + + + Priority + + + + 9 + + + 6 + + + + + Select the priority for the MPlayer process. + + + false + + + + + + + 0 + + + 6 + + + + + Priorit&y: + + + false + + + priority_combo + + + + + + + + realtime + + + + + high + + + + + abovenormal + + + + + normal + + + + + belownormal + + + + + idle + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 201 + 21 + + + + + + + + + + + + + Cache + + + + 9 + + + 6 + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 191 + 61 + + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 31 + 21 + + + + + + + + false + + + Si&ze: + + + false + + + cache_spin + + + + + + + false + + + 10000 + + + + + + + false + + + KB + + + false + + + + + + + + + &Use cache + + + + + + + Setting a cache may improve performance on slow media + + + false + + + + + + + + + + &Allow frame drop + + + + + + + Allow &hard frame drop (can lead to image distortion) + + + + + + + Synchronization + + + + 9 + + + 6 + + + + + Audio/&video auto synchronization + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + QSizePolicy::Preferred + + + + 40 + 31 + + + + + + + + false + + + Fact&or: + + + false + + + autosync_spin + + + + + + + false + + + 1000 + + + 1 + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 105 + 21 + + + + + + + + + + + + + &Fast audio track switching + + + + + + + Fast &seek to chapters in dvds + + + + + + + Qt::Horizontal + + + + + + + &Create index if needed + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + tabWidget + priority_combo + use_cache_check + cache_spin + framedrop_check + hardframedrop_check + autosync_check + autosync_spin + fastaudioswitching_check + fast_chapter_check + + + + + use_cache_check + toggled(bool) + cache_spin + setEnabled(bool) + + + 103 + 208 + + + 129 + 243 + + + + + use_cache_check + toggled(bool) + cache_size_label + setEnabled(bool) + + + 103 + 208 + + + 74 + 243 + + + + + use_cache_check + toggled(bool) + cache_kb_label + setEnabled(bool) + + + 103 + 208 + + + 176 + 243 + + + + + autosync_check + toggled(bool) + factor_label + setEnabled(bool) + + + 270 + 381 + + + 90 + 416 + + + + + autosync_check + toggled(bool) + autosync_spin + setEnabled(bool) + + + 270 + 381 + + + 147 + 416 + + + + + diff --git a/retroshare-gui/src/apps/smplayer/prefsubtitles.cpp b/retroshare-gui/src/apps/smplayer/prefsubtitles.cpp new file mode 100644 index 000000000..c42687e42 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/prefsubtitles.cpp @@ -0,0 +1,317 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + + +#include "prefsubtitles.h" +#include "images.h" +#include "preferences.h" +#include "encodings.h" +#include "helper.h" +#include "filedialog.h" + +#include + +PrefSubtitles::PrefSubtitles(QWidget * parent, Qt::WindowFlags f) + : PrefWidget(parent, f ) +{ + setupUi(this); + +#if !USE_SUBFONT + subfont_check->hide(); +#endif + + encodings = new Encodings(this); + font_encoding_combo->insertItems( 0, encodings->list() ); + + //languageChange(); + createHelp(); +} + +PrefSubtitles::~PrefSubtitles() +{ +} + +QString PrefSubtitles::sectionName() { + return tr("Subtitles"); +} + +QPixmap PrefSubtitles::sectionIcon() { + return Images::icon("pref_subtitles"); +} + + +void PrefSubtitles::retranslateStrings() { + int font_autoscale_item = font_autoscale_combo->currentIndex(); + int font_autoload_item = font_autoload_combo->currentIndex(); + + retranslateUi(this); + + font_autoscale_combo->setCurrentIndex(font_autoscale_item); + font_autoload_combo->setCurrentIndex(font_autoload_item); + + // Encodings combo + int font_encoding_item = font_encoding_combo->currentIndex(); + font_encoding_combo->clear(); + encodings->retranslate(); + font_encoding_combo->insertItems( 0, encodings->list() ); + font_encoding_combo->setCurrentIndex(font_encoding_item); + + sub_pos_label->setNum( sub_pos_slider->value() ); + + createHelp(); +} + +void PrefSubtitles::setData(Preferences * pref) { + setFontName( pref->font_name ); + setFontFile( pref->font_file ); + setUseFontconfig( pref->use_fontconfig ); + setFontAutoscale( pref->font_autoscale ); + setFontTextscale( pref->font_textscale ); + setAutoloadSub( pref->autoload_sub ); + setFontFuzziness( pref->subfuzziness ); + setFontEncoding( pref->subcp ); + setUseFontASS( pref->use_ass_subtitles ); + setAssColor( pref->ass_color ); + setAssBorderColor( pref->ass_border_color ); + setAssStyles( pref->ass_styles ); + setSubPos( pref->initial_sub_pos ); + setSubtitlesOnScreenshots( pref->subtitles_on_screenshots ); + +#if USE_SUBFONT + setUseSubfont( pref->use_subfont ); +#endif +} + +void PrefSubtitles::getData(Preferences * pref) { + requires_restart = false; + + TEST_AND_SET(pref->font_name, fontName()); + TEST_AND_SET(pref->font_file, fontFile()); + TEST_AND_SET(pref->use_fontconfig, useFontconfig()); + TEST_AND_SET(pref->font_autoscale, fontAutoscale()); + TEST_AND_SET(pref->font_textscale, fontTextscale()); + TEST_AND_SET(pref->autoload_sub, autoloadSub()); + TEST_AND_SET(pref->subfuzziness, fontFuzziness()); + TEST_AND_SET(pref->subcp, fontEncoding()); + TEST_AND_SET(pref->use_ass_subtitles, useFontASS()); + TEST_AND_SET(pref->ass_color, assColor()); + TEST_AND_SET(pref->ass_border_color, assBorderColor()); + TEST_AND_SET(pref->ass_styles, assStyles()); + pref->initial_sub_pos = subPos(); + TEST_AND_SET(pref->subtitles_on_screenshots, subtitlesOnScreenshots()); + +#if USE_SUBFONT + TEST_AND_SET(pref->use_subfont, useSubfont()); +#endif +} + +void PrefSubtitles::setFontName(QString font_name) { + fontCombo->setCurrentText(font_name); +} + +QString PrefSubtitles::fontName() { + return fontCombo->currentText(); +} + +void PrefSubtitles::setFontFile(QString font_file) { + ttf_font_edit->setText( font_file ); +} + +QString PrefSubtitles::fontFile() { + return ttf_font_edit->text(); +} + + +void PrefSubtitles::setUseFontconfig(bool b) { + system_font_button->setChecked(b); + ttf_font_button->setChecked(!b); +} + +bool PrefSubtitles::useFontconfig() { + return system_font_button->isChecked(); +} + +void PrefSubtitles::setFontAutoscale(int n) { + font_autoscale_combo->setCurrentIndex(n); +} + +int PrefSubtitles::fontAutoscale() { + return font_autoscale_combo->currentIndex(); +} + +void PrefSubtitles::setFontTextscale(int n) { + font_text_scale->setValue(n); +} + +int PrefSubtitles::fontTextscale() { + return font_text_scale->value(); +} + +void PrefSubtitles::setAutoloadSub(bool v) { + font_autoload_check->setChecked(v); +} + +bool PrefSubtitles::autoloadSub() { + return font_autoload_check->isChecked(); +} + +void PrefSubtitles::setFontEncoding(QString s) { + int n = encodings->findEncoding( s ); + if (n != -1) + font_encoding_combo->setCurrentIndex(n); + else + font_encoding_combo->setCurrentText(s); +} + +QString PrefSubtitles::fontEncoding() { + qDebug("PrefSubtitles::fontEncoding"); + QString res = encodings->parseEncoding( font_encoding_combo->currentText() ); + qDebug(" * res: '%s'", res.toUtf8().data() ); + return res; +} + +void PrefSubtitles::setSubPos(int pos) { + sub_pos_slider->setValue(pos); +} + +int PrefSubtitles::subPos() { + return sub_pos_slider->value(); +} + +void PrefSubtitles::setUseFontASS(bool v) { + font_ass_check->setChecked(v); + //assButtonToggled(v); +} + +bool PrefSubtitles::useFontASS() { + return font_ass_check->isChecked(); +} + +void PrefSubtitles::setAssColor( unsigned int color ) { + ass_color = color; +#ifdef Q_OS_WIN + colorButton->setStyleSheet( "border-width: 1px; border-style: solid; border-color: #000000; background: #" + Helper::colorToRGB(ass_color) + ";"); +#else + //colorButton->setAutoFillBackground(true); + Helper::setBackgroundColor( colorButton, color ); +#endif +} + +unsigned int PrefSubtitles::assColor() { + return ass_color; +} + +void PrefSubtitles::setAssBorderColor( unsigned int color ) { + ass_border_color = color; + +#ifdef Q_OS_WIN + borderButton->setStyleSheet( "border-width: 1px; border-style: solid; border-color: #000000; background: #" + Helper::colorToRGB(ass_border_color) + ";"); +#else + //borderButton->setAutoFillBackground(true); + Helper::setBackgroundColor( borderButton, color ); +#endif +} + +unsigned int PrefSubtitles::assBorderColor() { + return ass_border_color; +} + +void PrefSubtitles::setAssStyles(QString styles) { + ass_styles_edit->setText(styles); +} + +QString PrefSubtitles::assStyles() { + return ass_styles_edit->text(); +} + +void PrefSubtitles::setFontFuzziness(int n) { + font_autoload_combo->setCurrentIndex(n); +} + +int PrefSubtitles::fontFuzziness() { + return font_autoload_combo->currentIndex(); +} + +#if USE_SUBFONT +void PrefSubtitles::setUseSubfont(bool b) { + subfont_check->setChecked(b); +} + +bool PrefSubtitles::useSubfont() { + return subfont_check->isChecked(); +} +#endif + +void PrefSubtitles::setSubtitlesOnScreenshots(bool b) { + subtitles_on_screeshots_check->setChecked(b); +} + +bool PrefSubtitles::subtitlesOnScreenshots() { + return subtitles_on_screeshots_check->isChecked(); +} + + +void PrefSubtitles::on_searchButton_clicked() { + QString s = ""; + + QString f; + + s = MyFileDialog::getOpenFileName( + this, tr("Choose a ttf file"), + ttf_font_edit->text(), + tr("Truetype Fonts") + " (*.ttf)" +#ifdef Q_OS_WIN + , &f, QFileDialog::DontUseNativeDialog +#endif + ); + + if (!s.isEmpty()) { + ttf_font_edit->setText(s); + } +} + +void PrefSubtitles::on_colorButton_clicked() { + QColor c = QColorDialog::getColor ( ass_color, this ); + if (c.isValid()) { + setAssColor( c.rgb() ); + } +} + +void PrefSubtitles::on_borderButton_clicked() { + QColor c = QColorDialog::getColor ( ass_border_color, this ); + if (c.isValid()) { + setAssBorderColor( c.rgb() ); + } +} + +void PrefSubtitles::createHelp() { + clearHelp(); + + setWhatsThis(sub_pos_slider, tr("Subtitle position"), + tr("This option specifies the position of the subtitles over the " + "video window. 100 means the bottom, while 0 means " + "the top." ) ); + + setWhatsThis(ass_styles_edit, tr("SSA/ASS styles"), + tr("Here you can override styles for SSA/ASS subtitles. " + "It can be also used for fine-tuning the rendering of SRT and SUB " + "subtitles by the SSA/ASS library. " + "Example: Bold=1,Outline=2,Shadow=4")); +} + +#include "moc_prefsubtitles.cpp" diff --git a/retroshare-gui/src/apps/smplayer/prefsubtitles.h b/retroshare-gui/src/apps/smplayer/prefsubtitles.h new file mode 100644 index 000000000..4de9cb08e --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/prefsubtitles.h @@ -0,0 +1,109 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef _PREFSUBTITLES_H_ +#define _PREFSUBTITLES_H_ + +#include "ui_prefsubtitles.h" +#include "prefwidget.h" +#include "config.h" + +class Preferences; +class Encodings; + +class PrefSubtitles : public PrefWidget, public Ui::PrefSubtitles +{ + Q_OBJECT + +public: + PrefSubtitles( QWidget * parent = 0, Qt::WindowFlags f = 0 ); + ~PrefSubtitles(); + + virtual QString sectionName(); + virtual QPixmap sectionIcon(); + + // Pass data to the dialog + void setData(Preferences * pref); + + // Apply changes + void getData(Preferences * pref); + +protected: + virtual void createHelp(); + + void setFontName(QString font_name); + QString fontName(); + + void setFontFile(QString font_file); + QString fontFile(); + + void setUseFontconfig(bool b); + bool useFontconfig(); + + void setFontAutoscale(int n); + int fontAutoscale(); + + void setFontTextscale(int n); + int fontTextscale(); + + void setAutoloadSub(bool v); + bool autoloadSub(); + + void setFontEncoding(QString s); + QString fontEncoding(); + + void setSubPos(int pos); + int subPos(); + + void setUseFontASS(bool v); + bool useFontASS(); + + void setAssColor( unsigned int color ); + unsigned int assColor(); + + void setAssBorderColor( unsigned int color ); + unsigned int assBorderColor(); + + void setAssStyles(QString styles); + QString assStyles(); + + void setFontFuzziness(int n); + int fontFuzziness(); + + void setSubtitlesOnScreenshots(bool b); + bool subtitlesOnScreenshots(); + +#if USE_SUBFONT + void setUseSubfont(bool b); + bool useSubfont(); +#endif + +protected: + virtual void retranslateStrings(); + +protected slots: + void on_searchButton_clicked(); + void on_colorButton_clicked(); + void on_borderButton_clicked(); + +private: + Encodings * encodings; + unsigned int ass_color, ass_border_color; +}; + +#endif diff --git a/retroshare-gui/src/apps/smplayer/prefsubtitles.ui b/retroshare-gui/src/apps/smplayer/prefsubtitles.ui new file mode 100644 index 000000000..2ac4c6581 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/prefsubtitles.ui @@ -0,0 +1,931 @@ + + PrefSubtitles + + + + 0 + 0 + 520 + 538 + + + + + + + + + + + 0 + + + 6 + + + + + 0 + + + + &Subtitles + + + + 9 + + + 6 + + + + + Autoload + + + + 9 + + + 6 + + + + + Au&toload subtitles files (*.srt, *.sub...): + + + false + + + font_autoload_combo + + + + + + + S&elect first available subtitle + + + + + + + + Same name as movie + + + + + All subs containing movie name + + + + + All subs in directory + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 131 + 21 + + + + + + + + + + + &Default subtitle encoding: + + + false + + + font_encoding_combo + + + + + + + 0 + + + 6 + + + + + + 5 + 0 + 0 + 0 + + + + true + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 161 + 31 + + + + + + + + + + Position + + + + 9 + + + 6 + + + + + Default &position of the subtitles on screen + + + Qt::AlignVCenter + + + true + + + sub_pos_slider + + + + + + + 0 + + + 6 + + + + + + 7 + 0 + 0 + 0 + + + + 0 + + + 100 + + + 1 + + + Qt::Horizontal + + + + + + + 0 + + + false + + + + + + + + + 0 + + + 6 + + + + + Top + + + false + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 131 + 20 + + + + + + + + Bottom + + + false + + + + + + + + + + + + &Include subtitles on screenshots + + + + + + + &Use -subfont option (required by recent MPlayer releases) + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + &Font + + + + 9 + + + 6 + + + + + Font + + + + 9 + + + 6 + + + + + &TTF font: + + + + + + + false + + + + + + + false + + + Sea&rch... + + + + + + + Qt::Horizontal + + + + 121 + 20 + + + + + + + + S&ystem font: + + + + + + + Select the font which will be used for subtitles (and OSD): + + + false + + + + + + + false + + + + 5 + 0 + 0 + 0 + + + + + + + + + + + Size + + + + 9 + + + 6 + + + + + A&utoscale: + + + false + + + font_autoscale_combo + + + + + + + + No autoscale + + + + + Proportional to movie height + + + + + Proportional to movie width + + + + + Proportional to movie diagonal + + + + + + + + Qt::Horizontal + + + QSizePolicy::Preferred + + + + 71 + 20 + + + + + + + + S&cale: + + + false + + + font_text_scale + + + + + + + 100 + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + SSA/&ASS library + + + + 6 + + + 6 + + + + + The new SSA/ASS library will provide nice styled subtitles for external SSA/ASS subtitles files and Matroska tracks. But it will be used too for rendering other formats like SUB and SRT files. + + + Qt::AlignVCenter + + + true + + + + + + + &Use SSA/ASS library for subtitle rendering + + + + + + + 0 + + + 6 + + + + + false + + + &Text color: + + + false + + + colorButton + + + + + + + false + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Preferred + + + + 41 + 31 + + + + + + + + false + + + &Border color: + + + false + + + borderButton + + + + + + + false + + + + + + + + + + + + + 7 + 0 + 0 + 0 + + + + QFrame::HLine + + + QFrame::Sunken + + + Qt::Horizontal + + + + + + + false + + + Here you can override styles for SSA/ASS subtitles. It can be also used for fine-tuning the rendering of SRT and SUB subtitles by the SSA/ASS library. Example: <b>Bold=1,Outline=2,Shadow=4</b> + + + Qt::AlignVCenter + + + true + + + + + + + 0 + + + 6 + + + + + false + + + St&yles: + + + false + + + ass_styles_edit + + + + + + + false + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + + + + + MyFontComboBox + QFontComboBox +
    mycombobox.h
    +
    + + MyComboBox + QComboBox +
    mycombobox.h
    +
    +
    + + subtitles_tab + font_autoload_combo + font_autoload_check + font_encoding_combo + sub_pos_slider + subtitles_on_screeshots_check + subfont_check + ttf_font_button + ttf_font_edit + searchButton + system_font_button + fontCombo + font_autoscale_combo + font_text_scale + font_ass_check + colorButton + borderButton + ass_styles_edit + + + + + ttf_font_button + toggled(bool) + ttf_font_edit + setEnabled(bool) + + + 82 + 116 + + + 269 + 116 + + + + + ttf_font_button + toggled(bool) + searchButton + setEnabled(bool) + + + 82 + 116 + + + 510 + 116 + + + + + system_font_button + toggled(bool) + fontCombo + setEnabled(bool) + + + 82 + 152 + + + 269 + 152 + + + + + font_ass_check + toggled(bool) + asscolor_label + setEnabled(bool) + + + 322 + 98 + + + 76 + 133 + + + + + font_ass_check + toggled(bool) + colorButton + setEnabled(bool) + + + 322 + 98 + + + 199 + 133 + + + + + font_ass_check + toggled(bool) + borderButton + setEnabled(bool) + + + 322 + 98 + + + 569 + 133 + + + + + font_ass_check + toggled(bool) + assbordercolor_label + setEnabled(bool) + + + 322 + 98 + + + 446 + 133 + + + + + font_ass_check + toggled(bool) + ass_styles_label + setEnabled(bool) + + + 322 + 98 + + + 38 + 244 + + + + + font_ass_check + toggled(bool) + ass_styles_edit + setEnabled(bool) + + + 322 + 98 + + + 346 + 244 + + + + + font_ass_check + toggled(bool) + styles_desc_label + setEnabled(bool) + + + 322 + 98 + + + 322 + 193 + + + + + sub_pos_slider + valueChanged(int) + sub_pos_label + setNum(int) + + + 252 + 298 + + + 492 + 299 + + + + +
    diff --git a/retroshare-gui/src/apps/smplayer/prefwidget.cpp b/retroshare-gui/src/apps/smplayer/prefwidget.cpp new file mode 100644 index 000000000..dd7b3c0af --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/prefwidget.cpp @@ -0,0 +1,64 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "prefwidget.h" +#include + +PrefWidget::PrefWidget(QWidget * parent, Qt::WindowFlags f ) + : QWidget(parent, f) +{ + requires_restart = false; + help_message = ""; +} + +PrefWidget::~PrefWidget() { +} + +QString PrefWidget::sectionName() { + return QString(); +} + +QPixmap PrefWidget::sectionIcon() { + return QPixmap(); +} + +void PrefWidget::setWhatsThis( QWidget *w, const QString & title, + const QString & text) +{ + w->setWhatsThis(text); + help_message += ""+title+"
    "+text+"

    "; +} + +void PrefWidget::clearHelp() { + help_message = "

    " + sectionName() + "

    "; +} + +void PrefWidget::createHelp() { +} + +// Language change stuff +void PrefWidget::changeEvent(QEvent *e) { + if (e->type() == QEvent::LanguageChange) { + retranslateStrings(); + } else { + QWidget::changeEvent(e); + } +} + +void PrefWidget::retranslateStrings() { +} diff --git a/retroshare-gui/src/apps/smplayer/prefwidget.h b/retroshare-gui/src/apps/smplayer/prefwidget.h new file mode 100644 index 000000000..a4fc4f897 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/prefwidget.h @@ -0,0 +1,65 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef _PREFWIDGET_H_ +#define _PREFWIDGET_H_ + +#include +#include +#include + + +#define TEST_AND_SET( Pref, Dialog ) \ + if ( Pref != Dialog ) { Pref = Dialog; requires_restart = TRUE; } + +class QEvent; + +class PrefWidget : public QWidget +{ + +public: + PrefWidget(QWidget * parent = 0, Qt::WindowFlags f = 0 ); + ~PrefWidget(); + + // Return the name of the section + virtual QString sectionName(); + + virtual QPixmap sectionIcon(); + + // Return true if the changes made require to restart the mplayer + // process. Should be call just after the changes have been applied. + virtual bool requiresRestart() { return requires_restart; }; + + virtual QString help() { return help_message; }; + +protected: + virtual void retranslateStrings(); + virtual void changeEvent ( QEvent * event ) ; + + void setWhatsThis( QWidget *w, const QString & title, const QString & text); + void clearHelp(); + + virtual void createHelp(); + + bool requires_restart; + +private: + QString help_message; +}; + +#endif diff --git a/retroshare-gui/src/apps/smplayer/recents.cpp b/retroshare-gui/src/apps/smplayer/recents.cpp new file mode 100644 index 000000000..2afaacf10 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/recents.cpp @@ -0,0 +1,118 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "recents.h" +#include "global.h" +#include + +Recents::Recents(QObject* parent) : QObject(parent) +{ + l.clear(); + max_items = 10; + load(); +} + +Recents::~Recents() { + save(); +} + +void Recents::clear() { + l.clear(); +} + +void Recents::add(QString s) { + qDebug("Recents::add: '%s'", s.toUtf8().data()); + + /* + QStringList::iterator it = l.find(s); + if (it != l.end()) l.erase(it); + l.prepend(s); + + if (l.count() > max_items) l.erase(l.fromLast()); + */ + + int pos = l.indexOf(s); + if (pos != -1) l.removeAt(pos); + l.prepend(s); + + if (l.count() > max_items) l.removeLast(); + + //qDebug(" * current list:"); + //list(); +} + +int Recents::count() { + return l.count(); +} + +QString Recents::item(int n) { + return l[n]; +} + +void Recents::list() { + qDebug("Recents::list"); + + for (int n=0; n < count(); n++) { + qDebug(" * item %d: '%s'", n, item(n).toUtf8().data() ); + } +} + +void Recents::save() { + qDebug("Recents::save"); + + QSettings * set = settings; + + /* + set->beginGroup( "recent_files"); + + set->writeEntry( "items", count() ); + for (int n=0; n < count(); n++) { + set->writeEntry("entry_" + QString::number(n), item(n) ); + } + */ + + set->beginGroup( "recent_files"); + set->setValue( "files", l ); + + set->endGroup(); +} + +void Recents::load() { + qDebug("Recents::load"); + + l.clear(); + + QSettings * set = settings; + + /* + set->beginGroup( "recent_files"); + + int num_entries = set->readNumEntry( "items", 0 ); + for (int n=0; n < num_entries; n++) { + QString s = set->readEntry("entry_" + QString::number(n), "" ); + if (!s.isEmpty()) l.append( s ); + } + */ + + set->beginGroup( "recent_files"); + l = set->value( "files" ).toStringList(); + + set->endGroup(); +} + +#include "moc_recents.cpp" diff --git a/retroshare-gui/src/apps/smplayer/recents.h b/retroshare-gui/src/apps/smplayer/recents.h new file mode 100644 index 000000000..d98d6800b --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/recents.h @@ -0,0 +1,53 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef _RECENTS_H_ +#define _RECENTS_H_ + +#include +#include + +class Recents : public QObject +{ + Q_OBJECT + +public: + Recents(QObject* parent = 0); + ~Recents(); + + void add(QString s); + int count(); + QString item(int n); + + void setMaxItems(int n) { max_items = n; }; + int maxItems() { return max_items; }; + + void save(); + void load(); + + void list(); + +public slots: + void clear(); + +private: + QStringList l; + int max_items; +}; + +#endif diff --git a/retroshare-gui/src/apps/smplayer/seekwidget.cpp b/retroshare-gui/src/apps/smplayer/seekwidget.cpp new file mode 100644 index 000000000..27599376f --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/seekwidget.cpp @@ -0,0 +1,60 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "seekwidget.h" +#include +#include + +SeekWidget::SeekWidget( QWidget* parent, Qt::WindowFlags f) + : QWidget(parent, f) +{ + setupUi(this); + time_edit->setDisplayFormat("mm:ss"); +} + +SeekWidget::~SeekWidget() { +} + +void SeekWidget::setIcon(QPixmap icon) { + _image->setText(""); + _image->setPixmap(icon); +} + +const QPixmap * SeekWidget::icon() const { + return _image->pixmap(); +} + +void SeekWidget::setLabel(QString text) { + _label->setText(text); +} + +QString SeekWidget::label() const { + return _label->text(); +} + +void SeekWidget::setTime(int secs) { + QTime t; + time_edit->setTime(t.addSecs(secs)); +} + +int SeekWidget::time() const { + QTime t = time_edit->time(); + return (t.minute() * 60) + t.second(); +} + +#include "moc_seekwidget.cpp" diff --git a/retroshare-gui/src/apps/smplayer/seekwidget.h b/retroshare-gui/src/apps/smplayer/seekwidget.h new file mode 100644 index 000000000..8ee1db8ca --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/seekwidget.h @@ -0,0 +1,48 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef _SEEKWIDGET_H_ +#define _SEEKWIDGET_H_ + +#include "ui_seekwidget.h" +#include +#include + +class SeekWidget : public QWidget, public Ui::SeekWidget +{ + Q_OBJECT + Q_PROPERTY(QPixmap icon READ icon WRITE setIcon) + Q_PROPERTY(QString label READ label WRITE setLabel) + Q_PROPERTY(int time READ time WRITE setTime) + +public: + SeekWidget( QWidget* parent = 0, Qt::WindowFlags f = 0 ); + ~SeekWidget(); + + int time() const; + const QPixmap * icon() const; + QString label() const; + +public slots: + void setIcon(QPixmap icon); + void setLabel(QString text); + void setTime(int secs); + +}; + +#endif diff --git a/retroshare-gui/src/apps/smplayer/seekwidget.ui b/retroshare-gui/src/apps/smplayer/seekwidget.ui new file mode 100644 index 000000000..4ea5eac0c --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/seekwidget.ui @@ -0,0 +1,77 @@ + + SeekWidget + + + + 0 + 0 + 292 + 31 + + + + + + + + 0 + + + 0 + + + + + icon + + + false + + + + + + + + 7 + 5 + 0 + 0 + + + + label + + + false + + + time_edit + + + + + + + + + + + + + + + + + qPixmapFromMimeSource + + + diff --git a/retroshare-gui/src/apps/smplayer/shortcutgetter.cpp b/retroshare-gui/src/apps/smplayer/shortcutgetter.cpp new file mode 100644 index 000000000..8eea61ed7 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/shortcutgetter.cpp @@ -0,0 +1,417 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +/* + Note: The ShortcutGetter class is taken from the source code of Edyuk + (http://www.edyuk.org/), from file 3rdparty/qcumber/qshortcutdialog.cpp + + Copyright (C) 2006 FullMetalCoder + License: GPL + + I've just made a little few changes on it. +*/ + + +/**************************************************************************** +** +** Copyright (C) 2006 FullMetalCoder +** +** This file is part of the Edyuk project (beta version) +** +** This file may be used under the terms of the GNU General Public License +** version 2 as published by the Free Software Foundation and appearing in the +** file GPL.txt included in the packaging of this file. +** +** Notes : Parts of the project are derivative work of Trolltech's QSA library +** or Trolltech's Qt4 framework but, unless notified, every single line of code +** is the work of the Edyuk team or a contributor. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + + +#include "shortcutgetter.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if 1 + +static QHash keyMap; + +static void initKeyMap() +{ + if ( !keyMap.isEmpty() ) + return; + + /* + I'm a bit unsure about these one... + */ + keyMap[Qt::Key_Escape] = "Escape"; + keyMap[Qt::Key_Return] = "Return"; + keyMap[Qt::Key_Enter] = "Enter"; + keyMap[Qt::Key_Insert] = "Ins"; + keyMap[Qt::Key_Delete] = "Delete"; + keyMap[Qt::Key_Home] = "Home"; + keyMap[Qt::Key_End] = "End"; + keyMap[Qt::Key_Left] = "Left"; + keyMap[Qt::Key_Up] = "Up"; + keyMap[Qt::Key_Right] = "Right"; + keyMap[Qt::Key_Down] = "Down"; + keyMap[Qt::Key_PageUp] = "PageUp"; + keyMap[Qt::Key_PageDown] = "PageDown"; + keyMap[Qt::Key_CapsLock] = "CapsLock"; + keyMap[Qt::Key_NumLock] = "NumLock"; + keyMap[Qt::Key_ScrollLock] = "ScrollLock"; + + // Added by rvm: + keyMap[Qt::Key_Space] = "Space"; + keyMap[Qt::Key_Backspace] = "Backspace"; + + /* + These one are quite sure... + */ + keyMap[Qt::Key_F1] = "F1"; + keyMap[Qt::Key_F2] = "F2"; + keyMap[Qt::Key_F3] = "F3"; + keyMap[Qt::Key_F4] = "F4"; + keyMap[Qt::Key_F5] = "F5"; + keyMap[Qt::Key_F6] = "F6"; + keyMap[Qt::Key_F7] = "F7"; + keyMap[Qt::Key_F8] = "F8"; + keyMap[Qt::Key_F9] = "F9"; + keyMap[Qt::Key_F10] = "F10"; + keyMap[Qt::Key_F11] = "F11"; + keyMap[Qt::Key_F12] = "F12"; + keyMap[Qt::Key_F13] = "F13"; + keyMap[Qt::Key_F14] = "F14"; + keyMap[Qt::Key_F15] = "F15"; + keyMap[Qt::Key_F16] = "F16"; + keyMap[Qt::Key_F17] = "F17"; + keyMap[Qt::Key_F18] = "F18"; + keyMap[Qt::Key_F19] = "F19"; + keyMap[Qt::Key_F20] = "F20"; + keyMap[Qt::Key_F21] = "F21"; + keyMap[Qt::Key_F22] = "F22"; + keyMap[Qt::Key_F23] = "F23"; + keyMap[Qt::Key_F24] = "F24"; + keyMap[Qt::Key_F25] = "F25"; + keyMap[Qt::Key_F26] = "F26"; + keyMap[Qt::Key_F27] = "F27"; + keyMap[Qt::Key_F28] = "F28"; + keyMap[Qt::Key_F29] = "F29"; + keyMap[Qt::Key_F30] = "F30"; + keyMap[Qt::Key_F31] = "F31"; + keyMap[Qt::Key_F32] = "F32"; + keyMap[Qt::Key_F33] = "F33"; + keyMap[Qt::Key_F34] = "F34"; + keyMap[Qt::Key_F35] = "F35"; + + keyMap[Qt::Key_Exclam] = "!"; + keyMap[Qt::Key_QuoteDbl] = "\""; + keyMap[Qt::Key_NumberSign] = "-"; + keyMap[Qt::Key_Dollar] = "$"; + keyMap[Qt::Key_Percent] = "%"; + keyMap[Qt::Key_Ampersand] = "&"; + keyMap[Qt::Key_Apostrophe] = "\'"; + keyMap[Qt::Key_ParenLeft] = "("; + keyMap[Qt::Key_ParenRight] = ")"; + keyMap[Qt::Key_Asterisk] = "*"; + keyMap[Qt::Key_Plus] = "+"; + keyMap[Qt::Key_Comma] = ","; + keyMap[Qt::Key_Minus] = "-"; + keyMap[Qt::Key_Period] = "Period"; + keyMap[Qt::Key_Slash] = "/"; + + keyMap[Qt::Key_0] = "0"; + keyMap[Qt::Key_1] = "1"; + keyMap[Qt::Key_2] = "2"; + keyMap[Qt::Key_3] = "3"; + keyMap[Qt::Key_4] = "4"; + keyMap[Qt::Key_5] = "5"; + keyMap[Qt::Key_6] = "6"; + keyMap[Qt::Key_7] = "7"; + keyMap[Qt::Key_8] = "8"; + keyMap[Qt::Key_9] = "9"; + + keyMap[Qt::Key_Colon] = ":"; + keyMap[Qt::Key_Semicolon] = ";"; + keyMap[Qt::Key_Less] = "<"; + keyMap[Qt::Key_Equal] = "="; + keyMap[Qt::Key_Greater] = ">"; + keyMap[Qt::Key_Question] = "?"; + keyMap[Qt::Key_At] = "@"; + + keyMap[Qt::Key_A] = "A"; + keyMap[Qt::Key_B] = "B"; + keyMap[Qt::Key_C] = "C"; + keyMap[Qt::Key_D] = "D"; + keyMap[Qt::Key_E] = "E"; + keyMap[Qt::Key_F] = "F"; + keyMap[Qt::Key_G] = "G"; + keyMap[Qt::Key_H] = "H"; + keyMap[Qt::Key_I] = "I"; + keyMap[Qt::Key_J] = "J"; + keyMap[Qt::Key_K] = "K"; + keyMap[Qt::Key_L] = "L"; + keyMap[Qt::Key_M] = "M"; + keyMap[Qt::Key_N] = "N"; + keyMap[Qt::Key_O] = "O"; + keyMap[Qt::Key_P] = "P"; + keyMap[Qt::Key_Q] = "Q"; + keyMap[Qt::Key_R] = "R"; + keyMap[Qt::Key_S] = "S"; + keyMap[Qt::Key_T] = "T"; + keyMap[Qt::Key_U] = "U"; + keyMap[Qt::Key_V] = "V"; + keyMap[Qt::Key_W] = "W"; + keyMap[Qt::Key_X] = "X"; + keyMap[Qt::Key_Y] = "Y"; + keyMap[Qt::Key_Z] = "Z"; + + keyMap[Qt::Key_BracketLeft] = "["; + keyMap[Qt::Key_Backslash] = "\\"; + keyMap[Qt::Key_BracketRight] = "]"; + + keyMap[Qt::Key_Underscore] = "_"; + keyMap[Qt::Key_BraceLeft] = "{"; + keyMap[Qt::Key_Bar] = "|"; + keyMap[Qt::Key_BraceRight] = "}"; + keyMap[Qt::Key_AsciiTilde] = "~"; + +} + +static QString keyToString(int k) +{ + if ( k == Qt::Key_Shift || k == Qt::Key_Control || k == Qt::Key_Meta || + k == Qt::Key_Alt || k == Qt::Key_AltGr ) + return QString::null; + + initKeyMap(); + + return keyMap[k]; +} + +#else + +static QString keyToString(int k) +{ + if ( k == Qt::Key_Shift || k == Qt::Key_Control || k == Qt::Key_Meta || + k == Qt::Key_Alt || k == Qt::Key_AltGr ) + return QString::null; + + return QKeySequence(k).toString(); +} + +#endif + +static QStringList modToString(Qt::KeyboardModifiers k) +{ + //qDebug("modToString: k: %x", (int) k); + + QStringList l; + + if ( k & Qt::ShiftModifier ) + l << "Shift"; + if ( k & Qt::ControlModifier ) + l << "Ctrl"; + if ( k & Qt::AltModifier ) + l << "Alt"; + if ( k & Qt::MetaModifier ) + l << "Meta"; + if ( k & Qt::GroupSwitchModifier ) + ; + if ( k & Qt::KeypadModifier ) + ; + + return l; +} + + +ShortcutGetter::ShortcutGetter(QWidget *parent) : QDialog(parent) +{ + setWindowTitle(tr("Modify shortcut")); + + + QVBoxLayout *vbox = new QVBoxLayout(this); + vbox->setMargin(2); + vbox->setSpacing(4); + + QLabel *l = new QLabel(this); + l->setText(tr("Press the key combination you want to assign")); + vbox->addWidget(l); + + leKey = new QLineEdit(this); + + leKey->installEventFilter(this); + vbox->addWidget(leKey); + + // Change by rvm: use a QDialogButtonBox instead of QPushButtons + // and add a clear button + setCaptureKeyboard(true); + QDialogButtonBox * buttonbox = new QDialogButtonBox(QDialogButtonBox::Ok | + QDialogButtonBox::Cancel | + QDialogButtonBox::Reset ); + QPushButton * clearbutton = buttonbox->button(QDialogButtonBox::Reset); + clearbutton->setText( tr("Clear") ); + + QPushButton * captureButton = new QPushButton(tr("Capture"), this); + captureButton->setToolTip( tr("Capture keystrokes") ); + captureButton->setCheckable( captureKeyboard() ); + captureButton->setChecked( captureKeyboard() ); + connect(captureButton, SIGNAL(toggled(bool)), + this, SLOT(setCaptureKeyboard(bool))); + + + buttonbox->addButton(captureButton, QDialogButtonBox::ActionRole); + + connect( buttonbox, SIGNAL(accepted()), this, SLOT(accept()) ); + connect( buttonbox, SIGNAL(rejected()), this, SLOT(reject()) ); + connect( clearbutton, SIGNAL(clicked()), leKey, SLOT(clear()) ); + vbox->addWidget(buttonbox); +} + +void ShortcutGetter::setCaptureKeyboard(bool b) { + capture = b; + leKey->setReadOnly(b); + leKey->setFocus(); +} + + +QString ShortcutGetter::exec(const QString& s) +{ + bStop = false; + leKey->setText(s); + + if ( QDialog::exec() == QDialog::Accepted ) + return leKey->text(); + + return QString(); +} + +bool ShortcutGetter::event(QEvent *e) +{ + if (!capture) return QDialog::event(e); + + + QString key; + QStringList mods; + QKeyEvent *k = static_cast(e); + + switch ( e->type() ) + { + case QEvent::KeyPress : + + if ( bStop ) + { + lKeys.clear(); + bStop = false; + } + + key = keyToString(k->key()); + mods = modToString(k->modifiers()); + + //qDebug("event: key.count: %d, mods.count: %d", key.count(), mods.count()); + + if ( key.count() || mods.count() ) + { + + if ( key.count() && !lKeys.contains(key) ) + lKeys << key; + + foreach ( key, mods ) + if ( !lKeys.contains(key) ) + lKeys << key; + + } else { + key = k->text(); + + if ( !lKeys.contains(key) ) + lKeys << key; + } + + setText(); + break; + + case QEvent::KeyRelease : + + bStop = true; + break; + + /* + case QEvent::ShortcutOverride : + leKey->setText("Shortcut override"); + break; + */ + + default: + return QDialog::event(e); + break; + } + + return true; +} + +bool ShortcutGetter::eventFilter(QObject *o, QEvent *e) +{ + if (!capture) return QDialog::eventFilter(o, e); + + if ( e->type() == QEvent::KeyPress || + e->type() ==QEvent::KeyRelease ) + return event(e); + else + return QDialog::eventFilter(o, e); +} + +void ShortcutGetter::setText() +{ + QStringList seq; + + if ( lKeys.contains("Shift") ) + seq << "Shift"; + + if ( lKeys.contains("Ctrl") ) + seq << "Ctrl"; + + if ( lKeys.contains("Alt") ) + seq << "Alt"; + + if ( lKeys.contains("Meta") ) + seq << "Meta"; + + foreach ( QString s, lKeys ) { + //qDebug("setText: s: '%s'", s.toUtf8().data()); + if ( s != "Shift" && s != "Ctrl" + && s != "Alt" && s != "Meta" ) + seq << s; + } + + leKey->setText(seq.join("+")); + //leKey->selectAll(); +} + +#include "moc_shortcutgetter.cpp" diff --git a/retroshare-gui/src/apps/smplayer/shortcutgetter.h b/retroshare-gui/src/apps/smplayer/shortcutgetter.h new file mode 100644 index 000000000..997fcb334 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/shortcutgetter.h @@ -0,0 +1,61 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +/* + Note: The ShortcutGetter class is taken from the source code of Edyuk + (http://www.edyuk.org) + + Copyright (C) 2006 FullMetalCoder + License: GPL +*/ + + +#ifndef _SHORTCUTGETTER_H_ +#define _SHORTCUTGETTER_H_ + +#include + +class QLineEdit; + +class ShortcutGetter : public QDialog +{ + Q_OBJECT + +public: + ShortcutGetter(QWidget *parent = 0); + + QString exec(const QString& s); + +protected slots: + void setCaptureKeyboard(bool b); + +protected: + bool captureKeyboard() { return capture; }; + + bool event(QEvent *e); + bool eventFilter(QObject *o, QEvent *e); + void setText(); + +private: + bool bStop; + QLineEdit *leKey; + QStringList lKeys; + bool capture; +}; + +#endif diff --git a/retroshare-gui/src/apps/smplayer/shortcuts/default.keys b/retroshare-gui/src/apps/smplayer/shortcuts/default.keys new file mode 100644 index 000000000..27ae50090 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/shortcuts/default.keys @@ -0,0 +1,151 @@ +open_file Ctrl+F +open_directory +open_playlist +open_vcd +open_audio_cd +open_dvd +open_dvd_folder +open_url Ctrl+U +close Ctrl+X +clear_recents +play +play_or_pause Media Play +pause Space +pause_and_frame_step +stop Media Stop +frame_step . +rewind1 Left +rewind2 Down +rewind3 PgDown +forward1 Right +forward2 Up +forward3 PgUp +repeat +normal_speed Backspace +halve_speed { +double_speed } +dec_speed [ +inc_speed ] +fullscreen F +compact Ctrl+C +equalizer Ctrl+E +screenshot S +on_top +flip +postprocessing +autodetect_phase +deblock +dering +add_noise +mute M +decrease_volume 9, / +increase_volume 0, * +dec_audio_delay - +inc_audio_delay + +load_audio_file +unload_audio_file +extrastereo_filter +karaoke_filter +volnorm_filter +load_subs +unload_subs +dec_sub_delay Z +inc_sub_delay X +dec_sub_pos R +inc_sub_pos T +dec_sub_step G +inc_sub_step Y +use_ass_lib +show_playlist Ctrl+L +show_file_properties Ctrl+I +frame_counter +show_preferences Ctrl+P +show_mplayer_log Ctrl+M +show_smplayer_log Ctrl+S +about_qt +about_smplayer +play_next > +play_prev < +move_up Alt+Up +move_down Alt+Down +move_left Alt+Left +move_right Alt+Right +inc_zoom E +dec_zoom W +reset_zoom Shift+E +exit_fullscreen Esc +next_osd O +dec_contrast 1 +inc_contrast 2 +dec_brightness 3 +inc_brightness 4 +dec_hue 5 +inc_hue 6 +dec_saturation 7 +inc_saturation 8 +dec_gamma Alt+1 +inc_gamma Alt+2 +next_audio H +next_subtitle J +next_chapter @ +prev_chapter ! +toggle_double_size Ctrl+D +osd_none +osd_seek +osd_timer +osd_total +denoise_none +denoise_normal +denoise_soft +size_50 +size_75 +size_100 Ctrl+1 +size_125 +size_150 +size_175 +size_200 Ctrl+2 +size_300 +size_400 +deinterlace_none +deinterlace_l5 +deinterlace_yadif0 +deinterlace_yadif1 +deinterlace_lb +deinterlace_kern +channels_stereo +channels_surround +channels_ful51 +stereo +left_channel +right_channel +aspect_detect +aspect_4:3 +aspect_5:4 +aspect_14:9 +aspect_16:9 +aspect_16:10 +aspect_2.35:1 +aspect_4:3_letterbox +aspect_16:9_letterbox +aspect_4:3_panscan +aspect_4:3_to_16:9 +quit +show_tray_icon +restore/hide +pl_open +pl_save +pl_play +pl_next N +pl_prev P +pl_move_up +pl_move_down +pl_repeat +pl_shuffle +pl_add_current +pl_add_files +pl_add_directory +pl_remove_selected +pl_remove_all +pl_edit +show_main_toolbar F5 +show_language_toolbar F6 diff --git a/retroshare-gui/src/apps/smplayer/smplayer.ico b/retroshare-gui/src/apps/smplayer/smplayer.ico new file mode 100644 index 000000000..bab3eb3ac Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/smplayer.ico differ diff --git a/retroshare-gui/src/apps/smplayer/smplayer.pro b/retroshare-gui/src/apps/smplayer/smplayer.pro new file mode 100644 index 000000000..ecf834122 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/smplayer.pro @@ -0,0 +1,182 @@ +TEMPLATE = lib +CONFIG += staticlib +DESTDIR = lib + +LANGUAGE = C++ + +#CONFIG += qt warn_on release + +QT += network +#QT += opengl + +RESOURCES = icons.qrc + +HEADERS += config.h \ + constants.h \ + svn_revision.h \ + version.h \ + global.h \ + helper.h \ + translator.h \ + subtracks.h \ + trackdata.h \ + tracks.h \ + desktopinfo.h \ + myprocess.h \ + mplayerprocess.h \ + mplayerwindow.h \ + mediadata.h \ + mediasettings.h \ + preferences.h \ + images.h \ + inforeader.h \ + recents.h \ + core.h \ + logwindow.h \ + infofile.h \ + encodings.h \ + seekwidget.h \ + mytablewidget.h \ + shortcutgetter.h \ + actionseditor.h \ + preferencesdialog.h \ + mycombobox.h \ + prefwidget.h \ + prefgeneral.h \ + prefdrives.h \ + prefinterface.h \ + prefperformance.h \ + prefinput.h \ + prefsubtitles.h \ + prefadvanced.h \ + filepropertiesdialog.h \ + playlist.h \ + playlistdock.h \ + verticaltext.h \ + eqslider.h \ + videoequalizer.h \ + timeslider.h \ + inputdvddirectory.h \ + inputurl.h \ + myaction.h \ + myactiongroup.h \ + myserver.h \ + myclient.h \ + filedialog.h \ + aboutdialog.h \ + basegui.h \ + baseguiplus.h \ + floatingcontrol.h \ + defaultgui.h + + +SOURCES += version.cpp \ + global.cpp \ + helper.cpp \ + translator.cpp \ + subtracks.cpp \ + trackdata.cpp \ + tracks.cpp \ + desktopinfo.cpp \ + myprocess.cpp \ + mplayerprocess.cpp \ + mplayerwindow.cpp \ + mediadata.cpp \ + mediasettings.cpp \ + preferences.cpp \ + images.cpp \ + inforeader.cpp \ + recents.cpp \ + core.cpp \ + logwindow.cpp \ + infofile.cpp \ + encodings.cpp \ + seekwidget.cpp \ + mytablewidget.cpp \ + shortcutgetter.cpp \ + actionseditor.cpp \ + preferencesdialog.cpp \ + mycombobox.cpp \ + prefwidget.cpp \ + prefgeneral.cpp \ + prefdrives.cpp \ + prefinterface.cpp \ + prefperformance.cpp \ + prefinput.cpp \ + prefsubtitles.cpp \ + prefadvanced.cpp \ + filepropertiesdialog.cpp \ + playlist.cpp \ + playlistdock.cpp \ + verticaltext.cpp \ + eqslider.cpp \ + videoequalizer.cpp \ + timeslider.cpp \ + inputdvddirectory.cpp \ + inputurl.cpp \ + myaction.cpp \ + myactiongroup.cpp \ + myserver.cpp \ + myclient.cpp \ + filedialog.cpp \ + aboutdialog.cpp \ + basegui.cpp \ + baseguiplus.cpp \ + floatingcontrol.cpp \ + defaultgui.cpp \ + main.cpp + +FORMS = inputdvddirectory.ui logwindowbase.ui filepropertiesdialog.ui \ + eqslider.ui seekwidget.ui inputurl.ui \ + preferencesdialog.ui prefgeneral.ui prefdrives.ui prefinterface.ui \ + prefperformance.ui prefinput.ui prefsubtitles.ui prefadvanced.ui + +TRANSLATIONS = translations/smplayer_es.ts translations/smplayer_de.ts \ + translations/smplayer_sk.ts translations/smplayer_it.ts \ + translations/smplayer_fr.ts translations/smplayer_zh_CN.ts \ + translations/smplayer_ru_RU.ts translations/smplayer_hu.ts \ + translations/smplayer_en_US.ts translations/smplayer_pl.ts \ + translations/smplayer_ja.ts translations/smplayer_nl.ts \ + translations/smplayer_uk_UA.ts translations/smplayer_pt_BR.ts \ + translations/smplayer_ka.ts translations/smplayer_cs.ts \ + translations/smplayer_bg.ts translations/smplayer_tr.ts \ + translations/smplayer_sv.ts translations/smplayer_sr.ts \ + translations/smplayer_zh_TW.ts translations/smplayer_ro_RO.ts \ + translations/smplayer_pt_PT.ts + +unix { + UI_DIR = .ui + MOC_DIR = .moc + OBJECTS_DIR = .obj + + DEFINES += DATA_PATH=$(DATA_PATH) + DEFINES += DOC_PATH=$(DOC_PATH) + DEFINES += TRANSLATION_PATH=$(TRANSLATION_PATH) + DEFINES += CONF_PATH=$(CONF_PATH) + DEFINES += THEMES_PATH=$(THEMES_PATH) + DEFINES += SHORTCUTS_PATH=$(SHORTCUTS_PATH) + #DEFINES += NO_DEBUG_ON_CONSOLE + + #DEFINES += KDE_SUPPORT + #INCLUDEPATH += /opt/kde3/include/ + #LIBS += -lkio -L/opt/kde3/lib/ + + #contains( DEFINES, KDE_SUPPORT) { + # HEADERS += mysystemtrayicon.h + # SOURCES += mysystemtrayicon.cpp + #} +} + +win32 { + + HEADERS += prefassociations.h winfileassoc.h + SOURCES += prefassociations.cpp winfileassoc.cpp + FORMS += prefassociations.ui + + RC_FILE = smplayer.rc + DEFINES += NO_DEBUG_ON_CONSOLE +# debug { +# CONFIG += console +# } +} + diff --git a/retroshare-gui/src/apps/smplayer/smplayer.rc b/retroshare-gui/src/apps/smplayer/smplayer.rc new file mode 100644 index 000000000..e290415b5 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/smplayer.rc @@ -0,0 +1 @@ +IDI_ICON1 ICON DISCARDABLE "smplayer.ico" diff --git a/retroshare-gui/src/apps/smplayer/subtracks.cpp b/retroshare-gui/src/apps/smplayer/subtracks.cpp new file mode 100644 index 000000000..d0c8aaab5 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/subtracks.cpp @@ -0,0 +1,228 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + + +#include "subtracks.h" +#include "mediasettings.h" +#include + +SubTracks::SubTracks() { + index = 0; +} + + +SubTracks::~SubTracks() { +} + +void SubTracks::clear() { + subs.clear(); +} + +void SubTracks::add( SubData::Type t, int ID ) { + SubData d; + d.setType(t); + d.setID(ID); + + subs.append(d); +} + +void SubTracks::list() { + for (unsigned int n=0; n < subs.count(); n++) { + qDebug("SubTracks::list: item %d: type: %d ID: %d lang: '%s' name: '%s' filename: '%s'", + n, subs[n].type(), subs[n].ID(), subs[n].lang().toUtf8().data(), + subs[n].name().toUtf8().data(), subs[n].filename().toUtf8().data() ); + } +} + +void SubTracks::listNames() { + for (unsigned int n=0; n < subs.count(); n++) { + qDebug("SubTracks::list: item %d: '%s'", + n, subs[n].displayName().toUtf8().data() ); + } +} + +int SubTracks::numItems() { + return subs.count(); +} + +bool SubTracks::existsItemAt(int n) { + return ((n > 0) && (n < numItems())); +} + +int SubTracks::findLang(QString expr) { + qDebug( "SubTracks::findLang: '%s'", expr.toUtf8().data()); + QRegExp rx( expr ); + + int res_id = -1; + + for (int n=0; n < numItems(); n++) { + qDebug("SubTracks::findLang: lang #%d '%s'", n, + subs[n].lang().toUtf8().data()); + if (rx.indexIn( subs[n].lang() ) > -1) { + qDebug("SubTracks::findLang: found preferred lang!"); + res_id = n; + break; + } + } + + return res_id; +} + +// Return first subtitle or the user preferred (if found) +// or none if there's no subtitles +int SubTracks::selectOne(QString preferred_lang, int default_sub) { + int sub = MediaSettings::SubNone; + + if (numItems() > 0) { + sub = 0; // First subtitle + if (existsItemAt(default_sub)) { + sub = default_sub; + } + + // Check if one of the subtitles is the user preferred. + if (!preferred_lang.isEmpty()) { + int res = findLang( preferred_lang ); + if (res != -1) sub = res; + } + } + return sub; +} + +int SubTracks::find( SubData::Type t, int ID ) { + for (unsigned int n=0; n < subs.count(); n++) { + if ( ( subs[n].type() == t ) && ( subs[n].ID() == ID ) ) { + return n; + } + } + qDebug("SubTracks::find: item type: %d, ID: %d doesn't exist", t, ID); + return -1; +} + +SubData SubTracks::findItem( SubData::Type t, int ID ) { + SubData sub; + int n = find(t,ID); + if ( n != -1 ) + return subs[n]; + else + return sub; +} + +SubData SubTracks::itemAt( int n ) { + return subs[n]; +} + +bool SubTracks::changeLang( SubData::Type t, int ID, QString lang ) { + int f = find(t,ID); + if (f == -1) return false; + + subs[f].setLang(lang); + return true; +} + +bool SubTracks::changeName( SubData::Type t, int ID, QString name ) { + int f = find(t,ID); + if (f == -1) return false; + + subs[f].setName(name); + return true; +} + +bool SubTracks::changeFilename( SubData::Type t, int ID, QString filename ) { + int f = find(t,ID); + if (f == -1) return false; + + subs[f].setFilename(filename); + return true; +} + +void SubTracks::process(QString text) { + qDebug("SubTracks::process: '%s'", text.toUtf8().data()); + + QRegExp rx_subtitle("^ID_(SUBTITLE|FILE_SUB|VOBSUB)_ID=(\\d+)"); + QRegExp rx_sid("^ID_(SID|VSID)_(\\d+)_(LANG|NAME)=(.*)"); + QRegExp rx_subtitle_file("^ID_FILE_SUB_FILENAME=(.*)"); + + if (rx_subtitle.indexIn(text) > -1) { + int ID = rx_subtitle.cap(2).toInt(); + QString type = rx_subtitle.cap(1); + + SubData::Type t; + if (type == "FILE_SUB") t = SubData::File; + else + if (type == "VOBSUB") t = SubData::Vob; + else + t = SubData::Sub; + + if (find(t, ID) > -1) { + qWarning("SubTracks::process: subtitle type: %d, ID: %d already exists!", t, ID); + } else { + add(t,ID); + } + } + else + if (rx_sid.indexIn(text) > -1) { + int ID = rx_sid.cap(2).toInt(); + QString value = rx_sid.cap(4); + QString attr = rx_sid.cap(3); + QString type = rx_sid.cap(1); + + SubData::Type t = SubData::Sub; + if (type == "VSID") t = SubData::Vob; + + if (find(t, ID) == -1) { + qWarning("SubTracks::process: subtitle type: %d, ID: %d doesn't exist!", t, ID); + } else { + if (attr=="NAME") + changeName(t,ID, value); + else + changeLang(t,ID, value); + } + } + else + if (rx_subtitle_file.indexIn(text) > -1) { + QString file = rx_subtitle_file.cap(1); + if ( subs.count() > 0 ) { + int last = subs.count() -1; + if (subs[last].type() == SubData::File) { + subs[last].setFilename( file ); + } + } + } +} + +/* +void SubTracks::test() { + process("ID_SUBTITLE_ID=0"); + process("ID_SID_0_NAME=Arabic"); + process("ID_SID_0_LANG=ara"); + process("ID_SUBTITLE_ID=1"); + process("ID_SID_1_NAME=Catalan"); + process("ID_SID_1_LANG=cat"); + + process("ID_VOBSUB_ID=0"); + process("ID_VSID_0_LANG=en"); + process("ID_VOBSUB_ID=1"); + process("ID_VSID_1_LANG=fr"); + + process("ID_FILE_SUB_ID=1"); + process("ID_FILE_SUB_FILENAME=./lost313_es.sub"); + + list(); + listNames(); +} +*/ diff --git a/retroshare-gui/src/apps/smplayer/subtracks.h b/retroshare-gui/src/apps/smplayer/subtracks.h new file mode 100644 index 000000000..b142f27ff --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/subtracks.h @@ -0,0 +1,114 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + + +#ifndef _SUBTRACKS_H_ +#define _SUBTRACKS_H_ + +#include +#include +#include + +class SubData +{ + +public: + enum Type { None = -1, Vob = 0, Sub = 1, File = 2 }; + + SubData() { _ID=-1; _lang=""; _name=""; _filename=""; _type = None; }; + ~SubData() {}; + + void setType( Type t ) { _type = t; }; + void setID(int id) { _ID = id; }; + void setLang(QString lang) { _lang = lang; }; + void setName(QString name) { _name = name; }; + void setFilename(QString f) { _filename = f; }; + + Type type() { return _type; }; + int ID() { return _ID; }; + QString lang() { return _lang; }; + QString name() { return _name; }; + QString filename() { return _filename; }; + + QString displayName() { + QString dname=""; + + if (!_name.isEmpty()) { + dname = _name; + } + else + if (!_lang.isEmpty()) { + dname = _lang; + } + else + if (!_filename.isEmpty()) { + QFileInfo f(_filename); + dname = f.fileName(); + } + else + dname = QString::number(_ID); + + return dname; + }; + +protected: + Type _type; + int _ID; + QString _lang; + QString _name; + QString _filename; +}; + +typedef QList SubList; + + +class SubTracks +{ +public: + SubTracks(); + ~SubTracks(); + + void clear(); + int find( SubData::Type t, int ID ); + + void add( SubData::Type t, int ID ); + bool changeLang( SubData::Type t, int ID, QString lang ); + bool changeName( SubData::Type t, int ID, QString name ); + bool changeFilename( SubData::Type t, int ID, QString filename ); + + int numItems(); + bool existsItemAt(int n); + + SubData itemAt(int n); + SubData findItem( SubData::Type t, int ID ); + + int findLang(QString expr); + int selectOne(QString preferred_lang, int default_sub=0); + + void process(QString text); + + void list(); + void listNames(); + /* void test(); */ + +protected: + SubList subs; + int index; +}; + +#endif diff --git a/retroshare-gui/src/apps/smplayer/svn_revision.h b/retroshare-gui/src/apps/smplayer/svn_revision.h new file mode 100644 index 000000000..8657cd3b1 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/svn_revision.h @@ -0,0 +1 @@ +#define SVN_REVISION "SVN-rUNKNOWN" diff --git a/retroshare-gui/src/apps/smplayer/timeslider.cpp b/retroshare-gui/src/apps/smplayer/timeslider.cpp new file mode 100644 index 000000000..ba8783882 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/timeslider.cpp @@ -0,0 +1,175 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "timeslider.h" + +#if QT_VERSION > 0x040000 +#include +#include +#include +#include +#include +#include +#endif + +#define DEBUG 0 + +MySlider::MySlider( QWidget * parent ) : QSlider(parent) +{ + setOrientation( Qt::Horizontal ); +} + +MySlider::~MySlider() { +} + +// The code from the following function is from Javier Díaz, +// taken from a post in the Qt-interest mailing list. +void MySlider::mousePressEvent( QMouseEvent * e ) { +#if QT_VERSION < 0x040000 + if (e->button() == Qt::LeftButton) { + if ( !sliderRect().contains(e->pos()) ) { + // Pongo como valor el correspondiente al lugar donde hemos hecho click + int value = Q3RangeControl::valueFromPosition( e->x(), width() ); + setValue(value); + // Representa un movimiento en el slider + emit sliderMoved(value); + } + else + QSlider::mousePressEvent(e); + } +#else + // FIXME: + // The code doesn't work well with right to left layout, + // so it's disabled. + if (qApp->isRightToLeft()) { + QSlider::mousePressEvent(e); + return; + } + + int range = maximum()-minimum(); + int pos = (e->x() * range) / width(); + //qDebug( "width: %d x: %d", width(), e->x()); + //qDebug( "range: %d pos: %d value: %d", range, pos, value()); + + // Calculate how many positions takes the slider handle + int metric = qApp->style()->pixelMetric( QStyle::PM_SliderLength ); + double one_tick_pixels = (double) width() / range; + int slider_handle_positions = metric / one_tick_pixels; + + /* + qDebug("metric: %d", metric ); + qDebug("one_tick_pixels :%f", one_tick_pixels); + qDebug("width() :%d", width()); + qDebug("slider_handle_positions: %d", slider_handle_positions); + */ + + if (abs(pos - value()) > slider_handle_positions) { + setValue(pos); + emit sliderMoved( pos ); + } else { + QSlider::mousePressEvent(e); + } +#endif +} + + + +TimeSlider::TimeSlider( QWidget * parent ) : MySlider(parent) +{ + dont_update = FALSE; + setMinimum(0); + setMaximum(100); + + setFocusPolicy( Qt::NoFocus ); + setSizePolicy( QSizePolicy::Expanding , QSizePolicy::Fixed ); + + connect( this, SIGNAL( sliderPressed() ), this, SLOT( stopUpdate() ) ); + connect( this, SIGNAL( sliderReleased() ), this, SLOT( resumeUpdate() ) ); + connect( this, SIGNAL( sliderReleased() ), this, SLOT( mouseReleased() ) ); + connect( this, SIGNAL( valueChanged(int) ), this, SLOT( valueChanged_slot(int) ) ); +} + +TimeSlider::~TimeSlider() { +} + +void TimeSlider::stopUpdate() { + #if DEBUG + qDebug("TimeSlider::stopUpdate"); + #endif + dont_update = TRUE; +} + +void TimeSlider::resumeUpdate() { + #if DEBUG + qDebug("TimeSlider::resumeUpdate"); + #endif + dont_update = FALSE; +} + +void TimeSlider::mouseReleased() { + #if DEBUG + qDebug("TimeSlider::mouseReleased"); + #endif + emit posChanged( value() ); +} + +void TimeSlider::valueChanged_slot(int v) { + #if DEBUG + qDebug("TimeSlider::changedValue_slot: %d", v); + #endif + + // Only to make things clear: + bool dragging = dont_update; + if (!dragging) { + if (v!=position) { + #if DEBUG + qDebug(" emitting posChanged"); + #endif + emit posChanged(v); + } + } else { + #if DEBUG + qDebug(" emitting draggingPos"); + #endif + emit draggingPos(v); + } +} + +void TimeSlider::setPos(int v) { + #if DEBUG + qDebug("TimeSlider::setPos: %d", v); + qDebug(" dont_update: %d", dont_update); + #endif + + if (v!=pos()) { + if (!dont_update) { + position = v; + setValue(v); + } + } +} + +int TimeSlider::pos() { + return position; +} + +void TimeSlider::wheelEvent( QWheelEvent * e ) { + e->ignore(); +} + +#include "moc_timeslider.cpp" diff --git a/retroshare-gui/src/apps/smplayer/timeslider.h b/retroshare-gui/src/apps/smplayer/timeslider.h new file mode 100644 index 000000000..4213cae07 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/timeslider.h @@ -0,0 +1,67 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef _TIMESLIDER_H_ +#define _TIMESLIDER_H_ + +#include + +class MySlider : public QSlider +{ + Q_OBJECT + +public: + MySlider( QWidget * parent ); + ~MySlider(); + +protected: + void mousePressEvent ( QMouseEvent * event ); +}; + + +class TimeSlider : public MySlider +{ + Q_OBJECT + +public: + TimeSlider( QWidget * parent ); + ~TimeSlider(); + +public slots: + virtual void setPos(int); // Don't use setValue! + virtual int pos(); + +signals: + void posChanged(int value); + void draggingPos(int value); + +protected slots: + void stopUpdate(); + void resumeUpdate(); + void mouseReleased(); + void valueChanged_slot(int); + + virtual void wheelEvent( QWheelEvent * e ); + +private: + bool dont_update; + int position; +}; + + +#endif diff --git a/retroshare-gui/src/apps/smplayer/trackdata.cpp b/retroshare-gui/src/apps/smplayer/trackdata.cpp new file mode 100644 index 000000000..9b773cc2c --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/trackdata.cpp @@ -0,0 +1,94 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "trackdata.h" +#include "helper.h" +#include + +TrackData::TrackData() { + _lang = ""; + _name = ""; + _filename = ""; + _duration = 0; + _ID = -1; + _chapters = 0; + _angles = 0; +} + +TrackData::~TrackData() { +} + +QString TrackData::displayName() const { + //qDebug("TrackData::displayName"); + + QString dname=""; + + if (!_name.isEmpty()) { + dname = _name; + } + else + if (!_lang.isEmpty()) { + dname = _lang; + } + else + if (!_filename.isEmpty()) { + QFileInfo f(_filename); + dname = f.fileName(); + } + else + dname = QString::number(_ID); + + if (_duration > 0) { + dname += " ("+ Helper::formatTime( (int) _duration ) +")"; + } + + return dname; +} + + +void TrackData::save(QSettings & set) { + //qDebug("TrackData::save"); + + set.setValue( "lang", _lang ); + set.setValue( "name", _name ); + set.setValue( "filename", _filename ); + set.setValue( "duration", _duration ); + set.setValue( "chapters", _chapters ); + set.setValue( "angles", _angles ); + set.setValue( "ID", _ID ); +} + +void TrackData::load(QSettings & set) { + //qDebug("TrackData::load"); + + _lang = set.value( "lang", _lang ).toString(); + _name = set.value( "name", _name ).toString(); + _filename = set.value( "filename", _filename ).toString(); + _duration = set.value( "duration", _duration).toDouble(); + _chapters = set.value( "chapters", _chapters ).toInt(); + _angles = set.value( "angles", _angles ).toInt(); + _ID = set.value( "ID", _ID ).toInt(); +} + +void TrackData::list() { + //qDebug("TrackData::list"); + + qDebug(" ID: '%d' lang: '%s' name: '%s'", _ID, _lang.toUtf8().data(), _name.toUtf8().data() ); + qDebug(" filename: '%s' duration: %f chapters: %d angles: %d", + _filename.toUtf8().data(), _duration, _chapters, _angles ); +} diff --git a/retroshare-gui/src/apps/smplayer/trackdata.h b/retroshare-gui/src/apps/smplayer/trackdata.h new file mode 100644 index 000000000..5d815ae9f --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/trackdata.h @@ -0,0 +1,77 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + + +#ifndef _TRACKDATA_H_ +#define _TRACKDATA_H_ + +#include +#include + +/* Class to store audios, subtitles, titles, chapters... */ + +class TrackData { + +public: + + TrackData(); + ~TrackData(); + + void setLang( const QString & l ) { _lang = l; }; + void setName( const QString & n ) { _name = n; }; + void setFilename( const QString & f ) { _filename = f; }; + void setDuration( double d ) { _duration = d; }; + void setChapters( int n ) { _chapters = n; }; + void setAngles( int n ) { _angles = n; }; + void setID( int id ) { _ID = id; }; + + QString lang() const { return _lang; }; + QString name() const { return _name; }; + QString filename() const { return _filename; }; + double duration() const { return _duration; }; + int chapters() const { return _chapters; }; + int angles() const { return _angles; }; + int ID() const { return _ID; }; + + QString displayName() const; + + void save(QSettings & set); + void load(QSettings & set); + void list(); + +protected: + + /* Language code: es, en, etc. */ + QString _lang; + + /* spanish, english... */ + QString _name; + + /* In case of subtitles files (*.srt, sub...) */ + QString _filename; + + /* For dvd titles */ + double _duration; + int _chapters; + int _angles; + + int _ID; +}; + + +#endif diff --git a/retroshare-gui/src/apps/smplayer/tracks.cpp b/retroshare-gui/src/apps/smplayer/tracks.cpp new file mode 100644 index 000000000..56d743a31 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/tracks.cpp @@ -0,0 +1,163 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "tracks.h" +#include + +TrackList::TrackList() { + clear(); +} + +TrackList::~TrackList() { +} + +void TrackList::clear() { + tm.clear(); +} + +void TrackList::addLang(int ID, QString lang) { + tm[ID].setLang(lang); + tm[ID].setID(ID); +} + +void TrackList::addName(int ID, QString name) { + tm[ID].setName(name); + tm[ID].setID(ID); +} + +void TrackList::addFilename(int ID, QString filename) { + tm[ID].setFilename(filename); + tm[ID].setID(ID); +} + +void TrackList::addDuration(int ID, double duration) { + tm[ID].setDuration(duration); + tm[ID].setID(ID); +} + +void TrackList::addChapters(int ID, int n) { + tm[ID].setChapters(n); + tm[ID].setID(ID); +} + +void TrackList::addAngles(int ID, int n) { + tm[ID].setAngles(n); + tm[ID].setID(ID); +} + +void TrackList::addID(int ID) { + tm[ID].setID(ID); +} + + +int TrackList::numItems() { + return tm.count(); +} + +bool TrackList::existsItemAt(int n) { + return ((n > 0) && (n < numItems())); +} + +TrackData TrackList::itemAt(int n) { + return tm.values()[n]; +} + +TrackData TrackList::item(int ID) { + return tm[ID]; +} + +int TrackList::find(int ID) { + for (int n=0; n < numItems(); n++) { + if (itemAt(n).ID() == ID) return n; + } + return -1; +} + +int TrackList::findLang(QString expr) { + qDebug( "TrackList::findLang: '%s'", expr.toUtf8().data()); + QRegExp rx( expr ); + + int res_id = -1; + + for (int n=0; n < numItems(); n++) { + qDebug("TrackList::findLang: lang #%d '%s'", n, itemAt(n).lang().toUtf8().data()); + if (rx.indexIn( itemAt(n).lang() ) > -1) { + qDebug("TrackList::findLang: found preferred lang!"); + res_id = itemAt(n).ID(); + break; + } + } + + return res_id; +} + +void TrackList::list() { + for (int n=0; n < numItems(); n++) { + qDebug(" item # %d", n); + itemAt(n).list(); + } +} + + +int TrackList::lastID() { + int key = -1; + for (int n=0; n < numItems(); n++) { + if (itemAt(n).ID() > key) + key = itemAt(n).ID(); + } + return key; +} + +bool TrackList::existsFilename(QString name) { + for (int n=0; n < numItems(); n++) { + if (itemAt(n).filename() == name) + return TRUE; + } + return FALSE; +} + +void TrackList::save(QSettings & set) { + qDebug("TrackList::save"); + + set.setValue( "num_tracks", numItems() ); + for (int n=0; n < numItems(); n++) { + set.beginGroup( "track_" + QString::number(n) ); + itemAt(n).save(set); + set.endGroup(); + } +} + +void TrackList::load(QSettings & set) { + qDebug("TrackList::load"); + + int num_tracks = set.value( "num_tracks", 0 ).toInt(); + + int ID; + for (int n=0; n < num_tracks; n++) { + set.beginGroup( "track_" + QString::number(n) ); + ID = set.value("ID", -1).toInt(); + if (ID!=-1) { + tm[ID].setID(ID); + tm[ID].load(set); + } + set.endGroup(); + } + + //list(); +} + diff --git a/retroshare-gui/src/apps/smplayer/tracks.h b/retroshare-gui/src/apps/smplayer/tracks.h new file mode 100644 index 000000000..2aef9849e --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/tracks.h @@ -0,0 +1,67 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef _TRACKS_H_ +#define _TRACKS_H_ + +#include "trackdata.h" +#include +#include + +class TrackList { + +public: + + TrackList(); + ~TrackList(); + + void clear(); + void list(); + + void addLang(int ID, QString lang); + void addName(int ID, QString name); + void addFilename(int ID, QString filename); + void addDuration(int ID, double duration); + void addChapters(int ID, int n); + void addAngles(int ID, int n); + void addID(int ID); + + int numItems(); + bool existsItemAt(int n); + + TrackData itemAt(int n); + TrackData item(int ID); + int find(int ID); + + int findLang(QString expr); + + // A mess for getting sub files... + int lastID(); + bool existsFilename(QString name); + + void save(QSettings & set); + void load(QSettings & set); + + +protected: + typedef QMap TrackMap; + TrackMap tm; +}; + + +#endif diff --git a/retroshare-gui/src/apps/smplayer/translations/qt_fr.qm b/retroshare-gui/src/apps/smplayer/translations/qt_fr.qm new file mode 100644 index 000000000..e65624420 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/translations/qt_fr.qm differ diff --git a/retroshare-gui/src/apps/smplayer/translations/smplayer_bg.qm b/retroshare-gui/src/apps/smplayer/translations/smplayer_bg.qm new file mode 100644 index 000000000..6a160b2de Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/translations/smplayer_bg.qm differ diff --git a/retroshare-gui/src/apps/smplayer/translations/smplayer_bg.ts b/retroshare-gui/src/apps/smplayer/translations/smplayer_bg.ts new file mode 100644 index 000000000..ee6d1b8b8 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/translations/smplayer_bg.ts @@ -0,0 +1,3826 @@ + + + + AboutDialog + + + About SMPlayer + ОтноÑно SMPlayer + + + + Version: %1 + ВерÑиÑ: %1 + + + + 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. + Тази програма е Ñ Ð¾Ñ‚Ð²Ð¾Ñ€ÐµÐ½ код; вие можете да Ñ Ñ€Ð°Ð·Ð¿Ñ€Ð¾ÑтранÑвате, променÑте и допълвате под GNU лиценза. + + + + Translators: + Преводачи: + + + + German + ÐемÑки + + + + Slovak + Словашки + + + + Italian + ИталианÑки + + + + French + ФренÑки + + + + Simplified-Chinese + ОпроÑтен китайÑки + + + + Russian + РуÑки + + + + Hungarian + УнгарÑки + + + + Polish + ПолÑки + + + + Japanese + ЯпонÑки + + + + Dutch + ÐидерландÑки + + + + Ukrainian + УкрайнÑки + + + + Georgian + ГрузинÑки + + + + Czech + Чешки + + + + Logo designed by %1 + Логото е направено от %1 + + + + Get updates at: %1 + Може да Ñледите за нови верÑии на: %1 + + + + Bulgarian + БългарÑки + + + + Turkish + ТурÑки + + + + Swedish + ШведÑки + + + + Serbian + СръбÑки + + + + Traditional Chinese + Традиционен китайÑки + + + + Romanian + + + + + Portuguese - Brazil + + + + + Portuguese - Portugal + + + + + Compiled with Qt %1 + + + + + %1, %2 and %3 + + + + + %1 and %2 + + + + + http://smplayer.sourceforge.net/en/windows/download.php + If the web page is translated into your language you can change the URL so it points to the download page in the translation.Otherwise leave as is. + + + + + http://smplayer.sourceforge.net/en/linux/download.php + If the web page is translated into your language you can change the URL so it points to the download page in the translation.Otherwise leave as is. + + + + + <b>%1</b>: %2 + + + + + ActionsEditor + + + Name + Име + + + + Description + ОпиÑание + + + + Shortcut + ПрÑк път + + + + &Save + &Ð—Ð°Ð¿Ð¸Ñ + + + + &Load + &Зареждане + + + + Key files + Ключови файлове + + + + Choose a filename + Избор на име на файла + + + + Confirm overwrite? + ПрезапиÑ? + + + + The file %1 already exists. +Do you want to overwrite? + Файлът %1 вече ÑъщеÑтвува. +ИÑкате ли да бъде презапиÑан? + + + + Choose a file + Избор на файл + + + + Error + Грешка + + + + The file couldn't be saved + Файлът не може да бъде запазен + + + + The file couldn't be loaded + Файлът не може да бъде зареден + + + + &Change shortcut... + + + + + BaseGui + + + &File... + &Файл... + + + + D&irectory... + &ДиректориÑ... + + + + &Playlist... + &СпиÑък за изпълнение... + + + + V&CD + V&CD + + + + &DVD from drive + &DVD от уÑтройÑтво + + + + D&VD from folder... + D&VD от папка... + + + + &URL... + &URL... + + + + P&lay + &Изпълнение + + + + &Pause + &Пауза + + + + &Stop + &Стоп + + + + &Frame step + &Кадър напред + + + + Play / Pause + Изпълнение / Пауза + + + + Pause / Frame step + Пауза + + + + &Repeat + &Повторение + + + + &Normal speed + &Ðормална ÑкороÑÑ‚ + + + + &Halve speed + &СкороÑÑ‚ наполовина + + + + &Double speed + &Двойна ÑкороÑÑ‚ + + + + Speed &-10% + СкороÑÑ‚ &-10% + + + + Speed &+10% + СкороÑÑ‚ &+10% + + + + Sp&eed + &СкороÑÑ‚ + + + + &Fullscreen + &Ðа цÑл екран + + + + &Compact mode + &Компактен режим + + + + &Equalizer + &Изравнител + + + + &Screenshot + &Снимка на екрана + + + + S&tay on top + &Положение отгоре + + + + &Postprocessing + &Postprocessing + + + + &Autodetect phase + &Ðвтооткриване на фазата + + + + &Deblock + &Deblock + + + + De&ring + De&ring + + + + Add n&oise + ДобавÑне на &шум + + + + F&ilters + &Филтри + + + + &Mute + &Заглушаване + + + + Volume &- + Сила на звука &- + + + + Volume &+ + Сила на звука &+ + + + + &Delay - + &ЗабавÑне - + + + + D&elay + + &ЗабавÑне + + + + + &Extrastereo + &ЕкÑтраÑтерео + + + + &Karaoke + &Караоке + + + + &Filters + &Филтри + + + + &Load... + &Зареждане... + + + + U&nload + &ОÑвобождаване + + + + Delay &- + ЗабавÑне &- + + + + Delay &+ + ЗабавÑне &+ + + + + &Up + &Ðагоре + + + + &Down + &Ðадолу + + + + &Playlist + &СпиÑък за изпълнение + + + + &Show frame counter + &Показване на броÑча на кадри + + + + P&references + &ÐаÑтройки + + + + &View logs + &Показване на дневниците + + + + About &Qt + ОтноÑно &Qt + + + + About &SMPlayer + ОтноÑно &SMplayer + + + + &Open + &ОтварÑне + + + + &Play + &Изпълнение + + + + &Video + &Видео + + + + &Audio + &Ðудио + + + + &Subtitles + &Субтитри + + + + &Browse + &Преглед + + + + Op&tions + &ÐаÑтройки + + + + &Help + &Помощ + + + + &Recent files + &ПоÑледни файлове + + + + &Clear + &ИзчиÑтване + + + + Si&ze + &Размер + + + + &Aspect ratio + &Картина + + + + &Deinterlace + &ÐšÐ¾Ñ€ÐµÐºÑ†Ð¸Ñ Ð½Ð° картина + + + + De&noise + De&noise + + + + &Autodetect + &Ðвтооткриване + + + + &4:3 + &4:3 + + + + &5:4 + &5:4 + + + + &14:9 + &14:9 + + + + 16:&9 + 16:&9 + + + + 1&6:10 + 1&6:10 + + + + &2.35:1 + &2.35:1 + + + + 4:3 &Letterbox + 4:3 &Широкоекранен + + + + 16:9 L&etterbox + 16:9 &Широкоекранен + + + + 4:3 &Panscan + 4:3 &Пълноекранен + + + + 4:3 &to 16:9 + 4:3 &към 16:9 + + + + &None + &ÐÑма + + + + &Lowpass5 + &Lowpass5 + + + + Linear &Blend + Linear &Blend + + + + N&ormal + &Ðормален + + + + &Soft + &Лек + + + + &Track + &Файл + + + + &Channels + &Канали + + + + &Stereo mode + &Стерео режим + + + + &Default + &Стандартни + + + + &Stereo + &Стерео + + + + &4.0 Surround + &4.0 Съраунд + + + + &5.1 Surround + &5.1 Съраунд + + + + &Left channel + &ЛÑв канал + + + + &Right channel + &ДеÑен канал + + + + &Select + &Избор + + + + &Title + &Заглавие + + + + &Chapter + &Глава + + + + &Angle + &Ðаклон + + + + &OSD + &OSD + + + + &Disabled + &Забранен + + + + &Seek bar + &Лента за Ñ‚ÑŠÑ€Ñене + + + + &Time + &Време + + + + Time + T&otal time + Време + &Общо време + + + + SMPlayer - mplayer log + SMPlayer - mplayer дневник + + + + SMPlayer - smplayer log + SMPlayer - smplayer дневник + + + + <empty> + <празно> + + + + Video + Видео + + + + Audio + Ðудио + + + + Playlists + СпиÑъци за изпълнение + + + + All files + Ð’Ñички файлове + + + + Choose a file + Избор на файл + + + + SMPlayer - Information + SMPlayer -Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ + + + + The CDROM / DVD drives are not configured yet. +The configuration dialog will be shown now, so you can do it. + CDROM / DVD уÑтройÑтвата вÑе още не Ñа наÑтроени. +Тук вие можете да го направите. + + + + Choose a directory + Избор на Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ + + + + Subtitles + Субтитри + + + + About Qt + ОтноÑно Qt + + + + Playing %1 + ИзпълнÑва Ñе %1 + + + + Pause + Пауза + + + + Stop + Стоп + + + + C&lose + &ЗатварÑне + + + + View &info and properties... + Показване на &информациÑ... + + + + Zoom &- + ÐамалÑване &- + + + + Zoom &+ + Увеличаване &+ + + + + &Reset + &ВъзÑтановÑване + + + + Move &left + ПремеÑтване &налÑво + + + + Move &right + ПремеÑтване &надÑÑно + + + + Move &up + ПремеÑтване &нагоре + + + + Move &down + ПремеÑтване &надолу + + + + &Pan && scan + &Pan && scan + + + + &Previous line in subtitles + &Предишен ред от Ñубтитрите + + + + N&ext line in subtitles + &Следващ ред от Ñубтитрите + + + + -%1 + -%1 + + + + +%1 + +%1 + + + + Dec volume (2) + Ðам. на звука (2) + + + + Inc volume (2) + Увел на звука (2) + + + + Exit fullscreen + Изход от цÑл екран + + + + OSD - Next level + OSD - Следващо ниво + + + + Dec contrast + Ðам на контраÑта + + + + Inc contrast + Увел на контраÑта + + + + Dec brightness + Ðам на ÑркоÑтта + + + + Inc brightness + Увел на ÑркоÑтта + + + + Dec hue + Ðам на нюанÑа + + + + Inc hue + Увел на нюанÑа + + + + Dec saturation + Ðам на наÑитеноÑтта + + + + Dec gamma + Увел на наÑитеноÑтта + + + + Next audio + Следващ аудио файл + + + + Next subtitle + Следващи Ñубтитри + + + + Next chapter + Следваща глава + + + + Previous chapter + Предишна глава + + + + Inc saturation + Увел на наÑитеноÑтта + + + + Inc gamma + Увел на гамата + + + + &Load external file... + + + + + &Kerndeint + + + + + &Yadif (normal) + + + + + Y&adif (double framerate) + + + + + &Next + &Следващ + + + + Pre&vious + &Предишен + + + + Volume &normalization + + + + + &Audio CD + + + + + Denoise nor&mal + + + + + Denoise &soft + + + + + Denoise o&ff + + + + + Use SSA/&ASS library + + + + + Flip i&mage + + + + + &Toggle double size + + + + + BaseGuiPlus + + + SMPlayer is still running here + SMPlayer вÑе още работи + + + + S&how icon in system tray + &Показване на икона в ÑиÑÑ‚ÐµÐ¼Ð½Ð¸Ñ Ð¿Ð°Ð½ÐµÐ» + + + + &Hide + &Скриване + + + + &Restore + &ВъзÑтановÑване + + + + &Recent files + &ПоÑледни файлове + + + + &Quit + &Изход + + + + Playlist + СпиÑък за изпълнение + + + + Core + + + Brightness: %1 + ЯркоÑÑ‚: %1 + + + + Contrast: %1 + КонтраÑÑ‚: %1 + + + + Gamma: %1 + Гама: %1 + + + + Hue: %1 + ÐюанÑ: %1 + + + + Saturation: %1 + ÐаÑитеноÑÑ‚: %1 + + + + Volume: %1 + Сила на звука: %1 + + + + Zoom: %1 + Мащаб: %1 + + + + DefaultGui + + + Welcome to SMPlayer + Добре дошли в SMPlayer + + + + &Main toolbar + &Главна лента + + + + &Language toolbar + &Езикова лента + + + + &Toolbars + &Ленти + + + + Volume + Сила на звука + + + + Audio + Ðудио + + + + Subtitle + Субтитри + + + + Playlist + СпиÑък за изпълнение + + + + Encodings + + + Western European Languages + Западни европейÑки езици + + + + Western European Languages with Euro + Западни европейÑки езици Ñ Ð•Ð²Ñ€Ð¾ + + + + Slavic/Central European Languages + СлавÑнÑки/Централна Европа + + + + Esperanto, Galician, Maltese, Turkish + ЕÑперанто, ГалиÑийÑки, МалтийÑки, ТурÑки + + + + Old Baltic charset + Стар БалтийÑки + + + + Cyrillic + Кирилица + + + + Arabic + ÐрабÑки + + + + Modern Greek + Модерен гръцки + + + + Turkish + ТурÑки + + + + Baltic + БалтийÑки + + + + Celtic + КелтÑки + + + + Hebrew charsets + ЕврейÑки + + + + Russian + РуÑки + + + + Ukrainian, Belarusian + УкрайнÑки, БеларуÑки + + + + Simplified Chinese charset + ОпроÑтен КитайÑки + + + + Traditional Chinese charset + Традиционен КитайÑки + + + + Japanese charsets + ЯпонÑки + + + + Korean charset + КорейÑки + + + + Thai charset + ТайÑки + + + + Cyrillic Windows + Кирилица Windows + + + + Slavic/Central European Windows + СлавÑнÑки/Централна Европа Windows + + + + Arabic Windows + + + + + EqSlider + + + icon + икона + + + + FilePropertiesDialog + + + SMPlayer - File properties + SMPlayer - ÐаÑтройки на файла + + + + &Information + &Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ + + + + &Demuxer + &Разпределител + + + + &Select the demuxer that will be used for this file: + &Изберете разпределителÑÑ‚, които ще бъде използван за този файл: + + + + &Reset + &ВъзÑтановÑване + + + + &Video codec + &Видео кодек + + + + &Select the video codec: + &Изберете видео кодек: + + + + A&udio codec + &Ðудио кодек + + + + &Select the audio codec: + &Изберете аудио кодек: + + + + &MPlayer options + &MPlayer наÑтройки + + + + Additional Options for MPlayer + Допълнителни наÑтройки на MPlayer + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + Тук можете да добавÑте допълнителни команди. +Отделете ги Ñ Ð¸Ð½Ñ‚ÐµÑ€Ð²Ð°Ð»Ð¸. +Пример: -flip -nosound + + + + &Options: + &ÐаÑтройки: + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + Вие Ñъщо можете да добавÑте допълнителни видео филтри. +Отделете ги Ñ ",". Ðе използвайте интервали! +Пример: scale=512:-2,eq2=1.1 + + + + V&ideo filters: + &Видео филтри: + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + Вие Ñъщо можете да добавÑте и аудио филтри. +Правилото е Ñъщото като за видео филтрите. +Пример: resample=44100:0:0,volnorm + + + + Audio &filters: + &Ðудио филтри: + + + + OK + + + + + Cancel + + + + + Apply + + + + + InfoFile + + + General + Общи + + + + Size + Размер + + + + %1 KB (%2 MB) + %1 КБ (%2 МБ) + + + + URL + URL + + + + Length + Дължина + + + + Demuxer + Разпределител + + + + Name + Име + + + + Artist + Изпълнител + + + + Author + Ðвтор + + + + Album + Ðлбум + + + + Genre + Жанр + + + + Date + Дата + + + + Track + Файл + + + + Copyright + ÐвторÑко право + + + + Comment + Коментар + + + + Software + Софтуер + + + + Clip info + Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° клипа + + + + Video + Видео + + + + Resolution + Разделителна ÑпоÑобноÑÑ‚ + + + + Aspect ratio + Съотношение + + + + Format + Формат + + + + Bitrate + СкороÑÑ‚ + + + + %1 kbps + %1 kbps + + + + Frames per second + Кадри в Ñекунда + + + + Selected codec + Избран кодек + + + + Initial Audio Stream + Първоначален аудио поток + + + + Rate + ЧеÑтота + + + + %1 Hz + %1 Хц + + + + Channels + Канали + + + + Audio Streams + Ðудио потоци + + + + Language + Език + + + + empty + празно + + + + Subtitles + Субтитри + + + + Type + Тип + + + + ID + Info for translators: this is a identification code + ID + + + + # + Info for translators: this is a abbreviation for number + # + + + + Stream title + Име на потока + + + + Stream URL + URL на потока + + + + File + + + + + InputDVDDirectory + + + Choose a directory + Избор на Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ + + + + SMPlayer - Play a DVD from a folder + SMPlayer - Изпълнение на DVD от папка + + + + You can play a dvd from your hard disc. Just select the folder which contains the VIDEO_TS and AUDIO_TS directories. + Вие можете да изпълните dvd от Ð²Ð°ÑˆÐ¸Ñ Ñ…Ð°Ñ€Ð´Ð´Ð¸Ñк. ПроÑто изберете папката, коÑто Ñъдържа директориите VIDEO_TS и AUDIO_TS. + + + + Choose a directory... + Избор на директориÑ... + + + + InputURL + + + SMPlayer - Enter URL + + + + + &URL: + + + + + It's a &playlist + + + + + If this option is checked, the URL will be treated as a playlist: it will be opened as text and will play the URLs in it. + + + + + LogWindow + + + Choose a filename to save under + Изберете име на файла + + + + Confirm overwrite? + ПрезапиÑ? + + + + The file already exists. +Do you want to overwrite? + Файлът вече ÑъщеÑтвува. +ИÑкате ли да бъде презапиÑан? + + + + Error saving file + Грешка при Ð·Ð°Ð¿Ð¸Ñ Ð½Ð° файла + + + + The log couldn't be saved + Дневникът не може да бъде запазен + + + + Logs + Дневници + + + + LogWindowBase + + + Log Window + Прозорец на дневника + + + + Save + Ð—Ð°Ð¿Ð¸Ñ + + + + Copy to clipboard + Копиране в ÑиÑÑ‚ÐµÐ¼Ð½Ð¸Ñ Ð±ÑƒÑ„ÐµÑ€ + + + + Close + ЗатварÑне + + + + &Close + &ЗатварÑне + + + + Playlist + + + Name + Име + + + + Length + Дължина + + + + &Play + &Изпълнение + + + + &Edit + &Редактиране + + + + Playlists + СпиÑъци за изпълнение + + + + Choose a file + Избор на файл + + + + Choose a filename + Избор на име на файла + + + + Confirm overwrite? + ПрезапиÑ? + + + + The file %1 already exists. +Do you want to overwrite? + Файлът %1 вече ÑъщеÑтвува.ИÑкате ли да бъде презапиÑан? + + + + All files + Ð’Ñички файлове + + + + Select one or more files to open + Изберете един или повече файлове за отварÑне + + + + Choose a directory + Избор на Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ + + + + Edit name + Редактиране на име + + + + Type the name that will be displayed in the playlist for this file: + Ðапишете име, което ще бъде показано в ÑпиÑъка за изпълнение: + + + + &Load + &Зареждане + + + + &Save + &Ð—Ð°Ð¿Ð¸Ñ + + + + &Next + &Следващ + + + + Pre&vious + &Предишен + + + + Move &up + ПремеÑти &нагоре + + + + Move &down + ПремеÑти &надолу + + + + &Repeat + &Повторение + + + + S&huffle + &Разбъркано подреждане + + + + Add &current file + ДобавÑне на &Ñ‚ÐµÐºÑƒÑ‰Ð¸Ñ Ñ„Ð°Ð¹Ð» + + + + Add &file(s) + ДобавÑне на &файл(ове) + + + + Add &directory + ДобавÑне на &Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ + + + + Remove &selected + &Премахване на избраните + + + + Remove &all + Премахване на &вÑички + + + + Add... + ДобавÑне... + + + + Remove... + Премахване... + + + + SMPlayer - Playlist + SMPlayer - СпиÑък за изпълнение + + + + Playlist modified + СпиÑъкът за изпълнение е променен + + + + There are unsaved changes, do you want to save the playlist? + Има незапазени промени, иÑкате ли да запазите ÑпиÑъка? + + + + PrefAdvanced + + + Advanced + + + + + Auto + + + + + &Advanced + + + + + icon + икона + + + + Additional Options for MPlayer + Допълнителни наÑтройки на MPlayer + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + Тук можете да добавÑте допълнителни команди. +Отделете ги Ñ Ð¸Ð½Ñ‚ÐµÑ€Ð²Ð°Ð»Ð¸. +Пример: -flip -nosound + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + Вие Ñъщо можете да добавÑте допълнителни видео филтри. +Отделете ги Ñ ",". Ðе използвайте интервали! +Пример: scale=512:-2,eq2=1.1 + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + Вие Ñъщо можете да добавÑте и аудио филтри. +Правилото е Ñъщото като за видео филтрите. +Пример: resample=44100:0:0,volnorm + + + + Don't repaint the background of the video window + Ðе оцветÑвай фона на видео прозореца отново + + + + &Logs + + + + + Log MPlayer output + Разрешаване на дневник за MPlayer + + + + Log SMPlayer output + Разрешаване на дневник за SMPlayer + + + + This option is mainly intended for debugging the application. + Тази Ð¾Ð¿Ñ†Ð¸Ñ Ðµ планирана за оÑтранÑване на грешки в програмата. + + + + &MPlayer language + + + + + SMPlayer needs to read and parse the output of MPlayer and sometimes it relies on English text. If you are using a MPlayer translated into another language, then you need to change the texts that SMPlayer looks for. (Technically you should enter regular expressions)<br><br> +The drop-down lists may provide already made regular expression for several languages. + + + + + Checking this option may reduce flickering, but it also might produce that the video won't be displayed properly. + Ðко отметнете тази Ð¾Ð¿Ñ†Ð¸Ñ Ð¼Ð¾Ð¶Ðµ да намалите треперенето, но Ñъщо и може видеото да не Ñе показва правилно. + + + + If checked, smplayer will store the output of mplayer (you can see it in <b>Options->View logs->mplayer</b>). In case of problems this log can contain important information, so it's recommended to keep this option checked. + Ðко изберете тази опциÑ, smplayer ще ÑъхранÑва дневниците на mplayer (можете да ги видите в <b>ÐаÑтройки->Показване на дневниците->mplayer</b> Ð’ Ñлучай на проблеми този дневник може да Ñъдържа важна информациÑ. + + + + If this option is checked, smplayer will store the debugging messages that smplayer outputs (you can see the log in <b>Options->View logs->smplayer</b>). This information can be very useful for the developer in case you find a bug. + Ðко изберете тази опциÑ, smplayer ще ÑъхранÑва ÑъобщениÑта за бъгове на smplayer (можете да ги видите в <b>ÐаÑтройки->Показване на дневниците->smplayer</b> Ð’ Ñлучай на проблеми този дневник може да Ñъдържа важна информациÑ. + + + + Filter for SMPlayer logs + + + + + This option allows to filter the smplayer messages that will be stored in the log. Here you can write any regular expression.<br>For instance: <i>^Core::.*</i> will display only the lines starting with <i>Core::</i> + Тази Ð¾Ð¿Ñ†Ð¸Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»Ñва да Ñе филтрират дневниците на smplayer. Тук можете да пишете обикновенни фрази. <br>Ðапример: <i>^Core::*</i> ще покаже редовете, започващи Ñ <i>Core::</i> + + + + &Monitor aspect: + + + + + &Run MPlayer in its own window + + + + + &Options: + &ÐаÑтройки: + + + + V&ideo filters: + &Видео филтри: + + + + Audio &filters: + &Ðудио филтри: + + + + &Colorkey: + + + + + &Don't repaint the background of the video window + + + + + Log &MPlayer output + + + + + Log &SMPlayer output + + + + + &Filter for SMPlayer logs: + + + + + &End of file: + + + + + &No video: + + + + + C&hange... + + + + + PrefAssociations + + + Warning + + + + + Not all files could be associated. Please check your security permissions and retry. + + + + + File Types + + + + + Select all + + + + + Check all file types in the list + + + + + Uncheck all file types in the list + + + + + List of file types + + + + + File types + + + + + Media files handled by SMPlayer: + + + + + Select All + + + + + Select None + + + + + Check the media file extensions you would like SMPlayer to handle. When you click Apply, the checked files will be associated with SMPlayer. If you uncheck a media type, the file association will be restored. + + + + + Select none + + + + + PrefDrives + + + Drives + ДиÑкове + + + + Currently SMPlayer does not autodetect cdrom or dvd devices. So in order to play cdroms or dvds you must first select here your cdrom and dvd drives (can be the same). + Ð’ момента SMPlayer не открива автоматично cd и dvd уÑтройÑтва. Така че, за да пуÑнете такива, първо ги поÑочете оттук. + + + + icon + икона + + + + Select your CD device: + Изберете вашето CD уÑтройÑтво: + + + + Select your DVD device: + Изберете вашето DVD уÑтройÑтво: + + + + CD device + + + + + Choose your CDROM device. It will be used to play VCDs and Audio CDs. + + + + + DVD device + + + + + Choose your DVD device. It will be used to play DVDs. + + + + + Select your &CD device: + + + + + Select your &DVD device: + + + + + PrefGeneral + + + General + Общи + + + + &General + + + + + Paths + Пътища + + + + Select... + Избор... + + + + Folder for storing screenshots: + Папка за ÑъхранÑване на Ñнимки: + + + + Search... + ТърÑене... + + + + Select the MPlayer executable: + Изберете Ð¸Ð·Ð¿ÑŠÐ»Ð½Ð¸Ð¼Ð¸Ñ Ñ„Ð°Ð¹Ð» на MPlayer: + + + + Output drivers + Изходни уÑтройÑтва + + + + Video: + Видео: + + + + Audio: + Ðудио: + + + + Media settings + ÐаÑтройки + + + + Remember settings for all files (audio track, subtitles...) + ЗапомнÑне на наÑтройките за вÑички файлове (аудио файлове, Ñубтитри...) + + + + Don't remember time position (files start playing from the beginning) + Без запомнÑне на времевата Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ (файловете ще почват от началото) + + + + Preferred audio and subtitles + Предпочитани аудио и Ñубтитри + + + + Subtitles: + Субтитри: + + + + &Video and audio + + + + + Video + Видео + + + + Use software video equalizer + Използване на Ñофтуерен видео изравнител + + + + Start videos in fullscreen + Стартиране на филмите на цÑл екран + + + + Disable screensaver + Изключване на ÑкрийнÑейвър + + + + Audio + Ðудио + + + + Use software volume control + Използване на Ñофтуерна Ñила на звука + + + + Select the mplayer executable + Избор на mplayer изпълним файл + + + + Executables + Изпълними файлове + + + + All files + Ð’Ñички файлове + + + + Select a directory + Избор на Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ + + + + MPlayer executable + + + + + Here you must specify the mplayer executable that smplayer will use.<br>smplayer requires at least mplayer 1.0rc1 (svn recommended).<br><b>If this setting is wrong, smplayer won't be able to play anything!</b> + Тук Ñ‚Ñ€Ñбва да зададете Ð¸Ð·Ð¿ÑŠÐ»Ð½Ð¸Ð¼Ð¸Ñ Ñ„Ð°Ð¹Ð» на mplayer, който smplayer ше използва.<br>smplayer изиÑква поне 1.0rc1 (svn препоръчително).<br><b>Ðко наÑтройката е грешна, smplayer нÑма да може да изпълни нищо!</b> + + + + Screenshots folder + + + + + Here you can specify a folder where the screenshots taken by smplayer will be stored. If this field is empty the screenshot feature will be disabled. + Тук можете да зададете къде да бъдат запазвани Ñнимките на екрана. Ðко това поле е празно, фукнциÑта ще бъде изключена. + + + + Video output driver + + + + + Select the video output driver. Usually xv (linux) and directx (windows) provide the best performance. + Избор на видео драйвер. Обикновено xv (ЛинукÑ) и directx (Windows) дават най-добра производителноÑÑ‚. + + + + Audio output driver + + + + + Select the audio output driver. + Избор на аудио драйвер. + + + + Remember settings + + + + + Usually smplayer will remember the settings for each file you play (audio track selected, volume, filters...). Uncheck this option if you don't like this feature. + Обикновенно smplayer помни наÑтройките за вÑеки отделен файл. Махнете тази Ð¾Ð¿Ñ†Ð¸Ñ Ð°ÐºÐ¾ не иÑкате да Ñтава така. + + + + Don't remember time position + + + + + If you check this option, smplayer will play all files from the beginning. + Ðко тази Ð¾Ð¿Ñ†Ð¸Ñ Ðµ активна, smplayer ще пуÑка вÑички файлове от началото. + + + + Preferred audio language + + + + + Here you can type your preferred language for the audio streams. When a media with multiple audio streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the audio streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the audio track if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + Тук можете да напишете Ð¿Ñ€ÐµÐ´Ð¿Ð¾Ñ‡Ð¸Ñ‚Ð°Ð½Ð¸Ñ Ð²Ð¸ език за аудио потоците. Когато диÑк Ñ Ð½Ñколко аудио потока бъде намерен, smplayer ще Ñе опита да използва този език.<br>Това ще работи Ñамо на диÑкове, които предлагат Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° езика на потоците, като DVD-та или mkv файлове.<br>Това поле възприема нормални фрази. Пример: <b>es|esp|spa</b>ще избере аудио файла ако Ñъвпада Ñ <i>es</i>, <i>esp</i> или <i>spa</i>. + + + + Preferred subtitle language + + + + + Here you can type your preferred language for the subtitle stream. When a media with multiple subtitle streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the subtitle streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the subtitle stream if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + Тук можете да напишете Ð¿Ñ€ÐµÐ´Ð¿Ð¾Ñ‡Ð¸Ñ‚Ð°Ð½Ð¸Ñ Ð²Ð¸ език за Ñубтитрите. Когато диÑк ÑÑŠÑ Ñубтитри бъде намерен, smplayer ще Ñе опита да използва този език.<br>Това ще работи Ñамо на диÑкове, които предлагат Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° езика на Ñубтитрите, като DVD-та или mkv файлове.<br>Това поле възприема нормални фрази. Пример: <b>es|esp|spa</b>ще избере Ñубтитрите ако Ñъвпадат Ñ <i>es</i>, <i>esp</i> или <i>spa</i>. + + + + Software video equalizer + + + + + You can check this option if video equalizer is not supported by your graphic card or the selected video output driver.<br><b>Note:</b> this option can be incompatible with some video output drivers. + Можете да разрешите тази Ð¾Ð¿Ñ†Ð¸Ñ Ð°ÐºÐ¾ видео изравнÑването не Ñе поддържа от вашата видеокарта или Ð¸Ð·Ð±Ñ€Ð°Ð½Ð¸Ñ Ð²Ð¸Ð´ÐµÐ¾ драйвер.<br><b>Забележка:</b> тази Ð¾Ð¿Ñ†Ð¸Ñ Ð¼Ð¾Ð¶Ðµ да не е ÑъвмеÑтима Ñ Ð½Ñкои видео драйвери. + + + + If this option is checked, all videos will start to play in fullscreen mode. + Ðко тази Ð¾Ð¿Ñ†Ð¸Ñ Ðµ активна, smplayer ще пуÑка вÑички файлове на цÑл екран. + + + + Check this option to disable the screensaver while playing.<br>The screensaver will enabled again when play finishes.<br><b>Note:</b> This option works only in X11 and Windows. + ÐатиÑнете тук, за да забраните ÑкрийнÑейвъра, когато Ñе изпълнÑват файлове.<br>СкрийнÑейвърът ще бъде активиран, когато изпълнението Ñвърши.<br><b>Забележка:</b> Тази Ð¾Ð¿Ñ†Ð¸Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ð¸ Ñамо в X11 и Windows. + + + + Software volume control + + + + + Check this option to use the software mixer, instead of using the sound card mixer. + Тази Ð¾Ð¿Ñ†Ð¸Ñ Ñлужи за използване на Ñофтуерно микÑиране, вмеÑто това на звуковата карта. + + + + Postprocessing quality + + + + + Dynamically changes the level of postprocessing depending on the available spare CPU time. The number you specify will be the maximum level used. Usually you can use some big number. + Динамична промÑна на нивото на postprocessing в завиÑимоÑÑ‚ от CPU-то. Ðомерът, който изберете, ще бъде макÑимална граница. + + + + Change volume + + + + + If checked, SMPlayer will remember the volume for every file and will restore it when played again. For new files the default volume will be used. + + + + + Default volume: + Стандартна Ñила на звука: + + + + 0 + 0 + + + + &Change volume on every file + + + + + &Search... + + + + + S&elect... + + + + + Select the &MPlayer executable: + + + + + &Folder for storing screenshots: + + + + + V&ideo: + + + + + &Audio: + + + + + &Don't remember time position (files start playing from the beginning) + + + + + &Remember settings for all files (audio track, subtitles...) + + + + + A&udio: + + + + + Su&btitles: + + + + + &Use software video equalizer + + + + + &Quality: + + + + + Start videos in &fullscreen + + + + + Disable &screensaver + + + + + &Default volume: + + + + + Use s&oftware volume control + + + + + Ma&x. Amplification: + + + + + &AC3/DTS pass-through S/PDIF + + + + + Direct rendering + + + + + If checked, turns on direct rendering (not supported by all codecs and video outputs)<br><b>WARNING:</b> May cause OSD/SUB corruption! + + + + + Double buffering + + + + + D&irect rendering + + + + + Dou&ble buffering + + + + + Double buffering fixes flicker by storing two frames in memory, and displaying one while decoding another. If disabled it can affect OSD negatively, but often removes OSD flickering. + + + + + &Enable postprocessing by default + + + + + Volume &normalization by default + + + + + Close when finished + + + + + If this option is checked, the main window will be automatically closed when the current file/playlist finishes. + + + + + &Close when finished + + + + + 2 (Stereo) + + + + + 4 (4.0 Surround) + + + + + 6 (5.1 Surround) + + + + + C&hannels by default: + + + + + &Pause when minimized + + + + + Pause when minimized + + + + + If this option is enabled, the file will be paused when the main window is hidden. When the window is restored, play will be resumed. + + + + + Enable postprocessing by default + + + + + Max. Amplification + + + + + AC3/DTS pass-through S/PDIF + + + + + Volume normalization by default + + + + + Maximizes the volume without distorting the sound. + + + + + Default volume + + + + + Sets the initial volume that new files will use. + + + + + Channels by default + + + + + Sets the maximum amplification level in percent (default: 110). A value of 200 will allow you to adjust the volume up to a maximum of double the current level. With values below 100 the initial volume (which is 100%) will be above the maximum, which e.g. the OSD cannot display correctly. + + + + + Uses hardware AC3 passthrough + + + + + Requests the number of playback channels. MPlayer asks the decoder to decode the audio into as many channels as specified. Then it is up to the decoder to fulfill the requirement. This is usually only important when playing videos with AC3 audio (like DVDs). In that case liba52 does the decoding by default and correctly downmixes the audio into the requested number of channels. NOTE: This option is honored by codecs (AC3 only), filters (surround) and audio output drivers (OSS at least). + + + + + Postprocessing will be used by default on new opened files. + + + + + PrefInput + + + Keyboard and mouse + + + + + &Keyboard + + + + + icon + икона + + + + Here you can change any key shortcut. To do it double click or start typing over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + Тук може да променÑте клавишите на клавиатурата. За да го направите кликнете двойно и натиÑнете бутон. Също можете да запазите този ÑпиÑък и да го ÑподелÑте Ñ Ð¿Ð¾Ð·Ð½Ð°Ñ‚Ð¸. + + + + &Mouse + + + + + Button functions: + Функции на бутоните: + + + + Media seeking + ТърÑене на Ð¼ÐµÐ´Ð¸Ñ + + + + Volume control + Контрол на звука + + + + Zoom video + + + + + None + ÐÑма + + + + Here you can change any key shortcut. To do it double click or press enter over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + + + + + &Left click + + + + + &Double click + + + + + &Wheel function: + + + + + Shortcut editor + + + + + This table allows you to change the key shortcuts of most available actions. Double click or press enter on a item, or press the <b>Change shortcut</b> button to enter in the <i>Modify shortcut</i> dialog. There are two ways to change a shortcut: if the <b>Capture</b> button is on then just press the new key or combination of keys that you want to assign for the action (unfortunately this doesn't work for all keys). If the <b>Capture</b> button is off then you could enter the full name of the key. + + + + + Left click + + + + + Select the action for left click on the mouse. + + + + + Double click + + + + + Select the action for double click on the mouse. + + + + + Wheel function + + + + + Select the action for the mouse wheel. + + + + + PrefInterface + + + Interface + Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ + + + + Bulgarian + БългарÑки + + + + Czech + Чешки + + + + German + ÐемÑки + + + + Greek + Гръцки + + + + English + ÐнглийÑки + + + + Spanish + ИÑпанÑки + + + + Finnish + ФинÑки + + + + French + ФренÑки + + + + Hungarian + УнгарÑки + + + + Italian + ИталианÑки + + + + Japanese + ЯпонÑки + + + + Georgian + ГрузинÑки + + + + Dutch + ÐидерландÑки + + + + Polish + ПолÑки + + + + Portuguese - Brazil + + + + + Portuguese - Portugal + + + + + Romanian + + + + + Russian + РуÑки + + + + Slovak + Словашки + + + + Serbian + СръбÑки + + + + Swedish + ШведÑки + + + + Turkish + ТурÑки + + + + Ukrainian + УкрайнÑки + + + + Simplified-Chinese + ОпроÑтен китайÑки + + + + Traditional Chinese + Традиционен китайÑки + + + + <Autodetect> + <Ðвтооткриване> + + + + Default + Стандартни + + + + &Interface + + + + + Seeking + ТърÑене + + + + Never + Ðикога + + + + Whenever it's needed + Винаги когато е необходимо + + + + Only after loading a new video + Само Ñлед зареждането на ново видео + + + + Recent files + ПоÑледни файлове + + + + Language + Език + + + + Here you can change the language of the application. + + + + + Instances + + + + + Catalan + + + + + Basque + + + + + Galician + + + + + &Short jump + + + + + &Medium jump + + + + + &Long jump + + + + + Mouse &wheel jump + + + + + &Use only one running instance of SMPlayer + + + + + SMPlayer will listen to this &port to receive commands from other instances: + + + + + Ma&x. items + + + + + St&yle: + + + + + Ico&n set: + + + + + L&anguage: + + + + + Main window + + + + + Auto&resize: + + + + + R&emember position and size + + + + + Default font: + + + + + &Change... + + + + + PrefPerformance + + + Performance + ПроизводителноÑÑ‚ + + + + &Performance + + + + + Priority + Приоритет + + + + Select the priority for the MPlayer process. + Изберете приоритета за MPlayer. + + + + Priority: + Приоритет: + + + + realtime + реално време + + + + high + виÑоко + + + + abovenormal + наднормалното + + + + normal + нормално + + + + belownormal + поднормалното + + + + idle + без + + + + Cache + + + + + KB + KB + + + + Setting a cache may improve performance on slow media + Задаването на кеш може да подобри производителноÑтта при бавни файлове + + + + Allow frame drop + Разрешаване на frame drop + + + + Allow hard frame drop (can lead to image distortion) + Разрешаване на Ñилен frame drop (може да доведе до изкривеноÑÑ‚ на картината) + + + + Synchronization + Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ + + + + Audio/video auto synchronization + Ðвтоматично Ðудио/Видео Ñинхронизиране + + + + Factor: + Фактор: + + + + Fast audio track switching + Бързо автоматично превключване на пеÑни + + + + Fast seek to chapters in dvds + Бързо Ñ‚ÑŠÑ€Ñене на отделните глави в DVD-та + + + + Set process priority for mplayer according to the predefined priorities available under Windows.<br><b>WARNING:</b> Using realtime priority can cause system lockup. + Задаване на приоритета на mplayer Ñпоред тези налични в Windows.<br><b>Ð’ÐИМÐÐИЕ:</b> Използването на реално време може да причини забив на ÑиÑтемата. + + + + <br><b>Note:</b> This option is for Windows only. + <br><b>Забележка:</b> Тази Ð¾Ð¿Ñ†Ð¸Ñ Ðµ Ñамо за Windows. + + + + This option specifies how much memory (in kBytes) to use when precaching a file or URL. Especially useful on slow media. + Тази Ð¾Ð¿Ñ†Ð¸Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñ ÐºÐ¾Ð»ÐºÐ¾ памет(в кб) да бъде използвана за прекеширането на файл или URL. Много полезно за бавна медиÑ. + + + + Skip displaying some frames to maintain A/V sync on slow systems. + ПреÑкачане показването на нÑкои кадри, за да Ñе поддържа A/V Ñинхронизирането на Ñлаби машини. + + + + Allow hard frame drop + + + + + More intense frame dropping (breaks decoding). Leads to image distortion! + Интензивен frame drop. Води до изкривÑване на картината! + + + + Gradually adjusts the A/V sync based on audio delay measurements. + ПоÑтепенно наглаÑÑва A/V Ñинхронизирането базирано на измерваниÑта на аудио забавÑнето. + + + + Priorit&y: + + + + + Si&ze: + + + + + &Use cache + + + + + &Allow frame drop + + + + + Allow &hard frame drop (can lead to image distortion) + + + + + Audio/&video auto synchronization + + + + + Fact&or: + + + + + &Fast audio track switching + + + + + Fast &seek to chapters in dvds + + + + + Create index if needed + + + + + Rebuilds index of files if no index was found, allowing seeking. Useful with broken/incomplete downloads, or badly created files. This option only works if the underlying media supports seeking (i.e. not with stdin, pipe, etc).<br> Note: the creation of the index may take some time. + + + + + &Create index if needed + + + + + If checked, it will try the fastest method to switch audio tracks but might not work with some formats. + + + + + If checked, it will try the fastest method to seek to chapters but it might not work with some discs. + + + + + PrefSubtitles + + + Subtitles + Субтитри + + + + Choose a ttf file + Избор на ttf файл + + + + Truetype Fonts + Truetype шрифтове + + + + &Subtitles + &Субтитри + + + + Autoload + Ðвтозареждане + + + + Autoload subtitles files (*.srt, *.sub...): + Ðвтоматично зареждане на Ñубтитри (*.srt, *.sub...): + + + + Select first available subtitle + Избор на първите налични Ñубтитри + + + + Same name as movie + Същото име като филма + + + + All subs containing movie name + Ð’Ñички Ñубтитри, Ñъдържащи името на филма + + + + All subs in directory + Ð’Ñички Ñубтитри в директориÑта + + + + Default subtitle encoding: + Кодировка на Ñубтитри: + + + + Position + ÐŸÐ¾Ð·Ð¸Ñ†Ð¸Ñ + + + + Default position of the subtitles on screen + ÐŸÐ¾Ð·Ð¸Ñ†Ð¸Ñ Ð½Ð° Ñубтитрите на екрана по подразбиране + + + + 0 + 0 + + + + Top + Отгоре + + + + Bottom + Отдолу + + + + Include subtitles on screenshots + Включи Ñубтитрите в Ñнимките на екрана + + + + &Font + + + + + Font + Шрифт + + + + TTF font: + TTF шрифт: + + + + Search... + ТърÑене... + + + + System font: + СиÑтемен шрифт: + + + + Select the font which will be used for subtitles (and OSD): + Избор на шрифта, който ще бъде използван за Ñубтитри (и OSD): + + + + Size + Размер + + + + Autoscale: + Ðвтомащабиране: + + + + No autoscale + Без Ðвтомащабиране + + + + Proportional to movie height + Пропорционално на виÑочината на филма + + + + Proportional to movie width + Пропорционално на ширината на филма + + + + Proportional to movie diagonal + Пропорционално на диагонала на филма + + + + Scale: + Мащабиране: + + + + SSA/&ASS library + + + + + The new SSA/ASS library will provide nice styled subtitles for external SSA/ASS subtitles files and Matroska tracks. But it will be used too for rendering other formats like SUB and SRT files. + + + + + Use SSA/ASS library for subtitle rendering + Използване на SSA/ASS библиотеката за обработка на Ñубтитри + + + + Text color: + ЦвÑÑ‚ на текÑта: + + + + Border color: + ЦвÑÑ‚ на ъглите около екрана: + + + + Here you can override styles for SSA/ASS subtitles. It can be also used for fine-tuning the rendering of SRT and SUB subtitles by the SSA/ASS library. Example: <b>Bold=1,Outline=2,Shadow=4</b> + + + + + Styles: + Стилове: + + + + Subtitle position + + + + + This option specifies the position of the subtitles over the video window. <i>100</i> means the bottom, while <i>0</i> means the top. + Тази наÑтройка Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñта на Ñубтитрите върху видео прозореца.<i>100</i>означава отдолу, докато <i>0</i> означава отгоре. + + + + SSA/ASS styles + + + + + Au&toload subtitles files (*.srt, *.sub...): + + + + + S&elect first available subtitle + + + + + &Default subtitle encoding: + + + + + Default &position of the subtitles on screen + + + + + &Include subtitles on screenshots + + + + + &Use -subfont option (required by recent MPlayer releases) + + + + + &TTF font: + + + + + Sea&rch... + + + + + S&ystem font: + + + + + A&utoscale: + + + + + S&cale: + + + + + &Use SSA/ASS library for subtitle rendering + + + + + &Text color: + + + + + &Border color: + + + + + St&yles: + + + + + PreferencesDialog + + + SMPlayer - Help + + + + + OK + + + + + Cancel + + + + + Apply + + + + + Help + + + + + SMPlayer - Preferences + SMPlayer - ÐаÑтройки + + + + QObject + + + 1 second + 1 Ñекунда + + + + %1 seconds + %1 Ñекунди + + + + %1 minutes + %1 минути + + + + %1 minutes and %2 seconds + %1 минути и %2 Ñекунди + + + + 1 minute + 1 минута + + + + 1 minute and 1 second + 1 минута и 1 Ñекунда + + + + 1 minute and %1 seconds + 1 минута и %1 Ñекунди + + + + %1 minutes and 1 second + %1 минути и 1 Ñекунда + + + + will show this message and then will exit. + + + + + 'media' is any kind of file that SMPlayer can open. It can be a local file, a DVD (e.g. dvd://1), an Internet stream (e.g. mms://....) or a local playlist in format m3u. If the -playlist option is used, that means that SMPlayer will pass the -playlist option to MPlayer, so MPlayer will handle the playlist, not SMPlayer. + + + + + the main window will be closed when the file/playlist finishes. + + + + + This is SMPlayer v. %1 running on %2 + + + + + tries to make a connection to another running instance and send to it the specified action. Example: -send-action pause The rest of options (if any) will be ignored and the application will exit. It will return 0 on success or -1 on failure. + + + + + action_list is a list of actions separated by spaces. The actions will be executed just after loading the file (if any) in the same order you entered. For checkable actions you can pass true or false as parameter. Example: -actions "fullscreen compact true". Quotes are necessary in case you pass more than one action. + + + + + media + + + + + if there's another instance running, the media will be added to that instance's playlist. If there's no other instance, this option will be ignored and the files will be opened in a new instance. + + + + + specifies the directory for the configuration file (smplayer.ini). + + + + + the main window won't be closed when the file/playlist finishes. + + + + + Usage: %1 [-ini-path directory] [-send-action action_name] [-actions action_list [-close-at-end] [-no-close-at-end] [-fullscreen] [-no-fullscreen] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + + + + + the video will be played in fullscreen mode. + + + + + the video will be played in window mode. + + + + + SeekWidget + + + icon + икона + + + + label + Ð½Ð°Ð´Ð¿Ð¸Ñ + + + + ShortcutGetter + + + Modify shortcut + + + + + Clear + + + + + Press the key combination you want to assign + + + + + Capture + + + + + Capture keystrokes + + + + + VideoEqualizer + + + Equalizer + Изравнител + + + + Contrast + КонтраÑÑ‚ + + + + Brightness + ЯркоÑÑ‚ + + + + Hue + ÐÑŽÐ°Ð½Ñ + + + + Saturation + ÐаÑитеноÑÑ‚ + + + + Gamma + Гама + + + + &Reset + &ВъзÑтановÑване + + + + &Set as default values + &Задаване като Ñтандартни + + + + Use the current values as default values for new videos. + Използване като Ñтандартни за нови филми. + + + + Set all controls to zero. + Задаване на вÑичко до нула. + + + diff --git a/retroshare-gui/src/apps/smplayer/translations/smplayer_cs.qm b/retroshare-gui/src/apps/smplayer/translations/smplayer_cs.qm new file mode 100644 index 000000000..01f442cab Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/translations/smplayer_cs.qm differ diff --git a/retroshare-gui/src/apps/smplayer/translations/smplayer_cs.ts b/retroshare-gui/src/apps/smplayer/translations/smplayer_cs.ts new file mode 100644 index 000000000..50ee4ce0d --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/translations/smplayer_cs.ts @@ -0,0 +1,3805 @@ + + + + AboutDialog + + + Version: %1 + Verze: %1 + + + + 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. + Tento program je volný software, který můžete šířit a modifikovat pod GNU General Public License publikovanou Free Software Foundation od verze 2, případnÄ› pozdÄ›jší. + + + + Translators: + Lokalizace: + + + + German + NÄ›mecká + + + + Slovak + Slovenská + + + + Italian + Italská + + + + French + Francouzská + + + + Simplified-Chinese + Čínská + + + + Russian + Ruská + + + + Hungarian + MaÄarská + + + + Japanese + Japonská + + + + Dutch + Holandská + + + + Ukrainian + Ukrajinská + + + + Georgian + Gragoriánská + + + + Czech + ÄŒeská + + + + Logo designed by %1 + Logo vytvoÅ™il %1 + + + + Get updates at: %1 + Nová verze: %1 + + + + About SMPlayer + O SMPlayeru + + + + Polish + Polská + + + + Bulgarian + Bulharská + + + + Turkish + Turecké + + + + Swedish + + + + + Serbian + + + + + Traditional Chinese + + + + + Romanian + + + + + Portuguese - Brazil + + + + + Portuguese - Portugal + + + + + Compiled with Qt %1 + + + + + %1, %2 and %3 + + + + + %1 and %2 + + + + + http://smplayer.sourceforge.net/en/windows/download.php + If the web page is translated into your language you can change the URL so it points to the download page in the translation.Otherwise leave as is. + + + + + http://smplayer.sourceforge.net/en/linux/download.php + If the web page is translated into your language you can change the URL so it points to the download page in the translation.Otherwise leave as is. + + + + + <b>%1</b>: %2 + + + + + ActionsEditor + + + Name + Název + + + + Description + + + + + Shortcut + + + + + &Save + &Uložit + + + + &Load + &NaÄíst + + + + Key files + + + + + Choose a filename + Zvolit název souboru + + + + Confirm overwrite? + Potvrdit pÅ™epsání? + + + + The file %1 already exists. +Do you want to overwrite? + Soubor %1 už existuje. +Opravdu jej chcete pÅ™epsat? + + + + Error + + + + + The file couldn't be saved + + + + + Choose a file + Zvolit soubor + + + + The file couldn't be loaded + + + + + &Change shortcut... + + + + + BaseGui + + + &File... + S&oubor... + + + + D&irectory... + &Adresář... + + + + &Playlist... + &Seznam... + + + + &DVD from drive + &DVD z mechaniky + + + + D&VD from folder... + D&VD z adresáře... + + + + &URL... + &URL... + + + + P&lay + P&Å™ehrát + + + + &Pause + &Pozastavit + + + + &Stop + &Stop + + + + &Frame step + &Krok po snímku + + + + Play / Pause + Spustit / Pozastavit + + + + Pause / Frame step + Pozastavit / Krok po snímku + + + + &Repeat + &Opakovat + + + + &Normal speed + &Normální rychlost + + + + &Halve speed + &PoloviÄní rychlost + + + + &Double speed + &Dvojnásobná rychlost + + + + Speed &-10% + Rychlost &-10% + + + + Speed &+10% + Rychlost &+10% + + + + Sp&eed + Rych&lost + + + + &Fullscreen + &Celá obrazovka + + + + &Compact mode + &Kompaktní mód + + + + &Equalizer + &Equalizér + + + + &Screenshot + &Snímek obrazovky + + + + S&tay on top + &Vždy na vrchu + + + + &Postprocessing + &DodateÄné zpracování + + + + &Autodetect phase + &Autodetekce fáze + + + + &Deblock + &Deblock + + + + De&ring + De&ring + + + + Add n&oise + PÅ™idat Å¡&um + + + + F&ilters + F&iltry + + + + &Mute + &Ztlumit + + + + Volume &- + Hlasitost &- + + + + Volume &+ + Hlasitost &+ + + + + &Delay - + &ZpoždÄ›ní - + + + + D&elay + + Z&poždÄ›ní + + + + + &Extrastereo + &Extra Stereo + + + + &Karaoke + &Karaoke + + + + &Filters + &Filtry + + + + &Load... + &NaÄíst... + + + + Delay &- + ZpoždÄ›ní &- + + + + Delay &+ + ZpoždÄ›ní &+ + + + + &Up + &Nahoru + + + + &Down + &Dolů + + + + &Playlist + &Seznam + + + + &Show frame counter + &Zobrazit poÄítadlo snímků + + + + P&references + &Nastavení + + + + &View logs + &Zobrazit logy + + + + About &Qt + O &Qt + + + + About &SMPlayer + O &SMplayeru + + + + &Open + &Otevřít + + + + &Play + &PÅ™ehrát + + + + &Video + &Video + + + + &Audio + &Audio + + + + &Subtitles + &Titulky + + + + &Browse + Navi&gace + + + + Op&tions + &Možnosti + + + + &Help + &NápovÄ›da + + + + &Recent files + &Naposledy otevÅ™ené + + + + &Clear + &VyÄistit + + + + Si&ze + &Velikost + + + + &Aspect ratio + &PomÄ›r stran + + + + &Deinterlace + &Deinterlace + + + + De&noise + Po&tlaÄení Å¡umu + + + + &Autodetect + &Autodetekce + + + + &4:3 + &4:3 + + + + &5:4 + &5:4 + + + + &14:9 + &14:9 + + + + 16:&9 + 16:&9 + + + + 1&6:10 + 1&6:10 + + + + &2.35:1 + &2.35:1 + + + + 4:3 &Letterbox + 4:3 &Letterbox + + + + 16:9 L&etterbox + 16:9 L&etterbox + + + + 4:3 &Panscan + 4:3 &Panscan + + + + 4:3 &to 16:9 + 4:3 &na 16:9 + + + + &None + Žá&dné + + + + &Lowpass5 + &Lowpass5 + + + + Linear &Blend + Linear &Blend + + + + N&ormal + N&ormální + + + + &Soft + &Jemné + + + + &Track + &Stopa + + + + &Channels + &Kanály + + + + &Stereo mode + &Stereo mód + + + + &Default + &Výchozí + + + + &Stereo + &Stereo + + + + &4.0 Surround + &4.0 Surround + + + + &5.1 Surround + &5.1 Surround + + + + &Left channel + &Levý kanál + + + + &Right channel + &Pravý kanál + + + + &Select + &Vybrat + + + + &Title + &Titul + + + + &Chapter + &Kapitola + + + + &Angle + Ú&hel + + + + &OSD + &OSD + + + + &Disabled + &vypnuto + + + + &Seek bar + &Ukazatel pozice + + + + &Time + ÄŒ&as + + + + Time + T&otal time + ÄŒas + &Celkový Äas + + + + SMPlayer - mplayer log + SMPlayer - mplayer log + + + + SMPlayer - smplayer log + SMPlayer - smplayer log + + + + <empty> + <prázdné> + + + + Video + Video + + + + Audio + Audio + + + + Playlists + Seznamy + + + + All files + VÅ¡echny soubory + + + + Choose a file + Zvolit soubor + + + + SMPlayer - Information + SMplayer - informace + + + + The CDROM / DVD drives are not configured yet. +The configuration dialog will be shown now, so you can do it. + Mechaniky CDROM/DVD nejsou nastaveny +Bude zobrazeno konfiguraÄní okno. + + + + Choose a directory + Zvolit adresář + + + + Subtitles + Titulky + + + + About Qt + O Qt + + + + Playing %1 + PÅ™ehrávám %1 + + + + Pause + Pozastavit + + + + Stop + Stop + + + + U&nload + U&volnit + + + + V&CD + V&CD + + + + C&lose + &Zavřít + + + + View &info and properties... + Zobrazit &info a vlastnosti... + + + + Zoom &- + + + + + Zoom &+ + + + + + &Reset + &Reset + + + + Move &left + + + + + Move &right + + + + + Move &up + &Posunout nahoru + + + + Move &down + Po&sunout dolů + + + + &Previous line in subtitles + + + + + N&ext line in subtitles + + + + + &Pan && scan + + + + + -%1 + + + + + +%1 + + + + + Dec volume (2) + + + + + Inc volume (2) + + + + + Exit fullscreen + + + + + OSD - Next level + + + + + Dec contrast + + + + + Inc contrast + + + + + Dec brightness + + + + + Inc brightness + + + + + Dec hue + + + + + Inc hue + + + + + Dec saturation + + + + + Dec gamma + + + + + Next audio + + + + + Next subtitle + + + + + Next chapter + + + + + Previous chapter + + + + + Inc saturation + + + + + Inc gamma + + + + + &Load external file... + + + + + &Kerndeint + + + + + &Yadif (normal) + + + + + Y&adif (double framerate) + + + + + &Next + &Další + + + + Pre&vious + &PÅ™edchozí + + + + Volume &normalization + + + + + &Audio CD + + + + + Denoise nor&mal + + + + + Denoise &soft + + + + + Denoise o&ff + + + + + Use SSA/&ASS library + + + + + Flip i&mage + + + + + &Toggle double size + + + + + BaseGuiPlus + + + SMPlayer is still running here + SMPlayer zde stále běží + + + + S&how icon in system tray + Z&obrazit ikonu v systémové liÅ¡tÄ› + + + + &Hide + &Skrýt + + + + &Restore + &Obnovit + + + + &Recent files + &Naposledy otevÅ™ené + + + + &Quit + &Konec + + + + Playlist + Seznam + + + + Core + + + Brightness: %1 + Jas: %1 + + + + Contrast: %1 + Kontrast: %1 + + + + Gamma: %1 + Gamma: %1 + + + + Hue: %1 + Odstín: %1 + + + + Saturation: %1 + Saturace: %1 + + + + Volume: %1 + Hlasitost: %1 + + + + Zoom: %1 + + + + + DefaultGui + + + Welcome to SMPlayer + Vítá Vás SMplayer + + + + &Main toolbar + &Hlavní nástrojová liÅ¡ta + + + + &Language toolbar + &LiÅ¡ta výbÄ›ru jazyka + + + + &Toolbars + &Nástrojové liÅ¡ty + + + + Volume + Hlasitost + + + + Audio + Audio + + + + Subtitle + Titulky + + + + Playlist + Seznam + + + + Encodings + + + Western European Languages + Západoevropské jazyky + + + + Western European Languages with Euro + Západoevropské jazyky s Euro + + + + Slavic/Central European Languages + StÅ™edoevropské jazyky + + + + Esperanto, Galician, Maltese, Turkish + Esperanto + + + + Old Baltic charset + Staré baltské kódování + + + + Cyrillic + Cyrilika + + + + Arabic + Arabské + + + + Modern Greek + Moderní Å™eÄtina + + + + Turkish + Turecké + + + + Baltic + Baltské + + + + Celtic + Keltské + + + + Hebrew charsets + Hebrejské + + + + Russian + Ruské + + + + Ukrainian, Belarusian + Ukrajinské + + + + Simplified Chinese charset + Jednoduchá ÄínÅ¡tina + + + + Traditional Chinese charset + TradiÄní ÄínÅ¡tina + + + + Japanese charsets + Japonské + + + + Korean charset + Korejské + + + + Thai charset + Thajské + + + + Cyrillic Windows + Cyrilika Windows + + + + Slavic/Central European Windows + StÅ™edoevropské Windows + + + + Arabic Windows + + + + + EqSlider + + + icon + + + + + FilePropertiesDialog + + + SMPlayer - File properties + SMPlayer - Vlastnosti souboru + + + + &Information + &Informace + + + + &Demuxer + &Dekodér + + + + &Select the demuxer that will be used for this file: + &VýbÄ›r dekodéru který bude použit pro tento soubor: + + + + &Reset + &Reset + + + + &Video codec + &Video kodek + + + + &Select the video codec: + Vý&bÄ›r video kodeku: + + + + A&udio codec + A&udio kodek + + + + &Select the audio codec: + VýbÄ›r &Audio kodeku: + + + + &MPlayer options + &Možnosti MPlayeru + + + + Additional Options for MPlayer + Další volby pro MPlayer + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + Zde můžete zadat extra parametry pro MPlayer. +OddÄ›lujte je mezerami. +Příklad: -flip -nosound + + + + &Options: + &Možnosti: + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + Můžete použít další video filtry. +OddÄ›lujte je Äárkou, nepoužívejte mezery. +Příklad: scale=512:-2;eq2=1.1 + + + + V&ideo filters: + V&ideo filtry: + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + A nakonec audio filtry. Stejná pravidla jako video filtry. +Příklad: resample=44100:0:0,volnorm + + + + Audio &filters: + Audio &filtry: + + + + OK + + + + + Cancel + + + + + Apply + + + + + InfoFile + + + General + Hlavní + + + + Size + Velikost + + + + %1 KB (%2 MB) + %1 KB (%2 MB) + + + + URL + URL + + + + Length + Délka + + + + Demuxer + Dekodér + + + + Name + Název + + + + Artist + UmÄ›lec + + + + Author + Autor + + + + Album + Album + + + + Genre + Žánr + + + + Date + Datum + + + + Track + Stopa + + + + Copyright + Copyright + + + + Comment + Komentář + + + + Software + Software + + + + Clip info + Informace o klipu + + + + Video + Video + + + + Resolution + RozliÅ¡ení + + + + Aspect ratio + PomÄ›r stran + + + + Format + Formát + + + + Bitrate + Datový tok + + + + %1 kbps + %1 kbps + + + + Frames per second + Snímků za sekundu + + + + Selected codec + Vybraný kodek + + + + Initial Audio Stream + Výchozí audio stopa + + + + Rate + Hodnocení + + + + %1 Hz + %1 Hz + + + + Channels + Kanály + + + + Audio Streams + Audio stopy + + + + Language + Jazyk + + + + empty + prázdný + + + + Subtitles + Titulky + + + + Type + Typ + + + + ID + Info for translators: this is a identification code + ID + + + + # + Info for translators: this is a abbreviation for number + + + + + Stream title + + + + + Stream URL + + + + + File + + + + + InputDVDDirectory + + + Choose a directory + Zvolit adresář + + + + SMPlayer - Play a DVD from a folder + SMPlayer - PÅ™ehrát DVD z adresáře + + + + You can play a dvd from your hard disc. Just select the folder which contains the VIDEO_TS and AUDIO_TS directories. + Můžete spustit DVD z adresáře na disku. ProstÄ› vyberte adresář kterýobsahuje složky VIDEO_TS a AUDIO_TS. + + + + Choose a directory... + Zvolit adresář... + + + + InputURL + + + SMPlayer - Enter URL + + + + + &URL: + + + + + It's a &playlist + + + + + If this option is checked, the URL will be treated as a playlist: it will be opened as text and will play the URLs in it. + + + + + LogWindow + + + Choose a filename to save under + Zvolit název pod kterým bude soubor uložen + + + + Confirm overwrite? + Potvrdit pÅ™epsání? + + + + The file already exists. +Do you want to overwrite? + Soubor už existuje. +Chcete jej opravdu pÅ™epsat? + + + + Error saving file + Chyba pÅ™i ukládání souboru + + + + The log couldn't be saved + Log nemohl být uložen + + + + Logs + Logy + + + + LogWindowBase + + + Log Window + Okno logu + + + + Save + Uložit + + + + Copy to clipboard + Zkopírovat do schránky + + + + Close + Zavřít + + + + &Close + &Zavřít + + + + Playlist + + + Name + Název + + + + Length + Délka + + + + &Play + &PÅ™ehrát + + + + &Edit + &Editace + + + + Playlists + Seznamy + + + + Choose a file + Zvolit soubor + + + + Choose a filename + Zvolit název souboru + + + + Confirm overwrite? + Potvrdit pÅ™epsání? + + + + The file %1 already exists. +Do you want to overwrite? + Soubor %1 už existuje. +Opravdu jej chcete pÅ™epsat? + + + + All files + VÅ¡echny soubory + + + + Select one or more files to open + VýbÄ›r jednoho nebo více souborů k otevÅ™ení + + + + Choose a directory + Zvolit adresář + + + + Edit name + ZmÄ›nit název + + + + Type the name that will be displayed in the playlist for this file: + Zadat název pro tento soubor pod kterým bude zobrazován v seznamu: + + + + &Load + &NaÄíst + + + + &Save + &Uložit + + + + &Next + &Další + + + + Pre&vious + &PÅ™edchozí + + + + Move &up + &Posunout nahoru + + + + Move &down + Po&sunout dolů + + + + &Repeat + &Opakovat + + + + S&huffle + Ná&hodnÄ› + + + + Add &current file + PÅ™id&at stávající soubor + + + + Add &file(s) + PÅ™ida&t soubor(y) + + + + Add &directory + PÅ™idat ad&resář + + + + Remove &selected + Ode&brat vybrané + + + + Remove &all + Odebrat &vÅ¡e + + + + Add... + PÅ™idat... + + + + Remove... + Odebrat... + + + + SMPlayer - Playlist + SMPlayer - Seznam + + + + Playlist modified + Seznam zmÄ›nÄ›n + + + + There are unsaved changes, do you want to save the playlist? + Byly provedeny zmÄ›ny, chcete je uložit do seznamu? + + + + PrefAdvanced + + + Advanced + Rozšířené + + + + Auto + + + + + &Advanced + + + + + icon + Ikona + + + + Additional Options for MPlayer + Další volby pro MPlayer + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + Zde můžete zadat extra parametry pro MPlayer. +OddÄ›lujte je mezerami. +Příklad: -flip -nosound + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + Můžete použít další video filtry. +OddÄ›lujte je Äárkou, nepoužívejte mezery. +Příklad: scale=512:-2;eq2=1.1 + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + A nakonec audio filtry. Stejná pravidla jako video filtry. +Příklad: resample=44100:0:0,volnorm + + + + Don't repaint the background of the video window + + + + + &Logs + + + + + Log MPlayer output + + + + + Log SMPlayer output + + + + + This option is mainly intended for debugging the application. + Tato možnost je urÄena pro ladÄ›ní aplikace. + + + + &MPlayer language + + + + + SMPlayer needs to read and parse the output of MPlayer and sometimes it relies on English text. If you are using a MPlayer translated into another language, then you need to change the texts that SMPlayer looks for. (Technically you should enter regular expressions)<br><br> +The drop-down lists may provide already made regular expression for several languages. + + + + + Checking this option may reduce flickering, but it also might produce that the video won't be displayed properly. + + + + + If checked, smplayer will store the output of mplayer (you can see it in <b>Options->View logs->mplayer</b>). In case of problems this log can contain important information, so it's recommended to keep this option checked. + Pokud je zatrženo, SMPlayer bude ukládat hlášení MPlayeru (lze vidÄ›t v <b> Možnosti -> Zobrazit logy -> mplayer<b>). VpřípadÄ› problémů log obsahuje důležité informace, takže se doporuÄuje tuto možnost mít povolenou. + + + + If this option is checked, smplayer will store the debugging messages that smplayer outputs (you can see the log in <b>Options->View logs->smplayer</b>). This information can be very useful for the developer in case you find a bug. + Pokud je zatrženo, SMPlayer bude ukládat zprávy SMPlayeru (lze vidÄ›t v <b> Možnosti -> Zobrazit logy -> smplayer<b>). Tyto informace jsou velice použitelné pro vývojáře k nalezení chyb. + + + + Filter for SMPlayer logs + + + + + This option allows to filter the smplayer messages that will be stored in the log. Here you can write any regular expression.<br>For instance: <i>^Core::.*</i> will display only the lines starting with <i>Core::</i> + Tato možnost povolí filtrování zpráv SMPlayeru které jsou ukládány do logu. Můžete zadat rugulární výraz. Například: <i>^Core::.*</i> zobrazí pouze řádky zaÄínající <i>Core::</i> + + + + &Monitor aspect: + + + + + &Run MPlayer in its own window + + + + + &Options: + &Možnosti: + + + + V&ideo filters: + V&ideo filtry: + + + + Audio &filters: + Audio &filtry: + + + + &Colorkey: + + + + + &Don't repaint the background of the video window + + + + + Log &MPlayer output + + + + + Log &SMPlayer output + + + + + &Filter for SMPlayer logs: + + + + + &End of file: + + + + + &No video: + + + + + C&hange... + + + + + PrefAssociations + + + Warning + + + + + Not all files could be associated. Please check your security permissions and retry. + + + + + File Types + + + + + Select all + + + + + Check all file types in the list + + + + + Uncheck all file types in the list + + + + + List of file types + + + + + File types + + + + + Media files handled by SMPlayer: + + + + + Select All + + + + + Select None + + + + + Check the media file extensions you would like SMPlayer to handle. When you click Apply, the checked files will be associated with SMPlayer. If you uncheck a media type, the file association will be restored. + + + + + Select none + + + + + PrefDrives + + + Drives + Mechaniky + + + + Currently SMPlayer does not autodetect cdrom or dvd devices. So in order to play cdroms or dvds you must first select here your cdrom and dvd drives (can be the same). + MomentálnÄ› SMPlayer neumí automaticky detekovat CD a DVD mechaniky. Pokud budete pÅ™ehrávat z CD nebo DVD mechaniky, musíte je zde nastavit (mohou být stejné). + + + + icon + Ikona + + + + Select your CD device: + VýbÄ›r CD mechaniky: + + + + Select your DVD device: + VýbÄ›r DVD mechaniky: + + + + CD device + + + + + Choose your CDROM device. It will be used to play VCDs and Audio CDs. + + + + + DVD device + + + + + Choose your DVD device. It will be used to play DVDs. + + + + + Select your &CD device: + + + + + Select your &DVD device: + + + + + PrefGeneral + + + General + Hlavní + + + + &General + + + + + Paths + UmístÄ›ní + + + + Select... + Vybrat... + + + + Folder for storing screenshots: + Adresář pro ukládání snímků: + + + + Search... + Najít... + + + + Output drivers + Výstupní ovladaÄe + + + + Video: + Video: + + + + Audio: + Audio: + + + + Media settings + Nastavení médií + + + + Remember settings for all files (audio track, subtitles...) + Pamatovat nastavení pro vÅ¡echny soubory (zvukové stopy, titulky...) + + + + Don't remember time position (files start playing from the beginning) + Nepamatovat si pozici Äasu (soubory budou pÅ™ehrávány od zaÄátku) + + + + Preferred audio and subtitles + Preferované audio a titulky + + + + Subtitles: + Titulky: + + + + &Video and audio + + + + + Video + Video + + + + Use software video equalizer + Použít softwarový video equalizér + + + + Start videos in fullscreen + Spustit videa v režimu celé obrazovky + + + + Disable screensaver + Vypnout spoÅ™iÄ obrazovky + + + + Audio + Audio + + + + Use software volume control + Použít softwarové ovládání hlasitosti + + + + Select the mplayer executable + VýbÄ›r spustitelného souboru MPlayeru + + + + Executables + Spustitelné + + + + All files + VÅ¡echny soubory + + + + Select a directory + VýbÄ›r adresáře + + + + MPlayer executable + + + + + Here you must specify the mplayer executable that smplayer will use.<br>smplayer requires at least mplayer 1.0rc1 (svn recommended).<br><b>If this setting is wrong, smplayer won't be able to play anything!</b> + Zde musí být nastaven spustitelný soubor MPlayeru který SMplayer bude používat. <br> SMplayer potÅ™ebuje MPlayer alespoň ve verzi 1.0rc1 (doporuÄeno SVN). <br><b> Pokud bude tato položka Å¡patnÄ› nastavena, SMplayer nebude moct nic pÅ™ehrát!</b> + + + + Screenshots folder + + + + + Here you can specify a folder where the screenshots taken by smplayer will be stored. If this field is empty the screenshot feature will be disabled. + Zde můžete nastavit adresář do kterého se budou ukládat uložené snímky. Pokud není adresář nastaven, nebude tato funkce povolena. + + + + Video output driver + + + + + Select the video output driver. Usually xv (linux) and directx (windows) provide the best performance. + VýbÄ›r výstupního video ovladaÄe. VÄ›tÅ¡inou xv (linux) a directx (windows) poskytují nejvyšší výkon. + + + + Audio output driver + + + + + Select the audio output driver. + VýbÄ›r výstupního audio ovladaÄe. + + + + Remember settings + + + + + Usually smplayer will remember the settings for each file you play (audio track selected, volume, filters...). Uncheck this option if you don't like this feature. + VÄ›tÅ¡inou si SMPlayer pamatuje nastavení pro každý pÅ™ehrávaný soubor (volba zvukové stopy, hlasitost, filtry...). ZruÅ¡ením této volby nebude tuto možnost používat. + + + + Don't remember time position + + + + + If you check this option, smplayer will play all files from the beginning. + Povolení této možnosti bude SMplayer pÅ™ehrávat vÅ¡echny soubory od zaÄátku. + + + + Preferred audio language + + + + + Here you can type your preferred language for the audio streams. When a media with multiple audio streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the audio streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the audio track if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + Zde lze zvolit preferovaný jazyk audio stopy. Pokud je ve videu nalezeno více audio stop, SMPlayer zkusí použít tento jazyk. <br> Toto funguje pouze v případÄ› že je v mediu přístupná informace o jazyce v audio stopÄ›, jako jsou DVD nebo mkv soubory. <br> Toto políÄko akceptuje regulární výrazy. Například: <b>es|esp|spa</b> bude vybírat audio stopu odpovídající <i>es</i>, <i>esp</i> or <i>spa</i>. + + + + Preferred subtitle language + + + + + Here you can type your preferred language for the subtitle stream. When a media with multiple subtitle streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the subtitle streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the subtitle stream if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + Zde lze zvolit preferovaný jazyk titulků. Pokud je ve videu nalezeno více titulků, SMPlayer zkusí použít tento jazyk. <br> Toto funguje pouze v případÄ› že je v mediu přístupná informace o jazyce v titulcích, jako jsou DVD nebo mkv soubory. <br> Toto políÄko akceptuje regulární výrazy. Například: <b>es|esp|spa</b> bude vybírat titulky odpovídající <i>es</i>, <i>esp</i> or <i>spa</i>. + + + + Software video equalizer + + + + + You can check this option if video equalizer is not supported by your graphic card or the selected video output driver.<br><b>Note:</b> this option can be incompatible with some video output drivers. + Tuto možnost můžete využít pokud není video equalizér podporován vaší grafickou kartou nebo vybraným výstupním video ovladaÄem. <br><b> Poznámka: tato možnost může být nekompatibilní s nÄ›kterýmy výstupními video ovladaÄi. + + + + If this option is checked, all videos will start to play in fullscreen mode. + Pokud bude tato možnost povolena, vÅ¡echny videa budou pÅ™ehrávány v režimu celé obrazovky. + + + + Check this option to disable the screensaver while playing.<br>The screensaver will enabled again when play finishes.<br><b>Note:</b> This option works only in X11 and Windows. + Tato možnost zakáže Å¡etÅ™iÄ obrazovky bÄ›hem pÅ™ehrávání. <br> Å etÅ™iÄ obrazovky bude znovu povolen po ukonÄení pÅ™ehrávání. <br><b> Poznámka: Toto lze použít pouze v systémech X11 a Windows. + + + + Software volume control + + + + + Check this option to use the software mixer, instead of using the sound card mixer. + Tato volba umožní použít softwarový mixer místo mixeru zvukové karty. + + + + Postprocessing quality + + + + + Dynamically changes the level of postprocessing depending on the available spare CPU time. The number you specify will be the maximum level used. Usually you can use some big number. + Dynamické zmÄ›ny úrovnÄ› dodateÄného zpracování závisející na vytížení procesoru. Číslo udává maximální úroveň která může být použita. VÄ›tÅ¡inou je použito nÄ›jaké vysoké Äíslo. + + + + Change volume + + + + + If checked, SMPlayer will remember the volume for every file and will restore it when played again. For new files the default volume will be used. + + + + + Default volume: + Výchozí úroveň hlasitosti: + + + + 0 + 0 + + + + &Change volume on every file + + + + + &Search... + + + + + S&elect... + + + + + Select the &MPlayer executable: + + + + + &Folder for storing screenshots: + + + + + V&ideo: + + + + + &Audio: + + + + + &Don't remember time position (files start playing from the beginning) + + + + + &Remember settings for all files (audio track, subtitles...) + + + + + A&udio: + + + + + Su&btitles: + + + + + &Use software video equalizer + + + + + &Quality: + + + + + Start videos in &fullscreen + + + + + Disable &screensaver + + + + + &Default volume: + + + + + Use s&oftware volume control + + + + + Ma&x. Amplification: + + + + + &AC3/DTS pass-through S/PDIF + + + + + Direct rendering + + + + + If checked, turns on direct rendering (not supported by all codecs and video outputs)<br><b>WARNING:</b> May cause OSD/SUB corruption! + + + + + Double buffering + + + + + D&irect rendering + + + + + Dou&ble buffering + + + + + Double buffering fixes flicker by storing two frames in memory, and displaying one while decoding another. If disabled it can affect OSD negatively, but often removes OSD flickering. + + + + + &Enable postprocessing by default + + + + + Volume &normalization by default + + + + + Close when finished + + + + + If this option is checked, the main window will be automatically closed when the current file/playlist finishes. + + + + + &Close when finished + + + + + 2 (Stereo) + + + + + 4 (4.0 Surround) + + + + + 6 (5.1 Surround) + + + + + C&hannels by default: + + + + + &Pause when minimized + + + + + Pause when minimized + + + + + If this option is enabled, the file will be paused when the main window is hidden. When the window is restored, play will be resumed. + + + + + Enable postprocessing by default + + + + + Max. Amplification + + + + + AC3/DTS pass-through S/PDIF + + + + + Volume normalization by default + + + + + Maximizes the volume without distorting the sound. + + + + + Default volume + + + + + Sets the initial volume that new files will use. + + + + + Channels by default + + + + + Sets the maximum amplification level in percent (default: 110). A value of 200 will allow you to adjust the volume up to a maximum of double the current level. With values below 100 the initial volume (which is 100%) will be above the maximum, which e.g. the OSD cannot display correctly. + + + + + Uses hardware AC3 passthrough + + + + + Requests the number of playback channels. MPlayer asks the decoder to decode the audio into as many channels as specified. Then it is up to the decoder to fulfill the requirement. This is usually only important when playing videos with AC3 audio (like DVDs). In that case liba52 does the decoding by default and correctly downmixes the audio into the requested number of channels. NOTE: This option is honored by codecs (AC3 only), filters (surround) and audio output drivers (OSS at least). + + + + + Postprocessing will be used by default on new opened files. + + + + + PrefInput + + + Keyboard and mouse + + + + + &Keyboard + + + + + icon + Ikona + + + + &Mouse + + + + + Button functions: + Funkce tlaÄítek: + + + + Media seeking + PÅ™etáÄení médií + + + + Volume control + Ovládání hlasitosti + + + + Zoom video + + + + + None + Prázdný + + + + Here you can change any key shortcut. To do it double click or press enter over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + + + + + Here you can change any key shortcut. To do it double click or start typing over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + + + + + &Left click + + + + + &Double click + + + + + &Wheel function: + + + + + Shortcut editor + + + + + This table allows you to change the key shortcuts of most available actions. Double click or press enter on a item, or press the <b>Change shortcut</b> button to enter in the <i>Modify shortcut</i> dialog. There are two ways to change a shortcut: if the <b>Capture</b> button is on then just press the new key or combination of keys that you want to assign for the action (unfortunately this doesn't work for all keys). If the <b>Capture</b> button is off then you could enter the full name of the key. + + + + + Left click + + + + + Select the action for left click on the mouse. + + + + + Double click + + + + + Select the action for double click on the mouse. + + + + + Wheel function + + + + + Select the action for the mouse wheel. + + + + + PrefInterface + + + Interface + Rozhraní + + + + Bulgarian + Bulharská + + + + Czech + ÄŒeská + + + + German + NÄ›mecká + + + + Greek + + + + + English + Anglická + + + + Spanish + Å panÄ›lská + + + + Finnish + + + + + French + Francouzská + + + + Hungarian + MaÄarská + + + + Italian + Italská + + + + Japanese + Japonská + + + + Georgian + Gragoriánská + + + + Dutch + Holandská + + + + Polish + Polská + + + + Portuguese - Brazil + + + + + Portuguese - Portugal + + + + + Romanian + + + + + Russian + + + + + Slovak + Slovenská + + + + Serbian + + + + + Swedish + + + + + Turkish + Turecké + + + + Ukrainian + Ukrajinská + + + + Simplified-Chinese + Čínská + + + + Traditional Chinese + + + + + <Autodetect> + <Autodetekce> + + + + Default + Výchozí + + + + &Interface + + + + + Seeking + PÅ™etáÄení + + + + Never + Nikdy + + + + Whenever it's needed + Kdykoli je potÅ™eba + + + + Only after loading a new video + Pouze pÅ™i naÄítání nového videa + + + + Recent files + Neposledy použité soubory + + + + Language + Jazyk + + + + Here you can change the language of the application. + + + + + Instances + + + + + Catalan + + + + + Basque + + + + + Galician + + + + + &Short jump + + + + + &Medium jump + + + + + &Long jump + + + + + Mouse &wheel jump + + + + + &Use only one running instance of SMPlayer + + + + + SMPlayer will listen to this &port to receive commands from other instances: + + + + + Ma&x. items + + + + + St&yle: + + + + + Ico&n set: + + + + + L&anguage: + + + + + Main window + + + + + Auto&resize: + + + + + R&emember position and size + + + + + Default font: + + + + + &Change... + + + + + PrefPerformance + + + Performance + Výkon + + + + &Performance + + + + + Priority + Priorita + + + + Select the priority for the MPlayer process. + + + + + Priority: + Priorita: + + + + realtime + Reálný Äas + + + + high + Vysoká + + + + abovenormal + Vyšší + + + + normal + Normální + + + + belownormal + Nižší + + + + idle + Nízká + + + + Cache + + + + + KB + KB + + + + Setting a cache may improve performance on slow media + Nastavením vyrovnávací pamÄ›ti lze zvýšit výkon pÅ™ehrávání z pomalých médií + + + + Allow frame drop + Povolit vypuÅ¡tÄ›ní snímku + + + + Allow hard frame drop (can lead to image distortion) + Povolit tvrdé vypuÅ¡tÄ›ní snímku (může vést ke zkreslení obrazu) + + + + Synchronization + Synchronizace + + + + Audio/video auto synchronization + Automatická synchronizace audia s videem + + + + Factor: + Faktor: + + + + Fast audio track switching + Rychlé pÅ™epínání audio stop + + + + Fast seek to chapters in dvds + Rychlé pÅ™eskakování kapitol u DVD + + + + Set process priority for mplayer according to the predefined priorities available under Windows.<br><b>WARNING:</b> Using realtime priority can cause system lockup. + Nastavení zmÄ›ny priority pro MPlayer pod Windows .<br><b>VAROVÃNÃ:</b> Použití priority reálného Äasu může způsobit zablokování systému. + + + + <br><b>Note:</b> This option is for Windows only. + <br><b>Poznámka:</b> tato možnost je pouze pro Windows. + + + + This option specifies how much memory (in kBytes) to use when precaching a file or URL. Especially useful on slow media. + Tento parametr specifikuje kolik pamÄ›ti (v KBytech) je použito pro pÅ™ednaÄtení souboru nebo URL. Použitelní hlavnÄ› pro pomalá média. + + + + Skip displaying some frames to maintain A/V sync on slow systems. + PÅ™eskoÄí zobrazování nÄ›kterých snímků potÅ™ebných pro A/V synchronizaci na pomalých systémech. + + + + Allow hard frame drop + + + + + More intense frame dropping (breaks decoding). Leads to image distortion! + CitlivÄ›jší vypouÅ¡tÄ›ní snímků (dekódování mezer). Způsobuje zkreslení obrazu! + + + + Gradually adjusts the A/V sync based on audio delay measurements. + PostupnÄ› mÄ›ní A/V synchronizaci založenou na zpožení velikosti audia. + + + + Priorit&y: + + + + + Si&ze: + + + + + &Use cache + + + + + &Allow frame drop + + + + + Allow &hard frame drop (can lead to image distortion) + + + + + Audio/&video auto synchronization + + + + + Fact&or: + + + + + &Fast audio track switching + + + + + Fast &seek to chapters in dvds + + + + + Create index if needed + + + + + Rebuilds index of files if no index was found, allowing seeking. Useful with broken/incomplete downloads, or badly created files. This option only works if the underlying media supports seeking (i.e. not with stdin, pipe, etc).<br> Note: the creation of the index may take some time. + + + + + &Create index if needed + + + + + If checked, it will try the fastest method to switch audio tracks but might not work with some formats. + + + + + If checked, it will try the fastest method to seek to chapters but it might not work with some discs. + + + + + PrefSubtitles + + + Subtitles + Titulky + + + + Choose a ttf file + Vybrat TTF soubor + + + + Truetype Fonts + TrueType fonty + + + + &Subtitles + &Titulky + + + + Autoload + Automatické naÄtení + + + + Autoload subtitles files (*.srt, *.sub...): + Automaticky naÄíst titulky (*.srt,*.sub...): + + + + Same name as movie + Stejný název jako video soubor + + + + All subs containing movie name + VÅ¡echny titulky obsahující název video souboru + + + + All subs in directory + VÅ¡echny titulky v adresáři + + + + Default subtitle encoding: + Výchozí kódování titulků: + + + + Position + + + + + 0 + 0 + + + + Top + + + + + Bottom + + + + + Include subtitles on screenshots + Snímky vÄetnÄ› titulků + + + + &Font + + + + + Font + Font + + + + TTF font: + TTF Font: + + + + Search... + Najít... + + + + System font: + Systémový font: + + + + Select the font which will be used for subtitles (and OSD): + VýbÄ›r fontu který bude použit pro titulky (a OSD): + + + + Size + Velikost + + + + Autoscale: + Automatické měřítko: + + + + No autoscale + Bez automatického měřítka + + + + Proportional to movie height + ProporcionálnÄ› k výšce videa + + + + Proportional to movie width + ProporcionálnÄ› k šířce videa + + + + Proportional to movie diagonal + ProporcionálnÄ› k úhlopříÄce videa + + + + Scale: + Měřítko: + + + + SSA/&ASS library + + + + + The new SSA/ASS library will provide nice styled subtitles for external SSA/ASS subtitles files and Matroska tracks. But it will be used too for rendering other formats like SUB and SRT files. + + + + + Use SSA/ASS library for subtitle rendering + Použít SSA/ASS knihovnu pro renderování titulků + + + + Text color: + Barva textu: + + + + Border color: + Barva pozadí: + + + + Here you can override styles for SSA/ASS subtitles. It can be also used for fine-tuning the rendering of SRT and SUB subtitles by the SSA/ASS library. Example: <b>Bold=1,Outline=2,Shadow=4</b> + + + + + Subtitle position + + + + + This option specifies the position of the subtitles over the video window. <i>100</i> means the bottom, while <i>0</i> means the top. + + + + + SSA/ASS styles + + + + + Au&toload subtitles files (*.srt, *.sub...): + + + + + S&elect first available subtitle + + + + + &Default subtitle encoding: + + + + + Default &position of the subtitles on screen + + + + + &Include subtitles on screenshots + + + + + &Use -subfont option (required by recent MPlayer releases) + + + + + &TTF font: + + + + + Sea&rch... + + + + + S&ystem font: + + + + + A&utoscale: + + + + + S&cale: + + + + + &Use SSA/ASS library for subtitle rendering + + + + + &Text color: + + + + + &Border color: + + + + + St&yles: + + + + + PreferencesDialog + + + SMPlayer - Help + + + + + OK + + + + + Cancel + + + + + Apply + + + + + Help + + + + + SMPlayer - Preferences + SMPlayer - Nastavení + + + + QObject + + + 1 second + + + + + %1 seconds + + + + + 1 minute + + + + + 1 minute and 1 second + + + + + 1 minute and %1 seconds + + + + + %1 minutes + + + + + %1 minutes and 1 second + + + + + %1 minutes and %2 seconds + + + + + will show this message and then will exit. + + + + + 'media' is any kind of file that SMPlayer can open. It can be a local file, a DVD (e.g. dvd://1), an Internet stream (e.g. mms://....) or a local playlist in format m3u. If the -playlist option is used, that means that SMPlayer will pass the -playlist option to MPlayer, so MPlayer will handle the playlist, not SMPlayer. + + + + + the main window will be closed when the file/playlist finishes. + + + + + This is SMPlayer v. %1 running on %2 + + + + + tries to make a connection to another running instance and send to it the specified action. Example: -send-action pause The rest of options (if any) will be ignored and the application will exit. It will return 0 on success or -1 on failure. + + + + + action_list is a list of actions separated by spaces. The actions will be executed just after loading the file (if any) in the same order you entered. For checkable actions you can pass true or false as parameter. Example: -actions "fullscreen compact true". Quotes are necessary in case you pass more than one action. + + + + + media + + + + + if there's another instance running, the media will be added to that instance's playlist. If there's no other instance, this option will be ignored and the files will be opened in a new instance. + + + + + specifies the directory for the configuration file (smplayer.ini). + + + + + the main window won't be closed when the file/playlist finishes. + + + + + Usage: %1 [-ini-path directory] [-send-action action_name] [-actions action_list [-close-at-end] [-no-close-at-end] [-fullscreen] [-no-fullscreen] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + + + + + the video will be played in fullscreen mode. + + + + + the video will be played in window mode. + + + + + SeekWidget + + + icon + + + + + label + oznaÄení + + + + ShortcutGetter + + + Modify shortcut + + + + + Clear + + + + + Press the key combination you want to assign + + + + + Capture + + + + + Capture keystrokes + + + + + VideoEqualizer + + + Equalizer + Equalizér + + + + Contrast + Kontrast + + + + Brightness + Jas + + + + Hue + Odstín + + + + Saturation + Sytost + + + + Gamma + Gamma + + + + &Reset + &Reset + + + + &Set as default values + &Nastavit jako výchozí hodnoty + + + + Use the current values as default values for new videos. + Použít stávající hodnoty jako výchozí pro nové videa. + + + + Set all controls to zero. + Nastavit vÅ¡echny ovládací prvky na nulu. + + + diff --git a/retroshare-gui/src/apps/smplayer/translations/smplayer_de.qm b/retroshare-gui/src/apps/smplayer/translations/smplayer_de.qm new file mode 100644 index 000000000..d91760bc7 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/translations/smplayer_de.qm differ diff --git a/retroshare-gui/src/apps/smplayer/translations/smplayer_de.ts b/retroshare-gui/src/apps/smplayer/translations/smplayer_de.ts new file mode 100644 index 000000000..444c5d69c --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/translations/smplayer_de.ts @@ -0,0 +1,4008 @@ + + + + + AboutDialog + + + Version: %1 + Version: %1 + + + + 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. + Dieses Programm ist freie Software; Sie können es weitergeben und/oder es unter den Bedingungen der allgemeinen GNU Lizenz verändern, wie es durch die Free Software-Foundation festgelegt wurde; entweder Version 2 der Lizenz, oder (nach ihrer Wahl) eine neuere Version. + + + + Translators: + Ãœbersetzer: + + + + German + Deutsch + + + + Slovak + Slowenisch + + + + Italian + Italienisch + + + + French + Französisch + + + + Simplified-Chinese + Vereinfachtes Chinesisch + + + + Russian + Russisch + + + + Hungarian + Ungarisch + + + + Japanese + Japanisch + + + + Dutch + Niederländisch + + + + Ukrainian + Ukrainisch + + + + Georgian + Georgisch + + + + Czech + Tschechisch + + + + Logo designed by %1 + Logo designed von %1 + + + + Get updates at: %1 + Updates erhalten von : %1 + + + + About SMPlayer + Ãœber SMPlayer + + + + Polish + Polnisch + + + + Bulgarian + Bulgarisch + + + + Turkish + Türkisch + + + + Swedish + Schwedisch + + + + Serbian + Serbisch + + + + Traditional Chinese + Traditionelles Chinesisch + + + + Romanian + Romanisch + + + + Portuguese - Brazil + Portugiesisch - Brasilien + + + + Portuguese - Portugal + Portugiesisch - Portugal + + + + Compiled with Qt %1 + Kompiliert mit Qt %1 + + + + %1, %2 and %3 + %1, %2 and %3 + + + + %1 and %2 + %1 and %2 + + + + http://smplayer.sourceforge.net/en/windows/download.php + If the web page is translated into your language you can change the URL so it points to the download page in the translation.Otherwise leave as is. + http://smplayer.sourceforge.net/en/windows/download.php + + + + http://smplayer.sourceforge.net/en/linux/download.php + If the web page is translated into your language you can change the URL so it points to the download page in the translation.Otherwise leave as is. + http://smplayer.sourceforge.net/en/linux/download.php + + + + <b>%1</b>: %2 + <b>%1</b>: %2 + + + + ActionsEditor + + + Name + Name + + + + Description + Beschreibung + + + + Shortcut + Tastaturkurzbefehl + + + + &Save + &Speichern + + + + &Load + &Laden + + + + Key files + Kurzbefehl-Dateien + + + + Choose a filename + Dateinamen auswählen + + + + Confirm overwrite? + Ãœberschreiben bestätigen ? + + + + The file %1 already exists. +Do you want to overwrite? + Die Datei %1 existiert bereits. +Ãœberschreiben ? + + + + Choose a file + Datei auswählen + + + + Error + Fehler + + + + The file couldn't be saved + Die Datei konnte nicht gespeichert werden + + + + The file couldn't be loaded + Die Datei konnte nicht geladen werden + + + + &Change shortcut... + &Tastaturkurzbefehl ändern... + + + + BaseGui + + + &File... + &Datei... + + + + D&irectory... + V&erzeichnis... + + + + &Playlist... + &Abspiellisten... + + + + &DVD from drive + &DVD im Laufwerk + + + + D&VD from folder... + D&VD Ordner... + + + + &URL... + &URL... + + + + P&lay + &Wiedergabe + + + + &Pause + &Pause + + + + &Stop + &Stop + + + + &Frame step + &Bildlauf + + + + &Repeat + &Wiederholen + + + + &Normal speed + &Normale Geschwindigkeit + + + + &Halve speed + &Halbe Geschwindigkeit + + + + &Double speed + &Doppelte Geschwindigkeit + + + + Speed &-10% + Geschwindigkeit &-10% + + + + Speed &+10% + Geschwindigkeit &+10% + + + + Sp&eed + &Geschwindigkeit + + + + &Fullscreen + &Vollbild + + + + &Compact mode + &Kompaktmodus + + + + &Equalizer + &Equalizer + + + + &Screenshot + &Bildschirmfoto + + + + S&tay on top + &Immer im Vordergrund + + + + &Postprocessing + &Nachbearbeitung + + + + &Autodetect phase + &Automatisch + + + + &Deblock + &Deblocking + + + + De&ring + De&ringing + + + + Add n&oise + &Rauschen hinzufügen + + + + F&ilters + F&ilter + + + + &Mute + &Stumm + + + + Volume &- + Leiser &- + + + + Volume &+ + Lauter &+ + + + + &Delay - + &Delay - + + + + D&elay + + D&elay + + + + + &Extrastereo + &Extrastereo + + + + &Karaoke + &Karaoke + + + + &Filters + &Filter + + + + &Load... + &Laden... + + + + Delay &- + Delay &- + + + + Delay &+ + Delay &+ + + + + &Up + &Hoch + + + + &Down + &Runter + + + + &Playlist + &Abspielliste + + + + &Show frame counter + &Anzahl der Einzelbilder anzeigen + + + + P&references + &Einstellungen + + + + &View logs + &Logs einsehen + + + + About &Qt + Ãœber &Qt + + + + About &SMPlayer + Ãœber &SMPlayer + + + + &Open + &Öffnen + + + + &Play + &Wiedergabe + + + + &Video + &Video + + + + &Audio + &Audio + + + + &Subtitles + &Untertitel + + + + &Browse + &Navigation + + + + Op&tions + &Optionen + + + + &Help + &Hilfe + + + + &Recent files + &Neueste Dateien + + + + &Clear + &Löschen + + + + Si&ze + &Größe + + + + &Aspect ratio + &Aspect Ratio + + + + &Deinterlace + &Deinterlacing + + + + De&noise + &Rauschfilter + + + + &Autodetect + &Automatisch + + + + &4:3 + &4:3 + + + + &5:4 + &5:4 + + + + &14:9 + &14:9 + + + + 16:&9 + 16:&9 + + + + 1&6:10 + 1&6:10 + + + + &2.35:1 + &2.35:1 + + + + 4:3 &Letterbox + 4:3 &Letterbox + + + + 16:9 L&etterbox + 16:9 L&etterbox + + + + 4:3 &Panscan + 4:3 &Pan && Scan + + + + 4:3 &to 16:9 + 4:3 &zu 16:9 + + + + &None + &Keine + + + + &Lowpass5 + &Tiefpass(filter)5 + + + + Linear &Blend + &Lineare Ãœberblendung + + + + N&ormal + N&ormal + + + + &Soft + &Soft + + + + &Track + &Spur + + + + &Channels + &Kanäle + + + + &Stereo mode + &Stereo Mode + + + + &Default + S&tandard + + + + &Stereo + &Stereo + + + + &4.0 Surround + &4.0 Surround + + + + &5.1 Surround + &5.1 Surround + + + + &Left channel + &Linker Kanal + + + + &Right channel + &Rechter Kanal + + + + &Select + &Auswahl + + + + &Title + &Titel + + + + &Chapter + &Kapitel + + + + &Angle + &Blickwinkel + + + + &OSD + &OSD + + + + &Disabled + &Ausgeschaltet + + + + &Seek bar + &Zeitleiste + + + + &Time + &Zeit + + + + Time + T&otal time + Zeit + Zeit t&otal + + + + SMPlayer - mplayer log + SMPlayer - mplayer log + + + + SMPlayer - smplayer log + SMPlayer - smplayer log + + + + <empty> + <leer> + + + + Video + Video + + + + Audio + Audio + + + + Playlists + Abspiellisten + + + + All files + Alle Dateien + + + + Choose a file + Datei wählen + + + + SMPlayer - Information + SMPlayer - Information + + + + The CDROM / DVD drives are not configured yet. +The configuration dialog will be shown now, so you can do it. + Die CDROM /DVD Laufwerke wurden nocht nicht konfiguriert. +Das kann im folgenden Konfigurationsdialog gemacht werden. + + + + Choose a directory + Verzeichnis auswählen + + + + Subtitles + Untertitel + + + + About Qt + Ãœber Qt + + + + Playing %1 + Wiedergabe %1 + + + + Pause + Pause + + + + Stop + Stop + + + + Play / Pause + Wiedergabe / Pause + + + + Pause / Frame step + Pause / Bildlauf + + + + U&nload + &Entladen + + + + V&CD + V&CD + + + + C&lose + &Schließen + + + + View &info and properties... + Ansicht &Info und Eigenschaften... + + + + Zoom &- + Zoom &- + + + + Zoom &+ + Zoom &+ + + + + &Reset + &Reset + + + + Move &left + &Nach links bewegen + + + + Move &right + &Nach rechts bewegen + + + + Move &up + &Hoch bewegen + + + + Move &down + &Runter bewegen + + + + &Pan && scan + &Pan && Scan + + + + &Previous line in subtitles + &Vorherige Untertitelzeile + + + + N&ext line in subtitles + &Nächste Untertitelzeile + + + + -%1 + -%1 + + + + +%1 + +%1 + + + + Dec volume (2) + Leiser (2) + + + + Inc volume (2) + Lauter (2) + + + + Exit fullscreen + Vollbild beenden + + + + OSD - Next level + OSD - Nächste Stufe + + + + Dec contrast + Kontrast - + + + + Inc contrast + Kontrast + + + + + Dec brightness + Helligkeit - + + + + Inc brightness + Helligkeit + + + + + Dec hue + Farbe - + + + + Inc hue + Farbe + + + + + Dec saturation + Sättigung - + + + + Dec gamma + Gamma - + + + + Next audio + Nächste Audiodatei + + + + Next subtitle + Nächster Untertitel + + + + Next chapter + Nächstes Kapitel + + + + Previous chapter + Vorheriges Kapitel + + + + Inc saturation + Sättigung + + + + + Inc gamma + Gamma + + + + + Toggle double size + Doppelte Größe schalten + + + + &Load external file... + &Externe Datei laden... + + + + &Kerndeint + &Kerndeint + + + + &Yadif (normal) + &Yadif (Normal) + + + + Y&adif (double framerate) + Y&adif (Doppelte Framerate) + + + + &Next + &Nächster + + + + Pre&vious + &Vorheriger + + + + Volume &normalization + Lautstärke &normalisieren + + + + &Audio CD + &Audio CD + + + + Denoise nor&mal + &Rauschfilter normal + + + + Denoise &soft + &Rauschfilter soft + + + + Denoise o&ff + &Rauschfilter aus + + + + SMPlayer - Enter URL + SMPlayer - Eingabe URL + + + + URL: + URL: + + + + Use SSA/&ASS library + Benutze SSA/&ASS Programmbibliothek + + + + Flip i&mage + &Bild spiegeln + + + + &Toggle double size + &Doppelte Größe schalten + + + + BaseGuiPlus + + + SMPlayer is still running here + SMPlayer läuft noch hier + + + + S&how icon in system tray + &Icon im Sytem-Tray zeigen + + + + &Hide + &Ausblenden + + + + &Restore + &Wiederherstellen + + + + &Recent files + &Neueste Dateien + + + + &Quit + &Beenden + + + + Playlist + Abspielliste + + + + Core + + + Brightness: %1 + Helligkeit: %1 + + + + Contrast: %1 + Kontrast: %1 + + + + Gamma: %1 + Gamma: %1 + + + + Hue: %1 + Farbe: %1 + + + + Saturation: %1 + Sättigung: %1 + + + + Volume: %1 + Lautstärke: %1 + + + + Zoom: %1 + Zoom: %1 + + + + DefaultGui + + + Welcome to SMPlayer + Willkommen im SMPlayer + + + + Volume + Lautstärke + + + + Audio + Audio + + + + Subtitle + Untertitel + + + + Playlist + Abspielliste + + + + &Main toolbar + &Hauptsymbolleiste + + + + &Language toolbar + &Symbolleiste für Sprachen + + + + &Toolbars + &Symbolleisten + + + + Encodings + + + Western European Languages + West-Europäische Sprachen + + + + Western European Languages with Euro + West-Europäische Sprachen mit Euro + + + + Slavic/Central European Languages + Slavische/Zentral-Europäische Sprachen + + + + Esperanto, Galician, Maltese, Turkish + Esperanto, Galicisch, Maltesisch, Türkisch + + + + Old Baltic charset + Alte Baltische Zeichenkodierung + + + + Cyrillic + Kyrillisch + + + + Arabic + Arabisch + + + + Modern Greek + Modern Griechisch + + + + Turkish + Türkisch + + + + Baltic + Baltisch + + + + Celtic + Celtic + + + + Hebrew charsets + Hebräische Zeichkodierung + + + + Russian + Russisch + + + + Ukrainian, Belarusian + Ukrainisch, Weißrussisch + + + + Simplified Chinese charset + Vereinfachte Chinesische Zeichenkodierung + + + + Traditional Chinese charset + Traditionelle Chinesische Zeichnenkodierung + + + + Japanese charsets + Japanische Zeichenkodierung + + + + Korean charset + Koreanische Zeichenkodierung + + + + Thai charset + Thailändische Zeichenkodierung + + + + Cyrillic Windows + Kyrillisch Windows + + + + Slavic/Central European Windows + Slavisch/Zentral-Europäisches Windows + + + + Arabic Windows + Arabisches Windows + + + + EqSlider + + + icon + Icon + + + + FilePropertiesDialog + + + SMPlayer - File properties + SMPlayer - Datei-Eigenschaften + + + + &Information + &Information + + + + &Demuxer + &Demuxer + + + + &Select the demuxer that will be used for this file: + &Auswahl Demuxer, der auf die Datei angewendet wird: + + + + &Reset + &Reset + + + + &Video codec + &Video-Codec + + + + &Select the video codec: + &Auswahl Video-Codec: + + + + A&udio codec + A&udio-Codec + + + + &Select the audio codec: + &Auswahl Audio-Codec: + + + + &MPlayer options + &MPlayer Optionen + + + + Additional Options for MPlayer + Zusätzliche Optionen für MPlayer + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + Hier können zusätzliche mplayer-Optionen angeben werden. +Angaben werden durch Leerzeichen getrennt . +Beispiel: -flip -nosound + + + + &Options: + &Optionen: + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + Zusätzliche Angaben für Videofilter. +Angaben werden durch "," gerennt. +Keine Leerzeichen verwenden! Beispiel: scale=512:-2,eq2=1.1 + + + + V&ideo filters: + &Videofilter: + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + Audiofilter. +Regeln wie bei den Videofiltern. +Beispiel: resample=44100:0:0,volnorm + + + + Audio &filters: + &Audiofilter: + + + + OK + OK + + + + Cancel + Abbrechen + + + + Apply + Ãœbernehmen + + + + InfoFile + + + General + Allgemein + + + + Size + Größe + + + + %1 KB (%2 MB) + %1 KB (%2 MB) + + + + URL + URL + + + + Length + Dauer + + + + Demuxer + Demuxer + + + + Name + Name + + + + Artist + Künstler + + + + Author + Autor + + + + Album + Album + + + + Genre + Genre + + + + Date + Datum + + + + Track + Track + + + + Copyright + Urheberrecht + + + + Comment + Kommentar + + + + Software + Software + + + + Clip info + Clip Info + + + + Video + Video + + + + Resolution + Auflösung + + + + Aspect ratio + Aspect Ratio + + + + Format + Format + + + + Bitrate + Bitrate + + + + %1 kbps + %1 kbps + + + + Frames per second + Bilder pro Sekunde + + + + Selected codec + Verwendeter Codec + + + + Initial Audio Stream + Startwert Audio Stream + + + + Rate + Samplingrate + + + + %1 Hz + %1 Hz + + + + Channels + Kanäle + + + + Audio Streams + Audio Stream + + + + Language + Sprache + + + + empty + leer + + + + Subtitles + Untertitel + + + + Type + Typ + + + + ID + Info for translators: this is a identification code + ID + + + + # + Info for translators: this is a abbreviation for number + # + + + + Stream title + Streamtitel + + + + Stream URL + Stream URL + + + + File + Datei + + + + InputDVDDirectory + + + Choose a directory + Verzeichnis auswählen + + + + SMPlayer - Play a DVD from a folder + SMPlayer -Wiedergabe DVD aus einem Ordner + + + + You can play a dvd from your hard disc. Just select the folder which contains the VIDEO_TS and AUDIO_TS directories. + Wiedergabe der DVD, kann auch von der Festplatte erfolgen. +Auswahl des Ordners, der das VIDEO_TS und das AUDIO_TS Verzeichnis enthält. + + + + Choose a directory... + Verzeichnis auswählen... + + + + InputURL + + + SMPlayer - Enter URL + SMPlayer - Eingabe URL + + + + &URL: + &URL: + + + + It's a &playlist + &Es ist ein Abspielliste + + + + If this option is checked, the URL will be treated as a playlist: it will be opened as text and will play the URLs in it. + Wenn diese Option aktiviert ist, werden URLS in die Abspielliste mit einbezogen, als Text dargestellt und abgespielt. + + + + LogWindow + + + Choose a filename to save under + Wähle Dateinamen für speichern unter + + + + Confirm overwrite? + Ãœberschreiben bestätigen ? + + + + The file already exists. +Do you want to overwrite? + Die Datei existiert bereits. +Ãœberschreiben ? + + + + Error saving file + Fehler beim Speichern der Datei + + + + The log couldn't be saved + Log-Datei konnte nicht gespeichert werden + + + + Logs + Logs + + + + LogWindowBase + + + Log Window + Log Window + + + + Save + Speichern + + + + Copy to clipboard + Kopiere zum Clipboard + + + + Close + Schließen + + + + &Close + &Schließen + + + + Playlist + + + Name + Name + + + + Length + Dauer + + + + Choose a file + Datei auswählen + + + + Choose a filename + Dateinamen auswählen + + + + Confirm overwrite? + Ãœberschreiben bestätigen ? + + + + Select one or more files to open + Auswahl von einer, oder mehrerer Dateien, zum Öffnen + + + + Choose a directory + Verzeichnis auswählen + + + + The file %1 already exists. +Do you want to overwrite? + Die Datei %1 existiert bereits. +Ãœberschreiben ? + + + + Edit name + Name bearbeiten + + + + Type the name that will be displayed in the playlist for this file: + Den Dateinamen schreiben, wie er in der Abspielliste angezeigt werden soll: + + + + &Play + &Wiedergabe + + + + &Edit + &Bearbeiten + + + + Playlists + Abspiellisten + + + + All files + Alle Dateien + + + + &Load + &Laden + + + + &Save + &Speichern + + + + &Next + &Nächster + + + + Pre&vious + &Vorheriger + + + + Move &up + &Hoch bewegen + + + + Move &down + &Runter bewegen + + + + &Repeat + &Wiederholen + + + + S&huffle + &Zufall + + + + Add &current file + &Aktuelle Datei hinzufügen + + + + Add &file(s) + &Datei(en) hinzufügen + + + + Add &directory + &Verzeichnis hinzufügen + + + + Remove &selected + &Ausgewählte Datei entfernen + + + + Remove &all + &Alles entfernen + + + + Add... + Hinzufügen... + + + + Remove... + Entfernen... + + + + SMPlayer - Playlist + SMPlayer - Abspielliste + + + + Playlist modified + Abspielliste geändert + + + + There are unsaved changes, do you want to save the playlist? + Ungesicherte Änderungen, soll die Abspielliste gespeichert werden ? + + + + PrefAdvanced + + + Advanced + Erweitert + + + + Auto + Auto + + + + Form + Form + + + + &Advanced + &Erweitert + + + + icon + Icon + + + + Additional Options for MPlayer + Zusätzliche Optionen für MPlayer + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + Hier können zusätzliche mplayer-Optionen angeben werden. +Angaben werden durch Leerzeichen getrennt . +Beispiel: -flip -nosound + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + Zusätzliche Angaben für Videofilter. +Angaben werden durch "," gerennt. Keine Leerzeichen verwenden! +Beispiel: scale=512:-2,eq2=1.1 + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + Audiofilter. +Regeln wie bei den Videofiltern. +Beispiel: resample=44100:0:0,volnorm + + + + Don't repaint the background of the video window + Hintergrund vom Videofenster nicht ausfüllen + + + + &Logs + &Logs + + + + Log MPlayer output + Log mplayer Ausgabe + + + + Log SMPlayer output + Log SMPlayer Ausgabe + + + + This option is mainly intended for debugging the application. + Diese Option ist hauptsächlich zum Austesten der Anwendung. + + + + &MPlayer language + &Mplayer Sprache + + + + SMPlayer needs to read and parse the output of MPlayer and sometimes it relies on English text. If you are using a MPlayer translated into another language, then you need to change the texts that SMPlayer looks for. (Technically you should enter regular expressions)<br><br> +The drop-down lists may provide already made regular expression for several languages. + SMPlayer muß die meist englischsprachige Textausgabe von MPlayer lesen und analysieren. Liegt eine übersetzte MPlayer-Version vor, muß die Textsuche von SMPlayer angepasst werden.(Technisch sollten reguläre Ausdrücke eintragen werden) <br><br> +Die Auswahl-Liste enthält evt.schon die regulären Ausdrücke. + + + + Checking this option may reduce flickering, but it also might produce that the video won't be displayed properly. + Aktivieren der Option kann Flackern/Flimmern verringern, aber es könnte auch sein, dass das Video nicht mehr ordentlich dargestellt wird. + + + + If checked, smplayer will store the output of mplayer (you can see it in <b>Options->View logs->mplayer</b>). In case of problems this log can contain important information, so it's recommended to keep this option checked. + Die Ausgabeinformationen von mplayer kann optinoal von smplayer gespeichert werden.(hier zu finden <b>Optionen->Logs einsehen->mplayer</b>. In Problemfällen können die Logs wichtige Informationen enthalten,daher wird diese Option empfohlen. + + + + If this option is checked, smplayer will store the debugging messages that smplayer outputs (you can see the log in <b>Options->View logs->smplayer</b>). This information can be very useful for the developer in case you find a bug. + Optional speichert smplayer die debugging Informationen von smplayer. (Hier zu finden <b>Optionen->Logs einsehen->smplayer</b>) Diese Informationen können wichtig für Entwickler, bei der Fehlersuche, sein. + + + + Filter for SMPlayer logs + Filter für SMPlayer Logs + + + + This option allows to filter the smplayer messages that will be stored in the log. Here you can write any regular expression.<br>For instance: <i>^Core::.*</i> will display only the lines starting with <i>Core::</i> + Optional können Nachrichten von smplayer gefiltert werden. Hier kann man irgendeinen regelulärer Ausdruck schreiben.<br>Zum Beispiel: <i>^Core::.*</i> Nur Zeilen werden dargestellt, beginned mit <i>Core: :</i> + + + + &Monitor aspect: + &Seitenverhältnis: + + + + &Run MPlayer in its own window + &Wiedergabe im Mplayer-Fenster + + + + &Options: + &Optionen: + + + + V&ideo filters: + &Videofilter: + + + + Audio &filters: + &Audiofilter: + + + + &Colorkey: + &Farbschlüssel: + + + + &Don't repaint the background of the video window + &Hintergrund vom Videofenster nicht ausfüllen + + + + Log &MPlayer output + Log &MPlayer Ausgabe + + + + Log &SMPlayer output + Log &SMPlayer Ausgabe + + + + &Filter for SMPlayer logs: + &Filter für SMPlayer Logs: + + + + &End of file: + &Dateiende: + + + + &No video: + &Kein Video: + + + + C&hange... + &Ändern… + + + + PrefAssociations + + + Warning + Warnung + + + + Not all files could be associated. Please check your security permissions and retry. + Nicht alle Dateitypen konnten assoziiert werden. Bitte die Sicheheitseinstellungen üperprüfen und erneut versuchen. + + + + File Types + Dateitypen + + + + Select all + Alles auswählen + + + + Check all file types in the list + Aktivieren aller Dateitypen in der Liste + + + + Uncheck all file types in the list + Deaktivieren aller Dateitypen in der Liste + + + + List of file types + Liste der Dateitypen + + + + File types + Dateitypen + + + + Media files handled by SMPlayer: + Mediadateien die von SMPlayer verarbeitet werden: + + + + Select All + Alles auswählen + + + + Select None + Nichts auswählen + + + + Check the media file extensions you would like SMPlayer to handle. When you click Apply, the checked files will be associated with SMPlayer. If you uncheck a media type, the file association will be restored. + Aktivieren der Mediadateien, die mit SMPlayer assoziiert werden sollen. Anwenden anklicken, assoziiert die aktivierten Dateien mit SMPlayer. Deaktivierte Dateien werden wiederhergestellt. + + + + Select none + Nichts auswählen + + + + PrefDrives + + + Drives + Laufwerke + + + + Currently SMPlayer does not autodetect cdrom or dvd devices. So in order to play cdroms or dvds you must first select here your cdrom and dvd drives (can be the same). + Momentan kann SMPlayer CD- und DVD-Laufwerke nicht automatisch finden. +Um CDs oder DVDs abzupielen, müßen die Laufwerke vorher bestimmt werden +(Ein Laufwerk kann auch doppelt eingetragen werden). + + + + icon + Icon + + + + Select your CD device: + CD Laufwerk auswählen: + + + + Select your DVD device: + DVD Laufwerk auswählen: + + + + CD device + CD Laufwerk + + + + Choose your CDROM device. It will be used to play VCDs and Audio CDs. + CDROM Lauwerk auswählen. Erforderlich zum Abspielen von VCDs und Audio CDs. + + + + DVD device + DVD Laufwerk + + + + Choose your DVD device. It will be used to play DVDs. + DVD Laufwerk auswählen. Erforderlich zum Abspielen von DVDs. + + + + Select your &CD device: + &CD Laufwerk auswählen: + + + + Select your &DVD device: + &DVD Laufwerk auswählen: + + + + PrefGeneral + + + General + Allgemein + + + + &General + &Allgemein + + + + Paths + Pfade + + + + Select... + Auswahl... + + + + Folder for storing screenshots: + Verzeichnis für Bilschirmfotos: + + + + Search... + Suchen... + + + + Select the MPlayer executable: + Die ausführbare mplayer-Datei auswählen: + + + + Output drivers + Ausgabe Gerätetreiber + + + + Video: + Video: + + + + Audio: + Audio: + + + + Media settings + Media-Einstellungen + + + + Remember settings for all files (audio track, subtitles...) + Einstellungen für alle Dateien beibehalten (Audiospur, Untertitel...) + + + + Don't remember time position (files start playing from the beginning) + Zeitposition nicht wieder herstellen (Wiedergabe startet von Anfang an) + + + + Preferred audio and subtitles + Bevorzugter Ton und Untertitel + + + + Subtitles: + Untertitel: + + + + &Video and audio + &Video und Audio + + + + Video + Video + + + + Use software video equalizer + Benutze Software-Video-Equalizer + + + + Enable postprocessing for all videos + Nachbearbeitung für alle Videos aktivieren + + + + Quality: + Qualität: + + + + Start videos in fullscreen + Starte Video im Vollbildmodus + + + + Disable screensaver + Bilschirmschoner abschalten + + + + Audio + Audio + + + + Use software volume control + Benutze Software-Lautstärkeregelung + + + + Max. Amplification: + Max. Verstärker: + + + + AC3/DTS pass-through S/PDIF + AC3/DTS über S/PDIF + + + + Volume normalization + Lautstärke normalisieren + + + + Select the mplayer executable + mplayer (*.exe) auswählen + + + + Executables + Ausführbare Datei + + + + All files + Alle Dateien + + + + Select a directory + Verzeichnis auswählen + + + + MPlayer executable + Ausführbare Mplayer-Datei + + + + Here you must specify the mplayer executable that smplayer will use.<br>smplayer requires at least mplayer 1.0rc1 (svn recommended).<br><b>If this setting is wrong, smplayer won't be able to play anything!</b> + Hier muß die ausführbare mplayer-Datei angegeben werden.<br> smplayer benötigt mindestens mplayer 1.0rc1 (svn empfohlen)<br><b>Sollte diese Einstellung falsch sein, ist die Wiedergabe von smplayer ausser Funktion.</b> + + + + Screenshots folder + Order Bilschirmfotos + + + + Here you can specify a folder where the screenshots taken by smplayer will be stored. If this field is empty the screenshot feature will be disabled. + Hier wird der Order zur Speicherung der Bildschirmfotos festgelegt. +Ohne Eingabe wird die Funktion abgeschaltet. + + + + Video output driver + Video-Ausgabetreiber + + + + Select the video output driver. Usually xv (linux) and directx (windows) provide the best performance. + Auswahl Videoausgabe Treiber. Gewöhnlich erzielt xv (Linux) und DirectX (Windows) die beste Leistung. + + + + Audio output driver + Audio-Ausgabetreiber + + + + Select the audio output driver. + Audioausgabe Treiber wählen. + + + + Remember settings + Einstellungen beibehalten + + + + Usually smplayer will remember the settings for each file you play (audio track selected, volume, filters...). Uncheck this option if you don't like this feature. + Normalerweise erinnert sich smplayer an die Einstellungen jeder wiedergegebenen Datei (gewählte Tonspur, Lautstärke,Filter...). Bei Nichtgefallen,abstellen. + + + + Don't remember time position + Zeitposition nicht wieder herstellen + + + + If you check this option, smplayer will play all files from the beginning. + Mit dieser Option erfolgt die smplayer Wiedergabe aller Dateien immer von Anfang an. + + + + Preferred audio language + Bevorzugte Audio-Sprache + + + + Here you can type your preferred language for the audio streams. When a media with multiple audio streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the audio streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the audio track if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + Hier kann die bevorzugte Sprache der Tonspur gewählt werden.Bei Medien mit mehreren Tonspuren,wird Smplayer versuchen die bevorzugte Sprache zu benutzen.Das funktioniert nur mit Medien die eine Info über die Tonspuren bereit stellen, wie DVDs oder mkv-Dateien.<br>Das Feld akzeptiert normale Ausdrücke. Beispiel: <b>es|esp|spa</b> die Tonspur mit folgender Info wird ausgewählt <i>es</i>, <i>esp</i> or <i>spa</i>. + + + + Preferred subtitle language + Bevorzugte Untertitel-Sprache + + + + Here you can type your preferred language for the subtitle stream. When a media with multiple subtitle streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the subtitle streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the subtitle stream if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + Hier kann die bevorzugte Sprache der Tonspur gewählt werden.Bei Medien mit mehreren Tonspuren,wird Smplayer versuchen die bevorzugte Sprache zu benutzen.Das funktioniert nur mit Medien die eine Info über die Tonspuren bereit stellen, wie DVDs oder mkv-Dateien.<br>Das Feld akzeptiert normale Ausdrücke. Beispiel: <b>es|esp|spa</b> die Tonspur mit folgender Info wird ausgewählt <i>es</i>, <i>esp</i> or <i>spa</i>. + + + + Software video equalizer + Software Video Equalizer + + + + You can check this option if video equalizer is not supported by your graphic card or the selected video output driver.<br><b>Note:</b> this option can be incompatible with some video output drivers. + Option, falls der Video-Equalizer die Grafikkarte, oder den Video-Ausgabe Treiber nicht unterstützt.<br><b>Hinweis:</b> Die Option kann inkompatibel zu einigen Video-Ausgabe Treibern sein. + + + + If this option is checked, all videos will start to play in fullscreen mode. + Mit dieser Option erfolgt die Wiedergabe von smplayer im Vollbild-Modus. + + + + Check this option to disable the screensaver while playing.<br>The screensaver will enabled again when play finishes.<br><b>Note:</b> This option works only in X11 and Windows. + Optional kann der Bildschirmschoner während der Wiedergabe deaktiviert werden.<br> Aktiviert wird der Bildschirmschoner nach Beendigung der Wiedergabe.<br><b> Diese Option ist nur für X11 und Windows. + + + + Software volume control + Software Lautstärkenkontrolle + + + + Check this option to use the software mixer, instead of using the sound card mixer. + Optional kann der Software-Mixer anstelle des Karten-Mixers eingestellt werden. + + + + Postprocessing quality + Qualität der Nachbearbeitung + + + + Dynamically changes the level of postprocessing depending on the available spare CPU time. The number you specify will be the maximum level used. Usually you can use some big number. + Ändert dynamisch das Niveau der Nachbearbeitung, abhängig von der vorhandenen freien CPU Zeit. Die spezifizierte Zahl, ist das maximale benutzte Niveau. Normalerweise kann irgendeine grosse Zahl angeben werden. + + + + Change volume + Lautstärke ändern + + + + If checked, SMPlayer will remember the volume for every file and will restore it when played again. For new files the default volume will be used. + Falls aktiviert, erinnert sich SMPlayer an die Lautstärke für jede Datei und stellt sie wieder her, sobald die Datei gespielt wird. Für neue Dateien gilt die Standard-Lautstärke. + + + + Default volume: + Standard Lautstärke: + + + + 0 + 0 + + + + &Change volume on every file + &Lautstärke für jede Datei ändern + + + + &Search... + &Suchen... + + + + S&elect... + &Auswahl... + + + + Select the &MPlayer executable: + &Die ausführbare Mplayer-Datei auswählen: + + + + &Folder for storing screenshots: + &Verzeichnis für Bilschirmfotos: + + + + V&ideo: + V&ideo: + + + + &Audio: + &Audio: + + + + &Don't remember time position (files start playing from the beginning) + &Zeitposition nicht wieder herstellen (Wiedergabe startet von Anfang an) + + + + &Remember settings for all files (audio track, subtitles...) + &Einstellungen für alle Dateien beibehalten (Audiospur, Untertitel...) + + + + A&udio: + A&udio: + + + + Su&btitles: + &Untertitel: + + + + &Use software video equalizer + &Benutze Software-Video-Equalizer + + + + &Enable postprocessing for all videos + &Nachbearbeitung für alle Videos aktivieren + + + + &Quality: + &Qualität: + + + + Start videos in &fullscreen + &Starte Video im Vollbildmodus + + + + Disable &screensaver + &Bilschirmschoner abschalten + + + + &Default volume: + &Standard Lautstärke: + + + + Use s&oftware volume control + &Benutze Software-Lautstärkeregelung + + + + Ma&x. Amplification: + &Max. Verstärker: + + + + &AC3/DTS pass-through S/PDIF + &AC3/DTS über S/PDIF + + + + Volume &normalization + Lautstärke &normalisieren + + + + Direct rendering + Direktes Rendern + + + + If checked, turns on direct rendering (not supported by all codecs and video outputs)<br><b>WARNING:</b> May cause OSD/SUB corruption! + Diese Option aktiviert direktes Rendern (wird nicht von allen Video-Codecs und Video-Ausgaben unterstützt)<br><b>WARNUNG:</b> Eventuelle OSD/SUB Fehler! + + + + Double buffering + Doppelpufferung + + + + D&irect rendering + &Direktes Rendern + + + + Dou&ble buffering + &Doppelpufferung + + + + Double buffering fixes flicker by storing two frames in memory, and displaying one while decoding another. If disabled it can affect OSD negatively, but often removes OSD flickering. + Doppelpufferung verhindert Flackern, indem zwei Bilder zwischen gespeichert werden, eins wird dekodiert, das andere angezeigt .Falls abgeschaltet, kannes sich negativ im OSD auswirken, aber meistens entfernt es Flackern im OSD. + + + + &Enable postprocessing by default + &Nachbearbeitung als Standard aktivieren + + + + Volume &normalization by default + Lautstärke &normalisieren als Standard + + + + Close when finished + Schließen, wenn beendet + + + + If this option is checked, the main window will be automatically closed when the current file/playlist finishes. + Wenn diese Option aktiviert ist, wird das Hauptfenster automatisch geschlossen, wenn die aktuelle Datei/Abspielliste beendet ist. + + + + &Close when finished + &Schließen, wenn beendet + + + + 2 (Stereo) + 2 (Stereo) + + + + 4 (4.0 Surround) + 4 (4.0 Surround) + + + + 6 (5.1 Surround) + 6 (5.1 Surround) + + + + C&hannels by default: + &Kanäle als Standard: + + + + &Pause when minimized + &Pause wenn minimiert + + + + Pause when minimized + Pause wenn minimiert + + + + If this option is enabled, the file will be paused when the main window is hidden. When the window is restored, play will be resumed. + Ist diese Option aktiviert, wird die Datei pausieren, wenn das Hauptfenster verdeckt ist. Ist das Hauptfenster wieder hergestellt, wird das Abspielen fortgesetzt. + + + + Enable postprocessing by default + Nachbearbeitung als Standard aktivieren + + + + Max. Amplification + Max. Verstärker + + + + Volume normalization by default + Lautstärke normalisieren als Standard + + + + Maximizes the volume without distorting the sound. + Laustärke maximieren, ohne den Ton zu verzerren. + + + + Default volume + Standard Lautstärke + + + + Sets the initial volume that new files will use. + Ausgangslautstärke für neue Dateien festlegen. + + + + Channels by default + Kanäle als Standard + + + + Sets the maximum amplification level in percent (default: 110). A value of 200 will allow you to adjust the volume up to a maximum of double the current level. With values below 100 the initial volume (which is 100%) will be above the maximum, which e.g. the OSD cannot display correctly. + Stellt das maximale Verstärker-Niveau ein (Standard: 100). Ein Wert von 200 erlaubt , die Standard Lautstärke bis zu einem verdoppelten Maximum zu justieren. Mit Werten unter 100, ist die Anfangslautstärke (die 100% ist), über dem Maximum, das z.B. OSD nicht richtig anzeigen kann. + + + + Uses hardware AC3 passthrough + Benutze Hardware AC3 Durchlauf + + + + Requests the number of playback channels. MPlayer asks the decoder to decode the audio into as many channels as specified. Then it is up to the decoder to fulfill the requirement. This is usually only important when playing videos with AC3 audio (like DVDs). In that case liba52 does the decoding by default and correctly downmixes the audio into the requested number of channels. NOTE: This option is honored by codecs (AC3 only), filters (surround) and audio output drivers (OSS at least). + Anfrage der Anzahl von Playback Kanälen. Mplayer fragt den Decoder, den Ton in die angebenen Anzahl der Känäle zu decodieren. Damit sind die Bedingungen für den Decoder erfüllt. Das ist hauptsächlich wichtig, bei Videos mit AC3 Ton (meist DVD). In diesem Fall decodiert liba52 und sorgt für den korrekten Downmix der Kanäle, wie angefordert. Hinweis: Diese Option wird ermöglicht durch AC3 Codecs, Filter für Surround, und Audio-Ausgabe-Treibern (mindestens OSS). + + + + Postprocessing will be used by default on new opened files. + Nachbearbeitung als Standard für neu geöffnete Dateien. + + + + PrefInput + + + Keyboard and mouse + Tastatur und Maus + + + + None + Nichts + + + + &Keyboard + &Tastatur + + + + icon + Icon + + + + Here you can change any key shortcut. To do it double click or start typing over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + Hier kann jeder Tastaturkurzbefehl geändert werden. Doppelklick, oder direktes editieren, in dem Eingabefeld des Tastaturkurzbefehls. Optional kann die Liste zur Weitergabe gespeichert und auf einem anderen Computer weiterverwendet werden. + + + + &Mouse + &Maus + + + + Button functions: + Tasten-Funktion: + + + + Media seeking + Media Positionierung + + + + Volume control + Kontrolle Lautstärke + + + + Zoom video + Zoom Video + + + + Here you can change any key shortcut. To do it double click or press enter over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + Hier kann jeder Tastaturkurzbefehl geändert werden. Doppelklick, oder direktes editieren, in dem Eingabefeld des Tastaturkurzbefehls. Optional kann die Liste zur Weitergabe gespeichert und auf einem anderen Computer weiterverwendet werden. + + + + &Left click + &Click links + + + + &Double click + &Doppel Click + + + + &Wheel function: + &(Maus) Rad-Funktion: + + + + Shortcut editor + Tastaturkurzbefehl Editor + + + + This table allows you to change the key shortcuts of most available actions. Double click or press enter on a item, or press the <b>Change shortcut</b> button to enter in the <i>Modify shortcut</i> dialog. There are two ways to change a shortcut: if the <b>Capture</b> button is on then just press the new key or combination of keys that you want to assign for the action (unfortunately this doesn't work for all keys). If the <b>Capture</b> button is off then you could enter the full name of the key. + In dieser Tabelle können die Tastaurkurzbefehle geändert werden. Doppelklick oder Enter auf einem Begriff, oder drücken der <b>Tastaturkurzbefehl ändern</b> Taste, um in den <i>Tastaurkurzbefehl modifizieren<i> Modus zu gelangen. Es gibt zwei Wege den Kurzbefehl zu änder: Mit der <b> Erfassen<b> Taste und der anschließenden Eingabe durch die Tastatur (leider funktioniert das nicht bei allen Tasten). Ist die<b> Erfassen<b> Taste ohne Funktion, wird die Kombination eingetippt. + + + + Left click + Click links + + + + Select the action for left click on the mouse. + Auswahl der Aktion, oder links Click mit der Maus. + + + + Double click + Doppel Click + + + + Select the action for double click on the mouse. + Aktion für Doppel Click der Maus auswählen. + + + + Wheel function + (Maus) Rad-Funktion + + + + Select the action for the mouse wheel. + Aktion für (Maus) Rad auswählen. + + + + PrefInterface + + + Interface + Interface + + + + Bulgarian + Bulgarisch + + + + Czech + Tschechisch + + + + German + Deutsch + + + + Greek + Griechisch + + + + English + Englisch + + + + Spanish + Spanisch + + + + Finnish + Finnisch + + + + French + Französisch + + + + Hungarian + Ungarisch + + + + Italian + Italienisch + + + + Japanese + Japanisch + + + + Georgian + Georgisch + + + + Dutch + Niederländisch + + + + Polish + Polnisch + + + + Portuguese - Brazil + Portugiesisch - Brasilien + + + + Portuguese - Portugal + Portugiesisch - Portugal + + + + Romanian + Romanisch + + + + Russian + Russisch + + + + Slovak + Slowenisch + + + + Serbian + Serbisch + + + + Swedish + Schwedisch + + + + Turkish + Türkisch + + + + Ukrainian + Ukrainisch + + + + Simplified-Chinese + Vereinfachtes Chinesisch + + + + Traditional Chinese + Traditionelles Chinesisch + + + + <Autodetect> + <Automatisch> + + + + Default + Standard + + + + &Interface + &Interface + + + + Seeking + Positionierung + + + + Recent files + Neueste Dateien + + + + Never + Niemals + + + + Whenever it's needed + Wann immer es benötigt wird + + + + Only after loading a new video + Erst nach dem Laden eines neuen Videos + + + + Language + Sprache + + + + Here you can change the language of the application. + Hier kann die Sprache des Programms geändert werden + + + + Instances + Prozesse + + + + Catalan + Katalanisch + + + + Basque + Baskisch + + + + Galician + Galizisch + + + + &Short jump + &Kleiner Sprung + + + + &Medium jump + &Normaler Sprung + + + + &Long jump + &Langer Sprung + + + + Mouse &wheel jump + &Sprung per Mausrad + + + + &Use only one running instance of SMPlayer + &Nur einen laufenden SMPlayer-Prozess verwenden + + + + SMPlayer will listen to this &port to receive commands from other instances: + &SMPlayer wird diesen Port überwachen, um Befehle von anderen Prozessen zu empfangen: + + + + Main window &resize method + &Hauptfenster Resizing Methode + + + + Ma&x. items + &Max. Stücke + + + + St&yle: + &Stil: + + + + Ico&n set: + &Iconsatz: + + + + L&anguage: + &Sprache: + + + + Main window + Hauptfenster + + + + Auto&resize: + &Automatische Größenveränderung: + + + + R&emember position and size + &Position und Größe beibehalten + + + + Default font: + Standard Schriftart: + + + + &Change... + &Ändern... + + + + PrefPerformance + + + Performance + Leistungsverhalten + + + + Form + Form + + + + &Performance + &Leistungsverhalten + + + + Priority + Priorität + + + + Select the priority for the MPlayer process. + Auswahl der Prozessorpriorität für mplayer. + + + + Priority: + Priorität: + + + + realtime + Realzeit + + + + high + Hoch + + + + abovenormal + Ãœber Normal + + + + normal + Normal + + + + belownormal + Niedrig + + + + idle + Leerlauf + + + + Cache + Cache + + + + Size: + Größe: + + + + KB + KB + + + + Use cache + Cache benutzen + + + + Setting a cache may improve performance on slow media + Einstellung des Cachespeichers, kann Leistungsverhalten auf langsamen Systemen verbessern + + + + Allow frame drop + Ãœberspringen von Bildern erlauben + + + + Allow hard frame drop (can lead to image distortion) + Verstärktes überspringen von Bildern erlauben. (Kann zu Bildverzerrungen führen) + + + + Synchronization + Synchronisation + + + + Audio/video auto synchronization + Automatische Audio/Video Synchronisation + + + + Factor: + Faktor: + + + + Fast audio track switching + Schneller Tonspurwechsel + + + + Fast seek to chapters in dvds + Schnelle Suche in DVD-Kapiteln + + + + Set process priority for mplayer according to the predefined priorities available under Windows.<br><b>WARNING:</b> Using realtime priority can cause system lockup. + Festlegen der Prozessorpriorität gemäß der Verfügbarkeit unter Windows.<br><b>WARNUNG:</b>Echtzeitpriorität kann das System blockieren. + + + + <br><b>Note:</b> This option is for Windows only. + <br><b>Hinweis:</b> Diese Option ist nur für Windows. + + + + This option specifies how much memory (in kBytes) to use when precaching a file or URL. Especially useful on slow media. + Diese Option legt fest,wieviel Speicher (in kBytes) zum Vorausladen einer Datei, oder URL bereitgestellt werden. Besonders nützlich bei langsamen Medien. + + + + Skip displaying some frames to maintain A/V sync on slow systems. + Ãœberspringen einiger Einzelbilder, um A/V Synchronisation auf langsamen Systemen zu gewährleisten. + + + + Allow hard frame drop + Verstärktes überspringen von Bildern erlauben + + + + More intense frame dropping (breaks decoding). Leads to image distortion! + Intensive Einzelbildersprünge (Brüche beim Dekodieren) . Führt zu Bildverzerrungen! + + + + Gradually adjusts the A/V sync based on audio delay measurements. + Justiert stufenweise die A/V Synchronisierung, die auf Audioverzögerungen (Delay) basiert. + + + + Priorit&y: + &Priorität: + + + + Si&ze: + &Größe: + + + + &Use cache + &Cache benutzen + + + + &Allow frame drop + &Ãœberspringen von Bildern erlauben + + + + Allow &hard frame drop (can lead to image distortion) + &Verstärktes überspringen von Bildern erlauben. (Kann zu Bildverzerrungen führen) + + + + Audio/&video auto synchronization + &Automatische Audio/Video Synchronisation + + + + Fact&or: + &Faktor: + + + + &Fast audio track switching + &Schneller Tonspurwechsel + + + + Fast &seek to chapters in dvds + &Schnelle Suche in DVD-Kapiteln + + + + Create index if needed + Index erstellen, falls benötigt + + + + Rebuilds index of files if no index was found, allowing seeking. Useful with broken/incomplete downloads, or badly created files. This option only works if the underlying media supports seeking (i.e. not with stdin, pipe, etc).<br> Note: the creation of the index may take some time. + Baut Index der Datei wiederauf, mit der Erlaubnis zu suchen, wenn kein Index gefunden wurde. Nützlich bei unvollstänigen/defekten Downloads, oder schlecht erstellten Dateien. Die Option funktioniert nur wenn das eigentliche Media Suchfunktionen unterstützt (nicht mit stdin,pipe, etc).<br> Hinweis:Erstellen von einem Index kann einige Zeit dauern. + + + + &Create index if needed + &Index erstellen, falls benötigt + + + + If checked, it will try the fastest method to switch audio tracks but might not work with some formats. + Mit dieser Option wird die schnellste Methode zum Umschalten für Audio Tracks genommen, aber es funktioniert nicht mit allen Formaten. + + + + If checked, it will try the fastest method to seek to chapters but it might not work with some discs. + Mit dieser Option wird die schnellste Methode zum Suchen der Kapitel gewählt, aber es funktioniert nicht mit allen Discs. + + + + PrefSubtitles + + + Subtitles + Untertitel + + + + Choose a ttf file + TTF-Datei wählen + + + + Truetype Fonts + Truetype Schriftarten (*.ttf) + + + + Form + Form + + + + &Subtitles + &Untertitel + + + + Autoload + Automatisch laden + + + + Autoload subtitles files (*.srt, *.sub...): + Untertitel automatisch laden (*.srt,*.sub...): + + + + Select first available subtitle + Den ersten vorhandenen Untertitel auswählen + + + + Same name as movie + Filmtitel als Name + + + + All subs containing movie name + Alle Untertitel die Filmnamen enthalten + + + + All subs in directory + Alle Untertitel im Verzeichnis + + + + Default subtitle encoding: + Standard Untertitel Encodierung: + + + + Position + Position + + + + Default position of the subtitles on screen + Standard Position der Untertitel auf dem Bildschirm + + + + 0 + 0 + + + + Top + Höchste Position + + + + Bottom + Niedrigste Position + + + + Include subtitles on screenshots + Untertitel miteinbeziehen auf Bidschirmfotos + + + + Use -subfont option (required by recent MPlayer releases) + Subfont Optionen anwenden (erfoderlich bei neueren Mplayer Versionen) + + + + &Font + &Schriftart + + + + Font + Schriftart + + + + TTF font: + TTF Schriftart: + + + + Search... + Suchen... + + + + System font: + System-Schriftart: + + + + Select the font which will be used for subtitles (and OSD): + Auswahl der Schriftart für Untertitel (und OSD): + + + + Size + Größe + + + + Autoscale: + Automatische Skalierung: + + + + No autoscale + Keine automatische Skalierung + + + + Proportional to movie height + Proportional zu Filmhöhe + + + + Proportional to movie width + Proportional zur Fimbreite + + + + Proportional to movie diagonal + Proportional zur Filmdiagonale + + + + Scale: + Skalierung: + + + + SSA/&ASS library + SSA/&ASS Library + + + + The new SSA/ASS library will provide nice styled subtitles for external SSA/ASS subtitles files and Matroska tracks. But it will be used too for rendering other formats like SUB and SRT files. + Die neue SSA/ASS Bibliothek produziert schön gestaltete Untertitel für externe SSA/ASS und Matroska-Dateien. Aber sie wird auch zum Rendern anderer Formate verwendet, wie sub und srt-Dateien. + + + + Use SSA/ASS library for subtitle rendering + SSA/ASS-Programmbibliothek zum Rendern von Untertiteln benutzen + + + + Text color: + Textfarbe: + + + + Border color: + Rahmenfarbe: + + + + Here you can override styles for SSA/ASS subtitles. It can be also used for fine-tuning the rendering of SRT and SUB subtitles by the SSA/ASS library. Example: <b>Bold=1,Outline=2,Shadow=4</b> + Hier kann der Stil für die SSA/ASS Untertitel aufgehoben werden. Ebenfalls können Feinabstimmungen zur Darstellung von srt und sub Untertiteln, mit der SSA/ASS Library, vorgenommen werden.<br>Example: <b>Bold=1,Outline=2,Shadow=4</b> {2 or 4?} + + + + Styles: + Stilarten: + + + + Subtitle position + Position der Untertitel + + + + This option specifies the position of the subtitles over the video window. <i>100</i> means the bottom, while <i>0</i> means the top. + Diese Option bestimmt die Position der Untertitel über dem Videofenster.<i>100</i> bedeutet Unten (Buttom), während <i>0</i> Oben (Top) bedeutet. + + + + SSA/ASS styles + SSA/ASS Stilarten + + + + Au&toload subtitles files (*.srt, *.sub...): + &Untertitel automatisch laden (*.srt,*.sub...): + + + + S&elect first available subtitle + &Den ersten vorhandenen Untertitel auswählen + + + + &Default subtitle encoding: + &Standard Untertitel Encodierung: + + + + Default &position of the subtitles on screen + &Standard Position der Untertitel auf dem Bildschirm + + + + &Include subtitles on screenshots + &Untertitel auf Bidschirmfotos miteinbeziehen + + + + &Use -subfont option (required by recent MPlayer releases) + &Subfont Optionen anwenden (erforderlich bei neueren MPlayer Versionen) + + + + &TTF font: + &TTF Schriftart: + + + + Sea&rch... + Su&chen... + + + + S&ystem font: + &System-Schriftart: + + + + A&utoscale: + &Automatische Skalierung: + + + + S&cale: + &Skalierung: + + + + &Use SSA/ASS library for subtitle rendering + &SSA/ASS-Programmbibliothek zum Rendern von Untertiteln benutzen + + + + &Text color: + &Textfarbe: + + + + &Border color: + &Rahmenfarbe: + + + + St&yles: + &Stilarten: + + + + PreferencesDialog + + + SMPlayer - Help + SMPlayer - Hilfe + + + + OK + OK + + + + Cancel + Abbrechen + + + + Apply + Ãœbernehmen + + + + Help + Hilfe + + + + SMPlayer - Preferences + SMPlayer - Einstellungen + + + + QObject + + + 1 second + 1 Sekunde + + + + %1 seconds + %1 Sekunden + + + + %1 minutes + %1 Minuten + + + + %1 minutes and %2 seconds + %1 Minuten und %2 Sekunden + + + + 1 minute + 1 Minute + + + + 1 minute and 1 second + 1 Minute und 1 Sekunde + + + + 1 minute and %1 seconds + 1 Minute und %1 Sekunden + + + + %1 minutes and 1 second + %1 Minuten und 1 Sekunde + + + + Usage: %1 [-ini-path [directory]] [-action action_name] [-close-at-end] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + + Anwendung: %1 [-ini-path [Verzeichnis]] [-action action_Name] [[-close-at-end] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + + + + -ini-path: specifies the directory for the configuration file + (smplayer.ini). If directory is omitted, the application + directory will be used. + + -ini-path: spezifiziert das Verzeichnis für die Konfiguration-Datei + (smplayer.ini) Wenn das Verzeichnis ausgelassen wird, + wird das Anwendungsverzeichnis benutzt. + + + + + -action: tries to make a connection to another running instance + and send to it the specified action. Example: -action pause + The rest of options (if any) will be ignored and the + application will exit. It will return 0 on success or -1 + on failure. + + -action: versucht, eine Beziehung zu einem anderen laufenden Prozeß herzustellen + und zu ihm die spezifizierte Aktionen zu schicken. Beispiel: - -action pause + Die restlichen Optionen (falls vorhanden) werden ignoriert + und die Anwendung beendet. Der Status bringt 0 für Erfolg oder -1 + für Ausfall zurück. + + + + + -close-at-end: the main window will be closed when the file/playlist finish + + -close-at-end: Das Hauptfenster wird geschlossen + wenn die Datei/Abspieliste benendet ist + + + + + -help: will show this message and then will exit. + + -help: Zeigt diesen Hinweis und wird beendet. + + + + + media: 'media' is any kind of file that SMPlayer can open. It can + be a local file, a DVD (e.g. dvd://1), an Internet stream + (e.g. mms://....) or a local playlist in format m3u. + If the -playlist option is used, that means that SMPlayer + will pass the -playlist option to MPlayer, so MPlayer will + will handle the playlist, not SMPlayer. + + media: 'Media' ist jede Art von Datei die SMPlayer öffnen kann. + Das kann eine lokale Datei sein, eine DVD (e.g. dvd://1), ein Internetstream + (e.g. mms://....) oder eine lokale Abspielliste im Format m3u. + Wenn die Option Abspielliste in Gebrach ist, das heißt SMPlayer + gibt die Abspiellisten-Option an MPlayer weiter, MPlayer + verarbeitet die Abspielliste, nicht SMPlayer. + + + + + This is SMPlayer v. %1 running on %2 + + Das ist SMPlayer v.%1 running on %2 + + + + This is SMPlayer v. %1 running on %2 + Das ist SMPlayer v.%1 running on %2 + + + + Usage: %1 [-ini-path [directory]] [-action action_name] [-close-at-end] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + Anwendung: %1 [-ini-path [Verzeichnis]] [-action action_Name] [[-close-at-end] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + + + + specifies the directory for the configuration file (smplayer.ini). If directory is omitted, the application directory will be used. + spezifiziert das Verzeichnis für die Konfiguration-Datei (smplayer.ini) Wenn das Verzeichnis ausgelassen wird, wird das Anwendungsverzeichnis benutzt. + + + + tries to make a connection to another running instance and send to it the specified action. Example: -action pause The rest of options (if any) will be ignored and the application will exit. It will return 0 on success or -1 on failure. + versucht, eine Beziehung zu einem anderen laufenden Prozeß herzustellen und zu ihm die spezifizierte Aktionen zu schicken. Beispiel: -action pause Die restlichen Optionen (falls vorhanden) werden ignoriert und die Anwendung beendet. Der Status bringt 0 für Erfolg oder -1 für Ausfall zurück. + + + + the main window will be closed when the file/playlist finishes. + Das Hauptfenster wird geschlossen wenn die Datei/Abspieliste benendet ist. + + + + will show this message and then will exit. + Zeigt diesen Hinweis und wird beendet. + + + + 'media' is any kind of file that SMPlayer can open. It can be a local file, a DVD (e.g. dvd://1), an Internet stream (e.g. mms://....) or a local playlist in format m3u. If the -playlist option is used, that means that SMPlayer will pass the -playlist option to MPlayer, so MPlayer will handle the playlist, not SMPlayer. + 'Media' ist jede Art von Datei die SMPlayer öffnen kann. Das kann eine lokale Datei sein, eine DVD (e.g. dvd://1), ein Internetstream (e.g. mms://....) oder eine lokale Abspielliste im Format m3u. Wenn die Option Abspielliste in Gebrach ist, das heißt SMPlayer gibt die Abspiellisten-Option an MPlayer weiter, MPlayer verarbeitet die Abspielliste, nicht SMPlayer. + + + + Usage: %1 [-ini-path [directory]] [-send-action action_name] [-actions action_list [-close-at-end] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + Anwendung: %1 [-ini-path [Verzeichnis]] [-send-action action_name] [-actions Aktion_Liste [-close-at-end] [-help|--help|-h|-?] [[-playlist] Media] [[-playlist] Media]... + + + + tries to make a connection to another running instance and send to it the specified action. Example: -send-action pause The rest of options (if any) will be ignored and the application will exit. It will return 0 on success or -1 on failure. + versucht, eine Beziehung zu einem anderen laufenden Prozeß herzustellen und zu ihm die spezifizierte Aktionen zu schicken. Beispiel: -action pause Die restlichen Optionen (falls vorhanden) werden ignoriert und die Anwendung beendet. Der Status bringt 0 für Erfolg oder -1 für Ausfall zurück. + + + + action_list is a list of actions separated by spaces. The actions will be executed just after loading the file (if any) in the same order you entered. For checkable actions you can pass true or false as parameter. Example: -actions "fullscreen compact true". Quotes are necessary in case you pass more than one action. + action_list ist eine Liste der Aktionen, die durch Leerzeichen (Space) getrennt werden. Die Aktionen werden gleich nach dem Laden der Datei (falls vorhanden) in dem Auftrag durchgeführt, der zuvor eingetragen wurde. Für wählbare Aktionen kann true (wahr) oder false (falsch) als Parameter angegeben werden. Beispiel: -actions "fullscreen compact true". Anführungsstriche müßen bei mehr als einer Aktion gesetzt werden. + + + + media + Media + + + + if there's another instance running, the media will be added to that instance's playlist. If there's no other instance, this option will be ignored and the files will be opened in a new instance. + Falls ein weiterer Prozess läuft, Medien werden dort in die Playlist eingefügt. Läuft kein weiterer Prozess, die Option wird ingnoriert und Dateien werden mit einem neuen Prozess geöffnet. + + + + Usage: %1 [-ini-path directory] [-send-action action_name] [-actions action_list [-close-at-end] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + Anwendung: %1 [-ini-path [Verzeichnis]] [-send-action action_name] [-actions Aktion_Liste [-close-at-end] [-help|--help|-h|-?] [[-playlist] Media] [[-playlist] Media]... + + + + specifies the directory for the configuration file (smplayer.ini). + Spezifiziert das Verzeichnis für die Konfigurationsdatei (smplayer.ini). + + + + the main window won't be closed when the file/playlist finishes. + Das Hauptfenster wird geschlossen wenn die Datei/Abspieliste benendet ist. + + + + Usage: %1 [-ini-path directory] [-send-action action_name] [-actions action_list [-close-at-end] [-no-close-at-end] [-fullscreen] [-no-fullscreen] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + Gebrauch: %1 [-ini-path Verzeichnis]] [-send-action action_name] [-actions action_list [-close-at-end] [-no-close-at-end] [-fullscreen] [-no-fullscreen] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + + + + the video will be played in fullscreen mode. + das Video wird im Vollbildmodus abgespielt. + + + + the video will be played in window mode. + das Video wird im Fenstermodus abgespielt. + + + + SeekWidget + + + icon + Icon + + + + label + Kennzeichnung + + + + ShortcutGetter + + + Modify shortcut + Tastaturkurzbefehl modifizieren + + + + Clear + Löschen + + + + Press the key combination you want to assign + Tastenkombination betätigen, die zugewiesen werden soll + + + + Capture + Erfassen + + + + Capture keystrokes + Tastenanschläge erfassen + + + + VideoEqualizer + + + Contrast + Kontrast + + + + Brightness + Helligkeit + + + + Hue + Farbe + + + + Saturation + Sättigung + + + + Gamma + Gamma + + + + Equalizer + Equalizer + + + + &Reset + &Reset + + + + &Set as default values + &Als Standard Wert einstellen + + + + Use the current values as default values for new videos. + Die jetzigen Werte als Standardwerte für neue Videos. + + + + Set all controls to zero. + Alle Steuerungen auf Null. + + + diff --git a/retroshare-gui/src/apps/smplayer/translations/smplayer_en_US.qm b/retroshare-gui/src/apps/smplayer/translations/smplayer_en_US.qm new file mode 100644 index 000000000..56f319e31 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/translations/smplayer_en_US.qm differ diff --git a/retroshare-gui/src/apps/smplayer/translations/smplayer_en_US.ts b/retroshare-gui/src/apps/smplayer/translations/smplayer_en_US.ts new file mode 100644 index 000000000..a9bc206c3 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/translations/smplayer_en_US.ts @@ -0,0 +1,3596 @@ + + + + AboutDialog + + + Version: %1 + + + + + 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. + + + + + Translators: + + + + + German + + + + + Slovak + + + + + Italian + + + + + French + + + + + Simplified-Chinese + + + + + Russian + + + + + Hungarian + + + + + Japanese + + + + + Dutch + + + + + Ukrainian + + + + + Georgian + + + + + Czech + + + + + Logo designed by %1 + + + + + Get updates at: %1 + + + + + About SMPlayer + + + + + Polish + + + + + Bulgarian + + + + + Turkish + + + + + Swedish + + + + + Serbian + + + + + Traditional Chinese + + + + + Romanian + + + + + Portuguese - Brazil + + + + + Portuguese - Portugal + + + + + Compiled with Qt %1 + + + + + %1, %2 and %3 + + + + + %1 and %2 + + + + + http://smplayer.sourceforge.net/en/windows/download.php + If the web page is translated into your language you can change the URL so it points to the download page in the translation.Otherwise leave as is. + + + + + http://smplayer.sourceforge.net/en/linux/download.php + If the web page is translated into your language you can change the URL so it points to the download page in the translation.Otherwise leave as is. + + + + + <b>%1</b>: %2 + + + + + ActionsEditor + + + Name + + + + + Description + + + + + Shortcut + + + + + &Save + + + + + &Load + + + + + Key files + + + + + Choose a filename + + + + + Confirm overwrite? + + + + + The file %1 already exists. +Do you want to overwrite? + + + + + Choose a file + + + + + Error + + + + + The file couldn't be saved + + + + + The file couldn't be loaded + + + + + &Change shortcut... + + + + + BaseGui + + + SMPlayer - mplayer log + + + + + SMPlayer - smplayer log + + + + + &Open + + + + + &Play + + + + + &Video + + + + + &Audio + + + + + &Subtitles + + + + + &Browse + + + + + Op&tions + + + + + &Help + + + + + &File... + + + + + D&irectory... + + + + + &Playlist... + + + + + &DVD from drive + + + + + D&VD from folder... + + + + + &URL... + + + + + &Clear + + + + + &Recent files + + + + + P&lay + + + + + &Pause + + + + + &Stop + + + + + &Frame step + + + + + &Normal speed + + + + + &Halve speed + + + + + &Double speed + + + + + Speed &-10% + + + + + Speed &+10% + + + + + Sp&eed + + + + + &Repeat + + + + + &Fullscreen + + + + + &Compact mode + + + + + Si&ze + + + + + &Autodetect + + + + + 4:3 &Letterbox + + + + + 16:9 L&etterbox + + + + + 4:3 &Panscan + + + + + 4:3 &to 16:9 + + + + + &Aspect ratio + + + + + &None + + + + + &Lowpass5 + + + + + Linear &Blend + + + + + &Deinterlace + + + + + &Postprocessing + + + + + &Autodetect phase + + + + + &Deblock + + + + + De&ring + + + + + Add n&oise + + + + + F&ilters + + + + + &Equalizer + + + + + &Screenshot + + + + + S&tay on top + + + + + &Track + + + + + &Extrastereo + + + + + &Karaoke + + + + + &Filters + + + + + &Stereo + + + + + &4.0 Surround + + + + + &5.1 Surround + + + + + &Channels + + + + + &Left channel + + + + + &Right channel + + + + + &Stereo mode + + + + + &Mute + + + + + Volume &- + + + + + Volume &+ + + + + + &Delay - + + + + + D&elay + + + + + + &Select + + + + + &Load... + + + + + Delay &- + + + + + Delay &+ + + + + + &Up + + + + + &Down + + + + + &Title + + + + + &Chapter + + + + + &Angle + + + + + &Playlist + + + + + &Show frame counter + + + + + &Disabled + + + + + &Seek bar + + + + + &Time + + + + + Time + T&otal time + + + + + &OSD + + + + + &View logs + + + + + P&references + + + + + About &Qt + + + + + About &SMPlayer + + + + + <empty> + + + + + Video + + + + + Audio + + + + + Playlists + + + + + All files + + + + + Choose a file + + + + + SMPlayer - Information + + + + + The CDROM / DVD drives are not configured yet. +The configuration dialog will be shown now, so you can do it. + + + + + Choose a directory + + + + + Subtitles + + + + + About Qt + + + + + Playing %1 + + + + + Pause + + + + + Stop + + + + + Play / Pause + + + + + Pause / Frame step + + + + + U&nload + + + + + V&CD + + + + + C&lose + + + + + View &info and properties... + + + + + Zoom &- + + + + + Zoom &+ + + + + + &Reset + + + + + Move &left + + + + + Move &right + + + + + Move &up + + + + + Move &down + + + + + &Pan && scan + + + + + &Previous line in subtitles + + + + + N&ext line in subtitles + + + + + -%1 + + + + + +%1 + + + + + Dec volume (2) + + + + + Inc volume (2) + + + + + Exit fullscreen + + + + + OSD - Next level + + + + + Dec contrast + + + + + Inc contrast + + + + + Dec brightness + + + + + Inc brightness + + + + + Dec hue + + + + + Inc hue + + + + + Dec saturation + + + + + Dec gamma + + + + + Next audio + + + + + Next subtitle + + + + + Next chapter + + + + + Previous chapter + + + + + Inc saturation + + + + + Inc gamma + + + + + &Load external file... + + + + + &Kerndeint + + + + + &Yadif (normal) + + + + + Y&adif (double framerate) + + + + + &Next + + + + + Pre&vious + + + + + Volume &normalization + + + + + &Audio CD + + + + + Denoise nor&mal + + + + + Denoise &soft + + + + + Denoise o&ff + + + + + Use SSA/&ASS library + + + + + Flip i&mage + + + + + &Toggle double size + + + + + BaseGuiPlus + + + SMPlayer is still running here + + + + + S&how icon in system tray + + + + + &Hide + + + + + &Restore + + + + + &Quit + + + + + Playlist + + + + + Core + + + Brightness: %1 + + + + + Contrast: %1 + + + + + Gamma: %1 + + + + + Hue: %1 + + + + + Saturation: %1 + + + + + Volume: %1 + + + + + Zoom: %1 + + + + + DefaultGui + + + Welcome to SMPlayer + + + + + Volume + + + + + Audio + + + + + Subtitle + + + + + &Main toolbar + + + + + &Language toolbar + + + + + &Toolbars + + + + + Encodings + + + Western European Languages + + + + + Western European Languages with Euro + + + + + Slavic/Central European Languages + + + + + Esperanto, Galician, Maltese, Turkish + + + + + Old Baltic charset + + + + + Cyrillic + + + + + Arabic + + + + + Modern Greek + + + + + Turkish + + + + + Baltic + + + + + Celtic + + + + + Hebrew charsets + + + + + Russian + + + + + Ukrainian, Belarusian + + + + + Simplified Chinese charset + + + + + Traditional Chinese charset + + + + + Japanese charsets + + + + + Korean charset + + + + + Thai charset + + + + + Cyrillic Windows + + + + + Slavic/Central European Windows + + + + + Arabic Windows + + + + + EqSlider + + + icon + + + + + FilePropertiesDialog + + + SMPlayer - File properties + + + + + &Information + + + + + &Demuxer + + + + + &Select the demuxer that will be used for this file: + + + + + &Reset + + + + + &Video codec + + + + + &Select the video codec: + + + + + A&udio codec + + + + + &Select the audio codec: + + + + + &MPlayer options + + + + + Additional Options for MPlayer + + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + + + + + &Options: + + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + + + + + V&ideo filters: + + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + + + + + Audio &filters: + + + + + OK + + + + + Cancel + + + + + Apply + + + + + InfoFile + + + General + + + + + Size + + + + + %1 KB (%2 MB) + + + + + URL + + + + + Length + + + + + Demuxer + + + + + Name + + + + + Artist + + + + + Author + + + + + Album + + + + + Genre + + + + + Date + + + + + Track + + + + + Copyright + + + + + Comment + + + + + Software + + + + + Clip info + + + + + Video + + + + + Resolution + + + + + Aspect ratio + + + + + Format + + + + + Bitrate + + + + + %1 kbps + + + + + Frames per second + + + + + Selected codec + + + + + Initial Audio Stream + + + + + Rate + + + + + %1 Hz + + + + + Channels + + + + + Audio Streams + + + + + Language + + + + + empty + + + + + Subtitles + + + + + Type + + + + + ID + Info for translators: this is a identification code + + + + + # + Info for translators: this is a abbreviation for number + + + + + Stream title + + + + + Stream URL + + + + + File + + + + + InputDVDDirectory + + + Choose a directory + + + + + SMPlayer - Play a DVD from a folder + + + + + You can play a dvd from your hard disc. Just select the folder which contains the VIDEO_TS and AUDIO_TS directories. + + + + + Choose a directory... + + + + + InputURL + + + SMPlayer - Enter URL + + + + + &URL: + + + + + It's a &playlist + + + + + If this option is checked, the URL will be treated as a playlist: it will be opened as text and will play the URLs in it. + + + + + LogWindow + + + Choose a filename to save under + + + + + Confirm overwrite? + + + + + The file already exists. +Do you want to overwrite? + + + + + Error saving file + + + + + The log couldn't be saved + + + + + Logs + + + + + LogWindowBase + + + Log Window + + + + + Save + + + + + Copy to clipboard + + + + + &Close + + + + + Close + + + + + Playlist + + + Name + + + + + Length + + + + + &Play + + + + + &Edit + + + + + Playlists + + + + + Choose a file + + + + + Choose a filename + + + + + Confirm overwrite? + + + + + The file %1 already exists. +Do you want to overwrite? + + + + + All files + + + + + Select one or more files to open + + + + + Choose a directory + + + + + Edit name + + + + + Type the name that will be displayed in the playlist for this file: + + + + + &Load + + + + + &Save + + + + + &Next + + + + + Pre&vious + + + + + Move &up + + + + + Move &down + + + + + &Repeat + + + + + S&huffle + + + + + Add &current file + + + + + Add &file(s) + + + + + Add &directory + + + + + Remove &selected + + + + + Remove &all + + + + + SMPlayer - Playlist + + + + + Add... + + + + + Remove... + + + + + Playlist modified + + + + + There are unsaved changes, do you want to save the playlist? + + + + + PrefAdvanced + + + Advanced + + + + + Auto + + + + + &Advanced + + + + + icon + + + + + Additional Options for MPlayer + + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + + + + + Don't repaint the background of the video window + + + + + &Logs + + + + + Log MPlayer output + + + + + Log SMPlayer output + + + + + This option is mainly intended for debugging the application. + + + + + &MPlayer language + + + + + SMPlayer needs to read and parse the output of MPlayer and sometimes it relies on English text. If you are using a MPlayer translated into another language, then you need to change the texts that SMPlayer looks for. (Technically you should enter regular expressions)<br><br> +The drop-down lists may provide already made regular expression for several languages. + + + + + Checking this option may reduce flickering, but it also might produce that the video won't be displayed properly. + + + + + If checked, smplayer will store the output of mplayer (you can see it in <b>Options->View logs->mplayer</b>). In case of problems this log can contain important information, so it's recommended to keep this option checked. + + + + + If this option is checked, smplayer will store the debugging messages that smplayer outputs (you can see the log in <b>Options->View logs->smplayer</b>). This information can be very useful for the developer in case you find a bug. + + + + + Filter for SMPlayer logs + + + + + This option allows to filter the smplayer messages that will be stored in the log. Here you can write any regular expression.<br>For instance: <i>^Core::.*</i> will display only the lines starting with <i>Core::</i> + + + + + &Monitor aspect: + + + + + &Run MPlayer in its own window + + + + + &Options: + + + + + V&ideo filters: + + + + + Audio &filters: + + + + + &Colorkey: + + + + + &Don't repaint the background of the video window + + + + + Log &MPlayer output + + + + + Log &SMPlayer output + + + + + &Filter for SMPlayer logs: + + + + + &End of file: + + + + + &No video: + + + + + C&hange... + + + + + PrefAssociations + + + Warning + + + + + Not all files could be associated. Please check your security permissions and retry. + + + + + File Types + + + + + Select all + + + + + Check all file types in the list + + + + + Uncheck all file types in the list + + + + + List of file types + + + + + File types + + + + + Media files handled by SMPlayer: + + + + + Select All + + + + + Select None + + + + + Check the media file extensions you would like SMPlayer to handle. When you click Apply, the checked files will be associated with SMPlayer. If you uncheck a media type, the file association will be restored. + + + + + Select none + + + + + PrefDrives + + + Drives + + + + + Currently SMPlayer does not autodetect cdrom or dvd devices. So in order to play cdroms or dvds you must first select here your cdrom and dvd drives (can be the same). + + + + + icon + + + + + CD device + + + + + Choose your CDROM device. It will be used to play VCDs and Audio CDs. + + + + + DVD device + + + + + Choose your DVD device. It will be used to play DVDs. + + + + + Select your &CD device: + + + + + Select your &DVD device: + + + + + PrefGeneral + + + General + + + + + &General + + + + + Paths + + + + + Output drivers + + + + + Media settings + + + + + Preferred audio and subtitles + + + + + &Video and audio + + + + + Video + + + + + Start videos in fullscreen + + + + + Disable screensaver + + + + + Audio + + + + + Select the mplayer executable + + + + + Executables + + + + + All files + + + + + Select a directory + + + + + MPlayer executable + + + + + Here you must specify the mplayer executable that smplayer will use.<br>smplayer requires at least mplayer 1.0rc1 (svn recommended).<br><b>If this setting is wrong, smplayer won't be able to play anything!</b> + + + + + Screenshots folder + + + + + Here you can specify a folder where the screenshots taken by smplayer will be stored. If this field is empty the screenshot feature will be disabled. + + + + + Video output driver + + + + + Select the video output driver. Usually xv (linux) and directx (windows) provide the best performance. + + + + + Audio output driver + + + + + Select the audio output driver. + + + + + Remember settings + + + + + Usually smplayer will remember the settings for each file you play (audio track selected, volume, filters...). Uncheck this option if you don't like this feature. + + + + + Don't remember time position + + + + + If you check this option, smplayer will play all files from the beginning. + + + + + Preferred audio language + + + + + Here you can type your preferred language for the audio streams. When a media with multiple audio streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the audio streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the audio track if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + + + + + Preferred subtitle language + + + + + Here you can type your preferred language for the subtitle stream. When a media with multiple subtitle streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the subtitle streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the subtitle stream if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + + + + + Software video equalizer + + + + + You can check this option if video equalizer is not supported by your graphic card or the selected video output driver.<br><b>Note:</b> this option can be incompatible with some video output drivers. + + + + + If this option is checked, all videos will start to play in fullscreen mode. + + + + + Check this option to disable the screensaver while playing.<br>The screensaver will enabled again when play finishes.<br><b>Note:</b> This option works only in X11 and Windows. + + + + + Software volume control + + + + + Check this option to use the software mixer, instead of using the sound card mixer. + + + + + Postprocessing quality + + + + + Dynamically changes the level of postprocessing depending on the available spare CPU time. The number you specify will be the maximum level used. Usually you can use some big number. + + + + + Change volume + + + + + If checked, SMPlayer will remember the volume for every file and will restore it when played again. For new files the default volume will be used. + + + + + 0 + + + + + &Change volume on every file + + + + + &Search... + + + + + S&elect... + + + + + Select the &MPlayer executable: + + + + + &Folder for storing screenshots: + + + + + V&ideo: + + + + + &Audio: + + + + + &Don't remember time position (files start playing from the beginning) + + + + + &Remember settings for all files (audio track, subtitles...) + + + + + A&udio: + + + + + Su&btitles: + + + + + &Use software video equalizer + + + + + &Quality: + + + + + Start videos in &fullscreen + + + + + Disable &screensaver + + + + + &Default volume: + + + + + Use s&oftware volume control + + + + + Ma&x. Amplification: + + + + + &AC3/DTS pass-through S/PDIF + + + + + Direct rendering + + + + + If checked, turns on direct rendering (not supported by all codecs and video outputs)<br><b>WARNING:</b> May cause OSD/SUB corruption! + + + + + Double buffering + + + + + D&irect rendering + + + + + Dou&ble buffering + + + + + Double buffering fixes flicker by storing two frames in memory, and displaying one while decoding another. If disabled it can affect OSD negatively, but often removes OSD flickering. + + + + + &Enable postprocessing by default + + + + + Volume &normalization by default + + + + + Close when finished + + + + + If this option is checked, the main window will be automatically closed when the current file/playlist finishes. + + + + + &Close when finished + + + + + 2 (Stereo) + + + + + 4 (4.0 Surround) + + + + + 6 (5.1 Surround) + + + + + C&hannels by default: + + + + + &Pause when minimized + + + + + Pause when minimized + + + + + If this option is enabled, the file will be paused when the main window is hidden. When the window is restored, play will be resumed. + + + + + Enable postprocessing by default + + + + + Max. Amplification + + + + + AC3/DTS pass-through S/PDIF + + + + + Volume normalization by default + + + + + Maximizes the volume without distorting the sound. + + + + + Default volume + + + + + Sets the initial volume that new files will use. + + + + + Channels by default + + + + + Sets the maximum amplification level in percent (default: 110). A value of 200 will allow you to adjust the volume up to a maximum of double the current level. With values below 100 the initial volume (which is 100%) will be above the maximum, which e.g. the OSD cannot display correctly. + + + + + Uses hardware AC3 passthrough + + + + + Requests the number of playback channels. MPlayer asks the decoder to decode the audio into as many channels as specified. Then it is up to the decoder to fulfill the requirement. This is usually only important when playing videos with AC3 audio (like DVDs). In that case liba52 does the decoding by default and correctly downmixes the audio into the requested number of channels. NOTE: This option is honored by codecs (AC3 only), filters (surround) and audio output drivers (OSS at least). + + + + + Postprocessing will be used by default on new opened files. + + + + + PrefInput + + + Keyboard and mouse + + + + + &Keyboard + + + + + icon + + + + + &Mouse + + + + + Button functions: + + + + + Media seeking + + + + + Volume control + + + + + Zoom video + + + + + None + + + + + Here you can change any key shortcut. To do it double click or press enter over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + + + + + Here you can change any key shortcut. To do it double click or start typing over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + + + + + &Left click + + + + + &Double click + + + + + &Wheel function: + + + + + Shortcut editor + + + + + This table allows you to change the key shortcuts of most available actions. Double click or press enter on a item, or press the <b>Change shortcut</b> button to enter in the <i>Modify shortcut</i> dialog. There are two ways to change a shortcut: if the <b>Capture</b> button is on then just press the new key or combination of keys that you want to assign for the action (unfortunately this doesn't work for all keys). If the <b>Capture</b> button is off then you could enter the full name of the key. + + + + + Left click + + + + + Select the action for left click on the mouse. + + + + + Double click + + + + + Select the action for double click on the mouse. + + + + + Wheel function + + + + + Select the action for the mouse wheel. + + + + + PrefInterface + + + Interface + + + + + Bulgarian + + + + + Czech + + + + + German + + + + + Greek + + + + + English + + + + + Spanish + + + + + Finnish + + + + + French + + + + + Hungarian + + + + + Italian + + + + + Japanese + + + + + Georgian + + + + + Dutch + + + + + Polish + + + + + Portuguese - Brazil + + + + + Portuguese - Portugal + + + + + Romanian + + + + + Russian + + + + + Slovak + + + + + Serbian + + + + + Swedish + + + + + Turkish + + + + + Ukrainian + + + + + Simplified-Chinese + + + + + Traditional Chinese + + + + + <Autodetect> + + + + + Default + + + + + &Interface + + + + + Seeking + + + + + Never + + + + + Whenever it's needed + + + + + Only after loading a new video + + + + + Recent files + + + + + Language + + + + + Here you can change the language of the application. + + + + + Instances + + + + + Catalan + + + + + Basque + + + + + Galician + + + + + &Short jump + + + + + &Medium jump + + + + + &Long jump + + + + + Mouse &wheel jump + + + + + &Use only one running instance of SMPlayer + + + + + SMPlayer will listen to this &port to receive commands from other instances: + + + + + Ma&x. items + + + + + St&yle: + + + + + Ico&n set: + + + + + L&anguage: + + + + + Main window + + + + + Auto&resize: + + + + + R&emember position and size + + + + + Default font: + + + + + &Change... + + + + + PrefPerformance + + + Performance + + + + + &Performance + + + + + Priority + + + + + Select the priority for the MPlayer process. + + + + + realtime + + + + + high + + + + + abovenormal + + + + + normal + + + + + belownormal + + + + + idle + + + + + Cache + + + + + KB + + + + + Setting a cache may improve performance on slow media + + + + + Allow frame drop + + + + + Synchronization + + + + + Audio/video auto synchronization + + + + + Set process priority for mplayer according to the predefined priorities available under Windows.<br><b>WARNING:</b> Using realtime priority can cause system lockup. + + + + + <br><b>Note:</b> This option is for Windows only. + + + + + This option specifies how much memory (in kBytes) to use when precaching a file or URL. Especially useful on slow media. + + + + + Skip displaying some frames to maintain A/V sync on slow systems. + + + + + Allow hard frame drop + + + + + More intense frame dropping (breaks decoding). Leads to image distortion! + + + + + Gradually adjusts the A/V sync based on audio delay measurements. + + + + + Priorit&y: + + + + + Si&ze: + + + + + &Use cache + + + + + &Allow frame drop + + + + + Allow &hard frame drop (can lead to image distortion) + + + + + Audio/&video auto synchronization + + + + + Fact&or: + + + + + &Fast audio track switching + + + + + Fast &seek to chapters in dvds + + + + + Create index if needed + + + + + Rebuilds index of files if no index was found, allowing seeking. Useful with broken/incomplete downloads, or badly created files. This option only works if the underlying media supports seeking (i.e. not with stdin, pipe, etc).<br> Note: the creation of the index may take some time. + + + + + &Create index if needed + + + + + Fast audio track switching + + + + + If checked, it will try the fastest method to switch audio tracks but might not work with some formats. + + + + + Fast seek to chapters in dvds + + + + + If checked, it will try the fastest method to seek to chapters but it might not work with some discs. + + + + + PrefSubtitles + + + Subtitles + + + + + Choose a ttf file + + + + + Truetype Fonts + + + + + &Subtitles + + + + + Autoload + + + + + Same name as movie + + + + + All subs containing movie name + + + + + All subs in directory + + + + + Position + + + + + 0 + + + + + Top + + + + + Bottom + + + + + &Font + + + + + Font + + + + + Select the font which will be used for subtitles (and OSD): + + + + + Size + + + + + No autoscale + + + + + Proportional to movie height + + + + + Proportional to movie width + + + + + Proportional to movie diagonal + + + + + SSA/&ASS library + + + + + The new SSA/ASS library will provide nice styled subtitles for external SSA/ASS subtitles files and Matroska tracks. But it will be used too for rendering other formats like SUB and SRT files. + + + + + Here you can override styles for SSA/ASS subtitles. It can be also used for fine-tuning the rendering of SRT and SUB subtitles by the SSA/ASS library. Example: <b>Bold=1,Outline=2,Shadow=4</b> + + + + + Subtitle position + + + + + This option specifies the position of the subtitles over the video window. <i>100</i> means the bottom, while <i>0</i> means the top. + + + + + SSA/ASS styles + + + + + Au&toload subtitles files (*.srt, *.sub...): + + + + + S&elect first available subtitle + + + + + &Default subtitle encoding: + + + + + Default &position of the subtitles on screen + + + + + &Include subtitles on screenshots + + + + + &Use -subfont option (required by recent MPlayer releases) + + + + + &TTF font: + + + + + Sea&rch... + + + + + S&ystem font: + + + + + A&utoscale: + + + + + S&cale: + + + + + &Use SSA/ASS library for subtitle rendering + + + + + &Text color: + + + + + &Border color: + + + + + St&yles: + + + + + PreferencesDialog + + + SMPlayer - Help + + + + + OK + + + + + Cancel + + + + + Apply + + + + + Help + + + + + SMPlayer - Preferences + + + + + QObject + + + 1 second + + + + + %1 seconds + + + + + %1 minutes + + + + + %1 minutes and %2 seconds + + + + + 1 minute + + + + + 1 minute and 1 second + + + + + 1 minute and %1 seconds + + + + + %1 minutes and 1 second + + + + + will show this message and then will exit. + + + + + 'media' is any kind of file that SMPlayer can open. It can be a local file, a DVD (e.g. dvd://1), an Internet stream (e.g. mms://....) or a local playlist in format m3u. If the -playlist option is used, that means that SMPlayer will pass the -playlist option to MPlayer, so MPlayer will handle the playlist, not SMPlayer. + + + + + the main window will be closed when the file/playlist finishes. + + + + + This is SMPlayer v. %1 running on %2 + + + + + tries to make a connection to another running instance and send to it the specified action. Example: -send-action pause The rest of options (if any) will be ignored and the application will exit. It will return 0 on success or -1 on failure. + + + + + action_list is a list of actions separated by spaces. The actions will be executed just after loading the file (if any) in the same order you entered. For checkable actions you can pass true or false as parameter. Example: -actions "fullscreen compact true". Quotes are necessary in case you pass more than one action. + + + + + media + + + + + if there's another instance running, the media will be added to that instance's playlist. If there's no other instance, this option will be ignored and the files will be opened in a new instance. + + + + + specifies the directory for the configuration file (smplayer.ini). + + + + + the main window won't be closed when the file/playlist finishes. + + + + + Usage: %1 [-ini-path directory] [-send-action action_name] [-actions action_list [-close-at-end] [-no-close-at-end] [-fullscreen] [-no-fullscreen] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + + + + + the video will be played in fullscreen mode. + + + + + the video will be played in window mode. + + + + + SeekWidget + + + icon + + + + + label + + + + + ShortcutGetter + + + Modify shortcut + + + + + Clear + + + + + Press the key combination you want to assign + + + + + Capture + + + + + Capture keystrokes + + + + + VideoEqualizer + + + Equalizer + + + + + Contrast + + + + + Brightness + + + + + Hue + + + + + Saturation + + + + + Gamma + + + + + &Reset + + + + + &Set as default values + + + + + Use the current values as default values for new videos. + + + + + Set all controls to zero. + + + + diff --git a/retroshare-gui/src/apps/smplayer/translations/smplayer_es.qm b/retroshare-gui/src/apps/smplayer/translations/smplayer_es.qm new file mode 100644 index 000000000..9fca22f55 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/translations/smplayer_es.qm differ diff --git a/retroshare-gui/src/apps/smplayer/translations/smplayer_es.ts b/retroshare-gui/src/apps/smplayer/translations/smplayer_es.ts new file mode 100644 index 000000000..4a3c7a18e --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/translations/smplayer_es.ts @@ -0,0 +1,4029 @@ + + + + AboutDialog + + + Version: %1 + Versión: %1 + + + + 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. + Este programa es Software Libre; usted puede redistribuirlo y/o modificarlo bajo los términos de la "GNU General Public License" como lo publica la "FSF Free Software Foundation", o (a su elección) de cualquier versión posterior. + + + + Translators: + Traductores: + + + + German + Alemán + + + + Slovak + Eslovaco + + + + Italian + Italiano + + + + French + Francés + + + + Simplified-Chinese + Chino simplificado + + + + Russian + Ruso + + + + Hungarian + Húngaro + + + + Japanese + Japonés + + + + Dutch + Holandés + + + + Ukrainian + Ucraniano + + + + Georgian + Georgiano + + + + Czech + Checo + + + + Logo designed by %1 + Logo diseñado por %1 + + + + Get updates at: %1 + Consigue actualizaciones en: %1 + + + + About SMPlayer + Acerca de SMPlayer + + + + Polish + Polaco + + + + Bulgarian + Búlgaro + + + + Turkish + Turco + + + + Swedish + Sueco + + + + Serbian + Serbio + + + + Traditional Chinese + Chino tradicional + + + + Romanian + Rumano + + + + Portuguese - Brazil + Portugués - Brasil + + + + Portuguese - Portugal + Portugués - Portugal + + + + Compiled with Qt %1 + Compilado con Qt %1 + + + + %1, %2 and %3 + %1, %2 y %3 + + + + %1 and %2 + %1 y %2 + + + + http://smplayer.sourceforge.net/en/windows/download.php + If the web page is translated into your language you can change the URL so it points to the download page in the translation.Otherwise leave as is. + http://smplayer.sourceforge.net/es/windows/download.php + + + + http://smplayer.sourceforge.net/en/linux/download.php + If the web page is translated into your language you can change the URL so it points to the download page in the translation.Otherwise leave as is. + http://smplayer.sourceforge.net/es/linux/download.php + + + + <b>%1</b>: %2 + <b>%1</b>: %2 + + + + ActionsEditor + + + Name + Nombre + + + + Description + Descripción + + + + Shortcut + Atajo + + + + &Save + &Grabar + + + + &Load + &Cargar + + + + Key files + Ficheros de atajos + + + + Choose a filename + Elige un fichero + + + + Confirm overwrite? + ¿Confirmar sobreescribir? + + + + The file %1 already exists. +Do you want to overwrite? + El fichero %1 ya existe. +¿Quieres sobreescribirlo? + + + + Choose a file + Elige un fichero + + + + Error + Error + + + + The file couldn't be saved + El fichero no se ha podido grabar + + + + The file couldn't be loaded + El fichero no se ha podido cargar + + + + &Change shortcut... + &Modificar atajo... + + + + BaseGui + + + SMPlayer - mplayer log + SMPlayer - mplayer log + + + + SMPlayer - smplayer log + SMPlayer - smplayer log + + + + &Open + A&brir + + + + &Play + &Reproducir + + + + &Video + &Vídeo + + + + &Audio + A&udio + + + + &Subtitles + &Subtítulos + + + + &Browse + &Navegar + + + + Op&tions + &Opciones + + + + &Help + &Ayuda + + + + &File... + &Fichero... + + + + D&irectory... + D&irectorio... + + + + &Playlist... + &Lista de reproducción... + + + + &DVD from drive + &DVD desde unidad lectora + + + + D&VD from folder... + D&VD desde una carpeta... + + + + &URL... + &URL... + + + + &Clear + &Borrar + + + + &Recent files + Ficheros &recientes + + + + P&lay + &Reproducir + + + + &Pause + &Pausa + + + + &Stop + &Detener + + + + &Frame step + &Avanzar fotograma + + + + &Normal speed + Velocidad &normal + + + + &Halve speed + &Reducir a la mitad + + + + &Double speed + &Doblar + + + + Speed &-10% + Velocidad &-10% + + + + Speed &+10% + Velocidad &+10% + + + + Sp&eed + &Velocidad + + + + &Repeat + R&epetir + + + + &Fullscreen + &Pantalla completa + + + + &Compact mode + &Modo compacto + + + + Si&ze + &Tamaño + + + + &Autodetect + A&utodetectar + + + + &4:3 + &4:3 + + + + &5:4 + &5:4 + + + + &14:9 + &14:9 + + + + 16:&9 + 16:&9 + + + + 1&6:10 + 1&6:10 + + + + &2.35:1 + &2.35:1 + + + + 4:3 &Letterbox + 4:3 &Letterbox + + + + 16:9 L&etterbox + 16:9 L&etterbox + + + + 4:3 &Panscan + 4:3 &Panscan + + + + 4:3 &to 16:9 + 4:3 &a 16:9 + + + + &Aspect ratio + &Aspect ratio + + + + &None + &Ninguno + + + + &Lowpass5 + &Lowpass5 + + + + Linear &Blend + Linear &Blend + + + + &Deinterlace + &Desentrelazado + + + + &Postprocessing + &Postprocesado + + + + &Autodetect phase + &Autodetección de fase + + + + &Deblock + + + + + De&ring + + + + + Add n&oise + Añadir r&uido + + + + F&ilters + &Filtros + + + + &Equalizer + &Ecualizador + + + + &Screenshot + &Captura + + + + S&tay on top + E&ncima de todas las ventanas + + + + &Track + &Pista + + + + &Extrastereo + &Extrastereo + + + + &Karaoke + &Karaoke + + + + &Filters + &Filtros + + + + &Default + Por &defecto + + + + &Stereo + E&stéreo + + + + &4.0 Surround + &4.0 Surround + + + + &5.1 Surround + &5.1 Surround + + + + &Channels + &Canales + + + + &Left channel + Canal &izquierdo + + + + &Right channel + Canal &derecho + + + + &Stereo mode + &Modo estéreo + + + + &Mute + &Silenciar + + + + Volume &- + Volumen &- + + + + Volume &+ + Volumen &+ + + + + &Delay - + &Retrasar - + + + + D&elay + + R&etrasar + + + + + &Select + &Seleccionar + + + + &Load... + &Cargar... + + + + Delay &- + Retrasar &- + + + + Delay &+ + Retrasar &+ + + + + &Up + &Arriba + + + + &Down + A&bajo + + + + &Title + &Título + + + + &Chapter + &Capítulo + + + + &Angle + &Ãngulo + + + + &Playlist + &Lista de reproducción + + + + &Show frame counter + &Mostrar contador de imágenes + + + + &Disabled + &Desactivado + + + + &Seek bar + &Barra de progreso + + + + &Time + &Tiempo + + + + Time + T&otal time + Tiempo + Tiempo t&otal + + + + &OSD + &OSD + + + + &View logs + &Ver logs + + + + P&references + P&referencias + + + + About &Qt + Acerca de &Qt + + + + About &SMPlayer + Acerca de &SMPlayer + + + + <empty> + <vacío> + + + + Video + Vídeo + + + + Audio + Audio + + + + Playlists + Listas de reproducción + + + + All files + Todos los ficheros + + + + Choose a file + Elige un fichero + + + + SMPlayer - Information + SMPlayer - Información + + + + The CDROM / DVD drives are not configured yet. +The configuration dialog will be shown now, so you can do it. + Las unidades de CDROM / DVD no han sido configuradas. +Se mostrará a continuación el diálogo de configuración. + + + + Choose a directory + Elige un directorio + + + + Subtitles + Subtítulos + + + + About Qt + Acerca de Qt + + + + Playing %1 + Reproduciendo %1 + + + + Pause + Pausa + + + + Stop + Stop + + + + De&noise + &Quitar ruido + + + + N&ormal + N&ormal + + + + &Soft + &Suave + + + + Play / Pause + Reproducir / Pausa + + + + Pause / Frame step + Pausa / Avanzar fotograma + + + + U&nload + &Descargar + + + + V&CD + V&CD + + + + C&lose + C&errar + + + + View &info and properties... + Ver &información y propiedades... + + + + Zoom &- + Zoom &- + + + + Zoom &+ + Zoom &+ + + + + &Reset + &Reiniciar + + + + Move &left + Desplazar &izquierda + + + + Move &right + Desplazar &derecha + + + + Move &up + Desplazar &arriba + + + + Move &down + Desplazar a&bajo + + + + &Pan && scan + Pan && &scan + + + + &Previous line in subtitles + Ir a línea a&nterior + + + + N&ext line in subtitles + Ir a línea &posterior + + + + -%1 + -%1 + + + + +%1 + +%1 + + + + Dec volume (2) + Bajar volumen (2) + + + + Inc volume (2) + Subir volumen (2) + + + + Exit fullscreen + Salir de pantalla completa + + + + OSD - Next level + OSD - Siguiente nivel + + + + Dec contrast + Bajar contraste + + + + Inc contrast + Subir contraste + + + + Dec brightness + Bajar brillo + + + + Inc brightness + Subir brillo + + + + Dec hue + Bajar tono + + + + Inc hue + Subir tono + + + + Dec saturation + Bajar saturación + + + + Dec gamma + Bajar gamma + + + + Next audio + Siguiente audio + + + + Next subtitle + Siguiente subtítulo + + + + Next chapter + Siguiente capítulo + + + + Previous chapter + Capítulo anterior + + + + Inc saturation + Subir saturación + + + + Inc gamma + Subir gamma + + + + Toggle double size + Tamaño normal / tamaño doble + + + + &Load external file... + C&argar archivo externo... + + + + &Kerndeint + &Kerndeint + + + + &Yadif (normal) + &Yadif (normal) + + + + Y&adif (double framerate) + Y&adif (doble framerate) + + + + &Next + &Siguiente + + + + Pre&vious + &Anterior + + + + Volume &normalization + &Normalización de volumen + + + + &Audio CD + CD de &audio + + + + Denoise nor&mal + Quitar ruido nor&mal + + + + Denoise &soft + Quitar ruido &suave + + + + Denoise o&ff + Quitar ruido desactivad&o + + + + SMPlayer - Enter URL + SMPlayer - Introduce una URL + + + + URL: + URL: + + + + Use SSA/&ASS library + &Usar la librería SSA/ASS + + + + Flip i&mage + Imagen &boca abajo + + + + &Toggle double size + &Tamaño normal / tamaño doble + + + + BaseGuiPlus + + + SMPlayer is still running here + SMPlayer sigue funcionando aquí + + + + S&how icon in system tray + I&cono en la bandeja del sistema + + + + &Hide + &Ocultar + + + + &Restore + &Restaurar + + + + &Recent files + Ficheros &recientes + + + + &Quit + &Salir + + + + Playlist + Lista de reproducción + + + + Core + + + Brightness: %1 + Brillo: %1 + + + + Contrast: %1 + Contraste: %1 + + + + Gamma: %1 + Gamma: %1 + + + + Hue: %1 + Tono: %1 + + + + Saturation: %1 + Saturación: %1 + + + + Volume: %1 + Volumen: %1 + + + + Zoom: %1 + Zoom: %1 + + + + DefaultGui + + + Welcome to SMPlayer + Bienvenido a SMPlayer + + + + Volume + Volumen + + + + Audio + Audio + + + + Subtitle + Subtítulo + + + + Playlist + Lista de reproducción + + + + &Main toolbar + Barra &principal + + + + &Language toolbar + Barra de &idioma + + + + &Toolbars + &Barras de herramientas + + + + Encodings + + + Western European Languages + Occidental + + + + Western European Languages with Euro + Occidental con euro + + + + Slavic/Central European Languages + Eslavo/Centroeuropeo + + + + Esperanto, Galician, Maltese, Turkish + Esperanto, Gallego, Maltés, Turco + + + + Old Baltic charset + Báltico antiguo + + + + Cyrillic + Cirílico + + + + Arabic + Ãrabe + + + + Modern Greek + Griego moderno + + + + Turkish + Turco + + + + Baltic + Báltico + + + + Celtic + Céltico + + + + Hebrew charsets + Hebreo + + + + Russian + Ruso + + + + Ukrainian, Belarusian + Ucraniano, Belaruso + + + + Simplified Chinese charset + Chino simplificado + + + + Traditional Chinese charset + Chino tradicional + + + + Japanese charsets + Japonés + + + + Korean charset + Coreano + + + + Thai charset + Thai + + + + Cyrillic Windows + Cirílico Windows + + + + Slavic/Central European Windows + Eslavo/Centroeuropeo Windows + + + + Arabic Windows + Ãrabe Windows + + + + EqSlider + + + icon + icon + + + + FilePropertiesDialog + + + SMPlayer - File properties + SMPlayer - Propiedades del fichero + + + + &Information + &Información + + + + &Demuxer + &Demuxer + + + + &Select the demuxer that will be used for this file: + &Selecciona el demuxer que se usará para este fichero: + + + + &Reset + &Reiniciar + + + + &Video codec + Códec de &vídeo + + + + &Select the video codec: + &Selecciona el códec de vídeo: + + + + A&udio codec + Códec de a&udio + + + + &Select the audio codec: + &Selecciona el códec de audio: + + + + &MPlayer options + Opciones para el &MPlayer + + + + Additional Options for MPlayer + Opciones Adicionales para el MPlayer + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + Aquí puedes pasar opciones extra al MPlayer. +Escríbelas separadas por espacios. +Ejemplo: -flip -nosound + + + + &Options: + &Opciones: + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + También puedes pasar filtros de vídeo adicionales. +Sepáralos con ",". ¡No uses espacios! +Ejemplo: scale=512:-2,eq2=1.1 + + + + V&ideo filters: + Filtros de víd&eo: + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + Y finalmente los filtros de audio. Misma norma que para los filtros de audio. +Ejemplo: resample=44100:0:0,volnorm + + + + Audio &filters: + &Filtros de audio: + + + + OK + Aceptar + + + + Cancel + Cancelar + + + + Apply + Aplicar + + + + InfoFile + + + General + General + + + + Size + Tamaño + + + + %1 KB (%2 MB) + %1 KB (%2 MB) + + + + URL + URL + + + + Length + Duración + + + + Demuxer + Demuxer + + + + Name + Nombre + + + + Artist + Artista + + + + Author + Autor + + + + Album + Ãlbum + + + + Genre + Género + + + + Date + Fecha + + + + Track + Pista + + + + Copyright + Copyright + + + + Comment + Comentario + + + + Software + Software + + + + Clip info + + + + + Video + Vídeo + + + + Resolution + Resolución + + + + Aspect ratio + + + + + Format + Formato + + + + Bitrate + + + + + %1 kbps + %1 kbps + + + + Frames per second + Imágenes por segundo + + + + Selected codec + Códec seleccionado + + + + Initial Audio Stream + Pista de audio inicial + + + + Rate + + + + + %1 Hz + %1 Hz + + + + Channels + Canales + + + + Audio Streams + Pistas de audio + + + + Language + Idioma + + + + empty + vacío + + + + Subtitles + Subtítulos + + + + Type + Tipo + + + + ID + Info for translators: this is a identification code + ID + + + + # + Info for translators: this is a abbreviation for number + nº + + + + Stream title + Título del stream + + + + Stream URL + URL del stream + + + + File + Fichero + + + + InputDVDDirectory + + + Choose a directory + Elige un directorio + + + + SMPlayer - Play a DVD from a folder + SMPlayer - Reproducir un DVD desde una carpeta + + + + You can play a dvd from your hard disc. Just select the folder which contains the VIDEO_TS and AUDIO_TS directories. + Es posible reproducir un dvd desde el disco duro. Simplemente selecciona la carpeta que contiene los directorios VIDEO_TS y AUDIO_TS. + + + + Choose a directory... + Elegir un directorio... + + + + InputURL + + + SMPlayer - Enter URL + SMPlayer - Introduce una URL + + + + &URL: + &URL: + + + + It's a &playlist + Es una &lista de reproducción + + + + If this option is checked, the URL will be treated as a playlist: it will be opened as text and will play the URLs in it. + Si esta opción está activada, la URL será tratada como una lista de reproducción: se abrirá como texto y se reproducirán las URLs que se encuentren. + + + + LogWindow + + + Choose a filename to save under + Elige el nombre de fichero + + + + Confirm overwrite? + ¿Confirmar sobreescribir? + + + + The file already exists. +Do you want to overwrite? + El fichero ya existe. +¿Quieres sobreescribirlo? + + + + Error saving file + Error al grabar el fichero + + + + The log couldn't be saved + No se ha podido grabar el fichero log + + + + Logs + Logs + + + + LogWindowBase + + + Log Window + Log Window + + + + Save + Guardar + + + + Copy to clipboard + Copiar al portapapeles + + + + Close + Cerrar + + + + &Close + &Cerrar + + + + Playlist + + + Name + Nombre + + + + Length + Duración + + + + Choose a file + Elige un fichero + + + + Choose a filename + Elige un fichero + + + + Confirm overwrite? + ¿Confirmar sobreescribir? + + + + Select one or more files to open + Selecciona uno o más ficheros + + + + Choose a directory + Elige un directorio + + + + The file %1 already exists. +Do you want to overwrite? + El fichero %1 ya existe. +¿Quieres sobreescribirlo? + + + + Edit name + Editar nombre + + + + Type the name that will be displayed in the playlist for this file: + Teclea el nombre que se mostrará en la lista para este fichero: + + + + &Play + &Reproducir + + + + &Edit + &Editar + + + + Playlists + Listas de reproducción + + + + All files + Todos los ficheros + + + + &Load + &Cargar + + + + &Save + &Grabar + + + + &Next + &Siguiente + + + + Pre&vious + &Anterior + + + + Move &up + &Bajar + + + + Move &down + &Subir + + + + &Repeat + R&epetir + + + + S&huffle + &Desordenar + + + + Add &current file + Añadir fichero &actual + + + + Add &file(s) + Añadir &fichero(s) + + + + Add &directory + Añadir &directorio + + + + Remove &selected + Borrar &selección + + + + Remove &all + Borrar &todo + + + + SMPlayer - Playlist + SMPlayer - Lista de reproducción + + + + Add... + Añadir... + + + + Remove... + Borrar... + + + + Playlist modified + Lista de reproducción modificada + + + + There are unsaved changes, do you want to save the playlist? + Hay cambios sin guardar, ¿quieres grabar la lista de reproducción? + + + + PrefAdvanced + + + Advanced + Avanzado + + + + Auto + Auto + + + + Form + Form + + + + &Advanced + &Avanzado + + + + icon + icon + + + + Additional Options for MPlayer + Opciones Adicionales para el MPlayer + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + Aquí puedes pasar opciones extra al MPlayer. +Escríbelas separadas por espacios. +Ejemplo: -flip -nosound + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + También puedes pasar filtros de vídeo adicionales. +Sepáralos con ",". ¡No uses espacios! +Ejemplo: scale=512:-2,eq2=1.1 + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + Y finalmente los filtros de audio. Misma norma que para los filtros de audio. +Ejemplo: resample=44100:0:0,volnorm + + + + Don't repaint the background of the video window + No redibujar el fondo de la ventana de vídeo + + + + &Logs + &Logs + + + + Log MPlayer output + Guardar los textos de la salida del MPlayer + + + + Log SMPlayer output + Guardar los textos de la salida del SMPlayer + + + + This option is mainly intended for debugging the application. + Esta opción es principalmente para depurar la aplicación. + + + + &MPlayer language + &Idioma del MPlayer + + + + SMPlayer needs to read and parse the output of MPlayer and sometimes it relies on English text. If you are using a MPlayer translated into another language, then you need to change the texts that SMPlayer looks for. (Technically you should enter regular expressions)<br><br> +The drop-down lists may provide already made regular expression for several languages. + Para el perfecto funcionamiento del programa, SMPlayer tiene que leer e interpretar los mensajes de salida del MPlayer y a veces busca textos en inglés. Si estás usando un MPlayer traducido a otro idioma, entonces necesitas cambiar los textos que SMPlayer busca. (Técnicamente debes introducir expresiones regulares)<br><br> +Los combos proporcionan algunas expresiones regulares ya hechas para varios idiomas. + + + + Checking this option may reduce flickering, but it also might produce that the video won't be displayed properly. + Marcando esta opción se pueden reducir los parpadeos, pero también podría pasar que el vídeo no se mostrase correctamente. + + + + If checked, smplayer will store the output of mplayer (you can see it in <b>Options->View logs->mplayer</b>). In case of problems this log can contain important information, so it's recommended to keep this option checked. + Si está marcada, smplayer almacenará la salida del mplayer (la puedes ver en <b>Opciones->Ver logs->mplayer</b>). En caso de problemas este log puede contener información importante, por tanto es recomendable mantener activada esta opción. + + + + If this option is checked, smplayer will store the debugging messages that smplayer outputs (you can see the log in <b>Options->View logs->smplayer</b>). This information can be very useful for the developer in case you find a bug. + Si esta opción está marcada, smplayer almacenará los mensajes de depuración que emite (puedes verlos en <b>Opciones->Ver logs->smplayer</b>). Esta información puede ser muy útil para el programador en caso de que encuentres algún bug. + + + + Filter for SMPlayer logs + Filtro para los logs del SMPlayer + + + + This option allows to filter the smplayer messages that will be stored in the log. Here you can write any regular expression.<br>For instance: <i>^Core::.*</i> will display only the lines starting with <i>Core::</i> + Esta opción permite filtrar los mensajes que se almacenarán en el log. Aquí puedes escribir cualquier expresión regular.<br>Por ejemplo: <i>^Core::.*</i> mostrará sólo las líneas que comiencen por <i>Core::</i> + + + + &Monitor aspect: + Aspect ratio del &monitor: + + + + &Run MPlayer in its own window + E&jecutar el MPlayer en su propia ventana + + + + &Options: + &Opciones: + + + + V&ideo filters: + Filtros de víd&eo: + + + + Audio &filters: + &Filtros de audio: + + + + &Colorkey: + &Colorkey: + + + + &Don't repaint the background of the video window + &No redibujar el fondo de la ventana de vídeo + + + + Log &MPlayer output + Guardar los textos de la salida del &MPlayer + + + + Log &SMPlayer output + Guardar los textos de la salida del &SMPlayer + + + + &Filter for SMPlayer logs: + &Filtro para los logs del SMPlayer: + + + + &End of file: + &Final de fichero: + + + + &No video: + &No hay vídeo: + + + + C&hange... + Cam&biar... + + + + PrefAssociations + + + Warning + Advertencia + + + + Not all files could be associated. Please check your security permissions and retry. + No todos los ficheros han podido ser asociados. Verifica los permisos de seguridad y reinténtalo. + + + + File Types + Tipos de ficheros + + + + Select all + Seleccionar todos + + + + Check all file types in the list + Marca todos los tipos de ficheros de la lista + + + + Uncheck all file types in the list + Desmarca todos los tipos de ficheros de la lista + + + + List of file types + Lista de tipos de ficheros + + + + File types + Tipos de ficheros + + + + Media files handled by SMPlayer: + Ficheros controlados por SMPlayer: + + + + Select All + Seleccionar todos + + + + Select None + No seleccionar ninguno + + + + Check the media file extensions you would like SMPlayer to handle. When you click Apply, the checked files will be associated with SMPlayer. If you uncheck a media type, the file association will be restored. + Marca los tipos de ficheros que deseas que SMPlayer controle. Cuando pulses en Aplicar, los ficheros marcados serán asociados a SMPlayer. Si desmarcas un tipo de fichero, se recuperará la asociación previa. + + + + Select none + No seleccionar ninguno + + + + PrefDrives + + + Drives + Unidades de disco + + + + Currently SMPlayer does not autodetect cdrom or dvd devices. So in order to play cdroms or dvds you must first select here your cdrom and dvd drives (can be the same). + Actualmente SMPlayer no autodetecta unidades de cdrom o dvd. Por tanto para que sea posible reproducir cdroms o dvds es necesario que selecciones tu unidad de cd y dvd (pueden ser la misma). + + + + icon + icon + + + + Select your CD device: + Selecciona tu dispositivo CD: + + + + Select your DVD device: + Selecciona tu dispositivo DVD: + + + + CD device + Dispositivo CD + + + + Choose your CDROM device. It will be used to play VCDs and Audio CDs. + Selecciona tu dispositivo CDROM. Se usará para reproducir VCDs y CDs de audio. + + + + DVD device + Dispositivo DVD + + + + Choose your DVD device. It will be used to play DVDs. + Selecciona tu dispositivo DVD. Se usará para reproducir DVDs. + + + + Select your &CD device: + Selecciona tu dispositivo &CD: + + + + Select your &DVD device: + Selecciona tu dispositivo &DVD: + + + + PrefGeneral + + + General + General + + + + &General + &General + + + + Paths + Trayectorias + + + + Select... + Seleccionar... + + + + Folder for storing screenshots: + Carpeta donde se guardarán las capturas de pantalla: + + + + Search... + Buscar... + + + + Select the MPlayer executable: + Selecciona el ejecutable del MPlayer: + + + + Output drivers + Drivers de salida + + + + Video: + Vídeo: + + + + Audio: + Audio: + + + + Media settings + Opciones para los ficheros + + + + Remember settings for all files (audio track, subtitles...) + Recordar las opciones para cada vídeo (pista de audio, subtítulos...) + + + + Don't remember time position (files start playing from the beginning) + No recordar por donde se quedó el vídeo (reproducción desde el inicio) + + + + Preferred audio and subtitles + Audio y subtítulos preferidos + + + + Subtitles: + Subtítulos: + + + + &Video and audio + &Vídeo y audio + + + + Video + Vídeo + + + + Use software video equalizer + Usar ecualizador de vídeo por software + + + + Enable postprocessing for all videos + Activar el postprocesado para todos los vídeos + + + + Quality: + Calidad: + + + + Start videos in fullscreen + Comenzar los vídeos a pantalla completa + + + + Disable screensaver + Desactivar salvapantallas + + + + Audio + Audio + + + + Use software volume control + Usar control de volumen por software + + + + Max. Amplification: + Máx. amplificación: + + + + AC3/DTS pass-through S/PDIF + Pasar AC3/DTS por S/PDIF + + + + Volume normalization + Normalización de volumen + + + + Select the mplayer executable + Selecciona el ejecutable del mplayer + + + + Executables + Ejecutables + + + + All files + Todos los ficheros + + + + Select a directory + Seleccionar un directorio + + + + MPlayer executable + Ejecutable del MPlayer + + + + Here you must specify the mplayer executable that smplayer will use.<br>smplayer requires at least mplayer 1.0rc1 (svn recommended).<br><b>If this setting is wrong, smplayer won't be able to play anything!</b> + Aquí debes especificar el ejecutable del mplayer que será usado por el smplayer.<br>smplayer requiere al menos mplayer 1.0rc1 (svn recomendado).<br><b>Si esta opción es incorrecta, ¡smplayer no será capaz de reproducir nada!</b> + + + + Screenshots folder + Carpeta para las capturas de pantalla + + + + Here you can specify a folder where the screenshots taken by smplayer will be stored. If this field is empty the screenshot feature will be disabled. + Aquí puedes especificar la carpeta donde se guardarán las capturas de pantalla. Si dejas el campo vacío no se realizarán capturas de pantalla. + + + + Video output driver + Driver de salida de vídeo + + + + Select the video output driver. Usually xv (linux) and directx (windows) provide the best performance. + Selecciona el driver de vídeo. Normalmente xv (linux) y directx (windows) proporcionan el mejor rendimiento. + + + + Audio output driver + Driver de salida de audio + + + + Select the audio output driver. + Selecciona el driver de audio. + + + + Remember settings + Recordar opciones + + + + Usually smplayer will remember the settings for each file you play (audio track selected, volume, filters...). Uncheck this option if you don't like this feature. + Normalmente smplayer recordará las opciones para cada fichero que reproduzcas (la pista de audio seleccionada, el volumen, los filtros...). Desmarca esta opción si no te gusta que haga esto. + + + + Don't remember time position + No recordar por donde se quedó el vídeo + + + + If you check this option, smplayer will play all files from the beginning. + Si marcas esta opción, smplayer reproducirá todos los ficheros desde el principio. + + + + Preferred audio language + Idioma preferido para el audio + + + + Here you can type your preferred language for the audio streams. When a media with multiple audio streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the audio streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the audio track if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + Aquí puedes introducir el idioma preferido para la pista de audio. Cuando se reproduzca un vídeo con múltiples pistas de audio, smplayer intentará usar tu idioma preferido.<br>Esto sólo funcionará con medios que ofrezcan información sobre los idiomas de las pistas de audio, como los DVDs o ficheros mkv.<br>Este campo acepta expresiones regulares. Ejemplo: <b>es|esp|spa</b> seleccionará la pista de audio si coincide con <i>es</i>, <i>esp</i> o <i>spa</i>. + + + + Preferred subtitle language + Idioma preferido para los subtítulos + + + + Here you can type your preferred language for the subtitle stream. When a media with multiple subtitle streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the subtitle streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the subtitle stream if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + Aquí puedes introducir el idioma preferido para los subtítulos. Cuando se reproduzca un vídeo con múltiples subtítulos, smplayer intentará usar tu idioma preferido.<br>Esto sólo funcionará con medios que ofrezcan información sobre los idiomas de los subtítulos, como los DVDs o ficheros mkv.<br>Este campo acepta expresiones regulares. Ejemplo: <b>es|esp|spa</b> seleccionará el subtítulo si coincide con <i>es</i>, <i>esp</i> o <i>spa</i>. + + + + Software video equalizer + Ecualizador de vídeo por software + + + + You can check this option if video equalizer is not supported by your graphic card or the selected video output driver.<br><b>Note:</b> this option can be incompatible with some video output drivers. + Puedes marcar esta opción si tu tarjeta gráfica o el driver de vídeo no tienen soporte para ecualizador de vídeo.<br><b>Nota:</b> esta opción puede ser incompatible con algunos drivers de vídeo. + + + + If this option is checked, all videos will start to play in fullscreen mode. + Si esta opción está marcada, todos los vídeos comenzarán a reproducirse a pantalla completa. + + + + Check this option to disable the screensaver while playing.<br>The screensaver will enabled again when play finishes.<br><b>Note:</b> This option works only in X11 and Windows. + Marca esta opción para desactivar el salvapantallas durante la reproducción.<br>El salvapantallas se volverá a activar cuando la reproducción acabe.<br><b>Nota:</b> Esta opción sólo funciona en X11 y Windows. + + + + Software volume control + Control de volumen por software + + + + Check this option to use the software mixer, instead of using the sound card mixer. + Marca esta opción para usar el mezclador por software, en lugar del mezclador de la tarjeta de sonido. + + + + Postprocessing quality + Calidad del postprocesado + + + + Dynamically changes the level of postprocessing depending on the available spare CPU time. The number you specify will be the maximum level used. Usually you can use some big number. + Cambia dinámicamente el nivel de postprocesado dependiendo del tiempo de CPU disponible. El número que especifique será el mínimo nivel usado. Normalmente puede usar un número grande. + + + + Change volume + Cambiar volumen + + + + If checked, SMPlayer will remember the volume for every file and will restore it when played again. For new files the default volume will be used. + Si la opción está marcada, SMPlayer recordará el volumen de cada archivo y lo recuperará cuando se reproduzca otra vez. Para archivos nuevos se usará el volumen por defecto. + + + + Default volume: + Volumen por defecto: + + + + 0 + 0 + + + + &Change volume on every file + Ca&mbiar el volumen en cada archivo + + + + &Search... + &Buscar... + + + + S&elect... + S&eleccionar... + + + + Select the &MPlayer executable: + Selecciona el ejecutable del &MPlayer: + + + + &Folder for storing screenshots: + &Carpeta donde se guardarán las capturas de pantalla: + + + + V&ideo: + Ví&deo: + + + + &Audio: + &Audio: + + + + &Don't remember time position (files start playing from the beginning) + &No recordar por donde se quedó el vídeo (reproducción desde el inicio) + + + + &Remember settings for all files (audio track, subtitles...) + &Recordar las opciones para cada vídeo (pista de audio, subtítulos...) + + + + A&udio: + A&udio: + + + + Su&btitles: + Sub&títulos: + + + + &Use software video equalizer + &Usar ecualizador de vídeo por software + + + + &Enable postprocessing for all videos + &Activar el postprocesado para todos los vídeos + + + + &Quality: + &Calidad: + + + + Start videos in &fullscreen + Comen&zar los vídeos a pantalla completa + + + + Disable &screensaver + Desactivar &salvapantallas + + + + &Default volume: + Volumen por &defecto: + + + + Use s&oftware volume control + Usar control de volumen por s&oftware + + + + Ma&x. Amplification: + Má&x. amplificación: + + + + &AC3/DTS pass-through S/PDIF + &Pasar AC3/DTS por S/PDIF + + + + Volume &normalization + &Normalización de volumen + + + + Direct rendering + Renderizado directo + + + + If checked, turns on direct rendering (not supported by all codecs and video outputs)<br><b>WARNING:</b> May cause OSD/SUB corruption! + Si está marcado, activa el renderizado directo (no está soportado por todos los codecs y salidas de vídeo)<br><b>AVISO:</b> ¡Puede causar corrupción en el OSD y subtítulos! + + + + Double buffering + Doble buffer + + + + D&irect rendering + Renderizado d&irecto + + + + Dou&ble buffering + Do&ble buffer + + + + Double buffering fixes flicker by storing two frames in memory, and displaying one while decoding another. If disabled it can affect OSD negatively, but often removes OSD flickering. + El doble buffer soluciona los problemas de parpadeo almacenando dos imáenes en memoria y mostrando una mientras decodifica la otra. Puede afectar al OSD negativamente, pero a menudo elimina el parpadeo del OSD. + + + + &Enable postprocessing by default + &Activar el postprocesado por defecto + + + + Volume &normalization by default + &Normalización de volumen por defecto + + + + Close when finished + Cerrar al acabar la reproducción + + + + If this option is checked, the main window will be automatically closed when the current file/playlist finishes. + Si esta opción está marcada, la ventana principal se cerrará automáticamente cuando el fichero o lista de reproducción llegue al final. + + + + &Close when finished + Cerrar al acabar &la reproducción + + + + 2 (Stereo) + 2 (Estéreo) + + + + 4 (4.0 Surround) + 4 (4.0 Surround) + + + + 6 (5.1 Surround) + 6 (5.1 Surround) + + + + C&hannels by default: + Cana&les por defecto: + + + + &Pause when minimized + &Pausar al minimizar + + + + Pause when minimized + Pausar al minimizar + + + + If this option is enabled, the file will be paused when the main window is hidden. When the window is restored, play will be resumed. + Si esta opción está activada, el fichero se pondrá en pausa cuando la ventana principal sea minimizada. Una vez que la ventana vuelva a ser visible, la reproducción continuará. + + + + Enable postprocessing by default + Activar el postprocesado por defecto + + + + Posprocessing will be used by default on new open files. + El postprocesado será usado por defecto en los nuevos ficheros que se abran. + + + + Max. Amplification + Máx. amplificación + + + + Volume normalization by default + Normalización de volumen por defecto + + + + Maximizes the volume without distorting the sound. + Aumenta el volumen sin distorsionar el sonido. + + + + Default volume + Volumen por defecto + + + + Sets the initial volume that new files will use. + Establece el volumen inicial que tendrán los nuevos ficheros. + + + + Channels by default + Canales por defecto + + + + Sets the maximum amplification level in percent (default: 110). A value of 200 will allow you to adjust the volume up to a maximum of double the current level. With values below 100 the initial volume (which is 100%) will be above the maximum, which e.g. the OSD cannot display correctly. + Fija el nivel máximo de amplificación en porcentaje (por defecto: 110). Un valor de 200 le permitirá ajustar el volumen hasta un máximo del doble del nivel actual. Con valores por debajo de 100 el volumen inicial (que es el 100%) estará por debajo del máximo, p.e. el OSD no se mostrará correctamente. + + + + Uses hardware AC3 passthrough + + + + + Requests the number of playback channels. MPlayer asks the decoder to decode the audio into as many channels as specified. Then it is up to the decoder to fulfill the requirement. This is usually only important when playing videos with AC3 audio (like DVDs). In that case liba52 does the decoding by default and correctly downmixes the audio into the requested number of channels. NOTE: This option is honored by codecs (AC3 only), filters (surround) and audio output drivers (OSS at least). + Cambia el número de canales de reproducción. MPlayer pide al decodificador que decodifique el audio en tantos canales como se hayan especificado. Entonces depende del decodificador cumplir con la petición. Normalmente sólo es importante cuando se reproducen vídeos con audio AC3 (como los DVDs). En ese caso la liba52 realiza la decodificación por defecto y mezcla correctamente el audio en el número de canales que se han pedido. NOTA: Esta opción es respetada por los codecs (AC3 solo), filtros (surround) y controladores de audio (al menos OSS). + + + + Postprocessing will be used by default on new opened files. + El postprocesado será usado por defecto en los nuevos ficheros que se abran. + + + + PrefInput + + + Keyboard and mouse + Teclado y ratón + + + + &Keyboard + &Teclado + + + + icon + icon + + + + Here you can change any key shortcut. To do it double click or start typing over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + Aquí puedes cambiar los atajos de teclado. Para hacerlo haz doble click o empieza a escribir sobre un atajo. Opcionalmente también puedes guardar la lista para compartirla con otras personas o usarla en otro ordenador. + + + + &Mouse + &Ratón + + + + Button functions: + Funciones de los botones: + + + + Media seeking + Desplazarse por el medio + + + + Volume control + Controlar el volumen + + + + Zoom video + Hacer zoom en el vídeo + + + + None + Ninguna + + + + Here you can change any key shortcut. To do it double click or press enter over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + Aquí puedes cambiar los atajos de teclado. Para hacerlo haz doble click o pulsa intro sobre un atajo. Opcionalmente también puedes guardar la lista para compartirla con otras personas o usarla en otro ordenador. + + + + &Left click + &Botón izquierdo + + + + &Double click + &Doble click + + + + &Wheel function: + &Función de la rueda: + + + + Shortcut editor + Editor de atajos + + + + This table allows you to change the key shortcuts of most available actions. Double click or press enter on a item, or press the <b>Change shortcut</b> button to enter in the <i>Modify shortcut</i> dialog. There are two ways to change a shortcut: if the <b>Capture</b> button is on then just press the new key or combination of keys that you want to assign for the action (unfortunately this doesn't work for all keys). If the <b>Capture</b> button is off then you could enter the full name of the key. + Esta tabla te permite cambiar los atajos del teclado para la mayoría de las acciones disponibles. Haz doble click o pulsa intro sobre una acción, o pulsa el botón <b>Modificar atajo</b> para abrir el diálogo <i>Modificar atajo</i>. Hay dos maneras de cambiar un atajo: si el botón <b>Capturar</b> está activado, entonces simplemente presiona la nueva tecla o combinación de teclas que desees asignar para la acción (desafortunadamente no funciona con todas las teclas). Si el botón <b>Capturar</b> está desactivado entonces puedes teclear el nombre completo de la tecla. + + + + Left click + Botón izquierdo + + + + Select the action for left click on the mouse. + Selecciona la acción para el botón izquierdo del ratón. + + + + Double click + Doble click + + + + Select the action for double click on the mouse. + Selecciona la acción para el doble click del ratón. + + + + Wheel function + Función de la rueda + + + + Select the action for the mouse wheel. + Selecciona la acción para la rueda del ratón. + + + + PrefInterface + + + Interface + Interfaz + + + + Bulgarian + Búlgaro + + + + Czech + Checo + + + + German + Alemán + + + + Greek + Griego + + + + English + Inglés + + + + Spanish + Español + + + + Finnish + Finés + + + + French + Francés + + + + Hungarian + Húngaro + + + + Italian + Italiano + + + + Japanese + Japonés + + + + Georgian + Georgiano + + + + Dutch + Holandés + + + + Polish + Polaco + + + + Portuguese - Brazil + Portugués - Brasil + + + + Portuguese - Portugal + Portugués - Portugal + + + + Romanian + Rumano + + + + Russian + Ruso + + + + Slovak + Eslovaco + + + + Serbian + Serbio + + + + Swedish + Sueco + + + + Turkish + Turco + + + + Ukrainian + Ucraniano + + + + Simplified-Chinese + Chino simplificado + + + + Traditional Chinese + Chino tradicional + + + + <Autodetect> + <Autodetectar> + + + + Default + Por defecto + + + + &Interface + &Interfaz + + + + Seeking + Búsqueda + + + + Never + Nunca + + + + Whenever it's needed + Siempre que sea necesario + + + + Only after loading a new video + Sólo después de cargar un nuevo vídeo + + + + Recent files + Ficheros recientes + + + + Language + Idioma + + + + Here you can change the language of the application. + Aquí puedes cambiar el idioma del programa. + + + + Instances + Instancias + + + + Catalan + Catalán + + + + Basque + Euskera + + + + Galician + Gallego + + + + &Short jump + &Salto corto + + + + &Medium jump + Salto &medio + + + + &Long jump + Salto &largo + + + + Mouse &wheel jump + &Rueda del ratón + + + + &Use only one running instance of SMPlayer + &Usar sólo una única instancia de SMPlayer + + + + SMPlayer will listen to this &port to receive commands from other instances: + SMPlayer escuchará este &puerto para recibir órdenes de otras instancias: + + + + Main window &resize method + Ajuste del &tamaño de la ventana + + + + Ma&x. items + Má&x. entradas + + + + St&yle: + Estil&o: + + + + Ico&n set: + Juego de ico&nos: + + + + L&anguage: + I&dioma: + + + + Main window + Ventana principal + + + + Auto&resize: + Ajuste automático del &tamaño: + + + + R&emember position and size + R&ecordar la posición y el tamaño + + + + Default font: + Tipo de letra por defecto: + + + + &Change... + &Cambiar... + + + + PrefPerformance + + + Performance + Rendimiento + + + + Form + Form + + + + &Performance + &Rendimiento + + + + Priority + Prioridad + + + + Select the priority for the MPlayer process. + Selecciona la prioridad con la que se ejecutará el MPlayer. + + + + Priority: + Prioridad: + + + + realtime + realtime + + + + high + high + + + + abovenormal + abovenormal + + + + normal + normal + + + + belownormal + belownormal + + + + idle + idle + + + + Cache + Caché + + + + Size: + Tamaño: + + + + KB + KB + + + + Use cache + Usar caché + + + + Setting a cache may improve performance on slow media + Usar una caché puede mejorar el rendimiento en medios lentos + + + + Allow frame drop + Permitir saltar fotogramas + + + + Allow hard frame drop (can lead to image distortion) + Permitir saltar aún más fotogramas (puede corromper la imagen) + + + + Synchronization + Sincronización + + + + Audio/video auto synchronization + Sincronización automática de audio y vídeo + + + + Factor: + Factor: + + + + Fast audio track switching + Cambio rápido de pista de audio + + + + Fast seek to chapters in dvds + Selección rápida de capítulos en dvds + + + + Set process priority for mplayer according to the predefined priorities available under Windows.<br><b>WARNING:</b> Using realtime priority can cause system lockup. + Establece la prioridad del proceso del mplayer según las prioridades disponibles en Windows.<br><b>ADVERTENCIA:</b> Usar la prioridad realtime puede causar el cuelgue del sistema. + + + + <br><b>Note:</b> This option is for Windows only. + <br><b>Nota:</b> Esta opción es sólo para Windows. + + + + This option specifies how much memory (in kBytes) to use when precaching a file or URL. Especially useful on slow media. + Esta opción especifica cuanta memoria se usará (en kBytes) cuando se rellene la cache para reproducir un fichero o una URL. Especialmente útil para medios lentos. + + + + Skip displaying some frames to maintain A/V sync on slow systems. + Se salta la representación de algunas imágenes para mantener la sincronización audio/vídeo en sistemas lentos. + + + + Allow hard frame drop + Permitir saltar aún más fotogramas + + + + More intense frame dropping (breaks decoding). Leads to image distortion! + Salto mayor de imágenes (puede romper la decodificación). ¡Puede corromper la imagen! + + + + Gradually adjusts the A/V sync based on audio delay measurements. + Ajusta gradualmente la sincronización audio/vídeo basada en medidas de retardo de audio. + + + + Priorit&y: + Priorida&d: + + + + Si&ze: + &Tamaño: + + + + &Use cache + &Usar caché + + + + &Allow frame drop + &Permitir saltar fotogramas + + + + Allow &hard frame drop (can lead to image distortion) + Permitir saltar aún más &fotogramas (puede corromper la imagen) + + + + Audio/&video auto synchronization + Sincronización automática de audio y &vídeo + + + + Fact&or: + Fact&or: + + + + &Fast audio track switching + &Cambio rápido de pista de audio + + + + Fast &seek to chapters in dvds + &Selección rápida de capítulos en dvds + + + + Create index if needed + Crear un índice si es necesario + + + + Rebuilds index of files if no index was found, allowing seeking. Useful with broken/incomplete downloads, or badly created files. This option only works if the underlying media supports seeking (i.e. not with stdin, pipe, etc).<br> Note: the creation of the index may take some time. + Reconstruye el índice de los archivos en los que no se encuentra, permitiendo búsquedas. Es útil con descargas rotas/incompletas, o archivos que están mal creados. Esta opción solo funciona si el medio soporta búsquedas (p.e. no con stdin, pipe, etc).<br>Nota: la creación del índice puede llevar algún tiempo. + + + + &Create index if needed + Cr&ear un índice si es necesario + + + + If checked, it will try the fastest method to switch audio tracks but might not work with some formats. + Si la opción está marcada se intentará usar el método más rápido para cambiar la pista de audio pero puede que no funcione con algunos formatos. + + + + If checked, it will try the fastest method to seek to chapters but it might not work with some discs. + Si la opción está marcada se intentará usar el método más rápido para buscar capítulos pero puede no funcionar con algunos discos. + + + + PrefSubtitles + + + Subtitles + Subtítulos + + + + Choose a ttf file + Elige un fichero ttf + + + + Truetype Fonts + Fuentes Truetype + + + + Form + Form + + + + &Subtitles + &Subtítulos + + + + Autoload + Autocargar + + + + Autoload subtitles files (*.srt, *.sub...): + Autocargar ficheros de subtítulos (*.srt, *.sub...): + + + + Select first available subtitle + Seleccionar el primer subtítulo disponible + + + + Same name as movie + De igual nombre que el vídeo + + + + All subs containing movie name + Todos los que contengan el nombre del vídeo + + + + All subs in directory + Todos los subtítulos del directorio + + + + Default subtitle encoding: + Codificación de los subtítulos: + + + + Position + Posición + + + + Default position of the subtitles on screen + Posición por defecto de los subtítulos en la pantalla + + + + 0 + 0 + + + + Top + Arriba + + + + Bottom + Abajo + + + + Include subtitles on screenshots + Incluir subtítulos en las capturas de pantalla + + + + Use -subfont option (required by recent MPlayer releases) + Usar la opción -subfont (necesario en versiones recientes de MPlayer) + + + + &Font + &Tipo de letra + + + + Font + Tipo de letra + + + + TTF font: + Fuente ttf: + + + + Search... + Buscar... + + + + System font: + Fuente del sistema: + + + + Select the font which will be used for subtitles (and OSD): + Selecciona el tipo de letra que se usará para los subtítulos (y OSD): + + + + Size + Tamaño + + + + Autoscale: + Autoescalar: + + + + No autoscale + No autoescalar + + + + Proportional to movie height + Proporcional a la altura del vídeo + + + + Proportional to movie width + Proporcional a la anchura del vídeo + + + + Proportional to movie diagonal + Proporcional a la diagonal del vídeo + + + + Scale: + Escala: + + + + SSA/&ASS library + Librería SSA/&ASS + + + + The new SSA/ASS library will provide nice styled subtitles for external SSA/ASS subtitles files and Matroska tracks. But it will be used too for rendering other formats like SUB and SRT files. + La nueva librería SSA/ASS es capaz de mostrar estupendos subtítulos para ficheros SSA/ASS y pistas Matroska. También se usará para mostrar subtítulos en otros formatos, como ficheros SUB y SRT. + + + + Use SSA/ASS library for subtitle rendering + Usar la librería SSA/ASS para dibujar los subtítulos + + + + Text color: + Color del texto: + + + + Border color: + Color del borde: + + + + Here you can override styles for SSA/ASS subtitles. It can be also used for fine-tuning the rendering of SRT and SUB subtitles by the SSA/ASS library. Example: <b>Bold=1,Outline=2,Shadow=4</b> + Aquí puedes modificar los estilos de los subtítulos SSA/ASS. También se puede utilizar para ajustar la forma en que la libreria SSA/ASS genera los subtítulos SRT y SUB. Ejemplo: <b>Bold=1,Outline=2,Shadow=4</b> + + + + Styles: + Estilos: + + + + Subtitle position + Posición de los subtítulos + + + + This option specifies the position of the subtitles over the video window. <i>100</i> means the bottom, while <i>0</i> means the top. + Esta opción especifica la posición de los subtítulos en la ventana de vídeo. <i>100</i> es abajo del todo, mientras que <i>0</i> es la parte más alta. + + + + SSA/ASS styles + Estilos SSA/ASS + + + + Au&toload subtitles files (*.srt, *.sub...): + A&utocargar ficheros de subtítulos (*.srt, *.sub...): + + + + S&elect first available subtitle + S&eleccionar el primer subtítulo disponible + + + + &Default subtitle encoding: + &Codificación de los subtítulos: + + + + Default &position of the subtitles on screen + &Posición por defecto de los subtítulos en la pantalla + + + + &Include subtitles on screenshots + &Incluir subtítulos en las capturas de pantalla + + + + &Use -subfont option (required by recent MPlayer releases) + Usar &la opción -subfont (necesario en versiones recientes de MPlayer) + + + + &TTF font: + &Fuente ttf: + + + + Sea&rch... + Busca&r... + + + + S&ystem font: + Fuente del s&istema: + + + + A&utoscale: + A&utoescalar: + + + + S&cale: + Es&cala: + + + + &Use SSA/ASS library for subtitle rendering + &Usar la librería SSA/ASS para dibujar los subtítulos + + + + &Text color: + &Color del texto: + + + + &Border color: + Color del &borde: + + + + St&yles: + &Estilos: + + + + PreferencesDialog + + + SMPlayer - Help + SMPlayer - Ayuda + + + + OK + Aceptar + + + + Cancel + Cancelar + + + + Apply + Aplicar + + + + Help + Ayuda + + + + SMPlayer - Preferences + SMPlayer - Preferencias + + + + QObject + + + 1 second + 1 segundo + + + + %1 seconds + %1 segundos + + + + %1 minutes + %1 minutos + + + + %1 minutes and %2 seconds + %1 minutos y %2 segundos + + + + 1 minute + 1 minuto + + + + 1 minute and 1 second + 1 minuto y 1 segundo + + + + 1 minute and %1 seconds + 1 minuto y %1 segundos + + + + %1 minutes and 1 second + %1 minutos y 1 segundo + + + + Usage: %1 [-ini-path [directory]] [-action action_name] [-close-at-end] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + + Mode de uso: %1 [-ini-path [directorio]] [-action nombre_de_acción] [-close-at-end] [-help|--help|-h|-?] [[-playlist] medio] [[-playlist] medio]... + + + + + -ini-path: specifies the directory for the configuration file + (smplayer.ini). If directory is omitted, the application + directory will be used. + + -ini-path: especifica el directorio del fichero de configuración + (smplayer.ini). Si se omite el directorio, se usará el + directorio del programa. + + + + + -action: tries to make a connection to another running instance + and send to it the specified action. Example: -action pause + The rest of options (if any) will be ignored and the + application will exit. It will return 0 on success or -1 + on failure. + + -action: intenta realizar una conexión con otra instancia del + programa, y le enviará la acción especificada. + Ejemplo: -action pause. El resto de opciones (si hay) se + ignorarán y el programa finalizará. Retornará 0 si todo va + bien o -1 si se produce algún fallo. + + + + + -close-at-end: the main window will be closed when the file/playlist finish + + -close-at-end: la ventana principal se cerrará cuando el fichero/lista de + reproducción llege al final + + + + + -help: will show this message and then will exit. + + -help: mostrará este mensaje. + + + + + media: 'media' is any kind of file that SMPlayer can open. It can + be a local file, a DVD (e.g. dvd://1), an Internet stream + (e.g. mms://....) or a local playlist in format m3u. + If the -playlist option is used, that means that SMPlayer + will pass the -playlist option to MPlayer, so MPlayer will + will handle the playlist, not SMPlayer. + + medio: 'medio' es cualquier tipo de archivo que SMPlayer pueda + abrir. Puede ser un fichero local, un DVD (p.e. dvd://1), + un stream de internet (p.e mms://....) o una lista de + reproducción local en formato m3u. Si se usa la opción + -playlist, SMPlayer pasará la opción -playlist a MPlayer, + por tanto será MPlayer quien controle la lista de + reproducción, y no SMPlayer. + + + + + This is SMPlayer v. %1 running on %2 + + Esto es SMPlayer v. %1 ejecutándose en %2 + + + + + Usage: %1 [-ini-path [directory]] [-action action_name] [-close-at-end] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + Mode de uso: %1 [-ini-path [directorio]] [-action nombre_de_acción] [-close-at-end] [-help|--help|-h|-?] [[-playlist] medio] [[-playlist] medio]... + + + + specifies the directory for the configuration file (smplayer.ini). If directory is omitted, the application directory will be used. + especifica el directorio del fichero de configuración (smplayer.ini). Si se omite el directorio, se usará el directorio del programa. + + + + tries to make a connection to another running instance and send to it the specified action. Example: -action pause The rest of options (if any) will be ignored and the application will exit. It will return 0 on success or -1 on failure. + intenta realizar una conexión con otra instancia del programa, y le enviará la acción especificada. Ejemplo: -action pause. El resto de opciones (si hay) se ignorarán y el programa finalizará. Retornará 0 si todo va bien o -1 si se produce algún fallo. + + + + the main window will be closed when the file/playlist finishes + la ventana principal se cerrará cuando el fichero/lista de reproducción llege al final + + + + will show this message and then will exit. + mostrará este mensaje. + + + + 'media' is any kind of file that SMPlayer can open. It can be a local file, a DVD (e.g. dvd://1), an Internet stream (e.g. mms://....) or a local playlist in format m3u. If the -playlist option is used, that means that SMPlayer will pass the -playlist option to MPlayer, so MPlayer will handle the playlist, not SMPlayer. + 'medio' es cualquier tipo de archivo que SMPlayer pueda abrir. Puede ser un fichero local, un DVD (p.e. dvd://1), un stream de internet (p.e mms://....) o una lista de reproducción local en formato m3u. Si se usa la opción -playlist, SMPlayer pasará la opción -playlist a MPlayer, por tanto será MPlayer quien controle la lista de reproducción, y no SMPlayer. + + + + the main window will be closed when the file/playlist finishes. + la ventana principal se cerrará cuando el fichero/lista de reproducción llege al final. + + + + This is SMPlayer v. %1 running on %2 + SMPlayer v. %1 ejecutándose en %2 + + + + Usage: %1 [-ini-path [directory]] [-send-action action_name] [-actions action_list [-close-at-end] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + Mode de uso: %1 [-ini-path [directorio]] [-send-action nombre_de_acción] [-actions lista_de_acciones] [-close-at-end] [-help|--help|-h|-?] [[-playlist] medio] [[-playlist] medio]... + + + + tries to make a connection to another running instance and send to it the specified action. Example: -send-action pause The rest of options (if any) will be ignored and the application will exit. It will return 0 on success or -1 on failure. + intenta realizar una conexión con otra instancia del programa, y le enviará la acción especificada. Ejemplo: -send-action pause. El resto de opciones (si hay) se ignorarán y el programa finalizará. Retornará 0 si todo va bien o -1 si se produce algún fallo. + + + + action_list is a list of actions separated by spaces. The actions will be executed just after loading the file (if any) in the same order you entered. For checkable actions you can pass true or false as parameter. Example: -actions "fullscreen compact true". Quotes are necessary in case you pass more that one action. + lista_de_acciones es una lista de acciones separada por espacios. Las acciones se ejecutarán justo después de cargar el fichero (si se especifica alguno) en el mismo orden en que se han introducido. Para aquellas acciones que se pueden activar o desactivar, se puede pasar true o false como parámetro. Ejemplo: -actions "fullscreen compact true". Las comillas son necesarias si se pasa más de una acción. + + + + action_list is a list of actions separated by spaces. The actions will be executed just after loading the file (if any) in the same order you entered. For checkable actions you can pass true or false as parameter. Example: -actions "fullscreen compact true". Quotes are necessary in case you pass more than one action. + lista_de_acciones es una lista de acciones separada por espacios. Las acciones se ejecutarán justo después de cargar el fichero (si se especifica alguno) en el mismo orden en que se han introducido. Para aquellas acciones que se pueden activar o desactivar, se puede pasar true o false como parámetro. Ejemplo: -actions "fullscreen compact true". Las comillas son necesarias si se pasa más de una acción. + + + + media + medio + + + + Usage: %1 [-ini-path [directory]] [-send-action action_name] [-actions action_list [-close-at-end] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + Mode de uso: %1 [-ini-path [directorio]] [-send-action nombre_de_acción] [-actions lista_de_acciones] [-close-at-end] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] medio] [[-playlist] medio]... + + + + if there's another instance running, the media will be added to that instance's playlist. If there's no other instance, this option will be ignored and the files will be opened in a new instance. + si hay otra instancia en ejecución, los ficheros se añadirán a la lista de reproducción de esa instancia. Si no hay ninguna otra instancia, esta opción será ignorada y los ficheros se abrirán en una nueva instancia. + + + + Usage: %1 [-ini-path directory] [-send-action action_name] [-actions action_list [-close-at-end] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + Mode de uso: %1 [-ini-path directorio] [-send-action nombre_de_acción] [-actions lista_de_acciones] [-close-at-end] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] medio] [[-playlist] medio]... + + + + specifies the directory for the configuration file (smplayer.ini). + especifica el directorio del fichero de configuración (smplayer.ini). + + + + Usage: %1 [-ini-path directory] [-send-action action_name] [-actions action_list [-close-at-end] [-no-close-at-end] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + Mode de uso: %1 [-ini-path [directorio]] [-send-action nombre_de_acción] [-actions lista_de_acciones] [-close-at-end] [-no-close-at-end] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] medio] [[-playlist] medio]... + + + + the main window won't be closed when the file/playlist finishes. + la ventana principal no se cerrará cuando el fichero/lista de reproducción llege al final. + + + + Usage: %1 [-ini-path directory] [-send-action action_name] [-actions action_list [-close-at-end] [-no-close-at-end] [-fullscreen] [-no-fullscreen] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + Mode de uso: %1 [-ini-path [directorio]] [-send-action nombre_de_acción] [-actions lista_de_acciones] [-close-at-end] [-no-close-at-end] [-fullscreen] [-no-fullscreen] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] medio] [[-playlist] medio]... + + + + the video will be played in fullscreen mode. + el vídeo se reproducirá a pantalla completa. + + + + the video will be played in window mode. + el vídeo se reproducirá en una ventana. + + + + SeekWidget + + + icon + icon + + + + label + label + + + + ShortcutGetter + + + Modify shortcut + Modificar atajo + + + + Clear + Limpiar + + + + Press the key combination you want to assign + Pulsa la combinación de teclas que deseas asignar + + + + Capture + Capturar + + + + Capture keystrokes + Capturar las pulsaciones del teclado + + + + VideoEqualizer + + + Contrast + Contraste + + + + Brightness + Brillo + + + + Hue + Tono + + + + Saturation + Saturación + + + + Gamma + Gamma + + + + Equalizer + Ecualizador + + + + &Reset + &Reiniciar + + + + &Set as default values + &Usar como valores por defecto + + + + Use the current values as default values for new videos. + Usa los valores actuales como valores por defecto para los nuevos vídeos. + + + + Set all controls to zero. + Pone todos los controles a cero. + + + diff --git a/retroshare-gui/src/apps/smplayer/translations/smplayer_fr.qm b/retroshare-gui/src/apps/smplayer/translations/smplayer_fr.qm new file mode 100644 index 000000000..715114ba9 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/translations/smplayer_fr.qm differ diff --git a/retroshare-gui/src/apps/smplayer/translations/smplayer_fr.ts b/retroshare-gui/src/apps/smplayer/translations/smplayer_fr.ts new file mode 100644 index 000000000..0b5209847 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/translations/smplayer_fr.ts @@ -0,0 +1,3999 @@ + + + + + AboutDialog + + + Version: %1 + Version : %1 + + + + 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. + Ce programme est un logiciel libre: vous pouvez le redistribuer et/ou le modifier selon les termes de la "GNU General Public License", tels que publiés par la "Free Software Foundation"; soit la version 2 de cette licence ou (à votre choix) toute version ultérieure. Ce programme est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE GARANTIE, ni explicite ni implicite; sans même les garanties de commercialisation ou d'adaptation dans un but spécifique. Se référer à la "GNU General Public License" pour plus de détails. Vous devriez avoir reçu une copie de la "GNU General Public License" en même temps que ce programme; sinon, écrivez a la "Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA". + + + + Translators: + Traducteurs : + + + + German + Allemand + + + + Slovak + Slovène + + + + Italian + Italien + + + + French + Français + + + + Simplified-Chinese + Chinois simplifié + + + + Russian + Russe + + + + Hungarian + Hongrois + + + + Japanese + Japonais + + + + Dutch + Hollandais + + + + Ukrainian + Ukrainien + + + + Georgian + Géorgien + + + + Czech + Tchèque + + + + Logo designed by %1 + Logo créé par %1 + + + + Get updates at: %1 + Mises à jour : %1 + + + + About SMPlayer + A propos de SMPlayer + + + + Polish + Polonais + + + + Bulgarian + Bulgare + + + + Turkish + Turc + + + + Swedish + Suédois + + + + Serbian + Serbe + + + + Traditional Chinese + Chinois traditionnel + + + + Romanian + Roumain + + + + Portuguese - Brazil + Brésilien + + + + Portuguese - Portugal + Portugais + + + + Compiled with Qt %1 + Compilé avec Qt %1 + + + + %1, %2 and %3 + %1, %2 et %3 + + + + %1 and %2 + %1 et %2 + + + + http://smplayer.sourceforge.net/en/windows/download.php + If the web page is translated into your language you can change the URL so it points to the download page in the translation.Otherwise leave as is. + http://smplayer.sourceforge.net/fr/windows/download.php + + + + http://smplayer.sourceforge.net/en/linux/download.php + If the web page is translated into your language you can change the URL so it points to the download page in the translation.Otherwise leave as is. + http://smplayer.sourceforge.net/fr/linux/download.php + + + + <b>%1</b>: %2 + <b>%1</b> : %2 + + + + ActionsEditor + + + Name + Nom + + + + Description + Description + + + + Shortcut + Raccourci + + + + &Save + &Enregistrer + + + + &Load + &Charger + + + + Key files + Fichiers *.key + + + + Choose a filename + Choisir un nom de fichier + + + + Confirm overwrite? + Confirmer l'écrasement ? + + + + The file %1 already exists. +Do you want to overwrite? + Le fichier %1 existe déjà. +Voulez-vous l'écraser ? + + + + Choose a file + Choisir un fichier + + + + Error + Erreur + + + + The file couldn't be saved + Ce fichier n'a pas pu être sauvegardé + + + + The file couldn't be loaded + Ce fichier n'a pas pu être chargé + + + + &Change shortcut... + &Changer le raccourci... + + + + BaseGui + + + &File... + &Fichier... + + + + D&irectory... + Doss&ier... + + + + &Playlist... + &Liste de lecture... + + + + &DVD from drive + &DVD depuis un lecteur + + + + D&VD from folder... + D&VD depuis un dossier... + + + + &URL... + &URL... + + + + P&lay + &Lecture + + + + &Pause + &Pause + + + + &Stop + &Stop + + + + &Frame step + &Image par image + + + + &Repeat + &Répéter + + + + &Normal speed + &Vitesse normale + + + + &Halve speed + &Vitesse /2 + + + + &Double speed + &Vitesse x2 + + + + Speed &-10% + Vitesse &-10% + + + + Speed &+10% + Vitesse &+10% + + + + Sp&eed + &Vitesse + + + + &Fullscreen + &Plein écran + + + + &Compact mode + &Mode compact + + + + &Equalizer + &Equaliseur + + + + &Screenshot + &Capturer écran + + + + S&tay on top + Res&ter au premier plan + + + + &Postprocessing + &Post-traitement + + + + &Autodetect phase + &Autodétection de la phase + + + + &Deblock + &De-blocking + + + + De&ring + De-&ringing + + + + Add n&oise + Ajouter &bruit + + + + F&ilters + &Filtres + + + + &Mute + &Muet + + + + Volume &- + Volume &- + + + + Volume &+ + Volume &+ + + + + &Delay - + &Délai - + + + + D&elay + + D&élai + + + + + &Extrastereo + &Extra Stéréo + + + + &Karaoke + &Karaoké + + + + &Filters + &Filtres + + + + &Load... + &Charger... + + + + Delay &- + Délai &- + + + + Delay &+ + Délai &+ + + + + &Up + &Haut + + + + &Down + &Bas + + + + &Playlist + &Liste de lecture + + + + &Show frame counter + Compteur d'image&s + + + + P&references + P&références + + + + &View logs + &Logs + + + + About &Qt + A propos de &Qt + + + + About &SMPlayer + A propos de &SMPlayer + + + + &Open + &Ouvrir + + + + &Play + &Lire + + + + &Video + &Vidéo + + + + &Audio + &Audio + + + + &Subtitles + &Sous-titrage + + + + &Browse + &Navigation + + + + Op&tions + Op&tions + + + + &Help + A&ide + + + + &Recent files + &Fichiers récents + + + + &Clear + &Effacer + + + + Si&ze + T&aille + + + + &Aspect ratio + &Aspect ratio + + + + &Deinterlace + &Désentrelacement + + + + De&noise + Débr&uiter + + + + &Autodetect + &Autodétection + + + + &4:3 + &4:3 + + + + &5:4 + &5:4 + + + + &14:9 + &14:9 + + + + 16:&9 + 16:&9 + + + + 1&6:10 + 1&6:10 + + + + &2.35:1 + &2.35:1 + + + + 4:3 &Letterbox + 4:3 &Letterbox + + + + 16:9 L&etterbox + 16:9 L&etterbox + + + + 4:3 &Panscan + 4:3 &Panscan + + + + 4:3 &to 16:9 + 4:3 &à 16:9 + + + + &None + Aucu&n + + + + &Lowpass5 + &Lowpass5 + + + + Linear &Blend + Linear &Blend + + + + N&ormal + N&ormal + + + + &Soft + &Léger + + + + &Track + &Piste + + + + &Channels + &Canaux + + + + &Stereo mode + &Mode Stéréo + + + + &Default + &Défaut + + + + &Stereo + &Stéréo + + + + &4.0 Surround + &4.0 Surround + + + + &5.1 Surround + &5.1 Surround + + + + &Left channel + &Canal gauche + + + + &Right channel + Canal &droit + + + + &Select + &Sélectionner + + + + &Title + &Titre + + + + &Chapter + &Chapitre + + + + &Angle + &Angle + + + + &OSD + &OSD + + + + &Disabled + &Désactivé + + + + &Seek bar + &Barre de navigation + + + + &Time + &Durée + + + + Time + T&otal time + Durée + Durée t&otale + + + + SMPlayer - mplayer log + SMPlayer - MPlayer log + + + + SMPlayer - smplayer log + SMPlayer - SMPlayer log + + + + <empty> + <vide> + + + + Video + Vidéo + + + + Audio + Audio + + + + Playlists + Listes de lecture + + + + All files + Tous les fichiers + + + + Choose a file + Choisir un fichier + + + + SMPlayer - Information + SMPlayer - Information + + + + The CDROM / DVD drives are not configured yet. +The configuration dialog will be shown now, so you can do it. + Les lecteurs CD/DVD ne sont pas encore configurés. +La boîte de dialogue de configuration va s'afficher pour que vous le fassiez maintenant. + + + + Choose a directory + Choisir un dossier + + + + Subtitles + Sous-titres + + + + About Qt + A propos de Qt + + + + Playing %1 + Lecture de %1 + + + + Pause + Pause + + + + Stop + Stop + + + + Play / Pause + Lecture / Pause + + + + Pause / Frame step + Pause / Saut d'images + + + + U&nload + Déchar&ger + + + + V&CD + V&CD + + + + C&lose + F&ermer + + + + View &info and properties... + Propr&iétés du fichier... + + + + Zoom &- + Zoom &- + + + + Zoom &+ + Zoom &+ + + + + &Reset + &Réinitialiser + + + + Move &left + A&ller à gauche + + + + Move &right + Aller à d&roite + + + + Move &up + &Monter + + + + Move &down + &Descendre + + + + &Pan && scan + &Pan && scan + + + + &Previous line in subtitles + Ligne &précédente + + + + N&ext line in subtitles + Ligne suivant&e + + + + -%1 + -%1 + + + + +%1 + +%1 + + + + Dec volume (2) + Volume - (2) + + + + Inc volume (2) + Volume + (2) + + + + Exit fullscreen + Sortir du mode plein écran + + + + OSD - Next level + OSD - Niveau suivant + + + + Dec contrast + Constrate - + + + + Inc contrast + Constrate + + + + + Dec brightness + Luminosité - + + + + Inc brightness + Luminosité + + + + + Dec hue + Ton - + + + + Inc hue + Ton - + + + + Dec saturation + Saturation - + + + + Dec gamma + Gamma - + + + + Next audio + Audio suivant + + + + Next subtitle + Sous-titre suivant + + + + Next chapter + Chapitre suivant + + + + Previous chapter + Chapitre précédent + + + + Inc saturation + Saturation + + + + + Inc gamma + Gamma + + + + + Toggle double size + Fixer en taille double + + + + &Load external file... + &Charger fichier extérieur... + + + + &Kerndeint + &Kerndeint + + + + &Yadif (normal) + &Yadif (normal) + + + + Y&adif (double framerate) + Y&adif (taux d'images double) + + + + &Next + &Suivant + + + + Pre&vious + &Précédent + + + + Volume &normalization + &Normalisation du volume + + + + &Audio CD + CD &Audio + + + + Denoise nor&mal + Débruité nor&mal + + + + Denoise &soft + Débruité &léger + + + + Denoise o&ff + P&as de débruité + + + + SMPlayer - Enter URL + SMPlayer - Entrez une URL + + + + URL: + URL : + + + + Use SSA/&ASS library + Utiliser la librairie SSA/&ASS + + + + Flip i&mage + Inverser l'i&mage + + + + &Toggle double size + &Fixer en taille double + + + + BaseGuiPlus + + + SMPlayer is still running here + SMPlayer fonctionne toujours + + + + S&how icon in system tray + Icône dans la barre de tâc&hes + + + + &Hide + Cac&her + + + + &Restore + &Restaurer + + + + &Recent files + &Fichiers récents + + + + &Quit + &Quitter + + + + Playlist + Liste de lecture + + + + Core + + + Brightness: %1 + Luminosité : %1 + + + + Contrast: %1 + Contraste : %1 + + + + Gamma: %1 + Gamma : %1 + + + + Hue: %1 + Ton : %1 + + + + Saturation: %1 + Saturation : %1 + + + + Volume: %1 + Volume : %1 + + + + Zoom: %1 + Zoom : %1 + + + + DefaultGui + + + Welcome to SMPlayer + Bienvenue dans SMPlayer + + + + Volume + Volume + + + + Audio + Audio + + + + Subtitle + Sous-titres + + + + Playlist + Liste de lecture + + + + &Main toolbar + Barre d'outils pri&ncipale + + + + &Language toolbar + Barre de &langues + + + + &Toolbars + &Barre d'outils + + + + Encodings + + + Western European Languages + Langues de l'Europe de l'ouest + + + + Western European Languages with Euro + Langues de l'Europe de l'ouest avec Euro + + + + Slavic/Central European Languages + Langues de l'Europe centrale/slave + + + + Esperanto, Galician, Maltese, Turkish + Esperanto, Malte, Turc + + + + Old Baltic charset + Balte ancien + + + + Cyrillic + Cyrillic + + + + Arabic + Arabe + + + + Modern Greek + Grec moderne + + + + Turkish + Turc + + + + Baltic + Balte + + + + Celtic + Celte + + + + Hebrew charsets + Caractères hébreux + + + + Russian + Russe + + + + Ukrainian, Belarusian + Ukrainien, Biélorusse + + + + Simplified Chinese charset + Chinois simplifié + + + + Traditional Chinese charset + Chinois traditionel + + + + Japanese charsets + Japonais + + + + Korean charset + Koréen + + + + Thai charset + Thailandais + + + + Cyrillic Windows + Cyrillic Windows + + + + Slavic/Central European Windows + Langues de l'Europe centrale/slave + + + + Arabic Windows + Arabe Windows + + + + EqSlider + + + icon + Icône + + + + FilePropertiesDialog + + + SMPlayer - File properties + SMPlayer - Propriétés du fichier + + + + &Information + &Information + + + + &Demuxer + &Démultiplexeur + + + + &Select the demuxer that will be used for this file: + &Sélectionnez le démultiplexeur qui sera utilisé pour ce fichier : + + + + &Reset + &Réinitialiser + + + + &Video codec + Codec &vidéo + + + + &Select the video codec: + &Sélectionnez le codec vidéo : + + + + A&udio codec + Codec a&udio + + + + &Select the audio codec: + &Sélectionnez le codec audio : + + + + &MPlayer options + Options &Mplayer + + + + Additional Options for MPlayer + Options additionnelles pour MPlayer + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + Extra-options de MPlayer. +Celles-ci doivent être séparées d'un espace. +Exemple : -flip -nosound + + + + &Options: + &Options : + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + Vous pouvez aussi passer des filtres vidéo supplémentaires. +Séparez les par ",". N'utilisez pas d'espace ! +Exemple : scale=512:-2,eq2=1.1 + + + + V&ideo filters: + Filtres V&idéo : + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + Pour les filtres audios, même régle que pour les filtres vidéo. +Exemple : resample=44100:0:0,volnorm + + + + Audio &filters: + &Filtres audio : + + + + OK + OK + + + + Cancel + Annuler + + + + Apply + Appliquer + + + + InfoFile + + + General + Général + + + + Size + Taille + + + + %1 KB (%2 MB) + %1 Ko (%2 Mo) + + + + URL + URL + + + + Length + Durée + + + + Demuxer + Démultiplexeur + + + + Name + Nom + + + + Artist + Artiste + + + + Author + Auteur + + + + Album + Album + + + + Genre + Genre + + + + Date + Date + + + + Track + Piste + + + + Copyright + Copyrights + + + + Comment + Commentaire + + + + Software + Logiciel + + + + Clip info + Informations sur le fichier + + + + Video + Vidéo + + + + Resolution + Résolution + + + + Aspect ratio + Aspect ratio + + + + Format + Format + + + + Bitrate + Débit + + + + %1 kbps + %1 kbps + + + + Frames per second + Images par seconde + + + + Selected codec + Codec sélectionné + + + + Initial Audio Stream + Flux audio initial + + + + Rate + Taux + + + + %1 Hz + %1 Hz + + + + Channels + Canaux + + + + Audio Streams + Flux audio + + + + Language + Langue + + + + empty + vide + + + + Subtitles + Sous-titres + + + + Type + Type + + + + ID + Info for translators: this is a identification code + ID + + + + # + Info for translators: this is a abbreviation for number + # + + + + Stream title + Titre du Stream + + + + Stream URL + URL du Stream + + + + File + Fichier + + + + InputDVDDirectory + + + Choose a directory + Choisissez un dossier + + + + SMPlayer - Play a DVD from a folder + SMPlayer - Lire un DVD depuis un dossier + + + + You can play a dvd from your hard disc. Just select the folder which contains the VIDEO_TS and AUDIO_TS directories. + Vous pouvez lire un DVD depuis le disque dur. Selectionnez le dossier contenant VIDEO_TS et AUDIO_TS. + + + + Choose a directory... + Choisissez un dossier... + + + + InputURL + + + SMPlayer - Enter URL + SMPlayer - Entrez une URL + + + + &URL: + &URL : + + + + It's a &playlist + &Liste de lecture + + + + If this option is checked, the URL will be treated as a playlist: it will be opened as text and will play the URLs in it. + Si cette option est cochée, l'URL sera traitée comme une liste de lecture : celà l'ouvrira en tant que texte et jouera les URLs dedans. + + + + LogWindow + + + Choose a filename to save under + Choisissez un nom de fichier pour sauver + + + + Confirm overwrite? + Confirmer écrasement ? + + + + The file already exists. +Do you want to overwrite? + Le fichier existe déjà. +Voulez-vous le remplacer ? + + + + Error saving file + Erreur lors de la sauvegarde + + + + The log couldn't be saved + Le fichier de log n'a pas pu être sauvegardé + + + + Logs + Logs + + + + LogWindowBase + + + Log Window + Log Window + + + + Save + Sauver + + + + Copy to clipboard + Copier dans le presse papier + + + + Close + Fermer + + + + &Close + &Fermer + + + + Playlist + + + Name + Nom + + + + Length + Durée + + + + Choose a file + Choisir un fichier + + + + Choose a filename + Choisir un nom de fichier + + + + Confirm overwrite? + Confirmer remplacement ? + + + + Select one or more files to open + Selectionner un ou plusieurs fichiers à ouvrir + + + + Choose a directory + Selectionner un dossier + + + + The file %1 already exists. +Do you want to overwrite? + Le fichier %1 existe déjà. +Voulez vous l'écraser? + + + + Edit name + Editer le nom + + + + Type the name that will be displayed in the playlist for this file: + Tapez le nom qui sera affiché dans la playlist pour ce fichier : + + + + &Play + &Lire + + + + &Edit + &Editer + + + + Playlists + Listes de lecture + + + + All files + Tous les fichiers + + + + &Load + &Charger + + + + &Save + &Enregistrer + + + + &Next + &Suivant + + + + Pre&vious + &Précédent + + + + Move &up + &Monter + + + + Move &down + &Descendre + + + + &Repeat + &Répéter + + + + S&huffle + &Aléatoire + + + + Add &current file + Ajouter le fichier &courant + + + + Add &file(s) + Ajout de &fichier(s) + + + + Add &directory + Ajout d'un &dossier + + + + Remove &selected + Effacer la &sélection + + + + Remove &all + &Tout supprimer + + + + SMPlayer - Playlist + SMPlayer - Liste de lecture + + + + Add... + Ajouter... + + + + Remove... + Supprimer... + + + + Playlist modified + Playlist modifiée + + + + There are unsaved changes, do you want to save the playlist? + Des changements ont été faits dans cette liste de lecture, voulez-vous enregistrer ? + + + + PrefAdvanced + + + Advanced + Avancé + + + + Auto + Auto + + + + Form + Forme + + + + &Advanced + &Avancé + + + + icon + Icône + + + + Additional Options for MPlayer + Options additionnelles pour MPlayer + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + Extra-options de MPlayer. +Celles-ci doivent être séparées d'un espace. +Exemple : -flip -nosound + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + Vous pouvez aussi passer des filtres vidéo supplémentaires. +Séparez les par ",". N'utilisez pas d'espace ! +Exemple : scale=512:-2,eq2=1.1 + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + Pour les filtres audios, même régle que pour les filtres vidéo. +Exemple : resample=44100:0:0,volnorm + + + + Don't repaint the background of the video window + Ne pas repeindre le fond de la fenêtre de la vidéo + + + + &Logs + &Logs + + + + Log MPlayer output + Log de sortie MPlayer + + + + Log SMPlayer output + Log de sortie SMPlayer + + + + This option is mainly intended for debugging the application. + Cette option est principalement utile pour le débuggage. + + + + &MPlayer language + Langue pour &MPlayer + + + + SMPlayer needs to read and parse the output of MPlayer and sometimes it relies on English text. If you are using a MPlayer translated into another language, then you need to change the texts that SMPlayer looks for. (Technically you should enter regular expressions)<br><br> +The drop-down lists may provide already made regular expression for several languages. + SMPlayer a besoin de lire et décomposer la sortie de MPlayer et des fois, cela se fait sur un texte Anglais. Si vous utilisez un MPlayer traduit dans une autre langue, alors vous avez besoin de changer les textes pour que SMPlayer puisse les voir. (Techniquement, vous devriez entrer ces expressions)<br><br> +Les listes déroulantes peuvent fournir des expressions régulières déjà faites pour plusieurs langues. + + + + Checking this option may reduce flickering, but it also might produce that the video won't be displayed properly. + Cocher cette option peut réduire le "flickering", cependant, la vidéo peut ne pas s'afficher correctement. + + + + If checked, smplayer will store the output of mplayer (you can see it in <b>Options->View logs->mplayer</b>). In case of problems this log can contain important information, so it's recommended to keep this option checked. + Si cette options est sélectionnée, SMPlayer stockera le log de mplayer (pour voir: <b>Options->View logs->mplayer</b>). En cas de problème ce log peut contenir des informations importantes; il est donc recommandé de laisser cette option sélectionnée. + + + + If this option is checked, smplayer will store the debugging messages that smplayer outputs (you can see the log in <b>Options->View logs->smplayer</b>). This information can be very useful for the developer in case you find a bug. + Si cette option est activée, SMPlayer stockera le log de mplayer (pour voir: <b>Options->View logs->smplayer</b>). Ces informations peuvent être utiles pour les développeurs en cas de bug. + + + + Filter for SMPlayer logs + Filtres pour les logs de SMPlayer + + + + This option allows to filter the smplayer messages that will be stored in the log. Here you can write any regular expression.<br>For instance: <i>^Core::.*</i> will display only the lines starting with <i>Core::</i> + Cette option permet de filtrer les messages qui seront stockées dans le log. Ici, vous pouvez écrire n'importe quelle expression régulière.<br>Par exemple : <i>^Core::.*</i> affichera seulement les lignes qui commencent par <i>Core::</i> + + + + &Monitor aspect: + Aspect &moniteur : + + + + &Run MPlayer in its own window + Lance&r MPlayer dans sa propre fenêtre + + + + &Options: + &Options : + + + + V&ideo filters: + Filtres V&idéo : + + + + Audio &filters: + &Filtres audio : + + + + &Colorkey: + &Clé de couleur : + + + + &Don't repaint the background of the video window + Ne pas repeindre le fon&d de la fenêtre de la vidéo + + + + Log &MPlayer output + Log de sortie &MPlayer + + + + Log &SMPlayer output + Log de sortie &SMPlayer + + + + &Filter for SMPlayer logs: + &Filtre pour les logs de SMPlayer : + + + + &End of file: + Fin du fichi&er : + + + + &No video: + &Pas de vidéo : + + + + C&hange... + C&hanger... + + + + PrefAssociations + + + Warning + Attention + + + + Not all files could be associated. Please check your security permissions and retry. + Certains fichiers ne peuvent être associés. Vérifiez les droits de ceux-ci et réessayez. + + + + File Types + Types de fichier + + + + Select all + Tous les sélectionner + + + + Check all file types in the list + Vérifier tous les types de fichier dans la liste + + + + Uncheck all file types in the list + Ne plus vérifier tous les types de fichiers dans la liste + + + + List of file types + Liste des types de fichiers + + + + File types + Types de fichiers + + + + Media files handled by SMPlayer: + Fichiers associés à SMPlayer : + + + + Select All + Tous les sélectionner + + + + Select None + Sélectionner aucun + + + + Check the media file extensions you would like SMPlayer to handle. When you click Apply, the checked files will be associated with SMPlayer. If you uncheck a media type, the file association will be restored. + Vérifier les formats de fichiers que vous voulez associer à SMPlayer. Lorsque vous cliquez sur "Appliquer", les fichiers vérifiés seront associés à SMPlayer. Si vous souhaitez ne plus vérifier le type de fichier, alors l'association de ce fichier sera restaurée. + + + + Select none + Sélectionner aucun + + + + PrefDrives + + + Drives + Lecteurs + + + + Currently SMPlayer does not autodetect cdrom or dvd devices. So in order to play cdroms or dvds you must first select here your cdrom and dvd drives (can be the same). + Pour le moment, SMPlayer ne détecte pas encore automatiquement les lecteurs CD ou DVD. Vous devez donc indiquer ici vos lecteurs. (Peuvent être identique). + + + + icon + Icône + + + + Select your CD device: + Sélectionnez le lecteur CD : + + + + Select your DVD device: + Sélectionnez le lecteur DVD : + + + + CD device + Lecteur CD + + + + Choose your CDROM device. It will be used to play VCDs and Audio CDs. + Choississez votre lecteur CD. Il sera utilisé pour lire les VCDs et CDs Audio. + + + + DVD device + Lecteur DVD + + + + Choose your DVD device. It will be used to play DVDs. + Choississez votre lecteur DVD. Il sera utilisé pour lire les DVDs. + + + + Select your &CD device: + Sélectionnez le lecteur &CD : + + + + Select your &DVD device: + Sélectionnez le lecteur &DVD : + + + + PrefGeneral + + + General + Général + + + + &General + &Général + + + + Paths + Chemins + + + + Select... + Sélectionner... + + + + Folder for storing screenshots: + Dossier pour stocker les captures d'écran : + + + + Search... + Rechercher... + + + + Select the MPlayer executable: + Selectionner l'exécutable de MPlayer : + + + + Output drivers + Pilotes de sortie + + + + Video: + Vidéo : + + + + Audio: + Audio : + + + + Media settings + Configurations du média + + + + Remember settings for all files (audio track, subtitles...) + Se rappeler des configurations pour chaque fichier (piste audio, sous-titres...) + + + + Don't remember time position (files start playing from the beginning) + Ne pas se rappeler la position dans le fichier (lecture à partir du début) + + + + Preferred audio and subtitles + Audio et sous-titres préférés + + + + Subtitles: + Sous-titres : + + + + &Video and audio + &Vidéo et Audio + + + + Video + Vidéo + + + + Use software video equalizer + Utiliser l'équaliseur vidéo logiciel + + + + Enable postprocessing for all videos + Utiliser le postprocessing pour toutes les vidéos + + + + Quality: + Qualité : + + + + Start videos in fullscreen + Lancer les vidéos en plein écran + + + + Disable screensaver + Désactiver l'écran de veille + + + + Audio + Audio + + + + Use software volume control + Utiliser le contrôle de volume logiciel + + + + Max. Amplification: + Amplification Max. : + + + + AC3/DTS pass-through S/PDIF + AC3/DTS pass-through S/PDIF + + + + Volume normalization + Normalisation du volume + + + + Select the mplayer executable + Séléctionnez l'éxécutable MPlayer + + + + Executables + Exécutables + + + + All files + Tous les fichiers + + + + Select a directory + Choisir un dossier + + + + MPlayer executable + Executable MPlayer + + + + Here you must specify the mplayer executable that smplayer will use.<br>smplayer requires at least mplayer 1.0rc1 (svn recommended).<br><b>If this setting is wrong, smplayer won't be able to play anything!</b> + Ici vous devez spécifier l'éxécutable pour MPlayer.<br>SMPlayer nécessite au moins MPlayer 1.0rc1 (svn recommandé).<br><b>Si ce réglage n'est pas bon, SMPlayer ne pourra rien jouer !</b> + + + + Screenshots folder + Dossier des captures d'écran + + + + Here you can specify a folder where the screenshots taken by smplayer will be stored. If this field is empty the screenshot feature will be disabled. + Ici vous pouvez choisir le dossier où seront stockées les captures d'écran. Si ce champs est vide, la fonction de capture sera désactivée. + + + + Video output driver + Pilote de sortie vidéo + + + + Select the video output driver. Usually xv (linux) and directx (windows) provide the best performance. + Sélectionnez le pilote de sortie vidéo. Généralement, xv (Linux) et directx (Windows) donnent les meilleures performances. + + + + Audio output driver + Pilote de sortie Audio + + + + Select the audio output driver. + Sélectionnez le pilote de sortie audio. + + + + Remember settings + Configurations de rappel + + + + Usually smplayer will remember the settings for each file you play (audio track selected, volume, filters...). Uncheck this option if you don't like this feature. + Normalement, SMPlayer se rappellera des configurations pour chaque fichier (piste audio, volume, filtres...). Désactivez cette option si ça ne vous plait pas. + + + + Don't remember time position + Ne pas se rappeler de la position dans le temps + + + + If you check this option, smplayer will play all files from the beginning. + Si vous sélectionnez cette option, SMPlayer lira tous les fichiers à partir du début. + + + + Preferred audio language + Langage préféré pour l'audio + + + + Here you can type your preferred language for the audio streams. When a media with multiple audio streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the audio streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the audio track if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + Ici vous pouvez choisir votre langue audio préférée. Quand un média avec plusieurs pistes audio est trouvé, smplayer essaye d'utiliser votre préférée.<br>Ceci ne fonctionne que lorsque la langue est renseignée dans les flux audio, comme dans un DVD ou un mkv.<br>Ce champs accepte les expression régulières. Exemple: <b>es|esp|spa</b> choisira la piste audio <i>es</i>, <i>esp</i> or <i>spa</i>. + + + + Preferred subtitle language + Langage préféré pour le sous-titrage + + + + Here you can type your preferred language for the subtitle stream. When a media with multiple subtitle streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the subtitle streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the subtitle stream if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + Ici vous pouvez choisir votre langue de sous-titres préférée. Quand un média avec plusieurs sous-titres est trouvé, smplayer essaye d'utiliser votre préféré.<br>Ceci ne fonctionne que lorsque la langue est renseignée dans les sous-titres, comme dans un DVD ou un mkv.<br>Ce champs accepte les expression régulières. Exemple: <b>es|esp|spa</b> choisira les sous-titres <i>es</i>, <i>esp</i> or <i>spa</i>. + + + + Software video equalizer + Equaliseur vidéo logiciel + + + + You can check this option if video equalizer is not supported by your graphic card or the selected video output driver.<br><b>Note:</b> this option can be incompatible with some video output drivers. + Vous pouvez sélectionner cette option si l'égaliseur n'est pas supporté par votre carte graphique ou le driver de sortie vidéo sélectionné.<br><b>Note :</b> cette option peut être incompatible avec certains pilotes de sortie vidéo. + + + + If this option is checked, all videos will start to play in fullscreen mode. + Si cette option est sélectionnée, toutes les vidéos seront lancées en plein écran. + + + + Check this option to disable the screensaver while playing.<br>The screensaver will enabled again when play finishes.<br><b>Note:</b> This option works only in X11 and Windows. + Sélectionnez cette option pour désactiver l'économiseur d'écran pendant la lecture.<br>L'économiseur d'écran sera réactivé à la fin de la lecture.<br><b>Note :</b> cette option fonctionne seulement sous X11 et Windows. + + + + Software volume control + Contrôle volume logiciel + + + + Check this option to use the software mixer, instead of using the sound card mixer. + Sélectionnez cette option pour utiliser le mixeur logiciel au lieu du mixeur matériel. + + + + Postprocessing quality + Qualité post-traitement + + + + Dynamically changes the level of postprocessing depending on the available spare CPU time. The number you specify will be the maximum level used. Usually you can use some big number. + Changer dynamiquement le niveau de post-traitement selon la charge CPU disponible. Le nombre spécifié sera le niveau maximum. Généralement, vous pouvez choisir de grands nombres. + + + + Change volume + Changer volume + + + + If checked, SMPlayer will remember the volume for every file and will restore it when played again. For new files the default volume will be used. + Si coché, SMPlayer se rappelera du volume pour chaque fichier, et le restaurera. Pour les nouveaux fichiers, le volume par défaut sera utilisé. + + + + Default volume: + Volume par défaut : + + + + 0 + 0 + + + + &Change volume on every file + &Changer le volume sur chaque fichier + + + + &Search... + &Rechercher... + + + + S&elect... + S&électionner... + + + + Select the &MPlayer executable: + Selectionner l'exécutable de &MPlayer : + + + + &Folder for storing screenshots: + &Dossier stockant les captures d'écran : + + + + V&ideo: + V&idéo : + + + + &Audio: + &Audio : + + + + &Don't remember time position (files start playing from the beginning) + Toujours commencer au &début de la lecture d'un fichier + + + + &Remember settings for all files (audio track, subtitles...) + &Se rappeler de la configuration de chaque fichier (piste audio, sous-titres, ...) + + + + A&udio: + A&udio : + + + + Su&btitles: + Sous-&titres : + + + + &Use software video equalizer + &Utiliser l'équaliseur vidéo logiciel + + + + &Enable postprocessing for all videos + &Utiliser le postprocessing pour toutes les vidéos + + + + &Quality: + &Qualité : + + + + Start videos in &fullscreen + Toujours lancer les vidéos en &plein écran + + + + Disable &screensaver + Désactiver l'écran de &veille + + + + &Default volume: + Volume par &défaut : + + + + Use s&oftware volume control + Utiliser le contrôle de volume &logiciel + + + + Ma&x. Amplification: + Amplification Ma&x. : + + + + &AC3/DTS pass-through S/PDIF + &AC3/DTS pass-through S/PDIF + + + + Volume &normalization + &Normalisation du volume + + + + Direct rendering + Rendering direct + + + + If checked, turns on direct rendering (not supported by all codecs and video outputs)<br><b>WARNING:</b> May cause OSD/SUB corruption! + Si cochée, cette option met le rendering direct (non supportée par tous les codecs ou sorties de vidéos)<br><b>Attention :</br> Peut causer des corruptions OSD/SBUB ! + + + + Double buffering + Double buffering + + + + D&irect rendering + Rendering d&irect + + + + Dou&ble buffering + Dou&ble buffering + + + + Double buffering fixes flicker by storing two frames in memory, and displaying one while decoding another. If disabled it can affect OSD negatively, but often removes OSD flickering. + Double buffering fixe le clignotement en stockant deux images en mémoire, et en affiche une pendant que l'autre est en train d'être décodée. Si désactivé, cela peut affecter l'OSD, mais généralement cela supprime les clignotements. + + + + &Enable postprocessing by default + &Utiliser le post-traitement par défaut + + + + Volume &normalization by default + &Normalisation du volume par défaut + + + + Close when finished + Fermer l'application lorsque media est fini de lire + + + + If this option is checked, the main window will be automatically closed when the current file/playlist finishes. + Si cette option est cochée, la fenêtre principale sera automatiquement fermée lorsque le fichier ou la liste de lecture sera fin(e). + + + + &Close when finished + &Fermer l'application lorsque media est fini de lire + + + + 2 (Stereo) + 2 (Stéréo) + + + + 4 (4.0 Surround) + 4 (4.0 Surround) + + + + 6 (5.1 Surround) + 6 (5.1 Surround) + + + + C&hannels by default: + Canau&x par défaut : + + + + &Pause when minimized + &Pause lorsque l'application est réduite + + + + Pause when minimized + Mettre en pause lorsque l'application est minimisée + + + + If this option is enabled, the file will be paused when the main window is hidden. When the window is restored, play will be resumed. + Si cette option est activée, le fichier sera mis en pause quand la principale fenêtre est cachée. Lorsque la fenêtre est restaurée, alors la lecture se relancera. + + + + Enable postprocessing by default + Activer le post-traitement par défaut + + + + Posprocessing will be used by default on new open files. + Le post-traitement sera utilisé par défaut sur les nouveaux fichiers ouverts. + + + + Max. Amplification + Amplification Max + + + + Volume normalization by default + Normalisation du volume par défaut + + + + Maximizes the volume without distorting the sound. + Maximise le volume sans distordre le son. + + + + Default volume + Volume par défaut + + + + Sets the initial volume that new files will use. + Règle le volume initial dont les nouveaux fichiers utiliseront. + + + + Channels by default + Canaux par défaut + + + + Sets the maximum amplification level in percent (default: 110). A value of 200 will allow you to adjust the volume up to a maximum of double the current level. With values below 100 the initial volume (which is 100%) will be above the maximum, which e.g. the OSD cannot display correctly. + Règle le niveau d'amplification maximum en pourcentage (défault : 110). La valeur de 200 vous autorisera d'augmenter le volume au double du niveau actuel. Avec des valeurs comme 100, le volume initial (qui est de 100%) sera au dessus du maximum, que par exemple le OSE ne peut pas afficher correctement. + + + + Uses hardware AC3 passthrough + Utilise le hardware AC3 passthrough + + + + Requests the number of playback channels. MPlayer asks the decoder to decode the audio into as many channels as specified. Then it is up to the decoder to fulfill the requirement. This is usually only important when playing videos with AC3 audio (like DVDs). In that case liba52 does the decoding by default and correctly downmixes the audio into the requested number of channels. NOTE: This option is honored by codecs (AC3 only), filters (surround) and audio output drivers (OSS at least). + Définit le nombre de canaux audio à utiliser. (défaut : 2). MPlayer demande au décodeur dedécoder l’audio sur le nombre requis de canaux. Maintenant c’est au décodeur de satisfaire cette demande. Généralement, c’est important seulement pour la lecture des vidéos avec de l’audio AC-3(comme les DVDs). Dans ce cas liba52 fait le décodage pardéfaut et fusionne correctementl’audio dans le nombre requis de canaux. NOTE: Cette option est comprise par les codecs (AC-3 uniquement), filtres (surround) et pilotes de sortie audio (OSS au moins). + + + + Postprocessing will be used by default on new opened files. + Le post-traitement sera utilisé par défaut sur les nouveaux fichiers ouverts. + + + + PrefInput + + + Keyboard and mouse + Clavier et Souris + + + + &Keyboard + &Clavier + + + + icon + Icône + + + + &Mouse + &Souris + + + + Button functions: + Fontions des boutons : + + + + Media seeking + Navigation dans le média + + + + Volume control + Contrôle du volume + + + + Zoom video + Zoom vidéo + + + + None + Aucun + + + + Here you can change any key shortcut. To do it double click or press enter over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + Vous pouvez changer n'importe quel raccourci clavier. Pour se faire, double-cliquez ou appuyez sur "entrée" en appuyant sur la combinaison de touches. Ajouté à celà, vous pouvez aussi sauvegarder la liste pour la partager avec d'autres personnes ou la charger sur un autre ordinateur. + + + + Here you can change any key shortcut. To do it double click or start typing over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + Vous pouvez changer n'importe quel raccourci clavier. Pour se faire, double-cliquez ou appuyez sur "entrée" en appuyant sur la combinaison de touches. Ajouté à celà, vous pouvez aussi sauvegarder la liste pour la partager avec d'autres personnes ou la charger sur un autre ordinateur. + + + + &Left click + Clic &gauche + + + + &Double click + &Double-clic + + + + &Wheel function: + Fonction de la &molette : + + + + Shortcut editor + Editeur de raccourcis + + + + This table allows you to change the key shortcuts of most available actions. Double click or press enter on a item, or press the <b>Change shortcut</b> button to enter in the <i>Modify shortcut</i> dialog. There are two ways to change a shortcut: if the <b>Capture</b> button is on then just press the new key or combination of keys that you want to assign for the action (unfortunately this doesn't work for all keys). If the <b>Capture</b> button is off then you could enter the full name of the key. + Cette table vous permet de changer les raccourcis clé de la plupart des actions disponibles. Double-clicquez ou appuyez sur entrer sur un élément, ou pressez sur bouton <b>Changer raccourci</b> pour entrer sur la fenêtre <i>Modifier raccourci</i>. Il y a deux façons de changer un raccourci : si le bouton <b>Capturer</b> est actif alors pressez juste sur une nouvelle touche ou combinaison de touches que vous voulez assigner pour l'action (malheureusement cela ne marche pas pour toutes les touches). Si le boutton <b>Capturer</b> est inactif, alors vous pourrez entrer le nom entier de la touche. + + + + Left click + Clic gauche + + + + Select the action for left click on the mouse. + Sélectionner l'action pour le clic gauche de la souris. + + + + Double click + Double-clic + + + + Select the action for double click on the mouse. + Sélectionner l'action pour le double-clic de la souris. + + + + Wheel function + Fonction de la molette + + + + Select the action for the mouse wheel. + Sélectionner l'action de de la molette. + + + + PrefInterface + + + Interface + Interface + + + + Bulgarian + Bulgare + + + + Czech + Tchèque + + + + German + Allemand + + + + Greek + Grecque + + + + English + Anglais + + + + Spanish + Espagnol + + + + Finnish + Finlandais + + + + French + Français + + + + Hungarian + Hongrois + + + + Italian + Italien + + + + Japanese + Japonais + + + + Georgian + Géorgien + + + + Dutch + Hollandais + + + + Polish + Polonais + + + + Portuguese - Brazil + Brésilien + + + + Portuguese - Portugal + Portugais + + + + Romanian + Roumain + + + + Russian + Russe + + + + Slovak + Slovène + + + + Serbian + Serbe + + + + Swedish + Suédois + + + + Turkish + Turc + + + + Ukrainian + Ukrainien + + + + Simplified-Chinese + Chinois simplifié + + + + Traditional Chinese + Chinois traditionnel + + + + <Autodetect> + <Autodétection> + + + + Default + Défaut + + + + &Interface + &Interface + + + + Seeking + Navigation + + + + Never + Jamais + + + + Whenever it's needed + Si nécessaire + + + + Only after loading a new video + Seulement après le chargement d'une nouvelle vidéo + + + + Recent files + Fichiers récents + + + + Language + Langue + + + + Here you can change the language of the application. + Ici, vous pouvez changer la langue de l'application. + + + + Instances + Instances + + + + Catalan + Catalan + + + + Basque + Basque + + + + Galician + Galacien + + + + &Short jump + Saut &court + + + + &Medium jump + Saut &moyen + + + + &Long jump + Saut &long + + + + Mouse &wheel jump + Saut de la &molette + + + + &Use only one running instance of SMPlayer + &Utiliser qu'une seule instance de SMPlayer + + + + SMPlayer will listen to this &port to receive commands from other instances: + SMPlayer va écouter ce &port pour recevoir les commandes venant des autres instances : + + + + Main window &resize method + Méthode de &redimensionnement de la fenêtre principale + + + + Ma&x. items + Nombre ma&ximum + + + + St&yle: + St&yle : + + + + Ico&n set: + Icô&ne : + + + + L&anguage: + L&angue : + + + + Main window + Fenêtre principale + + + + Auto&resize: + &Redimension automatique : + + + + R&emember position and size + S&e rappeler de la position et de la taille + + + + Default font: + Police par défaut : + + + + &Change... + &Changer... + + + + PrefPerformance + + + Performance + Performance + + + + Form + Forme + + + + &Performance + &Performance + + + + Priority + Priorité + + + + Select the priority for the MPlayer process. + Sélectionnez la priorité du processus MPlayer. + + + + Priority: + Priorité : + + + + realtime + Temps réel + + + + high + Haut + + + + abovenormal + Au dessus de la normale + + + + normal + Normal + + + + belownormal + Au dessous de la normale + + + + idle + Inactif + + + + Cache + Cache + + + + Size: + Taille : + + + + KB + Ko + + + + Use cache + Utiliser Cache + + + + Setting a cache may improve performance on slow media + Régler le cache peut améliorer les performances sur les médias lents + + + + Allow frame drop + Activer le saut d'images + + + + Allow hard frame drop (can lead to image distortion) + Autoriser le saut d'images plus fort (peut conduire à des distorsions) + + + + Synchronization + Synchronisation + + + + Audio/video auto synchronization + Synchronisation auto audio/video + + + + Factor: + Facteur : + + + + Fast audio track switching + Changement rapide de pistes audio + + + + Fast seek to chapters in dvds + Sauts de chapitres rapides dans les DVD + + + + Set process priority for mplayer according to the predefined priorities available under Windows.<br><b>WARNING:</b> Using realtime priority can cause system lockup. + Définir la priorité du processus pour MPlayer.<br><b>ATTENTION :</b> "Temps réel" peut conduire à un blocage du système. + + + + <br><b>Note:</b> This option is for Windows only. + <br><b>Note :</b> Cette option est seulement pour Windows. + + + + This option specifies how much memory (in kBytes) to use when precaching a file or URL. Especially useful on slow media. + Cette option indique combien de mémoire (en Ko) est utilisée pour le préchargement d'un fichier ou d'une URL. Particulièrement utile pour les médias lents. + + + + Skip displaying some frames to maintain A/V sync on slow systems. + Sauter des images pour conserver la synchronisation Audio/Vidéo sur les systèmes lents. + + + + Allow hard frame drop + Accorder le saut des images erronées + + + + More intense frame dropping (breaks decoding). Leads to image distortion! + Saut d'images intense (destructif). Induit des distorsions d'images ! + + + + Gradually adjusts the A/V sync based on audio delay measurements. + Ajustement graduel de la synchronisation A/V basé sur les mesures de délai audio. + + + + Priorit&y: + Priori&té : + + + + Si&ze: + T&aille : + + + + &Use cache + &Utiliser le cache + + + + &Allow frame drop + Permettre le s&aut d'images + + + + Allow &hard frame drop (can lead to image distortion) + Autoriser le saut d'images plus &fort (peut conduire à des distorsions) + + + + Audio/&video auto synchronization + Synchronisation auto audio/&video + + + + Fact&or: + Facte&ur : + + + + &Fast audio track switching + &Changement rapide de pistes audio + + + + Fast &seek to chapters in dvds + &Sauts de chapitres rapides dans les DVD + + + + Create index if needed + Créer un index si nécessaire + + + + Rebuilds index of files if no index was found, allowing seeking. Useful with broken/incomplete downloads, or badly created files. This option only works if the underlying media supports seeking (i.e. not with stdin, pipe, etc).<br> Note: the creation of the index may take some time. + Reconstruit l'index des fichiers si aucun index a été trouvé, permettant la recherche. Très utile pour les fichiers cassés ou incomplets ou mal créés. Cette option ne marche que si le media supporte la recherche (par exemple sans stdin, pipe, etc). <br>Note : la création d'index peut prendre un certain temps. + + + + &Create index if needed + &Créer un index si nécessaire + + + + If checked, it will try the fastest method to switch audio tracks but might not work with some formats. + Si cette option est cochée, SMPlayer essayera la plus rapide méthode pour échanger les pistes audios mais ne devraient pas marcher avec certains formats. + + + + If checked, it will try the fastest method to seek to chapters but it might not work with some discs. + Si cette option est cochée, SMPlayer essayera la plus rapide méthode pour rechercher les chapitres mais ne devraient pas marcher avec certains disques. + + + + PrefSubtitles + + + Subtitles + Sous-titres + + + + Choose a ttf file + Choisir un fichier ttf + + + + Truetype Fonts + Polices truetype + + + + Form + Forme + + + + &Subtitles + &Sous-titres + + + + Autoload + Chargement automatique + + + + Autoload subtitles files (*.srt, *.sub...): + Chargement auto des sous-titres (*.srt, *.sub...) : + + + + Select first available subtitle + Selectionner le premier sous-titre disponible + + + + Same name as movie + Même nom que la vidéo + + + + All subs containing movie name + Tous les sous-titres contenant le nom de la vidéo + + + + All subs in directory + Tous les sous-titres du dossier + + + + Default subtitle encoding: + Encodage par défaut des sous-titres : + + + + Position + Position + + + + Default position of the subtitles on screen + Position par défaut des sous-titres sur l'écran + + + + 0 + 0 + + + + Top + Haut + + + + Bottom + Bas + + + + Include subtitles on screenshots + Inclure les sous-titres sur les captures d'écran + + + + Use -subfont option (required by recent MPlayer releases) + Utiliser -subfont option (demandé par les récentes versions de MPlayer) + + + + &Font + &Police + + + + Font + Police + + + + TTF font: + Police TTF : + + + + Search... + Rechercher... + + + + System font: + Police du système : + + + + Select the font which will be used for subtitles (and OSD): + Sélectionner la police des sous-titres (et OSD) : + + + + Size + Taille + + + + Autoscale: + Echelle automatique : + + + + No autoscale + Pas d'échelle automatique + + + + Proportional to movie height + Proportionnel à la hauteur du film + + + + Proportional to movie width + Proportionnel à la largeur du film + + + + Proportional to movie diagonal + Proportionnel à la diagonale du film + + + + Scale: + Echelle : + + + + SSA/&ASS library + Bibliothèque SSA/&ASS + + + + The new SSA/ASS library will provide nice styled subtitles for external SSA/ASS subtitles files and Matroska tracks. But it will be used too for rendering other formats like SUB and SRT files. + La nouvelle bibliothèque SSA/ASS fournira des sous-titres stylés pour les fichiers externes de sous-titres SSA/ASS et les pistes Matroska. Mais elle sera aussi utilisée pour d'autres formats comme des fichiers SUB et SRT. + + + + Use SSA/ASS library for subtitle rendering + Utiliser SSA/AAS pour le rendu + + + + Text color: + Couleur du texte : + + + + Border color: + Couleur de bordure : + + + + Here you can override styles for SSA/ASS subtitles. It can be also used for fine-tuning the rendering of SRT and SUB subtitles by the SSA/ASS library. Example: <b>Bold=1,Outline=2,Shadow=4</b> + Ici, vous pouvez outrepasser les styles pour les sous-titres SSA/ASS. Vous pouvez aussi l'utiliser pour ajuster le rendu des sous-titres SRT et SUB par la bibliothèque SSA/ASS. Exemple : <b>Bold=1,Outline=2,Shadow=4</b> + + + + Styles: + Styles : + + + + Subtitle position + Position du sous-titrage + + + + This option specifies the position of the subtitles over the video window. <i>100</i> means the bottom, while <i>0</i> means the top. + Cette option spécifie la position des sous-titres par rapport à la fenêtre. <i>100</i> veut dire le bas, et <i>0</i> le haut. + + + + SSA/ASS styles + Styles SSA/ASS + + + + Au&toload subtitles files (*.srt, *.sub...): + &Charger automatiquement les sous-titrages (*.srt, *.sub...) : + + + + S&elect first available subtitle + S&electionner le premier sous-titrage disponible + + + + &Default subtitle encoding: + Encodage par d&éfaut des sous-titres : + + + + Default &position of the subtitles on screen + &Position par défaut des sous-titres sur l'écran + + + + &Include subtitles on screenshots + &Inclure les sous-titres sur les captures d'écran + + + + &Use -subfont option (required by recent MPlayer releases) + &Utiliser -subfont option (demandé par les récentes versions de MPlayer) + + + + &TTF font: + Police &TTF : + + + + Sea&rch... + Reche&rcher... + + + + S&ystem font: + Police du s&ystème : + + + + A&utoscale: + Echelle a&utomatique : + + + + S&cale: + E&chelle : + + + + &Use SSA/ASS library for subtitle rendering + &Utiliser SSA/AAS pour le rendu + + + + &Text color: + Couleur du &texte : + + + + &Border color: + Couleur de &bordure : + + + + St&yles: + St&yles : + + + + PreferencesDialog + + + SMPlayer - Help + SMPlayer - Aide + + + + OK + OK + + + + Cancel + Annuler + + + + Apply + Appliquer + + + + Help + Aide + + + + SMPlayer - Preferences + SMPlayer - Préférences + + + + QObject + + + 1 second + 1 seconde + + + + %1 seconds + %1 secondes + + + + %1 minutes + %1 minutes + + + + %1 minutes and %2 seconds + %1 minutes and %2 secondes + + + + 1 minute + 1 minute + + + + 1 minute and 1 second + 1 minute and 1 seconde + + + + 1 minute and %1 seconds + 1 minute and %1 secondes + + + + %1 minutes and 1 second + %1 minutes and 1 seconde + + + + Usage: %1 [-ini-path [directory]] [-action action_name] [-close-at-end] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + + Usage : %1 [-ini-path [dossier]] [-action nom_action] [-close-at-end] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + + + + + -ini-path: specifies the directory for the configuration file + (smplayer.ini). If directory is omitted, the application + directory will be used. + + -ini-path: spécifie le dossier pour le fichier de configuration (smplayer.ini). + + + + -action: tries to make a connection to another running instance + and send to it the specified action. Example: -action pause + The rest of options (if any) will be ignored and the + application will exit. It will return 0 on success or -1 + on failure. + + -action: essaye de faire une connexion avec une autre instance et lui envoie l'action spécifiée. +Exemple : -action pause Le reste des options (s'il y en a) seront ignorés et l'application quittera. Cela retournera 0 si succès, et -1 si erreur. + + + + -close-at-end: the main window will be closed when the file/playlist finish + + -close-at-end : la fenêtre principale sera fermée lorsque le fichier ou la liste de lecture sera fini(e) + + + + -help: will show this message and then will exit. + + -help : montrera un message et quittera. + + + + media: 'media' is any kind of file that SMPlayer can open. It can + be a local file, a DVD (e.g. dvd://1), an Internet stream + (e.g. mms://....) or a local playlist in format m3u. + If the -playlist option is used, that means that SMPlayer + will pass the -playlist option to MPlayer, so MPlayer will + will handle the playlist, not SMPlayer. + + - media: 'media' est le format de fichier que peut ouvrir SMPlayer. Il peut être local (dvd://1), externe comme un Stream internet (mms://...) ou une liste de lecture (format m3u). +Si -playlist est utilisée, cela veut dire que SMPlayer passera l'information à MPlayer. Alors c'est MPlayer qui tiendra la liste de lectue, pas SMPlayer. + + + + This is SMPlayer v. %1 running on %2 + + SMPlayer v. %1 fonctionnant sur %2 + + + + + This is SMPlayer v. %1 running on %2 + SMPlayer v. %1 fonctionnant sur %2 + + + + Usage: %1 [-ini-path [directory]] [-action action_name] [-close-at-end] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + Usage : %1 [-ini-path [dossier]] [-action nom_action] [-close-at-end] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + + + + specifies the directory for the configuration file (smplayer.ini). If directory is omitted, the application directory will be used. + spécifie le dossier pour le fichier de configuration (smplayer.ini). + + + + tries to make a connection to another running instance and send to it the specified action. Example: -action pause The rest of options (if any) will be ignored and the application will exit. It will return 0 on success or -1 on failure. + essaye de faire une connexion avec une autre instance et lui envoie l'action spécifiée. Exemple : -action pause Le reste des options (s'il y en a) seront ignorés et l'application quittera. Cela retournera 0 si succès, et -1 si erreur. + + + + the main window will be closed when the file/playlist finishes. + la fenêtre principale sera fermée lorsque le fichier ou la liste de lecture sera fini(e). + + + + will show this message and then will exit. + montrera un message et quittera. + + + + 'media' is any kind of file that SMPlayer can open. It can be a local file, a DVD (e.g. dvd://1), an Internet stream (e.g. mms://....) or a local playlist in format m3u. If the -playlist option is used, that means that SMPlayer will pass the -playlist option to MPlayer, so MPlayer will handle the playlist, not SMPlayer. + 'media' est le format de fichier que peut ouvrir SMPlayer. Il peut être local (dvd://1), externe comme un Stream internet (mms://...) ou une liste de lecture (format m3u). Si -playlist est utilisée, cela veut dire que SMPlayer passera l'information à MPlayer. Alors c'est MPlayer qui tiendra la liste de lectue, pas SMPlayer. + + + + Usage: %1 [-ini-path [directory]] [-send-action action_name] [-actions action_list [-close-at-end] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + Usage : %1 [-ini-path [dossier]] [-action nom_action] [-actions action_list [-close-at-end] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + + + + tries to make a connection to another running instance and send to it the specified action. Example: -send-action pause The rest of options (if any) will be ignored and the application will exit. It will return 0 on success or -1 on failure. + essaye de faire une connexion avec une autre instance et lui envoie l'action spécifiée. Exemple : -action pause Le reste des options (s'il y en a) seront ignorés et l'application quittera. Cela retournera 0 si succès, et -1 si erreur. + + + + action_list is a list of actions separated by spaces. The actions will be executed just after loading the file (if any) in the same order you entered. For checkable actions you can pass true or false as parameter. Example: -actions "fullscreen compact true". Quotes are necessary in case you pass more than one action. + action_list est une liste d'actions séparées par des espaces. Ces actions seront exécutées juste après le fichier dans l'ordre dans lequel vous l'avez tapé. Pour les actions cochables, vous pouvez écrire "true" ou "false" en tant que paramètre. Exemple : -actions "fullscreen compact true". Les guillemets sont nécessaires si vous écrivez plus d'une action. + + + + media + Media + + + + Usage: %1 [-ini-path [directory]] [-send-action action_name] [-actions action_list [-close-at-end] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + Usage : %1 [-ini-path [directory]] [-send-action action_name] [-actions action_list [-close-at-end] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + + + + if there's another instance running, the media will be added to that instance's playlist. If there's no other instance, this option will be ignored and the files will be opened in a new instance. + Si une autre instance est en cours, le media sera ajouté à la liste de lecture de l'instance. Si il n'y a pas d'autre instance, l'option sera ignorée et les fichiers seront ouverts dans la nouvelle instance. + + + + Usage: %1 [-ini-path directory] [-send-action action_name] [-actions action_list [-close-at-end] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + Utilisation : %1 [-ini-path directory] [-send-action action_name] [-actions action_list [-close-at-end] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + + + + specifies the directory for the configuration file (smplayer.ini). + specifie le dossier pour le fichier de configuration (smplayer.ini). + + + + the main window won't be closed when the file/playlist finishes. + la fenêtre principale ne se fermera pas lorsque le fichier ou la liste de lecture sera fini(e). + + + + Usage: %1 [-ini-path directory] [-send-action action_name] [-actions action_list [-close-at-end] [-no-close-at-end] [-fullscreen] [-no-fullscreen] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + Usage : %1 [-ini-path directory] [-send-action action_name] [-actions action_list [-close-at-end] [-no-close-at-end] [-fullscreen] [-no-fullscreen] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + + + + the video will be played in fullscreen mode. + la video sera lue en plein écran. + + + + the video will be played in window mode. + la vidéo sera lue en mode fenêtre. + + + + SeekWidget + + + icon + Icône + + + + label + Label + + + + ShortcutGetter + + + Modify shortcut + Modifier raccourci + + + + Clear + Effacer + + + + Press the key combination you want to assign + Appuyez sur la combinaison de touches que vous voulez assigner + + + + Capture + Capturer + + + + Capture keystrokes + Enregistrer les frappes clavier + + + + VideoEqualizer + + + Contrast + Contraste + + + + Brightness + Luminosité + + + + Hue + Ton + + + + Saturation + Saturation + + + + Gamma + Gamma + + + + Equalizer + Equaliseur + + + + &Reset + &Reset + + + + &Set as default values + Choi&sir en tant que valeur par défaut + + + + Use the current values as default values for new videos. + Utiliser les valeurs actuelles comme valeurs par défaut pour les nouvelles vidéos. + + + + Set all controls to zero. + Mettre tous les contrôles à zéro. + + + diff --git a/retroshare-gui/src/apps/smplayer/translations/smplayer_hu.qm b/retroshare-gui/src/apps/smplayer/translations/smplayer_hu.qm new file mode 100644 index 000000000..f11bf2a07 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/translations/smplayer_hu.qm differ diff --git a/retroshare-gui/src/apps/smplayer/translations/smplayer_hu.ts b/retroshare-gui/src/apps/smplayer/translations/smplayer_hu.ts new file mode 100644 index 000000000..1e2dd06c0 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/translations/smplayer_hu.ts @@ -0,0 +1,3804 @@ + + + + AboutDialog + + + Version: %1 + Verzió: %1 + + + + 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. + Ez a program egy szabad szoftver; 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. + + + + Translators: + Fordítók: + + + + German + Német + + + + Slovak + Szlovák + + + + Italian + Olasz + + + + French + Francia + + + + Simplified-Chinese + Hagyományos-Kínai + + + + Russian + Orosz + + + + Hungarian + Magyar + + + + Japanese + Japán + + + + Dutch + Hollnad + + + + Ukrainian + Ukrán + + + + Georgian + Grúz + + + + Czech + Csehszlovák + + + + Logo designed by %1 + A logo és a jelenlegi dizájn %1 és a blackPanther Europe mukája (www.blackpanther.hu) + + + + Get updates at: %1 + Frissítés beszerezhetÅ‘ innen : %1 + + + + About SMPlayer + SMPlayer névjegye + + + + Polish + Lengyel + + + + Bulgarian + Bolgár + + + + Turkish + Török + + + + Swedish + Svéd + + + + Serbian + Szerb + + + + Traditional Chinese + Hagyományos Kínai + + + + Romanian + Román + + + + Portuguese - Brazil + Portugál - Brazil + + + + Portuguese - Portugal + Portugál + + + + Compiled with Qt %1 + Fordítva QT%1 -l + + + + %1, %2 and %3 + %1, %2 és %3 + + + + %1 and %2 + %1 és %2 + + + + http://smplayer.sourceforge.net/en/windows/download.php + If the web page is translated into your language you can change the URL so it points to the download page in the translation.Otherwise leave as is. + + + + + http://smplayer.sourceforge.net/en/linux/download.php + If the web page is translated into your language you can change the URL so it points to the download page in the translation.Otherwise leave as is. + + + + + <b>%1</b>: %2 + <b>%1</b>: %2 + + + + ActionsEditor + + + Name + Név + + + + Description + Leírás + + + + Shortcut + Parancs + + + + &Save + &Mentés + + + + &Load + &Betölt + + + + Key files + Kulcsfájlok + + + + Choose a filename + Válasszon egy fájlnevet + + + + Confirm overwrite? + Valóban felülírja ? + + + + The file %1 already exists. +Do you want to overwrite? + %1 fájl már létezik. +Valóban felül akarja írni ? + + + + Choose a file + Válasszon egy fájlt + + + + Error + Hiba + + + + The file couldn't be saved + A fájlt nem lehetett menteni + + + + The file couldn't be loaded + A fájlt nem lehetett betölteni + + + + &Change shortcut... + Bill. &cseréje... + + + + BaseGui + + + &File... + &Fájl... + + + + D&irectory... + &Könyvtár... + + + + &Playlist... + Lejátszóli&sta... + + + + &DVD from drive + &DVD lemez lejátszás + + + + D&VD from folder... + D&VD lejátszás könyvtárból... + + + + &URL... + &URL... + + + + P&lay + Le&játszás + + + + &Pause + &Szünet + + + + &Stop + &Megállít + + + + &Frame step + &Képkocka léptetés + + + + &Repeat + &Ismétlés + + + + &Normal speed + &Normál sebesség + + + + &Halve speed + &Fél sebesség + + + + &Double speed + &Dupla sebesség + + + + Speed &-10% + Sebesség&-10% + + + + Speed &+10% + Sebesség &+10% + + + + Sp&eed + &Sebesség + + + + &Fullscreen + &Teljes képernyÅ‘ + + + + &Compact mode + &Kompakt mód + + + + &Equalizer + &KiegyenlítÅ‘ (EQ) + + + + &Screenshot + &KépernyÅ‘kép + + + + S&tay on top + Mindig &felül + + + + &Postprocessing + &Postprocessing + + + + &Autodetect phase + &Automatikus szakasz + + + + &Deblock + &Deblock + + + + De&ring + De&ring + + + + Add n&oise + N&oise hozzáadása + + + + F&ilters + S&zűrÅ‘k + + + + &Mute + &Némítás + + + + Volume &- + HangerÅ‘ &- + + + + Volume &+ + HangerÅ‘ &+ + + + + &Delay - + &Késleltetés - + + + + D&elay + + Ké&sleltetés + + + + + &Extrastereo + &Extra sztereo + + + + &Karaoke + &Karaoke + + + + &Filters + &SzűrÅ‘k + + + + &Load... + &Betöltés... + + + + Delay &- + Késleltetés &- + + + + Delay &+ + Késleltetés &+ + + + + &Up + &Fel + + + + &Down + &Le + + + + &Playlist + Lejátszól&ista + + + + &Show frame counter + &Képkocka számolás megjelenítése + + + + P&references + &Beállítások + + + + &View logs + &Naplók megjelenítése + + + + About &Qt + &Qt névjegye + + + + About &SMPlayer + &SMPlayer névjegye + + + + &Open + &Megnyitás + + + + &Play + &Lejátszás + + + + &Video + &Videó + + + + &Audio + &Hang + + + + &Subtitles + &Feliratok + + + + &Browse + &Böngészés + + + + Op&tions + &Opciók + + + + &Help + &Segítség + + + + &Recent files + &Utoljára megnyított fájlok + + + + &Clear + &Tisztítás + + + + Si&ze + &Méret + + + + &Aspect ratio + &KépernyÅ‘ méretarány + + + + &Deinterlace + &Deinterlace + + + + De&noise + De&noise + + + + &Autodetect + &Automatikus + + + + &4:3 + &4:3 + + + + &5:4 + &5:4 + + + + &14:9 + &14:9 + + + + 16:&9 + 16:&9 + + + + 1&6:10 + 1&6:10 + + + + &2.35:1 + &2.35:1 + + + + 4:3 &Letterbox + 4:3 &Levélszekrény + + + + 16:9 L&etterbox + 16:9 &Levélszekrény + + + + 4:3 &Panscan + 4:3 &Pan keresés + + + + 4:3 &to 16:9 + 4:3 &erre 16:9 + + + + &None + &Nincs + + + + &Lowpass5 + &Lowpass5 + + + + Linear &Blend + &Lineáris keverés + + + + N&ormal + N&ormál + + + + &Track + &Sáv + + + + &Channels + &Csatornák + + + + &Stereo mode + &Sztereo Mód + + + + &Default + Alap&értelmezett + + + + &Stereo + &Sztereo + + + + &4.0 Surround + &4.0 Hárrérhang + + + + &5.1 Surround + &5.1 Hárrérhang + + + + &Left channel + &Bal csatorna + + + + &Right channel + &Jobb csatorna + + + + &Select + &Kiválaszt + + + + &Title + &Cím + + + + &Chapter + &Fejezet + + + + &Angle + &Angle + + + + &OSD + &OSD + + + + &Disabled + &Kikapcsolva + + + + &Seek bar + &Csúszó skála + + + + &Time + &IdÅ‘ + + + + Time + T&otal time + IdÅ‘ + &Teljes idÅ‘ + + + + SMPlayer - mplayer log + SMPlayer - mplayer napló + + + + SMPlayer - smplayer log + SMPlayer - smplayer napló + + + + <empty> + <üres> + + + + Video + Videó + + + + Audio + Hang + + + + Playlists + Lejátszólisták + + + + All files + Minden fájl + + + + Choose a file + Válasszon egy fájlt + + + + SMPlayer - Information + SMPlayer - Információ + + + + The CDROM / DVD drives are not configured yet. +The configuration dialog will be shown now, so you can do it. + A CDROM / DVD meghajtó nincs még beállítva. +A beállító panel megjelenik most, állítsa be az eszközöket. + + + + Choose a directory + Válasszon egy könyvtárat + + + + Subtitles + Feliratok + + + + About Qt + Qt névjegye + + + + Playing %1 + %1 lejátszás alatt + + + + Pause + Szünet + + + + Stop + Megállítás + + + + Play / Pause + Lejátszás / Szünet + + + + Pause / Frame step + Szünet / Képkocka léptetés + + + + U&nload + &Visszatöltés + + + + V&CD + V&CD + + + + C&lose + Be&zár + + + + View &info and properties... + &Információk és beállítások megjelenítése... + + + + Zoom &- + Kicsinyítés &- + + + + Zoom &+ + Nagyítás &+ + + + + &Reset + Ala&phelyzet + + + + Move &left + Mozgatás &balra + + + + Move &right + Mozgatás &jobbra + + + + Move &up + Mozgatás &felfelé + + + + Move &down + Mozgatás &lefelé + + + + &Pan && scan + &Pan && keresés + + + + &Previous line in subtitles + &ElÅ‘zÅ‘ sor a feliratban + + + + N&ext line in subtitles + &KövetkezÅ‘ sor a feliratban + + + + -%1 + -%1 + + + + +%1 + +%1 + + + + Dec volume (2) + Kevesebb hangerÅ‘ (2) + + + + Inc volume (2) + Több hangerÅ‘ (2) + + + + Exit fullscreen + Kilépés a teljesképernyÅ‘bÅ‘l + + + + OSD - Next level + OSD - KövetkezÅ‘ szint + + + + Dec contrast + Kevesebb kontraszt + + + + Inc contrast + Több kontraszt + + + + Dec brightness + Kevesebb fényerÅ‘ + + + + Inc brightness + Több fényerÅ‘ + + + + Dec hue + Kevesebb telítettség + + + + Inc hue + Több telítettség + + + + Dec saturation + Kevesebb szaturáció + + + + Dec gamma + Kevesebb gamma + + + + Next audio + KövetkezÅ‘ hang + + + + Next subtitle + KövetkezÅ‘ felirat + + + + Next chapter + KövetkezÅ‘ fejezet + + + + Previous chapter + ElÅ‘zÅ‘ fejezet + + + + Inc saturation + Több szaturáció + + + + Inc gamma + Több gamma + + + + &Load external file... + &KülsÅ‘ fájl betöltése... + + + + &Kerndeint + &Kerndeint + + + + &Yadif (normal) + &Yadif (normál) + + + + Y&adif (double framerate) + Y&adif (double framerate) + + + + &Next + &KövetkezÅ‘ + + + + Pre&vious + &ElÅ‘zÅ‘ + + + + Volume &normalization + HangerÅ‘ &nomalizálás + + + + &Audio CD + &Hanglemez + + + + Denoise nor&mal + Denoise nor&mál + + + + Denoise &soft + Denoise &szoft + + + + Denoise o&ff + Denoise o&ff + + + + Use SSA/&ASS library + SSA/&ASS könyvtár használata + + + + Flip i&mage + Kép &elforgatása + + + + &Toggle double size + &Dupla méretre vált + + + + BaseGuiPlus + + + SMPlayer is still running here + SMPlayer még mindig fut itt + + + + S&how icon in system tray + Tálca&ikon megjelenítése + + + + &Hide + &Elrejt + + + + &Restore + &Visszaállít + + + + &Recent files + &Utoljára megnyított fájlok + + + + &Quit + &Kilépés + + + + Playlist + Lejátszólista + + + + Core + + + Brightness: %1 + FényerÅ‘: %1 + + + + Contrast: %1 + Kontrast: %1 + + + + Gamma: %1 + Gamma: %1 + + + + Hue: %1 + Szinezés: %1 + + + + Saturation: %1 + Telitettség: %1 + + + + Volume: %1 + HangerÅ‘: %1 + + + + Zoom: %1 + Nagyítás: %1 + + + + DefaultGui + + + Welcome to SMPlayer + SMPlayer üdvözli Önt + + + + Volume + HangerÅ‘ + + + + Audio + Hang + + + + Subtitle + Felirat + + + + Playlist + Lejátszólista + + + + &Main toolbar + &FÅ‘ eszköztár + + + + &Language toolbar + &Nyelvi eszköztár + + + + &Toolbars + &Eszkötár + + + + Encodings + + + Western European Languages + Nyugat-Európai Nyelvek + + + + Western European Languages with Euro + Nyugat-Európai Nyelvek Euro-val + + + + Slavic/Central European Languages + Sláv/Közép-Europai Nyelvek + + + + Esperanto, Galician, Maltese, Turkish + Esperanto, Galicisch, Máltai, Török + + + + Old Baltic charset + + + + + Cyrillic + Cirill + + + + Arabic + Arab + + + + Modern Greek + + + + + Turkish + Török + + + + Baltic + Balti + + + + Celtic + Celtic + + + + Hebrew charsets + Héber kódolás + + + + Russian + Orosz + + + + Ukrainian, Belarusian + Ukrán, Belorusz + + + + Simplified Chinese charset + Hagyományos Kínai + + + + Traditional Chinese charset + Tradicionális Kínai kódolás + + + + Japanese charsets + Japán kódolás + + + + Korean charset + Koreai kódolás + + + + Thai charset + Thai kódolás + + + + Cyrillic Windows + Windows Cirill + + + + Slavic/Central European Windows + Sláv/Közép-Europai Windows + + + + Arabic Windows + + + + + EqSlider + + + icon + ikon + + + + FilePropertiesDialog + + + SMPlayer - File properties + SMPlayer - Fájlbeállítások + + + + &Information + &Információ + + + + &Demuxer + &Demuxer + + + + &Select the demuxer that will be used for this file: + &Válassza ki a demuxert amit ehhez a fájlhoz használni fog: + + + + &Reset + Ala&phelyzet + + + + &Video codec + &Videó kodek + + + + &Select the video codec: + Vála&ssza ki a videó kodeket: + + + + A&udio codec + H&ang kodek + + + + &Select the audio codec: + &Válassza ki az hang kodeket: + + + + &MPlayer options + &MPlayer opciók + + + + Additional Options for MPlayer + További opciók az MPlayer-hez + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + Itt kell megadnia az extra opciókat az MPlayer-hez.(new line)Ãrja Å‘ket szóközzel elválasztva.(new line)Example: -flip -nosound + + + + &Options: + &Opciók: + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + Itt tud további videó szűrÅ‘ket hozzáadni. +Ãrja Å‘ket ","-vel elválasztva. Ne használja a szóközt! +Például: scale=512:-2,eq2=1.1 + + + + V&ideo filters: + V&ideó szűrÅ‘k: + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + Audio szűrÅ‘k. Hasonló módon mint a videó szűrÅ‘k. +Például: mintavétel=44100:0:0,hangnorma + + + + Audio &filters: + A&udio szűrÅ‘k: + + + + OK + OK + + + + Cancel + Mégsem + + + + Apply + Alkalmaz + + + + InfoFile + + + General + Ãltalános + + + + Size + Méret + + + + %1 KB (%2 MB) + %1 KB (%2 MB) + + + + URL + URL + + + + Length + Hossz + + + + Demuxer + Demuxer + + + + Name + Név + + + + Artist + ElÅ‘adó + + + + Author + SzerzÅ‘ + + + + Album + Album + + + + Genre + Műfaj + + + + Date + Dátum + + + + Track + Sáv + + + + Copyright + Copyright + + + + Comment + Megjegyzés + + + + Software + Szoftver + + + + Clip info + Klipp Infó + + + + Video + Videó + + + + Resolution + Felbontás + + + + Aspect ratio + KépernyÅ‘arány + + + + Format + Formátum + + + + Bitrate + Bitráta + + + + %1 kbps + %1 kbps + + + + Frames per second + Képkocka / másodperc + + + + Selected codec + Kiválasztott kodek + + + + Initial Audio Stream + ElsÅ‘dleges hang adatfolyam + + + + Rate + Érték + + + + %1 Hz + %1 Hz + + + + Channels + Csatornák + + + + Audio Streams + Hang adatfolyamok + + + + Language + Nyelvezet + + + + empty + üres + + + + Subtitles + Feliratok + + + + Type + Típus + + + + ID + Info for translators: this is a identification code + + + + + # + Info for translators: this is a abbreviation for number + + + + + Stream title + Adatfolyam neve + + + + Stream URL + Adatfolyam URL + + + + File + Fájl + + + + InputDVDDirectory + + + Choose a directory + Válasszon egy könyvtárat + + + + SMPlayer - Play a DVD from a folder + SMPlayer - DVD lejátszása egy könyvtártból + + + + You can play a dvd from your hard disc. Just select the folder which contains the VIDEO_TS and AUDIO_TS directories. + Egy DVD-t lejátszhat akár az Ön merevlemezérÅ‘l is. Ehhez válassza ki azt a könyvtárat ahol a VIDEO_TS and AUDIO_TS fájlok vannak. + + + + Choose a directory... + Könyvtár választás... + + + + InputURL + + + SMPlayer - Enter URL + SMPlayer - URL megadása + + + + &URL: + &URL: + + + + It's a &playlist + Ez egy le&játszólista + + + + If this option is checked, the URL will be treated as a playlist: it will be opened as text and will play the URLs in it. + Ha ezt az opciót bejelöli, az URL úgy lesz kezelve mint egy lejátszólista: it will be opened as text and will play the URLs in it. + + + + LogWindow + + + Choose a filename to save under + Válasszon egy fájlnevet a mentéshez + + + + Confirm overwrite? + Valóban felülírja ? + + + + The file already exists. +Do you want to overwrite? + A fájl már létezik +Valóvan felül akarja írni ? + + + + Error saving file + Hiba a fájl mentésekor + + + + The log couldn't be saved + Naplózás mentése nem sikerült + + + + Logs + Naplók + + + + LogWindowBase + + + Log Window + Napló ablak + + + + Save + Mentés + + + + Copy to clipboard + Másolás a vágólapra + + + + Close + Bezár + + + + &Close + &Bezár + + + + Playlist + + + Name + Név + + + + Length + Hossz + + + + Choose a file + Válasszon egy fájlt + + + + Choose a filename + Válasszon egy fájlnevet + + + + Confirm overwrite? + Valóban felülírja ? + + + + Select one or more files to open + Kiválaszt egy vagy több fájlt a megnyitáshoz + + + + Choose a directory + Válasszon egy könyvtárat + + + + The file %1 already exists. +Do you want to overwrite? + %1 fájl már létezik. +Valóban felül akarja írni ? + + + + Edit name + Név szerkesztése + + + + Type the name that will be displayed in the playlist for this file: + Ãrjon be egy (új) nevet ennek a fájlnak a megjelenítéséhez: + + + + &Play + &Lejátszás + + + + &Edit + &Szerkesztés + + + + Playlists + Lejátszólisták + + + + All files + Minden fájl + + + + &Load + &Betölt + + + + &Save + &Mentés + + + + &Next + &KövetkezÅ‘ + + + + Pre&vious + &ElÅ‘zÅ‘ + + + + Move &up + Mozgatás &felfelé + + + + Move &down + Mozgatás &lefelé + + + + &Repeat + &Ismétlés + + + + S&huffle + &Keverés + + + + Add &current file + &Jelenlegi fájl hozzáadása + + + + Add &file(s) + Fájl(ok) &hozzáadása + + + + Add &directory + &Könyvtár hozzáadása + + + + Remove &selected + Ki&választott eltávolítása + + + + Remove &all + &Mind eltávolítása + + + + SMPlayer - Playlist + SMPlayer - Lejátszólista + + + + Add... + Hozzáadás... + + + + Remove... + Eltávolítás... + + + + Playlist modified + Lejátszólista módosítva + + + + There are unsaved changes, do you want to save the playlist? + Vannak most elmetnetetlen változások, el akarja most menteni? + + + + PrefAdvanced + + + Advanced + BÅ‘vített + + + + Auto + Auto + + + + &Advanced + &BÅ‘vített + + + + icon + Ikon + + + + Additional Options for MPlayer + További opciók az MPlayer-hez + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + Itt engedélyezhet extra opciókat az MPlayer-hez +Ãrja Å‘ket szóközzel elválasztva. +Például: -flip -nosound + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + Itt tud további videó szűrÅ‘ket hozzáadni. +Ãrja Å‘ket ","-vel elválasztva. Ne használja a szóközt! +Például: scale=512:-2,eq2=1.1 + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + Audio szűrÅ‘k. Hasonló módon mint a videó szűrÅ‘k. +Például: mintavétel=44100:0:0,hangnorma + + + + Don't repaint the background of the video window + Ne rajzolja újra a videóablak hátterét + + + + &Logs + &Naplók + + + + Log MPlayer output + MPlayer kimeneti napló + + + + Log SMPlayer output + SMPlayer kimeneti napló + + + + This option is mainly intended for debugging the application. + Ez az opció fÅ‘leg az alkalmazás hibakereséséhez szükséges. + + + + &MPlayer language + &MPlayer nyelve + + + + SMPlayer needs to read and parse the output of MPlayer and sometimes it relies on English text. If you are using a MPlayer translated into another language, then you need to change the texts that SMPlayer looks for. (Technically you should enter regular expressions)<br><br> +The drop-down lists may provide already made regular expression for several languages. + + + + + Checking this option may reduce flickering, but it also might produce that the video won't be displayed properly. + + + + + If checked, smplayer will store the output of mplayer (you can see it in <b>Options->View logs->mplayer</b>). In case of problems this log can contain important information, so it's recommended to keep this option checked. + Ha bejelöli az smplayer rögzíti az mplayer kimenetét (nézze meg ezt <b>Options->View logs->mplayer</b>). Probléma esetén nagyon fontos információkat tartalmazhat, ezért érdemes ezt az opciót bejelölni. + + + + If this option is checked, smplayer will store the debugging messages that smplayer outputs (you can see the log in <b>Options->View logs->smplayer</b>). This information can be very useful for the developer in case you find a bug. + Ha ezt bejelöli az smplayer rögzíteni fogja a debug üzeneteket az smplayer kimenetérÅ‘l (nézze meg a naplót itt <b>Options->View logs->smplayer</b>). Ez az információ nagyon hasznos lehet a fejlesztÅ‘nek a hibakeresésben. + + + + Filter for SMPlayer logs + SzűrÅ‘ az SMPlayer naplókhoz + + + + This option allows to filter the smplayer messages that will be stored in the log. Here you can write any regular expression.<br>For instance: <i>^Core::.*</i> will display only the lines starting with <i>Core::</i> + Ez az opció engedély a szűrÅ‘khöz az smplayer üzenetek rödzítésre kerülnek a naplóban. Ide írjon bármilyen megszokott kifejezést. <br>Kéréshez: <i>^Core::.*</i> így a megjelenítés a sorokban <i>Core::</i>-val indul + + + + &Monitor aspect: + &Monitor képarány: + + + + &Run MPlayer in its own window + &Futtatás az MPlayer ablakában + + + + &Options: + &Opciók: + + + + V&ideo filters: + V&ideó szűrÅ‘k: + + + + Audio &filters: + A&udio szűrÅ‘k: + + + + &Colorkey: + &Színkód: + + + + &Don't repaint the background of the video window + N&e rajzolja újra a videóablak hátterét + + + + Log &MPlayer output + &MPlayer kimeneti napló + + + + Log &SMPlayer output + &SMPlayer kimeneti napló + + + + &Filter for SMPlayer logs: + &SzűrÅ‘ az SMPlayer naplókhoz: + + + + &End of file: + Fájl &vége: + + + + &No video: + &Nincs videó: + + + + C&hange... + &Csere... + + + + PrefAssociations + + + Warning + + + + + Not all files could be associated. Please check your security permissions and retry. + + + + + File Types + + + + + Select all + + + + + Check all file types in the list + + + + + Uncheck all file types in the list + + + + + List of file types + + + + + File types + + + + + Media files handled by SMPlayer: + + + + + Select All + + + + + Select None + + + + + Check the media file extensions you would like SMPlayer to handle. When you click Apply, the checked files will be associated with SMPlayer. If you uncheck a media type, the file association will be restored. + + + + + Select none + + + + + PrefDrives + + + Drives + Meghajtók + + + + Currently SMPlayer does not autodetect cdrom or dvd devices. So in order to play cdroms or dvds you must first select here your cdrom and dvd drives (can be the same). + Az SMPlayer lehet, hogy nem tudta automatikusan felismerni a cd vagy dvd eszközöket. A lejátszáshoz most választani kell egy cdrom vagy dvd eszközt (lehet a két eszköz azonos). + + + + icon + Ikon + + + + Select your CD device: + CD eszköz kiválasztása (pl:/dev/cdrom): + + + + Select your DVD device: + DVD eszköz kiválasztása (pl:/dev/dvd): + + + + CD device + CD eszköz + + + + Choose your CDROM device. It will be used to play VCDs and Audio CDs. + Válassza ki a CD-rom eszközt. Ez lesz használva a VCD és a Haglemezek lejátszásához. + + + + DVD device + DVD eszköz + + + + Choose your DVD device. It will be used to play DVDs. + Válassza ki a DVD-rom eszközt. Ez lesz használva a DVD lemezek lejátszásához. + + + + Select your &CD device: + Válassza ki a &CD eszközt: + + + + Select your &DVD device: + Válassza ki a &DVD eszközt: + + + + PrefGeneral + + + General + Ãltalános + + + + &General + &Ãltalános + + + + Paths + Elérési utak + + + + Select... + Kiválaszt... + + + + Folder for storing screenshots: + Könyvtár a képernyÅ‘mentések tárolásához: + + + + Search... + Keresés... + + + + Output drivers + Kimeneti meghajtók + + + + Video: + Videó: + + + + Audio: + Hang: + + + + Media settings + Média-beállítások + + + + Remember settings for all files (audio track, subtitles...) + Jegyezze meg a beállításokat minden fájlhoz (hangsávok, feliratok...) + + + + Don't remember time position (files start playing from the beginning) + Ne jegyezze meg az idÅ‘-poziciót ( a fájl lejátszását az elejérÅ‘l kezdi ) + + + + Preferred audio and subtitles + Preferált hang és feliratok + + + + Subtitles: + Feliratok: + + + + &Video and audio + &Kép és hang + + + + Video + Videó + + + + Use software video equalizer + Szoftveres videó kiegyenlítÅ‘ (EQ) használata + + + + Start videos in fullscreen + Videók indítása teljes képrenyÅ‘s módba + + + + Disable screensaver + KépernyÅ‘kimélÅ‘ kikapcsolása + + + + Audio + Hang + + + + Use software volume control + Szoftveres hangerÅ‘ szabályzás használata + + + + Select the mplayer executable + Válassza ki az mplayer futtatható fájlt + + + + Executables + Futtathatók + + + + All files + Minden fájl + + + + Select a directory + Válasszon egy könyvtárat + + + + MPlayer executable + MPlayer futtatható állománya (bináris/exe) + + + + Here you must specify the mplayer executable that smplayer will use.<br>smplayer requires at least mplayer 1.0rc1 (svn recommended).<br><b>If this setting is wrong, smplayer won't be able to play anything!</b> + Itt be kell állítani az mplayer futathatóságát amit az smplayer használni fog. <br> smplayer igényli ehhez az mplayer 1.0rc1-et (svn ajánlott)<br><b>Ha ez rosszul van beállítva az smplayer nem fog semmit lejátszani!</b> + + + + Screenshots folder + Pillanatképek könyvtára + + + + Here you can specify a folder where the screenshots taken by smplayer will be stored. If this field is empty the screenshot feature will be disabled. + Itt kell megadni azt a könyvtárat ahol az smplayer által készített pillanatfelvételeket tárolja. Ha ez a mezÅ‘ üres marad a pillanatkép tulajdonságok ki lesznek kapcsolva. + + + + Video output driver + Videókimeneti meghajtó + + + + Select the video output driver. Usually xv (linux) and directx (windows) provide the best performance. + Válasszon videó kimeneti meghajtót. Ãltalában az xv (Linux) és a directx (Windows) biztosítja a legjobb teljesítményt. + + + + Audio output driver + Hangkimeneti meghajtó + + + + Select the audio output driver. + Válasszon kimeneti audio meghajtót. + + + + Remember settings + Beállítások megjegyzése + + + + Usually smplayer will remember the settings for each file you play (audio track selected, volume, filters...). Uncheck this option if you don't like this feature. + Ãltalában az smplayer megjegyzi a beállításokat minden általa lejátszott fájlhoz (kiválasztott hangsáv, hangerÅ‘, szűrÅ‘k...). Kapcsolja ki ezt az opciót ha nem akarja ezt a sajátosságot használni. + + + + Don't remember time position + Ne jegyezze meg az idÅ‘poziciót + + + + If you check this option, smplayer will play all files from the beginning. + Ha ezt az opciót bejelöli, minden fájl lejátszása az elejérÅ‘l lesz kezdve. + + + + Preferred audio language + ElsÅ‘dleges hang nyelve + + + + Here you can type your preferred language for the audio streams. When a media with multiple audio streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the audio streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the audio track if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + Itt kell megadnia az elsÅ‘dleges nyelv típusát a hang adatfolyamhoz. Amennyiben egy média többszörös hang adatfolyamot tartalmaz az smplayer megpróbálja használni az Ön elsÅ‘dleges nyelvét.<br>Ez csak akkor fog működni a médiával ha a hang adatfolyamok infomációjában van ilyen nyelv mint a DVD vagy mkv fájloknál.<br>Ha ezt elfogadja mindig ez lesz használva.Például: <b>es|esp|spa</b> így választjuk ki hangsávokat hogy egyezzen ezekkel <i>es</i>, <i>esp</i> or <i>spa</i>. + + + + Preferred subtitle language + ElsÅ‘dleges felirat nyelve + + + + Here you can type your preferred language for the subtitle stream. When a media with multiple subtitle streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the subtitle streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the subtitle stream if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + Itt kell megadnia az elsÅ‘dleges nyelv típusát a felirat adatfolyamhoz. Amennyiben egy média többféle felirat adatfolyamot tartalmaz akkor az smplayer megpróbálja használni az Ön elsÅ‘dleges nyelvét.<br>Ez csak akkor fog működni a médiával ha a hang adatfolyamok infomációjában van ilyen nyelv mint a DVD vagy mkv fájloknál.<br>Ha ezt elfogadja mindig ez lesz használva.Például: <b>es|esp|spa</b> így választjuk ki hangsávokat hogy egyezzen ezekkel <i>es</i>, <i>esp</i> or <i>spa</i>. + + + + Software video equalizer + Szoftveres videókiegyenlítÅ‘ + + + + You can check this option if video equalizer is not supported by your graphic card or the selected video output driver.<br><b>Note:</b> this option can be incompatible with some video output drivers. + Jelölje be ezt az opciót ha a videó kiegyenlítÅ‘ (EQ) nem támogatott a grafikus kártyája vagy a kiválasztott kimeneti meghajtó által.<br><b>Megjegyzés:</b> ez az opció nem kompatibilis néhány videó kimeneti meghajtóval. + + + + If this option is checked, all videos will start to play in fullscreen mode. + Ha ezt az opciót bejelöli minden videó teljesképernyÅ‘s módban lesz lejátszva. + + + + Check this option to disable the screensaver while playing.<br>The screensaver will enabled again when play finishes.<br><b>Note:</b> This option works only in X11 and Windows. + Jelölje be ezt az opciót a képernyÅ‘kímélÅ‘ kikapcsolásához a lejátszás alatt.<br>A képernyÅ‘kímélÅ‘ újra bekapcsol ha a léjátszás befejezÅ‘dik.<br><b>Megjegyzés:</b>Ez az opció csak X11 és Windows alatt működik. + + + + Software volume control + Szoftveres hangerÅ‘ vezérlés + + + + Check this option to use the software mixer, instead of using the sound card mixer. + Az opció bejelölésével szoftveres keverÅ‘ lesz használva a hangkártya kerverÅ‘je helyett. + + + + Postprocessing quality + Postprocessing minÅ‘ség + + + + Dynamically changes the level of postprocessing depending on the available spare CPU time. The number you specify will be the maximum level used. Usually you can use some big number. + A postprocessing igénye szerint a szint dinamikus váltása az elérhetÅ‘ tartalék CPU idÅ‘n. Az általad megadott szám lesz a maximum használt szint. Ãltalában használhatsz nagy számot is. + + + + Change volume + HangerÅ‘ váltás + + + + If checked, SMPlayer will remember the volume for every file and will restore it when played again. For new files the default volume will be used. + Ha bejelöli az SMPlayer megpróbálja megjegyezni a hangerÅ‘t minden fájlnál ha az újra lejátszásra kerül. Az új fájlokhoz az alapértelmezett beállítás lesz használva. + + + + Default volume: + Alapértelmezett hangerÅ‘: + + + + 0 + 0 + + + + &Change volume on every file + &HangerÅ‘ váltása minden fájlnál + + + + &Search... + &Keresés... + + + + S&elect... + &Kiválaszt... + + + + Select the &MPlayer executable: + A futtatható &MPlayer állomány kiválasztása: + + + + &Folder for storing screenshots: + &Pillanatképek könyvtára: + + + + V&ideo: + &Videó: + + + + &Audio: + &Hang: + + + + &Don't remember time position (files start playing from the beginning) + &Ne emlékezzen az idÅ‘pozicióra (a fájlok lejátszás az elejérÅ‘l kezdÅ‘djön) + + + + &Remember settings for all files (audio track, subtitles...) + &Jegyezze meg a beállításokat az összes fájlhoz (hangsáv, feliratok...) + + + + A&udio: + &Hang: + + + + Su&btitles: + &Feliratok: + + + + &Use software video equalizer + Szoftveres videó kiegyenlítÅ‘ (EQ) &használata + + + + &Quality: + &MinÅ‘ség: + + + + Start videos in &fullscreen + Videó indítása &teljes képernyÅ‘vel + + + + Disable &screensaver + &KépernyÅ‘kimélÅ‘ kikapcsolása + + + + &Default volume: + &Alapértelmezett hangerÅ‘: + + + + Use s&oftware volume control + &Szoftveres hangerÅ‘ szabályzás használata + + + + Ma&x. Amplification: + Ma&ximális erÅ‘sítés: + + + + &AC3/DTS pass-through S/PDIF + &AC3/DTS pass-through S/PDIF + + + + Direct rendering + Hardveres gyorsítás + + + + If checked, turns on direct rendering (not supported by all codecs and video outputs)<br><b>WARNING:</b> May cause OSD/SUB corruption! + Ha bejelöli bekapcsolja a hardveres gyorsítást. (nem támogatja minden kodek és videó kimenet) <br><b>FIGYELEM:</b> May cause OSD/SUB corruption! + + + + Double buffering + Dupla bufferelés + + + + D&irect rendering + Hardveres &gyorsítás + + + + Dou&ble buffering + Dupla &bufferelés + + + + Double buffering fixes flicker by storing two frames in memory, and displaying one while decoding another. If disabled it can affect OSD negatively, but often removes OSD flickering. + A dupla bufferelés javítja a lebegést úgy, hogy két képkockát tárol a memóriában és amíg az egyiket megjeleníti a másikat dekódolja. Ha kikapcsolja az OSD negatívvá válik vagy többször leveszi az OSD lebegést. + + + + &Enable postprocessing by default + Postprocessing &bekapcsolása alapból + + + + Volume &normalization by default + HangerÅ‘ &normalizálás alapból + + + + Close when finished + Befejezés után bezár + + + + If this option is checked, the main window will be automatically closed when the current file/playlist finishes. + Ha ezt az opciót kijelöli a fÅ‘ablak automatikusan bezáródik akkor ha a jelenlegi fájl/lejátszólista végetér. + + + + &Close when finished + Befejezés után &bezár + + + + 2 (Stereo) + + + + + 4 (4.0 Surround) + + + + + 6 (5.1 Surround) + + + + + &Pause when minimized + + + + + C&hannels by default: + + + + + Pause when minimized + + + + + If this option is enabled, the file will be paused when the main window is hidden. When the window is restored, play will be resumed. + + + + + Enable postprocessing by default + + + + + Max. Amplification + + + + + AC3/DTS pass-through S/PDIF + + + + + Volume normalization by default + + + + + Maximizes the volume without distorting the sound. + + + + + Default volume + + + + + Sets the initial volume that new files will use. + + + + + Channels by default + + + + + Sets the maximum amplification level in percent (default: 110). A value of 200 will allow you to adjust the volume up to a maximum of double the current level. With values below 100 the initial volume (which is 100%) will be above the maximum, which e.g. the OSD cannot display correctly. + + + + + Uses hardware AC3 passthrough + + + + + Requests the number of playback channels. MPlayer asks the decoder to decode the audio into as many channels as specified. Then it is up to the decoder to fulfill the requirement. This is usually only important when playing videos with AC3 audio (like DVDs). In that case liba52 does the decoding by default and correctly downmixes the audio into the requested number of channels. NOTE: This option is honored by codecs (AC3 only), filters (surround) and audio output drivers (OSS at least). + + + + + Postprocessing will be used by default on new opened files. + + + + + PrefInput + + + Keyboard and mouse + Billentyűzet és egér + + + + &Keyboard + &Billentyűzet + + + + icon + Ikon + + + + &Mouse + &Egér + + + + Button functions: + Gomb műveletek: + + + + Media seeking + Média léptetés + + + + Volume control + HangerÅ‘ szabályzó + + + + Zoom video + Videó nagyítás + + + + None + Nincs + + + + Here you can change any key shortcut. To do it double click or press enter over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + Itt tud bármilyen billentyűparancsot választani. Ehhez kattintson duplán vagy nyomja le az entert a parancscellán. Opcionálisan akár le is tudja menteni a listát és megoszthatja más emberek között vagy betöltheti egy másik gépen. + + + + Here you can change any key shortcut. To do it double click or start typing over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + Itt tud bármilyen billentyűparancsot választani.To do it double click or start typing over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + + + + &Left click + &Bal kattintás + + + + &Double click + &Jobb kattintás + + + + &Wheel function: + &GörgÅ‘funkció: + + + + Shortcut editor + + + + + This table allows you to change the key shortcuts of most available actions. Double click or press enter on a item, or press the <b>Change shortcut</b> button to enter in the <i>Modify shortcut</i> dialog. There are two ways to change a shortcut: if the <b>Capture</b> button is on then just press the new key or combination of keys that you want to assign for the action (unfortunately this doesn't work for all keys). If the <b>Capture</b> button is off then you could enter the full name of the key. + + + + + Left click + + + + + Select the action for left click on the mouse. + + + + + Double click + + + + + Select the action for double click on the mouse. + + + + + Wheel function + + + + + Select the action for the mouse wheel. + + + + + PrefInterface + + + Interface + Felület + + + + Bulgarian + Bulgár + + + + Czech + Csehszlovák + + + + German + Német + + + + Greek + Görög + + + + English + Angol + + + + Spanish + Spanyol + + + + Finnish + Finn + + + + French + Francia + + + + Hungarian + Magyar + + + + Italian + Olasz + + + + Japanese + Japán + + + + Georgian + Grúz + + + + Dutch + Hollnad + + + + Polish + Lengyel + + + + Portuguese - Brazil + Portugál - Brazil + + + + Portuguese - Portugal + Portugál + + + + Romanian + Román + + + + Russian + Orosz + + + + Slovak + Szlovák + + + + Serbian + Szerb + + + + Swedish + Svéd + + + + Turkish + Török + + + + Ukrainian + Ukrán + + + + Simplified-Chinese + Hagyományos-Kínai + + + + Traditional Chinese + Tradicionális Kínai + + + + <Autodetect> + <Automatikus> + + + + Default + Alapértelmezett + + + + &Interface + &Felület + + + + Seeking + Léptetés + + + + Never + Soha + + + + Whenever it's needed + Valahányszor ha szükséges + + + + Only after loading a new video + Csak egy új videó után tölti be + + + + Recent files + Utoljára megnyított fájlok + + + + Language + Nyelvezet + + + + Here you can change the language of the application. + Itt tudja megváltoztatni az alkalmazás nyelvezetét. + + + + Instances + Javaslatok + + + + Catalan + Katalán + + + + Basque + Basque + + + + Galician + Galician + + + + &Short jump + &Rövid ugrás + + + + &Medium jump + &Közepes ugrás + + + + &Long jump + &Hosszú ugrás + + + + Mouse &wheel jump + Ugrás egér&görgÅ‘vel + + + + &Use only one running instance of SMPlayer + &Akkor használja ha csak egy példány futhat az SMPlayer-bÅ‘l + + + + SMPlayer will listen to this &port to receive commands from other instances: + SMPlayer fenntartja ezt a &portot, hogy itt máshonnan érkezÅ‘ parancsokat fogadjon: + + + + Ma&x. items + Ma&x. elemek + + + + St&yle: + St&ílus: + + + + Ico&n set: + Ik&onkészlet: + + + + L&anguage: + Ny&elvezet: + + + + Main window + FÅ‘ablak + + + + Auto&resize: + Automatikus &méret: + + + + R&emember position and size + Pozició és méret megje&gyzése + + + + Default font: + Alapértelmezett font: + + + + &Change... + &Cserél... + + + + PrefPerformance + + + Performance + Teljesítmény + + + + &Performance + &Teljesítmény + + + + Priority + ElsÅ‘bbség + + + + Select the priority for the MPlayer process. + Válasszon egy priorítást az MPlayer folyamatokhoz. + + + + Priority: + Priorität: + + + + realtime + Valósidejű + + + + high + magas + + + + abovenormal + abovenormal + + + + normal + Normál + + + + belownormal + belownormal + + + + idle + tétlen + + + + Cache + Gyorsítótár + + + + KB + KB + + + + Setting a cache may improve performance on slow media + Ãllítson be egy gyorsítótárat, a lassú médiánál a teljesítményt megnövelheti + + + + Allow frame drop + Kép eldobás engedélyezése + + + + Allow hard frame drop (can lead to image distortion) + Engedélyezi a durva kép eldobást (képminÅ‘ség romláshoz vezethet) + + + + Synchronization + Szinkronizáció + + + + Audio/video auto synchronization + Automatikus Hang/Videó Szinkronizálás + + + + Factor: + Faktor: + + + + Fast audio track switching + Gyors hangsáv váltás + + + + Fast seek to chapters in dvds + Gyors léptetés a fejezetekhez a dvd-ken + + + + Set process priority for mplayer according to the predefined priorities available under Windows.<br><b>WARNING:</b> Using realtime priority can cause system lockup. + Az mplayer rendszer-folyamat priorításának beállítása az preferált priorításokhoz ami elérhetÅ‘ a Windows-ban.<br><b>Figyelem:</b> A valósidejű priorítás használata rendszervisszacsatolást okozhat. + + + + <br><b>Note:</b> This option is for Windows only. + <br><b>Megjegyzés:</b> Ez az opció csak a Windows-hoz érhetÅ‘ el. + + + + This option specifies how much memory (in kBytes) to use when precaching a file or URL. Especially useful on slow media. + +Ez az opció adja meg, hogy mennyi memóriát (kBytekben) használjon az újratároláshoz egy file vagy url. Legjobb lassú médiákhoz. + + + + Skip displaying some frames to maintain A/V sync on slow systems. + Vessen el a megjelenító pár képet a A/V szinkronizálásból lassú rendszeren. + + + + Allow hard frame drop + Engedélyezi a durva kép eldobást + + + + More intense frame dropping (breaks decoding). Leads to image distortion! + Intenzívebb képdobás (dekódolás törés). Képtorzuláshoz vezethet! + + + + Gradually adjusts the A/V sync based on audio delay measurements. + Fokozatosan igazítja az A/V szinkron bázist az audio késleltetés mérésen. + + + + Priorit&y: + &ElsÅ‘bbég: + + + + Si&ze: + &Méret: + + + + &Use cache + &Gyorsítótár használata + + + + &Allow frame drop + &Engedélyezi a képeldobást + + + + Allow &hard frame drop (can lead to image distortion) + Engedélyezi a &durva kép eldobást (képminÅ‘ség romláshoz vezethet) + + + + Audio/&video auto synchronization + Automatikus Hang/&Videó Szinkronizálás + + + + Fact&or: + Té&nyezÅ‘: + + + + &Fast audio track switching + &Gyors hangsáv váltás + + + + Fast &seek to chapters in dvds + Gyors &léptetés a fejezetekhez a dvd-ken + + + + Create index if needed + Tartalomjegyzék létrehozása ha szükséges + + + + Rebuilds index of files if no index was found, allowing seeking. Useful with broken/incomplete downloads, or badly created files. This option only works if the underlying media supports seeking (i.e. not with stdin, pipe, etc).<br> Note: the creation of the index may take some time. + + + + + &Create index if needed + Tartalomjegyzék &létrehozása ha szükséges + + + + If checked, it will try the fastest method to switch audio tracks but might not work with some formats. + + + + + If checked, it will try the fastest method to seek to chapters but it might not work with some discs. + + + + + PrefSubtitles + + + Subtitles + Feliratok + + + + Choose a ttf file + Válasszon egy TTF fájlt + + + + Truetype Fonts + Truetype fontok (*.ttf) + + + + &Subtitles + &Feliratok + + + + Autoload + Automatikus betöltés + + + + Autoload subtitles files (*.srt, *.sub...): + Feliratok automatikus betöltése (*.srt,*.sub...): + + + + Same name as movie + Azonos névvel mint a film + + + + All subs containing movie name + Minden felirat ami tartalmazza a film nevét + + + + All subs in directory + Minden felirat a könyvtárban + + + + Default subtitle encoding: + Alapértelmezett felirat kódolás: + + + + Position + Pozició + + + + 0 + 0 + + + + Top + Fenn + + + + Bottom + Lenn + + + + Include subtitles on screenshots + Feliratok beépítése a képernyÅ‘mentésbe + + + + &Font + &Font + + + + Font + Betűtípusok + + + + TTF font: + TTF font: + + + + Search... + Keresés... + + + + System font: + Rendszer font: + + + + Select the font which will be used for subtitles (and OSD): + Válasszon egy fontot a feliratokhoz (OSD is): + + + + Size + Méret + + + + Autoscale: + Automatikus méret: + + + + No autoscale + Nincs automatikus méretezés + + + + Proportional to movie height + A film magasságához megfelelÅ‘ + + + + Proportional to movie width + A film szélességéhez megfelelÅ‘ + + + + Proportional to movie diagonal + A film átlójához megfelelÅ‘ + + + + Scale: + Arány: + + + + SSA/&ASS library + SSA/&ASS könyvtár + + + + The new SSA/ASS library will provide nice styled subtitles for external SSA/ASS subtitles files and Matroska tracks. But it will be used too for rendering other formats like SUB and SRT files. + + + + + Use SSA/ASS library for subtitle rendering + SSA/ASS programkönyvtár használata a felirat rendereléshez + + + + Text color: + Szöveg szín: + + + + Border color: + Keret színe: + + + + Here you can override styles for SSA/ASS subtitles. It can be also used for fine-tuning the rendering of SRT and SUB subtitles by the SSA/ASS library. Example: <b>Bold=1,Outline=2,Shadow=4</b> + + + + + Subtitle position + Felirat poziciója + + + + This option specifies the position of the subtitles over the video window. <i>100</i> means the bottom, while <i>0</i> means the top. + + + + + SSA/ASS styles + SSA/ASS stílus + + + + Au&toload subtitles files (*.srt, *.sub...): + Feliratfájlok au&tomatikus betöltése (*.srt, *.sub...): + + + + S&elect first available subtitle + Az elsÅ‘ &elérhetÅ‘ felirat kiválasztása + + + + &Default subtitle encoding: + &Alapértelmezett felirat kódolás: + + + + Default &position of the subtitles on screen + A feliratok alapértelmezett &poziciója a képen + + + + &Include subtitles on screenshots + &Felirat beépítése a pillanatképbe + + + + &Use -subfont option (required by recent MPlayer releases) + &Használja a -subfont opciót (az újabb MPlayer kiadásnak szükséges lehet) + + + + &TTF font: + &TTF font: + + + + Sea&rch... + Ke&resés... + + + + S&ystem font: + &Rendszer font: + + + + A&utoscale: + A&utomatikus méret: + + + + S&cale: + Mérete&zés: + + + + &Use SSA/ASS library for subtitle rendering + &Használjon SSA/ASS könvtárat a felirat megjelenítéséhez + + + + &Text color: + &Szöveg színe: + + + + &Border color: + &Keret színe: + + + + St&yles: + S&tílusok: + + + + PreferencesDialog + + + SMPlayer - Help + SMPlayer - Segítség + + + + OK + OK + + + + Cancel + Mégsem + + + + Apply + Alkalmaz + + + + Help + Súgó + + + + SMPlayer - Preferences + SMPlayer - Beállítások + + + + QObject + + + 1 second + 1 másodperc + + + + %1 seconds + %1 másodperc + + + + %1 minutes + %1 perc + + + + %1 minutes and %2 seconds + %1 perc és %2 másodperc + + + + 1 minute + 1 perc + + + + 1 minute and 1 second + 1 perc és 1 másodperc + + + + 1 minute and %1 seconds + 1 perc és %1 másodperc + + + + %1 minutes and 1 second + %1 perc és 1 másodperc + + + + will show this message and then will exit. + megjeleníti ezt az üzenetet és kilép. + + + + 'media' is any kind of file that SMPlayer can open. It can be a local file, a DVD (e.g. dvd://1), an Internet stream (e.g. mms://....) or a local playlist in format m3u. If the -playlist option is used, that means that SMPlayer will pass the -playlist option to MPlayer, so MPlayer will handle the playlist, not SMPlayer. + + + + + the main window will be closed when the file/playlist finishes. + a fÅ‘ablak bezáródik ha a fájl/lejátszólista végetért. + + + + This is SMPlayer v. %1 running on %2 + Ez az SMPlayer v. %1 ami %2 fut + + + + Usage: %1 [-ini-path [directory]] [-send-action action_name] [-actions action_list [-close-at-end] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + Használat: %1 [-ini-path [directory]] [-send-action action_name] [-actions action_list [-close-at-end] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + + + + tries to make a connection to another running instance and send to it the specified action. Example: -send-action pause The rest of options (if any) will be ignored and the application will exit. It will return 0 on success or -1 on failure. + + + + + action_list is a list of actions separated by spaces. The actions will be executed just after loading the file (if any) in the same order you entered. For checkable actions you can pass true or false as parameter. Example: -actions "fullscreen compact true". Quotes are necessary in case you pass more than one action. + + + + + media + média + + + + if there's another instance running, the media will be added to that instance's playlist. If there's no other instance, this option will be ignored and the files will be opened in a new instance. + + + + + specifies the directory for the configuration file (smplayer.ini). + + + + + the main window won't be closed when the file/playlist finishes. + + + + + Usage: %1 [-ini-path directory] [-send-action action_name] [-actions action_list [-close-at-end] [-no-close-at-end] [-fullscreen] [-no-fullscreen] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + + + + + the video will be played in fullscreen mode. + + + + + the video will be played in window mode. + + + + + SeekWidget + + + icon + ikon + + + + label + fül + + + + ShortcutGetter + + + Modify shortcut + Parancs módosítása + + + + Clear + Töröl + + + + Press the key combination you want to assign + Nyomja le a billentyűkombinációt a hozzárendeléshez + + + + Capture + Pillanatkép + + + + Capture keystrokes + Pillanatképek billentyűkódja + + + + VideoEqualizer + + + Contrast + Kontraszt + + + + Brightness + FényerÅ‘ + + + + Hue + Szinezés + + + + Saturation + Telítettség + + + + Gamma + Gamma + + + + Equalizer + Equalizer + + + + &Reset + Ala&phelyzet + + + + &Set as default values + Alapértékek &visszaállítása + + + + Use the current values as default values for new videos. + A jelenlegi értékek használata mint alapérték az új videókhoz. + + + + Set all controls to zero. + Minden vezérlÅ‘ nullára állítása. + + + diff --git a/retroshare-gui/src/apps/smplayer/translations/smplayer_it.qm b/retroshare-gui/src/apps/smplayer/translations/smplayer_it.qm new file mode 100644 index 000000000..e065b9a44 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/translations/smplayer_it.qm differ diff --git a/retroshare-gui/src/apps/smplayer/translations/smplayer_it.ts b/retroshare-gui/src/apps/smplayer/translations/smplayer_it.ts new file mode 100644 index 000000000..ba60f6f3a --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/translations/smplayer_it.ts @@ -0,0 +1,3882 @@ + + + + AboutDialog + + + Version: %1 + Versione: %1 + + + + 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 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. + + + + Translators: + Traduttori: + + + + German + Tedesco + + + + Slovak + Slovacco + + + + Italian + Italiano + + + + French + Francese + + + + Simplified-Chinese + Cinese Semplificato + + + + Russian + Russo + + + + Hungarian + Ungherese + + + + Japanese + Giapponese + + + + Dutch + Olandese + + + + Ukrainian + Ucraino + + + + Georgian + Georgiano + + + + Czech + Ceco + + + + Logo designed by %1 + Logo realizzato da %1 + + + + Get updates at: %1 + Trova aggiornamenti su: %1 + + + + About SMPlayer + Informazioni su SMPlayer + + + + Polish + Polacco + + + + Bulgarian + Bulgaro + + + + Turkish + Turco + + + + Swedish + Svedese + + + + Serbian + Serbo + + + + Traditional Chinese + Cinese Tradizionale + + + + Romanian + Romeno + + + + Portuguese - Brazil + Portoghese (Brasile) + + + + Portuguese - Portugal + Portoghese (Portogallo) + + + + Compiled with Qt %1 + Compilato con Qt %1 + + + + %1, %2 and %3 + %1, %2 e %3 + + + + %1 and %2 + %1 e %2 + + + + http://smplayer.sourceforge.net/en/windows/download.php + If the web page is translated into your language you can change the URL so it points to the download page in the translation.Otherwise leave as is. + http://smplayer.sourceforge.net/en/windows/download.php + + + + http://smplayer.sourceforge.net/en/linux/download.php + If the web page is translated into your language you can change the URL so it points to the download page in the translation.Otherwise leave as is. + http://smplayer.sourceforge.net/en/linux/download.php + + + + <b>%1</b>: %2 + <b>%1</b>: %2 + + + + ActionsEditor + + + Name + Nome + + + + Description + Descrizione + + + + Shortcut + Scorciatoia + + + + &Save + &Salva + + + + &Load + &Apri + + + + Key files + File chiave + + + + Choose a filename + Scegli il nome del file + + + + Confirm overwrite? + Confermi sovrascrittura? + + + + The file %1 already exists. +Do you want to overwrite? + Il file %1 esiste già. +Vuoi sovrascriverlo? + + + + Choose a file + Scegli un file + + + + Error + Errore + + + + The file couldn't be saved + Non è stato possibile salvare il file + + + + The file couldn't be loaded + Non è stato possibile caricare il file + + + + &Change shortcut... + &Cambia scorciatoia... + + + + BaseGui + + + &File... + &File... + + + + D&irectory... + C&artella... + + + + &Playlist... + &Lista di riproduzione... + + + + &DVD from drive + &DVD dal lettore + + + + D&VD from folder... + D&VD da una cartella... + + + + &URL... + &URL... + + + + P&lay + &Riproduci + + + + &Pause + &Pausa + + + + &Stop + &Stop + + + + &Frame step + &Avanza per fotogramma + + + + &Repeat + Ripeti + + + + &Normal speed + Velocità &normale + + + + &Halve speed + &Dimezza velocità + + + + &Double speed + &Raddoppia velocità + + + + Speed &-10% + Velocità &-10% + + + + Speed &+10% + Velocità &+10% + + + + Sp&eed + &Velocità + + + + &Fullscreen + &Tutto schermo + + + + &Compact mode + &Modalità compatta + + + + &Equalizer + &Equalizzatore + + + + &Screenshot + &Screenshot + + + + S&tay on top + Tieni s&opra le altre + + + + &Postprocessing + &Postprocessing + + + + &Autodetect phase + &Autodetect della fase + + + + &Deblock + &Deblock + + + + De&ring + De&ring + + + + Add n&oise + Aggiungi r&umore + + + + F&ilters + &Filtri + + + + &Mute + &Muto + + + + Volume &- + Volume &- + + + + Volume &+ + Volume &+ + + + + &Delay - + &Ritardo - + + + + D&elay + + R&itardo + + + + + &Extrastereo + &Extrastereo + + + + &Karaoke + &Karaoke + + + + &Filters + &Filtri + + + + &Load... + &Apri... + + + + Delay &- + Ritardo &- + + + + Delay &+ + Ritardo &+ + + + + &Up + &Su + + + + &Down + G&iù + + + + &Playlist + &Lista di riproduzione + + + + &Show frame counter + Mostra &contatore fotogrammi + + + + P&references + P&referenze + + + + &View logs + &Vedi logs + + + + About &Qt + Informazioni &Qt + + + + About &SMPlayer + Informazioni su &SMPlayer + + + + &Open + A&pri + + + + &Play + &Riproduci + + + + &Video + &Video + + + + &Audio + A&udio + + + + &Subtitles + &Sottotitoli + + + + &Browse + S&foglia + + + + Op&tions + &Opzioni + + + + &Help + &Aiuto + + + + &Recent files + File &recenti + + + + &Clear + &Pulisci + + + + Si&ze + Grande&zza + + + + &Aspect ratio + &Rapporto d'aspetto + + + + &Deinterlace + &Deinterlaccia + + + + De&noise + De&noise + + + + &Autodetect + A&utomatico + + + + &4:3 + &4:3 + + + + &5:4 + &5:4 + + + + &14:9 + &14:9 + + + + 16:&9 + 16:&9 + + + + 1&6:10 + 1&6:10 + + + + &2.35:1 + &2.35:1 + + + + 4:3 &Letterbox + 4:3 &Letterbox + + + + 16:9 L&etterbox + 16:9 L&etterbox + + + + 4:3 &Panscan + 4:3 &Panscan + + + + 4:3 &to 16:9 + 4:3 &a 16:9 + + + + &None + &Nessuno + + + + &Lowpass5 + &Lowpass5 + + + + Linear &Blend + &Blend Lineare + + + + N&ormal + Normale + + + + &Soft + Soft + + + + &Track + &Traccia + + + + &Channels + &Canali + + + + &Stereo mode + &Modo stereo + + + + &Default + Pre&definito + + + + &Stereo + &Stereo + + + + &4.0 Surround + &4.0 Surround + + + + &5.1 Surround + &5.1 Surround + + + + &Left channel + Canale &Sinistro + + + + &Right channel + Canale &Destro + + + + &Select + &Seleziona + + + + &Title + &Titolo + + + + &Chapter + &Capitolo + + + + &Angle + &Angolo + + + + &OSD + &OSD + + + + &Disabled + &Disabilitato + + + + &Seek bar + &Barra di ricerca + + + + &Time + &Tempo + + + + Time + T&otal time + Tempo + Tempo T&otale + + + + SMPlayer - mplayer log + SMPlayer - Log di mplayer + + + + SMPlayer - smplayer log + SMPlayer - Log di smplayer + + + + <empty> + <vuoto> + + + + Video + Video + + + + Audio + Audio + + + + Playlists + Liste di riproduzione + + + + All files + Tutti i file + + + + Choose a file + Scegli un file + + + + SMPlayer - Information + SMPlayer - Informazioni + + + + The CDROM / DVD drives are not configured yet. +The configuration dialog will be shown now, so you can do it. + Le unità CDROM / DVD non sono ancora configurate. +Si aprirà ora il dialogo di configurazione, in modio che tu possa farlo. + + + + + Choose a directory + Scegli una cartella + + + + Subtitles + Sottotitoli + + + + About Qt + Informazioni Qt + + + + Playing %1 + In riproduzione %1 + + + + Pause + Pausa + + + + Stop + Stop + + + + Play / Pause + Riproduci / Pausa + + + + Pause / Frame step + Pausa / Per fotogramma + + + + U&nload + &Rimuovi + + + + V&CD + V&CD + + + + C&lose + C&hiudi + + + + View &info and properties... + &Informazioni e proprietà + + + + Zoom &- + Zoom &- + + + + Zoom &+ + Zoom &+ + + + + &Reset + &Reset + + + + Move &left + Muovi a &sinistra + + + + Move &right + Muovi a &destra + + + + Move &up + Manda &su + + + + Move &down + Manda &giù + + + + &Pan && scan + &Pan && scan + + + + &Previous line in subtitles + Linea &precedente nei sottotitoli + + + + N&ext line in subtitles + Linea succ&essiva nei sottotitoli + + + + -%1 + -%1 + + + + +%1 + +%1 + + + + Dec volume (2) + Abbassa volume (2) + + + + Inc volume (2) + Alza volume (2) + + + + Exit fullscreen + Esci da tutto schermo + + + + OSD - Next level + OSD - Livello successivo + + + + Dec contrast + Diminuisci contrasto + + + + Inc contrast + Aumenta contrasto + + + + Dec brightness + Diminuisci luminosità + + + + Inc brightness + Aumenta luminosità + + + + Dec hue + Diminuisci tonalità + + + + Inc hue + Aumenta tonalità + + + + Dec saturation + Diminuisci saturazione + + + + Dec gamma + Diminuisci gamma + + + + Next audio + Audio successivo + + + + Next subtitle + Sottotitoli successivi + + + + Next chapter + Capitolo successivo + + + + Previous chapter + Capitolo precedente + + + + Inc saturation + Aumenta saturazione + + + + Inc gamma + Aumenta gamma + + + + Toggle double size + Grandezza doppia + + + + &Load external file... + Apri file &esterno... + + + + &Kerndeint + &Kerndeint + + + + &Yadif (normal) + &Yadif (normale) + + + + Y&adif (double framerate) + Y&adif (framerate doppio) + + + + &Next + &Prossimo + + + + Pre&vious + P&recedente + + + + Volume &normalization + &Normalizzazione volume + + + + &Audio CD + CD &Audio + + + + Denoise nor&mal + Denoise nor&male + + + + Denoise &soft + Denoise &moderato + + + + Denoise o&ff + &Nessun Denoise + + + + Use SSA/&ASS library + Usa la libreria SSA/&ASS + + + + Flip i&mage + + + + + &Toggle double size + + + + + BaseGuiPlus + + + SMPlayer is still running here + SMPlayer è ancora in esecuzione. + + + + S&how icon in system tray + M&ostra icona nella barra di sistema + + + + &Hide + Nascondi + + + + &Restore + &Ripristina + + + + &Recent files + File &recenti + + + + &Quit + &Esci + + + + Playlist + Lista di riproduzione + + + + Core + + + Brightness: %1 + Luminosità: %1 + + + + Contrast: %1 + Contrasto: %1 + + + + Gamma: %1 + Gamma: %1 + + + + Hue: %1 + Tonalità: %1 + + + + Saturation: %1 + Saturazione: %1 + + + + Volume: %1 + Volume: %1 + + + + Zoom: %1 + Zoom %1 + + + + DefaultGui + + + Welcome to SMPlayer + Benvenuto in SMPlayer + + + + Volume + Volume + + + + Audio + Audio + + + + Subtitle + Sottotitoli + + + + Playlist + Lista di riproduzione + + + + &Main toolbar + Barra strumenti principale + + + + &Language toolbar + Barra strumenti per le lingue + + + + &Toolbars + Barre strumenti + + + + Encodings + + + Western European Languages + Lingue Europa Occidentale + + + + Western European Languages with Euro + Lingue Europa Occidentale con Euro + + + + Slavic/Central European Languages + Slavo/Lingue Europa Centrale + + + + Esperanto, Galician, Maltese, Turkish + Esperanto, Galiziano, Maltese, Turco + + + + Old Baltic charset + Vecchio set di caratteri Baltico + + + + Cyrillic + Cirillico + + + + Arabic + Arabo + + + + Modern Greek + Greco Moderno + + + + Turkish + Turco + + + + Baltic + Baltico + + + + Celtic + Cetico + + + + Hebrew charsets + Set di caratteri Ebraico + + + + Russian + Russo + + + + Ukrainian, Belarusian + Ucraino, Bielorusso + + + + Simplified Chinese charset + Set di caratteri Cinese Semplificato + + + + Traditional Chinese charset + Set di caratteri Cinese Tradizionale + + + + Japanese charsets + Set di caratteri Giapponese + + + + Korean charset + Set di caratteri Coreano + + + + Thai charset + Set di Caratteri Thai + + + + Cyrillic Windows + Cirillico per Windows + + + + Slavic/Central European Windows + Slavo/Lingue Europa Centrale per Windows + + + + Arabic Windows + + + + + EqSlider + + + icon + + + + + FilePropertiesDialog + + + SMPlayer - File properties + SMPlayer - Proprietà del file + + + + &Information + &Informazioni + + + + &Demuxer + &Demuxer + + + + &Select the demuxer that will be used for this file: + & Seleziona il demuxer che sarà usato per questo file: + + + + &Reset + &Reset + + + + &Video codec + Codec &video + + + + &Select the video codec: + &Seleziona il codec video: + + + + A&udio codec + Codec a&udio + + + + &Select the audio codec: + &Seleziona il codec audio: + + + + &MPlayer options + Opzioni &Mplayer + + + + Additional Options for MPlayer + Opzioni addizionali per MPlayer + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + Qui si possono passare opzioni extra a Mplayer. +Scrivile separate da spazi. +Esempio: -flip -nosound + + + + &Options: + &Opzioni: + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + Puoi attivare filtri video addizionali. +Separali con ",". Non usare spazi! +Esempio: scale=512:-2,eq2=1.1 + + + + V&ideo filters: + Filtri v&ideo: + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + E, per finire, i filtri audio. Stesse regole che per i filtri video. +Esempio:resample=44100:0:0,volnorm + + + + Audio &filters: + &Filtri audio: + + + + OK + OK + + + + Cancel + Cancella + + + + Apply + Applica + + + + InfoFile + + + General + Generale + + + + Size + Grandezza + + + + %1 KB (%2 MB) + %1 KB (%2 MB) + + + + URL + URL + + + + Length + Durata + + + + Demuxer + Demuxer + + + + Name + Nome + + + + Artist + Artista + + + + Author + Autore + + + + Album + Ãlbum + + + + Genre + Genere + + + + Date + Data + + + + Track + Traccia + + + + Copyright + Copyright + + + + Comment + Commento + + + + Software + Software + + + + Clip info + Informazioni + + + + Video + Video + + + + Resolution + Risoluzione + + + + Aspect ratio + Rapporto d'aspetto + + + + Format + Formato + + + + Bitrate + Bitrate + + + + %1 kbps + %1 kbps + + + + Frames per second + Frame al secondo + + + + Selected codec + Codec Selezionato + + + + Initial Audio Stream + Flusso Audio Iniziale + + + + Rate + Frequenza campionamento + + + + %1 Hz + %1 Hz + + + + Channels + Canali + + + + Audio Streams + Flussi Audio + + + + Language + Lingua + + + + empty + vuoto + + + + Subtitles + Sottotitoli + + + + Type + Tipo + + + + ID + Info for translators: this is a identification code + + + + + # + Info for translators: this is a abbreviation for number + + + + + Stream title + Titolo flusso + + + + Stream URL + URL flusso + + + + File + File + + + + InputDVDDirectory + + + Choose a directory + Scegli una cartella + + + + SMPlayer - Play a DVD from a folder + SMPlayer - Riproduci un DVD da una cartella + + + + You can play a dvd from your hard disc. Just select the folder which contains the VIDEO_TS and AUDIO_TS directories. + Puoi riprodurre un dvd direttamente dal disco. Seleziona semplicemente la cartella che contiene VIDEO_TS e AUDIO_TS. + + + + Choose a directory... + Scegli una cartella... + + + + InputURL + + + SMPlayer - Enter URL + SMPlayer - Digita URL + + + + &URL: + &URL: + + + + It's a &playlist + E' una &lista di riproduzione + + + + If this option is checked, the URL will be treated as a playlist: it will be opened as text and will play the URLs in it. + + + + + LogWindow + + + Choose a filename to save under + Scegli il nome del file + + + + Confirm overwrite? + Confermi sovrascrittura? + + + + The file already exists. +Do you want to overwrite? + il file esiste già. +Vuoi sovrascriverlo? + + + + Error saving file + Errore durante il salvataggio del file + + + + The log couldn't be saved + Non é stato possibile salvare il log + + + + Logs + Logs + + + + LogWindowBase + + + Log Window + Finestra Log + + + + Save + Salva + + + + Copy to clipboard + Copia negli appunti + + + + Close + Chiudi + + + + &Close + &Chiudi + + + + Playlist + + + Name + Nome + + + + Length + Durata + + + + Choose a file + Scegli un file + + + + Choose a filename + Scegli il nome del file + + + + Confirm overwrite? + Confermi sovrascrittura? + + + + Select one or more files to open + Seleziona uno o più file da aprire + + + + Choose a directory + Scegli una cartella + + + + The file %1 already exists. +Do you want to overwrite? + Il file %1 esiste già. +Vuoi sovrascriverlo? + + + + Edit name + Modifica nome + + + + Type the name that will be displayed in the playlist for this file: + Inserisci il nome per questo file che sarà visualizzato nella lista di riproduzione: + + + + &Play + &Riproduci + + + + &Edit + &Modifica + + + + Playlists + Liste di riproduzione + + + + All files + Tutti i file + + + + &Load + &Apri + + + + &Save + &Salva + + + + &Next + &Prossimo + + + + Pre&vious + P&recedente + + + + Move &up + Manda &su + + + + Move &down + Manda &giù + + + + &Repeat + &Ripeti + + + + S&huffle + Riproduzione &Casuale + + + + Add &current file + Aggiungi il file &corrente + + + + Add &file(s) + Aggiungi &file(s) + + + + Add &directory + Aggiungic&artella + + + + Remove &selected + R&imuovi selezionati + + + + Remove &all + Ri&muovi tutti + + + + SMPlayer - Playlist + SMPlayer - Lista di riproduzione + + + + Add... + Aggiungi... + + + + Remove... + Rimuovi... + + + + Playlist modified + Lista di riproduzione modificata + + + + There are unsaved changes, do you want to save the playlist? + Ci sono modifiche non salvate. Vuoi salvare la lista di riproduzione? + + + + PrefAdvanced + + + Advanced + Avanzate + + + + Auto + Automatico + + + + Form + Modulo + + + + &Advanced + &Avanzate + + + + icon + icona + + + + Additional Options for MPlayer + Opzioni addizionali per MPlayer + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + Qui puoi passare opzioni addizionali a MPlayer. +Scrivile separate da spazi. +Esempio: -flip -nosound + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + Puoi anche passare dei filtri video addizionali. +Separali con ",". Non usare spazi! +Esempio: resize=512:384,eq2=1.1 + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + E finalmente i filtri audio. Stessa regola dei filtri video. +Esempio: resample=44100:0:0,volnorm + + + + Don't repaint the background of the video window + Non ridisegnare lo sfondo della finestra video + + + + &Logs + &Logs + + + + Log MPlayer output + Salva l'output di MPlayer + + + + Log SMPlayer output + Salva l'output di SMPlayer + + + + This option is mainly intended for debugging the application. + Questa opzione é pensata principalmente per scopi di debug. + + + + &MPlayer language + Lingua &Mplayer + + + + SMPlayer needs to read and parse the output of MPlayer and sometimes it relies on English text. If you are using a MPlayer translated into another language, then you need to change the texts that SMPlayer looks for. (Technically you should enter regular expressions)<br><br> +The drop-down lists may provide already made regular expression for several languages. + SMPlayer ha bisogno di leggere l'output di MPlayer e talvolta fa affidamento sulla lingua inglese.Se stai usando MPlayer tradotto in un'altra lingua, allora devi cambiare il testo cercato da SMplayer. (Tecnicamente, bisogna inserire una espressione regolare)<br><br> +La lista può fornire delle espressioni regolari già fatte per alcune lingue. + + + + Checking this option may reduce flickering, but it also might produce that the video won't be displayed properly. + Selezionare questa opzione può ridurre lo sfarfallio, ma può anche produrre una errata riproduzione video. + + + + If checked, smplayer will store the output of mplayer (you can see it in <b>Options->View logs->mplayer</b>). In case of problems this log can contain important information, so it's recommended to keep this option checked. + Se selezionata, smplayer salverà l'output di mplayer (puoi visualizzarlo in <b>Opzioni->Vedi logs->mplayer</b>). In caso di problemi, questo log può contenere informazioni importanti, si raccomanda quindi di tenere selezionata questa opzione. + + + + If this option is checked, smplayer will store the debugging messages that smplayer outputs (you can see the log in <b>Options->View logs->smplayer</b>). This information can be very useful for the developer in case you find a bug. + Se questa opzione é selezionata, smplayer salverà i messaggi di debug (puoi visualizzarlo in <b>Opzioni->Vedi logs->smplayer</b>). Queste informazioni possono essere utili per gli sviluppatori nel caso trovino un bug. + + + + Filter for SMPlayer logs + Filtri per i log di SMPlayer + + + + This option allows to filter the smplayer messages that will be stored in the log. Here you can write any regular expression.<br>For instance: <i>^Core::.*</i> will display only the lines starting with <i>Core::</i> + Questa opzione permette di filtrare i messaggi di log. Potete inserire qualsiasi espressione regolare. <br>Per esempio: <i>^Core::.*</i> mostrerà solo le linee che iniziano con <i>Core::</i> + + + + &Monitor aspect: + Rapporto del &Monitor: + + + + &Run MPlayer in its own window + &Esegui Mplayer nella sua finestra + + + + &Options: + &Opzioni: + + + + V&ideo filters: + Filtri v&ideo: + + + + Audio &filters: + &Filtri audio: + + + + &Colorkey: + &Colorkey: + + + + &Don't repaint the background of the video window + &Non ridisegnare lo sfondo della finestra video + + + + Log &MPlayer output + Salva l'output di &MPlayer + + + + Log &SMPlayer output + Salva l'output di &SMPlayer + + + + &Filter for SMPlayer logs: + &Filtri per i log di SMPlayer: + + + + &End of file: + Fin&e del file: + + + + &No video: + &Nessun video: + + + + C&hange... + C&ambia... + + + + PrefAssociations + + + Warning + + + + + Not all files could be associated. Please check your security permissions and retry. + + + + + File Types + + + + + Select all + + + + + Check all file types in the list + + + + + Uncheck all file types in the list + + + + + List of file types + + + + + File types + + + + + Media files handled by SMPlayer: + + + + + Select All + + + + + Select None + + + + + Check the media file extensions you would like SMPlayer to handle. When you click Apply, the checked files will be associated with SMPlayer. If you uncheck a media type, the file association will be restored. + + + + + Select none + + + + + PrefDrives + + + Drives + Dispositivi + + + + Currently SMPlayer does not autodetect cdrom or dvd devices. So in order to play cdroms or dvds you must first select here your cdrom and dvd drives (can be the same). + Attualmente SMPlayer non trova automaticamente i dispositivi CDROM e DVD. Devi quindi selezionare qui i tuoi dispositivi (possono essere lo stesso). + + + + icon + icona + + + + Select your CD device: + Seleziona il dispositivo CD: + + + + Select your DVD device: + Seleziona il dispositivo DVD: + + + + CD device + Dispositivo CD + + + + Choose your CDROM device. It will be used to play VCDs and Audio CDs. + Scegli il dispositivo CDROM. Sarà usato per riprodurre VCD e CD audio. + + + + DVD device + Dispositivo DVD + + + + Choose your DVD device. It will be used to play DVDs. + Scegli il dispositivo DVD. Sarà usato per riprodurre DVD. + + + + Select your &CD device: + Seleziona il dispositivo &CD: + + + + Select your &DVD device: + Seleziona il dispositivo &DVD: + + + + PrefGeneral + + + General + Generale + + + + &General + &Generale + + + + Paths + Percorsi + + + + Select... + Seleziona... + + + + Folder for storing screenshots: + cartella degli screenshots: + + + + Search... + Cerca... + + + + Select the MPlayer executable: + Seleziona l'eseguibile mplayer + + + + Output drivers + Drivers di uscita + + + + Video: + Video: + + + + Audio: + Audio: + + + + Media settings + Opzioni per il video + + + + Remember settings for all files (audio track, subtitles...) + Ricorda le opzioni per tutti i file (traccia audio, sottotitoli...) + + + + Don't remember time position (files start playing from the beginning) + Non ricordare la posizione temporale (la riproduzione riparte dell'inizio) + + + + Preferred audio and subtitles + Audio e sottotitoli preferiti + + + + Subtitles: + Sottotitoli: + + + + &Video and audio + &Video e audio + + + + Video + Video + + + + Use software video equalizer + Usa equalizzatore video software + + + + Start videos in fullscreen + Riproduci video a tutto schermo + + + + Disable screensaver + Disabilita salvaschermo + + + + Audio + Audio + + + + Use software volume control + Usa controllo del volume software + + + + Max. Amplification: + Massima amplificazione: + + + + AC3/DTS pass-through S/PDIF + AC3/DTS passthrough S/PDIF + + + + Volume normalization + Normalizzazione volume + + + + Select the mplayer executable + Seleziona eseguibile mplayer + + + + Executables + Eseguibili + + + + All files + Tutti i file + + + + Select a directory + Seleziona una cartella + + + + MPlayer executable + Eseguibile Mplayer + + + + Here you must specify the mplayer executable that smplayer will use.<br>smplayer requires at least mplayer 1.0rc1 (svn recommended).<br><b>If this setting is wrong, smplayer won't be able to play anything!</b> + Qui puoi specificare l'eseguibile mplayer.<br>smplayer richiede almeno mplayer 1.0rc1 (svn raccomandato).<br><b>Se questa opzione é errata, smplayer non riprodurrà nulla!</b> + + + + Screenshots folder + Cartella per gli screenshots + + + + Here you can specify a folder where the screenshots taken by smplayer will be stored. If this field is empty the screenshot feature will be disabled. + Qui puoi specificare una cartella dove salvare gli screenshots. Se il campo é vuoto, la cattura degli screenshot sarà disabilitata. + + + + Video output driver + Driver di output video + + + + Select the video output driver. Usually xv (linux) and directx (windows) provide the best performance. + Seleziona il driver di output video. Di norma, xv (linux) e directx (windows) danno prestazioni migliori. + + + + Audio output driver + Driver di output audio + + + + Select the audio output driver. + Seleziona il driver di output audio. + + + + Remember settings + Ricorda opzioni + + + + Usually smplayer will remember the settings for each file you play (audio track selected, volume, filters...). Uncheck this option if you don't like this feature. + Normalmente smplayer ricorderà le opzioni per ogni file (traccia audio selezionata, volume, filtri...). Deseleziona l'opzione se non ti piace questa caratteristica. + + + + Don't remember time position + Non ricordare la posizione temporale + + + + If you check this option, smplayer will play all files from the beginning. + Se selezioni questa opzione, smplayer riprodurrà tutti i file dall'inizio. + + + + Preferred audio language + Lingua audio preferita + + + + Here you can type your preferred language for the audio streams. When a media with multiple audio streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the audio streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the audio track if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + Qui puoi inserire la lingua preferita per i flussi audio. Quando viene trovato un media con flussi audio multipli, smplayer proverà a usare la lingua preferita.<br>Questo funzionerà solo con media che offrono informazioni sulla lingua dei flussi audio, come i DVD o i file mkv.<br> Questo campo accetta espressioni regolari. Ad esempio: lt;b>es|esp|spa</b> selezionerà la traccia audio che combacia con <i>es</i>, <i>esp</i> o <i>spa</i>. + + + + Preferred subtitle language + Lingua preferita per i sottotitoli + + + + Here you can type your preferred language for the subtitle stream. When a media with multiple subtitle streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the subtitle streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the subtitle stream if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + Qui puoi inserire la lingua preferita per i sottotitoli. Quando viene trovato un media con sottotitoli multipli, smplayer proverà a usare la lingua preferita.<br>Questo funzionerà solo con media che offrono informazioni sulla lingua dei sottotitoli, come i DVD o i file mkv.<br> Questo campo accetta espressioni regolari. Ad esempio: lt;b>es|esp|spa</b> selezionerà il sottotitolo che combacia con <i>es</i>, <i>esp</i> o <i>spa</i>. + + + + Software video equalizer + Equalizzatore video software + + + + You can check this option if video equalizer is not supported by your graphic card or the selected video output driver.<br><b>Note:</b> this option can be incompatible with some video output drivers. + Seleziona questa opzione se l'equalizzatore video non é supportato dalla scheda grafica o dal driver video selezionato.<br><b>Attenzione:</b> questa opzione può essere incompatibile con alcuni driver video. + + + + If this option is checked, all videos will start to play in fullscreen mode. + Se selezioni questa opzione, tutti i video partiranno a tutto schermo. + + + + Check this option to disable the screensaver while playing.<br>The screensaver will enabled again when play finishes.<br><b>Note:</b> This option works only in X11 and Windows. + Seleziona questa opzione per disabilitare lo screensaver.<br>Sarà poi ripristinato alla fine della riproduzione.<br><b>Attenzione:</b> Questa opzione funziona solo in X11 e Windows. + + + + Software volume control + Controllo volume software + + + + Check this option to use the software mixer, instead of using the sound card mixer. + Seleziona questa opzione per usare il mixer software, invece di quello della scheda audio. + + + + Postprocessing quality + Qualità di postprocessing + + + + Dynamically changes the level of postprocessing depending on the available spare CPU time. The number you specify will be the maximum level used. Usually you can use some big number. + Cambia dinamicamente il livello di postprocessing a seconda del tempo di CPU disponibile. Il numero che specifichi sarà il massimo livello usato. Normalmente si possono usare numeri molto grandi. + + + + Change volume + Cambia volume + + + + If checked, SMPlayer will remember the volume for every file and will restore it when played again. For new files the default volume will be used. + Se selezionato, SMPlayer ricorderà il volume di ogni file e lo ripristinerà ogni volta che il file verrà riprodotto. Per i nuovi file verrà usato il volume predefinito. + + + + Default volume: + Volume predefinito: + + + + 0 + 0 + + + + &Change volume on every file + &Cambia volume ad ogni file + + + + &Search... + &Cerca... + + + + S&elect... + S&eleziona... + + + + Select the &MPlayer executable: + Seleziona l'eseguibile &Mplayer: + + + + &Folder for storing screenshots: + &Cartella per gli screenshots: + + + + V&ideo: + V&ideo: + + + + &Audio: + &Audio: + + + + &Don't remember time position (files start playing from the beginning) + &Non ricordare la posizione temporale (la riproduzione riparte dell'inizio) + + + + &Remember settings for all files (audio track, subtitles...) + &Ricorda le opzioni per tutti i file (traccia audio, sottotitoli...) + + + + A&udio: + A&udio: + + + + Su&btitles: + S&ottotitoli: + + + + &Use software video equalizer + &Usa equalizzatore video software + + + + &Quality: + &Qualità: + + + + Start videos in &fullscreen + &Riproduci video a tutto schermo + + + + Disable &screensaver + Disabilita &salvaschermo + + + + &Default volume: + Volume pre&definito: + + + + Use s&oftware volume control + Usa controllo del volume s&oftware + + + + Ma&x. Amplification: + Ma&ssima amplificazione: + + + + &AC3/DTS pass-through S/PDIF + &AC3/DTS passthrough S/PDIF + + + + Volume &normalization + &Normalizzazione volume + + + + Direct rendering + Direct rendering + + + + If checked, turns on direct rendering (not supported by all codecs and video outputs)<br><b>WARNING:</b> May cause OSD/SUB corruption! + Se selezionato, abilita il direct rendering (non supportato da tutti i codecs e output video)<br><b>ATTENZIONE:</b>Può corrompere l'OSD e i sottotitoli! + + + + Double buffering + Doppio buffering + + + + D&irect rendering + D&irect rendering + + + + Dou&ble buffering + Doppio &buffering + + + + Double buffering fixes flicker by storing two frames in memory, and displaying one while decoding another. If disabled it can affect OSD negatively, but often removes OSD flickering. + Il doppio buffering previene lo sfarfallio salvando due frame in memoria e mostrandone uno mentre decodifica l'altro. Se disabilitato può influenzare negativamente l'OSD, ma spesso ne rimuove lo sfarfallio. + + + + &Enable postprocessing by default + Abilita il postprocessing per d&efault + + + + Volume &normalization by default + Volume &normalizzato per default + + + + Close when finished + Chiudi alla fine + + + + If this option is checked, the main window will be automatically closed when the current file/playlist finishes. + Selezionando questa opzione, la finestra principale verrà chiusa alla fine del file/della lista di riproduzione. + + + + &Close when finished + &Chiudi alla fine + + + + 2 (Stereo) + + + + + 4 (4.0 Surround) + + + + + 6 (5.1 Surround) + + + + + C&hannels by default: + + + + + &Pause when minimized + + + + + Pause when minimized + + + + + If this option is enabled, the file will be paused when the main window is hidden. When the window is restored, play will be resumed. + + + + + Enable postprocessing by default + + + + + Max. Amplification + + + + + Volume normalization by default + + + + + Maximizes the volume without distorting the sound. + + + + + Default volume + + + + + Sets the initial volume that new files will use. + + + + + Channels by default + + + + + Sets the maximum amplification level in percent (default: 110). A value of 200 will allow you to adjust the volume up to a maximum of double the current level. With values below 100 the initial volume (which is 100%) will be above the maximum, which e.g. the OSD cannot display correctly. + + + + + Uses hardware AC3 passthrough + + + + + Requests the number of playback channels. MPlayer asks the decoder to decode the audio into as many channels as specified. Then it is up to the decoder to fulfill the requirement. This is usually only important when playing videos with AC3 audio (like DVDs). In that case liba52 does the decoding by default and correctly downmixes the audio into the requested number of channels. NOTE: This option is honored by codecs (AC3 only), filters (surround) and audio output drivers (OSS at least). + + + + + Postprocessing will be used by default on new opened files. + + + + + PrefInput + + + Keyboard and mouse + Tastiera e mouse + + + + &Keyboard + &Tastiera + + + + icon + icona + + + + Here you can change any key shortcut. To do it double click or start typing over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + Qui puoi cambiare le scorciatoie da tastiera. Per farlo, fai doppio click o scrivi nella cella corrispondente. Opzionalmente, puoi salvare la lista per condividerla con altre persone o utilizzarla su un altro computer. + + + + &Mouse + &Mouse + + + + Button functions: + Funzione bottoni: + + + + Media seeking + Ricerca nel file + + + + Volume control + Controllo volume + + + + Zoom video + Zoom video + + + + None + Nessuno + + + + Here you can change any key shortcut. To do it double click or press enter over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + Qui puoi cambiare le scorciatoie da tastiera. Per farlo, fai doppio click o scrivi nella cella corrispondente. Opzionalmente, puoi salvare la lista per condividerla con altre persone o utilizzarla su un altro computer. + + + + &Left click + Click &sinistro + + + + &Double click + &Doppio click + + + + &Wheel function: + Funzione &rotellina: + + + + Shortcut editor + + + + + This table allows you to change the key shortcuts of most available actions. Double click or press enter on a item, or press the <b>Change shortcut</b> button to enter in the <i>Modify shortcut</i> dialog. There are two ways to change a shortcut: if the <b>Capture</b> button is on then just press the new key or combination of keys that you want to assign for the action (unfortunately this doesn't work for all keys). If the <b>Capture</b> button is off then you could enter the full name of the key. + + + + + Left click + + + + + Select the action for left click on the mouse. + + + + + Double click + + + + + Select the action for double click on the mouse. + + + + + Wheel function + + + + + Select the action for the mouse wheel. + + + + + PrefInterface + + + Interface + Interfaccia + + + + Bulgarian + Bulgaro + + + + Czech + Ceco + + + + German + Tedesco + + + + Greek + Greco + + + + English + Inglese + + + + Spanish + Spagnolo + + + + Finnish + Finlandese + + + + French + Francese + + + + Hungarian + Ungherese + + + + Italian + Italiano + + + + Japanese + Giapponese + + + + Georgian + Georgiano + + + + Dutch + Olandese + + + + Polish + Polacco + + + + Portuguese - Brazil + Portoghese (Brasile) + + + + Portuguese - Portugal + Portoghese (Portogallo) + + + + Romanian + Romeno + + + + Russian + Russo + + + + Slovak + Slovacco + + + + Serbian + Serbo + + + + Swedish + Svedese + + + + Turkish + Turco + + + + Ukrainian + Ucraino + + + + Simplified-Chinese + Cinese Semplificato + + + + Traditional Chinese + Cinese Tradizionale + + + + <Autodetect> + <Automatico> + + + + Default + Predefinito + + + + &Interface + &Interfaccia + + + + Seeking + Ricerca + + + + Never + Mai + + + + Whenever it's needed + Quando è necessario + + + + Only after loading a new video + Solo dopo aver aperto in nuovo video + + + + Recent files + File recenti + + + + Language + Lingua + + + + Here you can change the language of the application. + Qui puoi modificare la lingua dell'applicazione. + + + + Instances + Istanze + + + + Catalan + Catalano + + + + Basque + Basco + + + + Galician + Galiziano + + + + &Short jump + Salto &corto + + + + &Medium jump + Slato &medio + + + + &Long jump + Salto &lungo + + + + Mouse &wheel jump + Salto &rotellina + + + + &Use only one running instance of SMPlayer + &Usa una sola istanza di SMPlayer + + + + SMPlayer will listen to this &port to receive commands from other instances: + SMPlayer ascolterà su questa &porta per ricevere comandi da altre istanze: + + + + Ma&x. items + Numero massimo di &elementi + + + + St&yle: + St&ile: + + + + Ico&n set: + Set ico&ne: + + + + L&anguage: + Lingu&a: + + + + Main window + Finestra principale + + + + Auto&resize: + Auto&resize: + + + + R&emember position and size + Ricorda posizione &e grandezza + + + + Default font: + + + + + &Change... + + + + + PrefPerformance + + + Performance + Prestazioni + + + + &Performance + &Prestazioni + + + + Priority + Priorità + + + + Select the priority for the MPlayer process. + Seleziona la priorità del processo MPlayer. + + + + Priority: + Priorità: + + + + realtime + tempo reale + + + + high + alta + + + + abovenormal + sopra al normale + + + + normal + normale + + + + belownormal + sotto al normale + + + + idle + idle + + + + Cache + Cache + + + + Size: + Grandezza: + + + + KB + KB + + + + Use cache + Usa cache + + + + Setting a cache may improve performance on slow media + Usare una cache può migliorare il rendimento nei media lenti + + + + Allow frame drop + Permetti scarto fotogrammi + + + + Allow hard frame drop (can lead to image distortion) + Permetti alto scarto fotogrammi (può corrompere l'immagine) + + + + Synchronization + Sincronia + + + + Audio/video auto synchronization + Sincronia automatica di audio e video + + + + Factor: + Fattore: + + + + Fast audio track switching + Cambio rapido della traccia audio + + + + Fast seek to chapters in dvds + Selezione rapida dei capitoli nei DVD + + + + Set process priority for mplayer according to the predefined priorities available under Windows.<br><b>WARNING:</b> Using realtime priority can cause system lockup. + Definisce la priorità per mplayer a seconda delle priorità predefinite disponibili in Windows. <br><b>ATTENZIONE:</b> Usare la priorità realtime può causare il blocco del sistema. + + + + <br><b>Note:</b> This option is for Windows only. + <br><b>Attenzione:</b> Questa opzione é solo per Windows. + + + + This option specifies how much memory (in kBytes) to use when precaching a file or URL. Especially useful on slow media. + Questa opzione specifica quanta memoria (in kBytes) usare per il precaching di un file o di un URL. Molto utile con media lenti. + + + + Skip displaying some frames to maintain A/V sync on slow systems. + Salta alcuni frame per mantenere la sincronia Audio/Video su sistemi lenti. + + + + Allow hard frame drop + Permetti alto scarto fotogrammi + + + + More intense frame dropping (breaks decoding). Leads to image distortion! + Salto di frame molto intenso. Causa immagini distorte! + + + + Gradually adjusts the A/V sync based on audio delay measurements. + Aggiusta gradualmente la sincronia Audio/Video basandosi sulla misura del ritardo audio. + + + + Priorit&y: + Priori&tà: + + + + Si&ze: + Grande&zza: + + + + &Use cache + &Usa cache + + + + &Allow frame drop + Permetti sc&arto fotogrammi + + + + Allow &hard frame drop (can lead to image distortion) + &Permetti alto scarto fotogrammi (può corrompere l'immagine) + + + + Audio/&video auto synchronization + Sincronia automatica di audio e &video + + + + Fact&or: + Fatt&ore: + + + + &Fast audio track switching + Cambio &rapido della traccia audio + + + + Fast &seek to chapters in dvds + &Selezione rapida dei capitoli nei DVD + + + + Create index if needed + + + + + Rebuilds index of files if no index was found, allowing seeking. Useful with broken/incomplete downloads, or badly created files. This option only works if the underlying media supports seeking (i.e. not with stdin, pipe, etc).<br> Note: the creation of the index may take some time. + + + + + &Create index if needed + + + + + If checked, it will try the fastest method to switch audio tracks but might not work with some formats. + + + + + If checked, it will try the fastest method to seek to chapters but it might not work with some discs. + + + + + PrefSubtitles + + + Subtitles + Sottotitoli + + + + Choose a ttf file + Scegli un file TTF + + + + Truetype Fonts + Caratteri Truetype + + + + Form + Modulo + + + + &Subtitles + &Sottotitoli + + + + Autoload + Apertura automatica + + + + Autoload subtitles files (*.srt, *.sub...): + Apri automaticamente i file dei sottotitoli (*.srt, *.sub...): + + + + Select first available subtitle + Seleziona i primi sottotitoli disponibili + + + + Same name as movie + Stesso nome del video + + + + All subs containing movie name + Tutti quelli che contengono il nome del video + + + + All subs in directory + Tutti i sottotitoli della cartella + + + + Default subtitle encoding: + Codifica dei sottotitoli: + + + + Position + Posizione + + + + Default position of the subtitles on screen + Posizione predefinita dei sottotitoli + + + + 0 + 0 + + + + Top + Alto + + + + Bottom + Basso + + + + Include subtitles on screenshots + Includi sottotitoli negli screenshot + + + + Use -subfont option (required by recent MPlayer releases) + Usa l'opzione -subfont (richiesta da recenti versioni di MPlayer) + + + + &Font + &Caratteri + + + + Font + Carattere + + + + TTF font: + Font TTF: + + + + Search... + Cerca... + + + + System font: + Font di sistema: + + + + Select the font which will be used for subtitles (and OSD): + Seleziona il tipo di carattere che si userà per i sottotitoli (e OSD): + + + + Size + Grandezza + + + + Autoscale: + Scala automatica: + + + + No autoscale + Nessuna scala automatica + + + + Proportional to movie height + Proporzionale all'altezza del video + + + + Proportional to movie width + Proporzionale alla larghezza del video + + + + Proportional to movie diagonal + Proporzionale alla diagonale del video + + + + Scale: + Scala: + + + + SSA/&ASS library + Libreria SSA/&ASS + + + + The new SSA/ASS library will provide nice styled subtitles for external SSA/ASS subtitles files and Matroska tracks. But it will be used too for rendering other formats like SUB and SRT files. + La nuova libreria SSA/ASS fornisce graziosi sottotitoli per file esterni SSA/ASS e tracce Matroska, ma può essere usata per visualizzare sottotitoli in altri formati, ad esempio SUB e SRT. + + + + Use SSA/ASS library for subtitle rendering + Usare la libreria SSA/ASS per visualizzare i sottotitoli + + + + Text color: + Colore del testo: + + + + Border color: + Colore del bordo: + + + + Here you can override styles for SSA/ASS subtitles. It can be also used for fine-tuning the rendering of SRT and SUB subtitles by the SSA/ASS library. Example: <b>Bold=1,Outline=2,Shadow=4</b> + Qui si possono sovrascrivere gli stili per i sottotitoli SSA/ASS. Può anche essere usata per controllare il rendering dei sottotitoli SRT e SUB da parte della libreria SSA/ASS. Esempio: <b>Bold=1,Outline=2,Shadow=2</b> + + + + Styles: + Stili: + + + + Subtitle position + Posizione dei sottotitoli + + + + This option specifies the position of the subtitles over the video window. <i>100</i> means the bottom, while <i>0</i> means the top. + Questa opzione specifica la posizione dei sottotitoli nella finestra. <i>100</i> significa in basso, mentre <i>0</i> significa in alto. + + + + SSA/ASS styles + Stili SSA/ASS + + + + Au&toload subtitles files (*.srt, *.sub...): + Au&tocarica sottotitoli (*.srt, *.sub...): + + + + S&elect first available subtitle + S&eleziona i primi sottotitoli disponibili + + + + &Default subtitle encoding: + &Codifica dei sottotitoli: + + + + Default &position of the subtitles on screen + Posizione &predefinita dei sottotitoli + + + + &Include subtitles on screenshots + &Includi sottotitoli negli screenshot + + + + &Use -subfont option (required by recent MPlayer releases) + &Usa l'opzione -subfont (richiesta da recenti versioni di MPlayer) + + + + &TTF font: + Font &TTF: + + + + Sea&rch... + Ce&rca... + + + + S&ystem font: + Font di s&istema: + + + + A&utoscale: + Scala a&utomatica: + + + + S&cale: + S&cala: + + + + &Use SSA/ASS library for subtitle rendering + &Usare la libreria SSA/ASS per visualizzare i sottotitoli + + + + &Text color: + Colore del &testo: + + + + &Border color: + Colore del &bordo: + + + + St&yles: + St&ili: + + + + PreferencesDialog + + + SMPlayer - Help + Aiuto su SMPlayer + + + + OK + OK + + + + Cancel + Cancella + + + + Apply + Applica + + + + Help + Aiuto + + + + SMPlayer - Preferences + SMPlayer - Preferenze + + + + QObject + + + 1 second + 1 secondo + + + + %1 seconds + %1 secondi + + + + %1 minutes + %1 minuti + + + + %1 minutes and %2 seconds + %1 minuti e %2 secondi + + + + 1 minute + 1 minuto + + + + 1 minute and 1 second + 1 minuto e 1 secondo + + + + 1 minute and %1 seconds + 1 minuto e %1 secondi + + + + %1 minutes and 1 second + %1 minuti e 1 secondo + + + + specifies the directory for the configuration file (smplayer.ini). If directory is omitted, the application directory will be used. + specifica la cartella del file di configurazione (smplayer.ini). Se la cartella è omessa, sara usata quella dell'applicazione. + + + + will show this message and then will exit. + mostrerà questo messaggio e uscirà. + + + + 'media' is any kind of file that SMPlayer can open. It can be a local file, a DVD (e.g. dvd://1), an Internet stream (e.g. mms://....) or a local playlist in format m3u. If the -playlist option is used, that means that SMPlayer will pass the -playlist option to MPlayer, so MPlayer will handle the playlist, not SMPlayer. + 'media' è qualsiasi tipo di file che SMPlayer è in grado di riprodurre. Può essere un file locale, un DVD (per es. dvd://1), uno stream internet (per es. mms://....) o una lista di riproduzione locale in formato m3u. Se si usa l'opzione -playlist, questa sarà passata a mplayer che si occuperà di gestirla. + + + + the main window will be closed when the file/playlist finishes. + la finestra principale sarà chiusa alla fine della riproduzione del file/lista di riproduzione. + + + + This is SMPlayer v. %1 running on %2 + Smplayer versione %1 in esecuzione su %2 + + + + Usage: %1 [-ini-path [directory]] [-send-action action_name] [-actions action_list [-close-at-end] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + Uso: %1 [-ini-path [directory]] [-send-action action_name] [-actions action_list [-close-at-end] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + + + + tries to make a connection to another running instance and send to it the specified action. Example: -send-action pause The rest of options (if any) will be ignored and the application will exit. It will return 0 on success or -1 on failure. + prova a stabilire una connessione ad un altra istanza e a mandare il comando specificato. Esempio: -send-action pause Tutto il resto (se presente) verrà ignorato e l'applicazione terminerà. Ritorna 0 in caso di successo o -1 in caso di fallimento. + + + + action_list is a list of actions separated by spaces. The actions will be executed just after loading the file (if any) in the same order you entered. For checkable actions you can pass true or false as parameter. Example: -actions "fullscreen compact true". Quotes are necessary in case you pass more than one action. + action_list è una lista di opzioni separate da spazi. Le azioni saranno eseguite subito dopo il caricamento di un file (se richiesto), nello stesso ordine di immissione. Per le azioni a scelta si possono passare true o false come parametri. Esempio: -actions "fullscreen compact true". Le doppie virgolette sono necessarie in caso si passi più di una azione. + + + + media + media + + + + if there's another instance running, the media will be added to that instance's playlist. If there's no other instance, this option will be ignored and the files will be opened in a new instance. + + + + + specifies the directory for the configuration file (smplayer.ini). + + + + + the main window won't be closed when the file/playlist finishes. + + + + + Usage: %1 [-ini-path directory] [-send-action action_name] [-actions action_list [-close-at-end] [-no-close-at-end] [-fullscreen] [-no-fullscreen] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + + + + + the video will be played in fullscreen mode. + + + + + the video will be played in window mode. + + + + + SeekWidget + + + icon + icona + + + + label + etichetta + + + + ShortcutGetter + + + Modify shortcut + Modifica scorciatoia + + + + Clear + Pulisci + + + + Press the key combination you want to assign + Esegui la combinazione che vuoi assegnare + + + + Capture + Cattura + + + + Capture keystrokes + Cattura combinazione di tasti + + + + VideoEqualizer + + + Contrast + Contrasto + + + + Brightness + Luminosità + + + + Hue + Tonalità + + + + Saturation + Saturazione + + + + Gamma + Gamma + + + + Equalizer + Equalizzatore + + + + &Reset + &Reset + + + + &Set as default values + Salva come valori predefiniti + + + + Use the current values as default values for new videos. + Usa i valori correnti come valori predefiniti per i nuovi video. + + + + Set all controls to zero. + Metti a zero tutti i controlli + + + diff --git a/retroshare-gui/src/apps/smplayer/translations/smplayer_ja.qm b/retroshare-gui/src/apps/smplayer/translations/smplayer_ja.qm new file mode 100644 index 000000000..e3aac97d6 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/translations/smplayer_ja.qm differ diff --git a/retroshare-gui/src/apps/smplayer/translations/smplayer_ja.ts b/retroshare-gui/src/apps/smplayer/translations/smplayer_ja.ts new file mode 100644 index 000000000..d674254e9 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/translations/smplayer_ja.ts @@ -0,0 +1,3926 @@ + + + + AboutDialog + + + Version: %1 + ãƒãƒ¼ã‚¸ãƒ§ãƒ³: %1 + + + + 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. + ã“ã®ãƒ—ログラムã¯ãƒ•ãƒªãƒ¼ ソフトウェアã§ã™; ã‚ãªãŸã¯ Free Software Foundation ã«ã‚ˆã£ã¦ç™ºè¡Œã•ã‚Œã¦ã„ã‚‹ GNU General Public License ã®æ¡ä»¶ã®ä¸‹ã§å†é…布ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™; License ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ 2 ã‹ã€(ã‚ãªãŸã®é¸æŠžã§) ã™ã¹ã¦ã®ã‚ˆã‚Šå¾Œã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ã©ã¡ã‚‰ã‹ã€‚ + + + + Translators: + 翻訳者: + + + + German + ドイツ語 + + + + Slovak + スロãƒã‚­ã‚¢èªž + + + + Italian + イタリア語 + + + + French + フランス語 + + + + Simplified-Chinese + 簡体字中国語 + + + + Russian + ロシア語 + + + + Hungarian + ãƒãƒ³ã‚¬ãƒªãƒ¼èªž + + + + Japanese + 日本語 + + + + Dutch + オランダ語 + + + + Ukrainian + ウクライナ語 + + + + Georgian + グルジア語 + + + + Czech + ãƒã‚§ã‚³èªž + + + + Logo designed by %1 + ロゴ デザイン: %1 + + + + Get updates at: %1 + æ›´æ–°ã®å–å¾—: %1 + + + + About SMPlayer + SMPlayer ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…å ± + + + + Polish + ãƒãƒ¼ãƒ©ãƒ³ãƒ‰èªž + + + + Bulgarian + ブルガリア語 + + + + Turkish + トルコ語 + + + + Swedish + スウェーデン語 + + + + Serbian + セルビア語 + + + + Traditional Chinese + ç¹ä½“字中国語 + + + + Romanian + ルーマニア語 + + + + Portuguese - Brazil + ãƒãƒ«ãƒˆã‚¬ãƒ«èªž - ブラジル + + + + Portuguese - Portugal + ãƒãƒ«ãƒˆã‚¬ãƒ«èªž - ãƒãƒ«ãƒˆã‚¬ãƒ« + + + + Compiled with Qt %1 + Qt %1 ã§ã‚³ãƒ³ãƒ‘イルã•ã‚Œã¦ã„ã¾ã™ + + + + %1, %2 and %3 + %1ã€%2 ãŠã‚ˆã³ %3 + + + + %1 and %2 + %1 㨠%2 + + + + http://smplayer.sourceforge.net/en/windows/download.php + If the web page is translated into your language you can change the URL so it points to the download page in the translation.Otherwise leave as is. + http://smplayer.sourceforge.net/ja/windows/download.php + + + + http://smplayer.sourceforge.net/en/linux/download.php + If the web page is translated into your language you can change the URL so it points to the download page in the translation.Otherwise leave as is. + http://smplayer.sourceforge.net/ja/linux/download.php + + + + <b>%1</b>: %2 + <b>%1</b>: %2 + + + + ActionsEditor + + + Name + åå‰ + + + + Description + 説明 + + + + Shortcut + ショートカット + + + + &Save + ä¿å­˜(&S) + + + + &Load + 読ã¿è¾¼ã¿(&L) + + + + Key files + キー ファイル + + + + Choose a filename + ファイルåã‚’é¸æŠžã—ã¾ã™ + + + + Confirm overwrite? + 上書ãを確èªã—ã¾ã™ã‹? + + + + The file %1 already exists. +Do you want to overwrite? + ファイル %1 ãŒã™ã§ã«å­˜åœ¨ã—ã¾ã™ã€‚ +上書ãã—ã¾ã™ã‹? + + + + Choose a file + ファイルをé¸æŠžã—ã¾ã™ + + + + Error + エラー + + + + The file couldn't be saved + ファイルをä¿å­˜ã§ãã¾ã›ã‚“ã§ã—㟠+ + + + The file couldn't be loaded + ファイルを読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—㟠+ + + + &Change shortcut... + ショートカットã®å¤‰æ›´(&C)... + + + + BaseGui + + + SMPlayer - mplayer log + SMPlayer - mplayer ã®ãƒ­ã‚° + + + + SMPlayer - smplayer log + SMPlayer - smplayer ã®ãƒ­ã‚° + + + + &Open + é–‹ã(&O) + + + + &Play + å†ç”Ÿ(&P) + + + + &Video + ビデオ(&V) + + + + &Audio + オーディオ(&A) + + + + &Subtitles + 字幕(&S) + + + + &Browse + å‚ç…§(&B) + + + + Op&tions + オプション(&T) + + + + &Help + ヘルプ(&H) + + + + &File... + ファイル(&F)... + + + + D&irectory... + ディレクトリ(&I)... + + + + &Playlist... + プレイリスト(&P)... + + + + &DVD from drive + ドライブã‹ã‚‰ DVD(&D) + + + + D&VD from folder... + フォルダã‹ã‚‰ DVD(&V)... + + + + &URL... + URL(&U)... + + + + &Clear + クリア(&C) + + + + &Recent files + 最近使ã£ãŸãƒ•ã‚¡ã‚¤ãƒ«(&R) + + + + P&lay + å†ç”Ÿ(&L) + + + + &Pause + 一時åœæ­¢(&P) + + + + &Stop + åœæ­¢(&S) + + + + &Frame step + フレーム ステップ(&F) + + + + &Normal speed + 標準ã®é€Ÿåº¦(&N) + + + + &Halve speed + åŠåˆ†ã®é€Ÿåº¦(&H) + + + + &Double speed + 2 å€ã®é€Ÿåº¦(&D) + + + + Speed &-10% + -10% ã®é€Ÿåº¦(&-) + + + + Speed &+10% + +10% ã®é€Ÿåº¦(&+) + + + + Sp&eed + 速度(&E) + + + + &Repeat + ç¹°ã‚Šè¿”ã—(&R) + + + + &Fullscreen + 全画é¢è¡¨ç¤º(&F) + + + + &Compact mode + コンパクト モード(&C) + + + + Si&ze + サイズ(&Z) + + + + &Autodetect + 自動検出(&A) + + + + &4:3 + 4:3(&4) + + + + &5:4 + 5:4(&5) + + + + &14:9 + 14:9(&1) + + + + 16:&9 + 16:9(&9) + + + + 1&6:10 + 16:10(&6) + + + + &2.35:1 + 2.35:1(&2) + + + + 4:3 &Letterbox + 4:3 レターボックス(&L) + + + + 16:9 L&etterbox + 16:9 レターボックス(&E) + + + + 4:3 &Panscan + 4:3 パンスキャン(&P) + + + + 4:3 &to 16:9 + 4:3 ã‹ã‚‰ 16:9 ã¸(&T) + + + + &Aspect ratio + アスペクト比(&A) + + + + &None + ãªã—(&N) + + + + &Lowpass5 + Lowpass5(&L) + + + + Linear &Blend + リニア ブレンド(&B) + + + + &Deinterlace + インターレイス解除(&D) + + + + &Postprocessing + 後処ç†(&P) + + + + &Autodetect phase + ä½ç›¸ã®è‡ªå‹•æ¤œå‡º(&A) + + + + &Deblock + ブロック除去(&D) + + + + De&ring + リング除去(&R) + + + + Add n&oise + ノイズã®è¿½åŠ (&O) + + + + F&ilters + フィルタ(&I) + + + + &Equalizer + イコライザ(&E) + + + + &Screenshot + スクリーンショット(&S) + + + + S&tay on top + 常ã«æ‰‹å‰ã«è¡¨ç¤º(&T) + + + + &Track + トラック(&T) + + + + &Extrastereo + エクストラステレオ(&E) + + + + &Karaoke + カラオケ(&K) + + + + &Filters + フィルタ(&F) + + + + &Default + 既定(&D) + + + + &Stereo + ステレオ(&S) + + + + &4.0 Surround + 4.0 サラウンド(&4) + + + + &5.1 Surround + 5.1 サラウンド(&5) + + + + &Channels + ãƒãƒ£ãƒ³ãƒãƒ«(&C) + + + + &Left channel + å·¦ãƒãƒ£ãƒ³ãƒãƒ«(&L) + + + + &Right channel + å³ãƒãƒ£ãƒ³ãƒãƒ«(&R) + + + + &Stereo mode + ステレオ モード(&S) + + + + &Mute + ミュート(&M) + + + + Volume &- + éŸ³é‡ &-(&-) + + + + Volume &+ + éŸ³é‡ &+(&+) + + + + &Delay - + é…延 -(&D) + + + + D&elay + + é…延 +(&E) + + + + &Select + é¸æŠž(&S) + + + + &Load... + 読ã¿è¾¼ã¿(&L)... + + + + Delay &- + é…延 -(&-) + + + + Delay &+ + é…延 +(&+) + + + + &Up + 上ã¸(&U) + + + + &Down + 下ã¸(&D) + + + + &Title + タイトル(&T) + + + + &Chapter + ãƒãƒ£ãƒ—ã‚¿(&C) + + + + &Angle + 角度(&A) + + + + &Playlist + プレイリスト(&P) + + + + &Show frame counter + フレーム カウンタã®è¡¨ç¤º(&S) + + + + &Disabled + 無効(&D) + + + + &Seek bar + シーク ãƒãƒ¼(&S) + + + + &Time + 時間(&T) + + + + Time + T&otal time + 時間 + 全体ã®æ™‚é–“(&O) + + + + &OSD + OSD(&O) + + + + &View logs + ログã®è¡¨ç¤º(&V) + + + + P&references + 環境設定(&R) + + + + About &Qt + Qt ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…å ±(&Q) + + + + About &SMPlayer + SMPlayer ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…å ±(&S) + + + + <empty> + <空> + + + + Video + ビデオ + + + + Audio + オーディオ + + + + Playlists + プレイリスト + + + + All files + ã™ã¹ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ« + + + + Choose a file + ファイルをé¸æŠžã—ã¾ã™ + + + + SMPlayer - Information + SMPlayer - 情報 + + + + The CDROM / DVD drives are not configured yet. +The configuration dialog will be shown now, so you can do it. + CDROM / DVD ドライブãŒã¾ã æ§‹æˆã•ã‚Œã¦ã„ã¾ã›ã‚“。 +構æˆãƒ€ã‚¤ã‚¢ãƒ­ã‚°ãŒä»Šã™ã表示ã•ã‚Œã¾ã™ã€ãã†ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + + + + Choose a directory + ディレクトリをé¸æŠžã—ã¾ã™ + + + + Subtitles + 字幕 + + + + About Qt + Qt ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…å ± + + + + Playing %1 + %1 ã‚’å†ç”Ÿä¸­ + + + + Pause + 一時åœæ­¢ + + + + Stop + åœæ­¢ + + + + De&noise + ノイズ除去(&N) + + + + N&ormal + 通常(&O) + + + + &Soft + ソフト(&S) + + + + Play / Pause + å†ç”Ÿ / 一時åœæ­¢ + + + + Pause / Frame step + 一時åœæ­¢ / フレーム ステップ + + + + U&nload + 読ã¿è¾¼ã¿ã®è§£é™¤(&N) + + + + V&CD + VCD(&C) + + + + C&lose + é–‰ã˜ã‚‹(&L) + + + + View &info and properties... + 情報ã¨ãƒ—ロパティã®è¡¨ç¤º(&I)... + + + + Zoom &- + 縮å°(&-) + + + + Zoom &+ + 拡大(&+) + + + + &Reset + リセット(&R) + + + + Move &left + å·¦ã¸ç§»å‹•(&L) + + + + Move &right + å³ã¸ç§»å‹•(&R) + + + + Move &up + 上ã¸ç§»å‹•(&U) + + + + Move &down + 下ã¸ç§»å‹•(&D) + + + + &Pan && scan + パン && スキャン(&P) + + + + &Previous line in subtitles + å‰ã®å­—幕ã®ãƒ©ã‚¤ãƒ³(&P) + + + + N&ext line in subtitles + 次ã®å­—幕ã®ãƒ©ã‚¤ãƒ³(&E) + + + + -%1 + -%1 + + + + +%1 + +%1 + + + + Dec volume (2) + 音é‡ã‚’下ã’ã‚‹ (2) + + + + Inc volume (2) + 音é‡ã‚’上ã’ã‚‹ (2) + + + + Exit fullscreen + 全画é¢è¡¨ç¤ºã®çµ‚了 + + + + OSD - Next level + OSD - 次ã®ãƒ¬ãƒ™ãƒ« + + + + Dec contrast + コントラストを下ã’ã‚‹ + + + + Inc contrast + コントラストを上ã’ã‚‹ + + + + Dec brightness + 明るã•ã‚’下ã’ã‚‹ + + + + Inc brightness + 明るã•ã‚’上ã’ã‚‹ + + + + Dec hue + 色åˆã„を下ã’ã‚‹ + + + + Inc hue + 色åˆã„を上ã’ã‚‹ + + + + Dec saturation + 鮮やã‹ã•ã‚’下ã’ã‚‹ + + + + Dec gamma + ガンマを下ã’ã‚‹ + + + + Next audio + 次ã®ã‚ªãƒ¼ãƒ‡ã‚£ã‚ª + + + + Next subtitle + 次ã®å­—幕 + + + + Next chapter + 次ã®ãƒãƒ£ãƒ—ã‚¿ + + + + Previous chapter + å‰ã®ãƒãƒ£ãƒ—ã‚¿ + + + + Inc saturation + 鮮やã‹ã•ã‚’上ã’ã‚‹ + + + + Inc gamma + ガンマを上ã’ã‚‹ + + + + Toggle double size + ダブル サイズã®åˆ‡ã‚Šæ›¿ãˆ + + + + &Load external file... + 外部ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®èª­ã¿è¾¼ã¿(&L)... + + + + &Kerndeint + Kerndeint(&K) + + + + &Yadif (normal) + Yadif (通常)(&Y) + + + + Y&adif (double framerate) + Yadif (ダブル フレームレート)(&A) + + + + &Next + 次ã¸(&N) + + + + Pre&vious + å‰ã¸(&V) + + + + Volume &normalization + 音é‡ã®é€šå¸¸åŒ–(&N) + + + + &Audio CD + オーディオ CD(&A) + + + + Denoise nor&mal + ノイズ除去 通常(&M) + + + + Denoise &soft + ノイズ除去 ソフト(&S) + + + + Denoise o&ff + ノイズ除去 オフ(&F) + + + + Use SSA/&ASS library + SSA/ASS ライブラリã®ä½¿ç”¨(&A) + + + + Flip i&mage + イメージã®å転(&M) + + + + &Toggle double size + å€ã®ã‚µã‚¤ã‚ºã®åˆ‡ã‚Šæ›¿ãˆ(&T) + + + + BaseGuiPlus + + + SMPlayer is still running here + SMPlayer ã¯ã¾ã ã“ã“ã§èµ·å‹•ã—ã¦ã„ã¾ã™ + + + + S&how icon in system tray + システム トレイã®ã‚¢ã‚¤ã‚³ãƒ³ã®è¡¨ç¤º(&H) + + + + &Hide + éžè¡¨ç¤º(&H) + + + + &Restore + 復元(&R) + + + + &Recent files + 最近使ã£ãŸãƒ•ã‚¡ã‚¤ãƒ«(&R) + + + + &Quit + 終了(&Q) + + + + Playlist + プレイリスト + + + + Core + + + Brightness: %1 + 明るã•: %1 + + + + Contrast: %1 + コントラスト: %1 + + + + Gamma: %1 + ガンマ: %1 + + + + Hue: %1 + 色åˆã„: %1 + + + + Saturation: %1 + 鮮やã‹ã•: %1 + + + + Volume: %1 + 音é‡: %1 + + + + Zoom: %1 + 拡大率: %1 + + + + DefaultGui + + + Welcome to SMPlayer + SMPlayer ã¸ã‚ˆã†ã“ã + + + + Volume + éŸ³é‡ + + + + Audio + オーディオ + + + + Subtitle + 字幕 + + + + Playlist + プレイリスト + + + + &Main toolbar + メイン ツール ãƒãƒ¼(&M) + + + + &Language toolbar + 言語ツール ãƒãƒ¼(&L) + + + + &Toolbars + ツール ãƒãƒ¼(&T) + + + + Encodings + + + Western European Languages + 西ヨーロッパ言語 + + + + Western European Languages with Euro + ユーロ地域ã®è¥¿ãƒ¨ãƒ¼ãƒ­ãƒƒãƒ‘言語 + + + + Slavic/Central European Languages + スラブ語/中央ヨーロッパ言語 + + + + Esperanto, Galician, Maltese, Turkish + エスペラント語ã€ã‚¬ãƒªã‚·ã‚¢èªžã€ãƒžãƒ«ã‚¿èªžã€ãƒˆãƒ«ã‚³èªž + + + + Old Baltic charset + å¤ãƒãƒ«ãƒˆèªžæ–‡å­—セット + + + + Cyrillic + キリル言語 + + + + Arabic + アラビア語 + + + + Modern Greek + ç¾ä»£ã‚®ãƒªã‚·ãƒ£èªž + + + + Turkish + トルコ語 + + + + Baltic + ãƒãƒ«ãƒˆèªž + + + + Celtic + ケルト語 + + + + Hebrew charsets + ヘブライ語文字セット + + + + Russian + ロシア語 + + + + Ukrainian, Belarusian + ウクライナ語ã€ãƒ™ãƒ©ãƒ«ãƒ¼ã‚·èªž + + + + Simplified Chinese charset + 簡体字中国語文字セット + + + + Traditional Chinese charset + ç¹ä½“字中国語文字セット + + + + Japanese charsets + 日本語文字セット + + + + Korean charset + 韓国語文字セット + + + + Thai charset + タイ語文字セット + + + + Cyrillic Windows + キリル言語 Windows + + + + Slavic/Central European Windows + スラブ語/中央ヨーロッパ Windows + + + + Arabic Windows + アラビア語 Windows + + + + EqSlider + + + icon + アイコン + + + + FilePropertiesDialog + + + SMPlayer - File properties + SMPlayer - ファイルã®ãƒ—ロパティ + + + + &Information + 情報(&I) + + + + &Demuxer + デミュクサ(&D) + + + + &Select the demuxer that will be used for this file: + ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«ä½¿ç”¨ã™ã‚‹ãƒ‡ãƒŸãƒ¥ã‚¯ã‚µã‚’é¸æŠžã—ã¾ã™(&S): + + + + &Reset + リセット(&R) + + + + &Video codec + ビデオ コーデック(&V) + + + + &Select the video codec: + ビデオ コーデックをé¸æŠžã—ã¾ã™(&S): + + + + A&udio codec + オーディオ コーデック(&U) + + + + &Select the audio codec: + オーディオ コーデックをé¸æŠžã—ã¾ã™(&S): + + + + &MPlayer options + MPlayer ã®ã‚ªãƒ—ション(&M) + + + + Additional Options for MPlayer + MPlayer ã®è¿½åŠ ã‚ªãƒ—ション + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + ã“ã“㧠MPlayer ã¸ã®ã‚¨ã‚¯ã‚¹ãƒˆãƒ© オプションを渡ã™ã“ã¨ãŒã§ãã¾ã™ã€‚ +スペースã§åŒºåˆ‡ã£ã¦ãれらを書ãè¾¼ã¿ã¾ã™ã€‚ +例: -flip -nosound + + + + &Options: + オプション(&O): + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + 追加ビデオ フィルタも渡ã™ã“ã¨ãŒã§ãã¾ã™ã€‚ +"," ã§åŒºåˆ‡ã‚Šã¾ã™ã€‚スペースã¯ä½¿ç”¨ã—ã¾ã›ã‚“! +例: scale=512:-2,eq2=1.1 + + + + V&ideo filters: + ビデオ フィルタ(&I): + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + ãã—ã¦æœ€å¾Œã¯ã‚ªãƒ¼ãƒ‡ã‚£ã‚ª フィルタã§ã™ã€‚ビデオ フィルタã¨åŒã˜è¦å‰‡ã§ã™ã€‚ +例: resample=44100:0:0,volnorm + + + + Audio &filters: + オーディオ フィルタ(&F): + + + + OK + OK + + + + Cancel + キャンセル + + + + Apply + é©ç”¨ + + + + InfoFile + + + General + 一般 + + + + Size + サイズ + + + + %1 KB (%2 MB) + %1 KB (%2 MB) + + + + URL + URL + + + + Length + é•·ã• + + + + Demuxer + デミュクサ + + + + Name + åå‰ + + + + Artist + アーティスト + + + + Author + 作者 + + + + Album + アルãƒãƒ  + + + + Genre + ジャンル + + + + Date + 日付 + + + + Track + トラック + + + + Copyright + 著作権 + + + + Comment + コメント + + + + Software + ソフトウェア + + + + Clip info + クリップ情報 + + + + Video + ビデオ + + + + Resolution + 解åƒåº¦ + + + + Aspect ratio + アスペクト比 + + + + Format + フォーマット + + + + Bitrate + ビットレート + + + + %1 kbps + %1 kbps + + + + Frames per second + 秒ã‚ãŸã‚Šã®ãƒ•ãƒ¬ãƒ¼ãƒ  + + + + Selected codec + é¸æŠžæ¸ˆã¿ã‚³ãƒ¼ãƒ‡ãƒƒã‚¯ + + + + Initial Audio Stream + åˆæœŸã‚ªãƒ¼ãƒ‡ã‚£ã‚ª ストリーム + + + + Rate + 率 + + + + %1 Hz + %1 Hz + + + + Channels + ãƒãƒ£ãƒ³ãƒãƒ« + + + + Audio Streams + オーディオ ストリーム + + + + Language + 言語 + + + + empty + 空 + + + + Subtitles + 字幕 + + + + Type + 種類 + + + + ID + Info for translators: this is a identification code + ID + + + + # + Info for translators: this is a abbreviation for number + ç•ªå· + + + + Stream title + ストリームã®ã‚¿ã‚¤ãƒˆãƒ« + + + + Stream URL + ストリーム㮠URL + + + + File + ファイル + + + + InputDVDDirectory + + + Choose a directory + ディレクトリをé¸æŠžã—ã¾ã™ + + + + SMPlayer - Play a DVD from a folder + SMPlayer - フォルダã‹ã‚‰ DVD ã‚’å†ç”Ÿ + + + + You can play a dvd from your hard disc. Just select the folder which contains the VIDEO_TS and AUDIO_TS directories. + ãŠä½¿ã„ã®ãƒãƒ¼ãƒ‰ ディスクã‹ã‚‰ dvd ã‚’å†ç”Ÿã§ãã¾ã™ã€‚VIDEO_TS ãŠã‚ˆã³ AUDIO_TS ディレクトリをå«ã‚€ãƒ•ã‚©ãƒ«ãƒ€ã‚’é¸æŠžã—ã¾ã™ã€‚ + + + + Choose a directory... + ディレクトリã®é¸æŠž... + + + + InputURL + + + SMPlayer - Enter URL + SMPlayer - URL ã®å…¥åŠ› + + + + &URL: + URL(&U): + + + + It's a &playlist + プレイリストã§ã™(&P) + + + + If this option is checked, the URL will be treated as a playlist: it will be opened as text and will play the URLs in it. + ã“ã®ã‚ªãƒ—ションãŒãƒã‚§ãƒƒã‚¯ã•ã‚Œã¦ã„ã‚‹å ´åˆã€URL ã¯ãƒ—レイリストã¨ã—ã¦å‡¦ç†ã•ã‚Œã¾ã™: テキストã¨ã—ã¦é–‹ã‹ã‚Œã¦ãã‚Œã«ã‚ã‚‹ URL ã‚’å†ç”Ÿã—ã¾ã™ã€‚ + + + + LogWindow + + + Choose a filename to save under + 以下ã«ä¿å­˜ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«åã‚’é¸æŠžã—ã¾ã™ + + + + Confirm overwrite? + 上書ãを確èªã—ã¾ã™ã‹? + + + + The file already exists. +Do you want to overwrite? + ファイルãŒã™ã§ã«å­˜åœ¨ã—ã¾ã™ã€‚ +上書ãã—ã¾ã™ã‹? + + + + Error saving file + ファイルã®ä¿å­˜ä¸­ã®ã‚¨ãƒ©ãƒ¼ + + + + The log couldn't be saved + ログをä¿å­˜ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—㟠+ + + + Logs + ログ + + + + LogWindowBase + + + Log Window + ログ ウィンドウ + + + + Save + ä¿å­˜ + + + + Copy to clipboard + クリップボードã¸ã‚³ãƒ”ー + + + + Close + é–‰ã˜ã‚‹ + + + + &Close + é–‰ã˜ã‚‹(&C) + + + + Playlist + + + Name + åå‰ + + + + Length + é•·ã• + + + + &Play + å†ç”Ÿ(&P) + + + + &Edit + 編集(&E) + + + + Playlists + プレイリスト + + + + Choose a file + ファイルをé¸æŠžã—ã¾ã™ + + + + Choose a filename + ファイルåã‚’é¸æŠžã—ã¾ã™ + + + + Confirm overwrite? + 上書ãを確èªã—ã¾ã™ã‹? + + + + The file %1 already exists. +Do you want to overwrite? + ファイル %1 ãŒã™ã§ã«å­˜åœ¨ã—ã¾ã™ã€‚ +上書ãã—ã¾ã™ã‹? + + + + All files + ã™ã¹ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ« + + + + Select one or more files to open + 1 ã¤ä»¥ä¸Šã®é–‹ãファイルをé¸æŠžã—ã¾ã™ + + + + Choose a directory + ディレクトリをé¸æŠžã—ã¾ã™ + + + + Edit name + åå‰ã®ç·¨é›† + + + + Type the name that will be displayed in the playlist for this file: + ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®ãƒ—レイリストã«è¡¨ç¤ºã™ã‚‹åå‰ã‚’入力ã—ã¾ã™: + + + + &Load + 読ã¿è¾¼ã¿(&L) + + + + &Save + ä¿å­˜(&S) + + + + &Next + 次ã¸(&N) + + + + Pre&vious + å‰ã¸(&V) + + + + Move &up + 上ã¸ç§»å‹•(&U) + + + + Move &down + 下ã¸ç§»å‹•(&D) + + + + &Repeat + ç¹°ã‚Šè¿”ã—(&R) + + + + S&huffle + シャッフル(&H) + + + + Add &current file + ç¾åœ¨ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®è¿½åŠ (&C) + + + + Add &file(s) + ファイルã®è¿½åŠ (&F) + + + + Add &directory + ディレクトリã®è¿½åŠ (&D) + + + + Remove &selected + é¸æŠžæ¸ˆã¿ã®å‰Šé™¤(&S) + + + + Remove &all + ã™ã¹ã¦å‰Šé™¤(&A) + + + + SMPlayer - Playlist + SMPlayer - プレイリスト + + + + Add... + 追加... + + + + Remove... + 削除... + + + + Playlist modified + プレイリストãŒå¤‰æ›´ã•ã‚Œã¾ã—㟠+ + + + There are unsaved changes, do you want to save the playlist? + 未ä¿å­˜ã®å¤‰æ›´ãŒã‚ã‚Šã¾ã™ã€ãƒ—レイリストをä¿å­˜ã—ã¾ã™ã‹? + + + + PrefAdvanced + + + Advanced + 高度 + + + + Auto + 自動 + + + + Don't repaint the background of the video window + ビデオ ウィンドウã®èƒŒæ™¯ã‚’å†æç”»ã—ãªã„ + + + + Checking this option may reduce flickering, but it also might produce that the video won't be displayed properly. + ã“ã®ã‚ªãƒ—ションã®ãƒã‚§ãƒƒã‚¯ã¯ã¡ã‚‰ã¤ãを減少ã•ã›ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ãŒã€ãƒ“デオãŒé©åˆ‡ã«è¡¨ç¤ºã•ã‚Œãªããªã‚‹ã“ã¨ã‚’生むå¯èƒ½æ€§ã‚‚ã‚ã‚Šã¾ã™ã€‚ + + + + Log MPlayer output + MPlayer ã®å‡ºåŠ›ã‚’記録ã—ã¾ã™ + + + + If checked, smplayer will store the output of mplayer (you can see it in <b>Options->View logs->mplayer</b>). In case of problems this log can contain important information, so it's recommended to keep this option checked. + ãƒã‚§ãƒƒã‚¯ã•ã‚Œã¦ã„ã‚‹å ´åˆã€smplayer 㯠mplayer ã®å‡ºåŠ› (<b>オプション->ログã®è¡¨ç¤º->mplayer</b> ã§ã”覧ã§ãã¾ã™) ã‚’æ ¼ç´ã—ã¾ã™ã€‚ã“ã®ãƒ­ã‚°ã¯é‡è¦ãªæƒ…報をå«ã‚€å¯èƒ½æ€§ãŒã‚ã‚‹ã®ã§ã€ã“ã®ã‚ªãƒ—ションã®ãƒã‚§ãƒƒã‚¯ã‚’ä¿æŒã™ã‚‹ã“ã¨ãŒæŽ¨å¥¨ã•ã‚Œã¾ã™ã€‚ + + + + Log SMPlayer output + SMPlayer ã®å‡ºåŠ›ã‚’記録ã—ã¾ã™ + + + + If this option is checked, smplayer will store the debugging messages that smplayer outputs (you can see the log in <b>Options->View logs->smplayer</b>). This information can be very useful for the developer in case you find a bug. + ã“ã®ã‚ªãƒ—ションãŒãƒã‚§ãƒƒã‚¯ã•ã‚Œã¦ã„ã‚‹å ´åˆã€smplayer 㯠smplayer ãŒå‡ºåŠ›ã™ã‚‹ãƒ‡ãƒãƒƒã‚° メッセージ (<b>オプション->ログã®è¡¨ç¤º->smplayer</b> ã§ã”覧ã§ãã¾ã™) ã‚’æ ¼ç´ã—ã¾ã™ã€‚ã“ã®æƒ…å ±ã¯ãƒã‚°ã‚’検索ã™ã‚‹å ´åˆã«é–‹ç™ºè€…ã«éžå¸¸ã«æœ‰ç”¨ã§ã™ã€‚ + + + + Filter for SMPlayer logs + SMPlayer ã®ãƒ­ã‚°ã®ãƒ•ã‚£ãƒ«ã‚¿ + + + + This option allows to filter the smplayer messages that will be stored in the log. Here you can write any regular expression.<br>For instance: <i>^Core::.*</i> will display only the lines starting with <i>Core::</i> + ã“ã®ã‚ªãƒ—ションã¯ãƒ­ã‚°ã«æ ¼ç´ã•ã‚Œã‚‹ smplayer ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’フィルタã™ã‚‹ã“ã¨ã‚’許å¯ã—ã¾ã™ã€‚ã“ã“ã§ä½•ã‹æ­£è¦è¡¨ç¾ã‚’書ã込むã“ã¨ãŒã§ãã¾ã™ã€‚<br>例: <i>^Core::.*</i> ã§ã¯ <i>Core::</i> ã§å§‹ã¾ã‚‹è¡Œã®ã¿ãŒè¡¨ç¤ºã•ã‚Œã¾ã™ + + + + Form + フォーム + + + + &Advanced + 高度(&A) + + + + icon + アイコン + + + + Additional Options for MPlayer + MPlayer ã®è¿½åŠ ã‚ªãƒ—ション + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + ã“ã“㧠MPlayer ã¸ã®ã‚¨ã‚¯ã‚¹ãƒˆãƒ© オプションを渡ã™ã“ã¨ãŒã§ãã¾ã™ã€‚ +スペースã§åŒºåˆ‡ã£ã¦ãれらを書ãè¾¼ã¿ã¾ã™ã€‚ +例: -flip -nosound + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + 追加ビデオ フィルタも渡ã™ã“ã¨ãŒã§ãã¾ã™ã€‚ +"," ã§åŒºåˆ‡ã‚Šã¾ã™ã€‚スペースã¯ä½¿ç”¨ã—ã¾ã›ã‚“! +例: scale=512:-2,eq2=1.1 + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + ãã—ã¦æœ€å¾Œã¯ã‚ªãƒ¼ãƒ‡ã‚£ã‚ª フィルタã§ã™ã€‚ビデオ フィルタã¨åŒã˜è¦å‰‡ã§ã™ã€‚ +例: resample=44100:0:0,volnorm + + + + &Logs + ログ(&L) + + + + This option is mainly intended for debugging the application. + ã“ã®ã‚ªãƒ—ションã¯ä¸»ã«ã‚¢ãƒ—リケーションã®ãƒ‡ãƒãƒƒã‚°ãŒå¯¾è±¡ã§ã™ã€‚ + + + + &MPlayer language + MPlayer ã®è¨€èªž(&M) + + + + SMPlayer needs to read and parse the output of MPlayer and sometimes it relies on English text. If you are using a MPlayer translated into another language, then you need to change the texts that SMPlayer looks for. (Technically you should enter regular expressions)<br><br> +The drop-down lists may provide already made regular expression for several languages. + SMPlayer 㯠MPlayer ã®å‡ºåŠ›ã®èª­ã¿è¾¼ã¿ãŠã‚ˆã³æ§‹æ–‡è§£æžã‚’å¿…è¦ã¨ã—ã¦ã¨ãã©ã英語ã®ãƒ†ã‚­ã‚¹ãƒˆã‚’頼りã«ã—ã¾ã™ã€‚別ã®è¨€èªžã«ç¿»è¨³ã•ã‚ŒãŸ MPlayer を使用ã—ã¦ã„ã‚‹å ´åˆã€æ¬¡ã« SMPlayer ãŒæ¤œç´¢ã™ã‚‹ãƒ†ã‚­ã‚¹ãƒˆã®å¤‰æ›´ã‚’å¿…è¦ã¨ã—ã¾ã™ã€‚(技術的ã«ã¯æ­£è¦è¡¨ç¾ã‚’入力ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™)<br><br> +ドロップダウン リストã¯ã™ã§ã«æ­£è¦è¡¨ç¾ã‚’数個ã®è¨€èªžç”¨ã«ã™ã‚‹ã®ã‚’æä¾›ã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ + + + + &Monitor aspect: + モニタã®æ¯”率(&M): + + + + &Run MPlayer in its own window + MPlayer を自身ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã§èµ·å‹•ã™ã‚‹(&R) + + + + &Options: + オプション(&O): + + + + V&ideo filters: + ビデオ フィルタ(&I): + + + + Audio &filters: + オーディオ フィルタ(&F): + + + + &Colorkey: + カラーキー(&C): + + + + &Don't repaint the background of the video window + ビデオ ウィンドウã®èƒŒæ™¯ã‚’å†æç”»ã—ãªã„(&D) + + + + Log &MPlayer output + MPlayer ã®å‡ºåŠ›ã‚’記録ã™ã‚‹(&M) + + + + Log &SMPlayer output + SMPlayer ã®å‡ºåŠ›ã‚’記録ã™ã‚‹(&S) + + + + &Filter for SMPlayer logs: + SMPlayer ã®ãƒ­ã‚°ã®ãƒ•ã‚£ãƒ«ã‚¿(&F): + + + + &End of file: + ファイルã®æœ€å¾Œ(&E): + + + + &No video: + ビデオãªã—(&N): + + + + C&hange... + 変更(&H)... + + + + PrefAssociations + + + Warning + 警告 + + + + Not all files could be associated. Please check your security permissions and retry. + ã™ã¹ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯é–¢é€£ä»˜ã‘ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚セキュリティã®è¨±å¯ã‚’ãƒã‚§ãƒƒã‚¯ã—ã¦å†è©¦è¡Œã—ã¦ãã ã•ã„。 + + + + File Types + ファイルã®ç¨®é¡ž + + + + Select all + ã™ã¹ã¦é¸æŠž + + + + Check all file types in the list + 一覧ã®ã™ã¹ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®ç¨®é¡žã‚’ãƒã‚§ãƒƒã‚¯ã—ã¾ã™ + + + + Uncheck all file types in the list + 一覧ã®ã™ã¹ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®ç¨®é¡žã‚’ãƒã‚§ãƒƒã‚¯è§£é™¤ã—ã¾ã™ + + + + List of file types + ファイルã®ç¨®é¡žã®ä¸€è¦§ + + + + File types + ファイルã®ç¨®é¡ž + + + + Media files handled by SMPlayer: + SMPlayer ã«ã‚ˆã£ã¦ãƒãƒ³ãƒ‰ãƒ«ã•ã‚Œã‚‹ãƒ¡ãƒ‡ã‚£ã‚¢ ファイル: + + + + Select All + ã™ã¹ã¦é¸æŠž + + + + Select None + é¸æŠžã—ãªã„ + + + + Check the media file extensions you would like SMPlayer to handle. When you click Apply, the checked files will be associated with SMPlayer. If you uncheck a media type, the file association will be restored. + SMPlayer ã«ãƒãƒ³ãƒ‰ãƒ«ã•ã›ãŸã„メディア ファイル拡張å­ã‚’ãƒã‚§ãƒƒã‚¯ã—ã¾ã™ã€‚[é©ç”¨] をクリックã™ã‚‹ã¨ã€ãƒã‚§ãƒƒã‚¯ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã¯ SMPlayer ã§é–¢é€£ä»˜ã‘ã•ã‚Œã¾ã™ã€‚メディアã®ç¨®é¡žã‚’ãƒã‚§ãƒƒã‚¯è§£é™¤ã™ã‚‹å ´åˆã€ãƒ•ã‚¡ã‚¤ãƒ«ã®é–¢é€£ä»˜ã‘ã¯å¾©å…ƒã•ã‚Œã¾ã™ã€‚ + + + + Select none + é¸æŠžã—ãªã„ + + + + PrefDrives + + + Drives + ドライブ + + + + CD device + CD デãƒã‚¤ã‚¹ + + + + Choose your CDROM device. It will be used to play VCDs and Audio CDs. + ãŠä½¿ã„ã® CDROM デãƒã‚¤ã‚¹ã‚’é¸æŠžã—ã¾ã™ã€‚VCD ã¨ã‚ªãƒ¼ãƒ‡ã‚£ã‚ª CD ã‚’å†ç”Ÿã™ã‚‹ã®ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ + + + + DVD device + DVD デãƒã‚¤ã‚¹ + + + + Choose your DVD device. It will be used to play DVDs. + ãŠä½¿ã„ã® DVD デãƒã‚¤ã‚¹ã‚’é¸æŠžã—ã¾ã™ã€‚DVD ã‚’å†ç”Ÿã™ã‚‹ã®ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ + + + + Currently SMPlayer does not autodetect cdrom or dvd devices. So in order to play cdroms or dvds you must first select here your cdrom and dvd drives (can be the same). + ç¾åœ¨ SMPlayer 㯠cdrom ã¾ãŸã¯ dvd デãƒã‚¤ã‚¹ã‚’自動検出ã—ã¾ã›ã‚“。Cdrom ã¾ãŸã¯ dvd ã‚’å†ç”Ÿã™ã‚‹ã«ã¯æœ€åˆã«ãŠä½¿ã„ã® cdrom ãŠã‚ˆã³ dvd ドライブ (åŒã˜ã«ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™) ã‚’é¸æŠžã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + + + + icon + アイコン + + + + Select your CD device: + ãŠä½¿ã„ã® CD デãƒã‚¤ã‚¹ã‚’é¸æŠžã—ã¾ã™: + + + + Select your DVD device: + ãŠä½¿ã„ã® DVD デãƒã‚¤ã‚¹ã‚’é¸æŠžã—ã¾ã™: + + + + Select your &CD device: + ãŠä½¿ã„ã® CD デãƒã‚¤ã‚¹ã‚’é¸æŠžã—ã¾ã™(&C): + + + + Select your &DVD device: + ãŠä½¿ã„ã® DVD デãƒã‚¤ã‚¹ã‚’é¸æŠžã—ã¾ã™(&D): + + + + PrefGeneral + + + General + 一般 + + + + Select the mplayer executable + Mplayer ã®å®Ÿè¡Œãƒ•ã‚¡ã‚¤ãƒ«ã‚’é¸æŠžã—ã¾ã™ + + + + Executables + 実行ファイル + + + + All files + ã™ã¹ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ« + + + + Select a directory + ディレクトリをé¸æŠžã—ã¾ã™ + + + + MPlayer executable + MPlayer ã®å®Ÿè¡Œãƒ•ã‚¡ã‚¤ãƒ« + + + + Here you must specify the mplayer executable that smplayer will use.<br>smplayer requires at least mplayer 1.0rc1 (svn recommended).<br><b>If this setting is wrong, smplayer won't be able to play anything!</b> + ã“ã“㧠smplayer ãŒä½¿ç”¨ã™ã‚‹ mplayer ã®å®Ÿè¡Œãƒ•ã‚¡ã‚¤ãƒ«ã‚’指定ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚<br>smplayer ã¯å°‘ãªãã¨ã‚‚ mplayer 1.0rc1 (svn ãŒæŽ¨å¥¨ã•ã‚Œã¾ã™) ã‚’å¿…è¦ã¨ã—ã¾ã™ã€‚<br><b>ã“ã®è¨­å®šãŒé–“é•ã£ã¦ã„ã‚‹ã¨ã€smplayer ã¯ä½•ã‚‚å†ç”Ÿã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“!</b> + + + + Screenshots folder + スクリーンショット フォルダ + + + + Here you can specify a folder where the screenshots taken by smplayer will be stored. If this field is empty the screenshot feature will be disabled. + ã“ã“㧠smplayer ã«ã‚ˆã£ã¦å–å¾—ã•ã‚ŒãŸã‚¹ã‚¯ãƒªãƒ¼ãƒ³ã‚·ãƒ§ãƒƒãƒˆãŒæ ¼ç´ã•ã‚Œã‚‹ãƒ•ã‚©ãƒ«ãƒ€ã‚’指定ã§ãã¾ã™ã€‚ã“ã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ãŒç©ºã§ã‚ã‚‹å ´åˆã¯ã‚¹ã‚¯ãƒªãƒ¼ãƒ³ã‚·ãƒ§ãƒƒãƒˆæ©Ÿèƒ½ã¯ç„¡åŠ¹ã«ãªã‚Šã¾ã™ã€‚ + + + + Video output driver + ビデオã®å‡ºåŠ›ãƒ‰ãƒ©ã‚¤ãƒ + + + + Select the video output driver. Usually xv (linux) and directx (windows) provide the best performance. + ビデオã®å‡ºåŠ›ãƒ‰ãƒ©ã‚¤ãƒã‚’é¸æŠžã—ã¾ã™ã€‚通常 xv (linux) 㨠directx (windows) ãŒæœ€é«˜ã®ãƒ‘フォーマンスを供給ã—ã¾ã™ã€‚ + + + + Audio output driver + オーディオã®å‡ºåŠ›ãƒ‰ãƒ©ã‚¤ãƒ + + + + Select the audio output driver. + オーディオã®å‡ºåŠ›ãƒ‰ãƒ©ã‚¤ãƒã‚’é¸æŠžã—ã¾ã™ã€‚ + + + + Remember settings + 設定を記憶ã™ã‚‹ + + + + Usually smplayer will remember the settings for each file you play (audio track selected, volume, filters...). Uncheck this option if you don't like this feature. + 通常 smplayer ã¯å†ç”Ÿã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ« (é¸æŠžã•ã‚ŒãŸã‚ªãƒ¼ãƒ‡ã‚£ã‚ª トラックã€éŸ³é‡ã€ãƒ•ã‚£ãƒ«ã‚¿...) ã”ã¨ã«è¨­å®šã‚’記憶ã—ã¾ã™ã€‚ã“ã®æ©Ÿèƒ½ã‚’好ã¾ãªã„ãªã‚‰ã“ã®ã‚ªãƒ—ションã®ãƒã‚§ãƒƒã‚¯ã‚’解除ã—ã¾ã™ã€‚ + + + + Don't remember time position + 時間ã®ä½ç½®ã‚’記憶ã—ãªã„ + + + + If you check this option, smplayer will play all files from the beginning. + ã“ã®ã‚ªãƒ—ションをãƒã‚§ãƒƒã‚¯ã™ã‚‹ã¨ã€smplayer ã¯ã™ã¹ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’最åˆã‹ã‚‰å†ç”Ÿã—ã¾ã™ã€‚ + + + + Preferred audio language + ãŠå¥½ã¿ã®ã‚ªãƒ¼ãƒ‡ã‚£ã‚ªã®è¨€èªž + + + + Here you can type your preferred language for the audio streams. When a media with multiple audio streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the audio streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the audio track if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + ã“ã“ã§ã‚ªãƒ¼ãƒ‡ã‚£ã‚ª ストリームã®å„ªå…ˆè¨€èªžã‚’入力ã§ãã¾ã™ã€‚複数ã®ã‚ªãƒ¼ãƒ‡ã‚£ã‚ª ストリームをæŒã¤ãƒ¡ãƒ‡ã‚£ã‚¢ãŒè¦‹ã¤ã‹ã£ãŸã¨ãã€smplayer ã¯å„ªå…ˆè¨€èªžã®ä½¿ç”¨ã‚’試行ã—ã¾ã™ã€‚<br>ã“れ㯠DVD ã¾ãŸã¯ mkv ファイルã®ã‚ˆã†ãªã€ã‚ªãƒ¼ãƒ‡ã‚£ã‚ª ストリームã®è¨€èªžã«ã¤ã„ã¦ã®æƒ…å ±ãŒæä¾›ã•ã‚Œã¦ã„るメディアã§ã®ã¿æ©Ÿèƒ½ã—ã¾ã™ã€‚<br>ã“ã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã¯æ­£è¦è¡¨ç¾ã‚’å—ã‘入れã¾ã™ã€‚例: <b>es|esp|spa</b> ã§ã¯ <i>es</i>ã€<i>esp</i> ã¾ãŸã¯ <i>spa</i> ã«ä¸€è‡´ã™ã‚‹å ´åˆã«ã‚ªãƒ¼ãƒ‡ã‚£ã‚ª トラックãŒé¸æŠžã•ã‚Œã¾ã™ã€‚ + + + + Preferred subtitle language + ãŠå¥½ã¿ã®å­—幕ã®è¨€èªž + + + + Here you can type your preferred language for the subtitle stream. When a media with multiple subtitle streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the subtitle streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the subtitle stream if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + ã“ã“ã§å­—幕ストリームã®å„ªå…ˆè¨€èªžã‚’入力ã§ãã¾ã™ã€‚複数ã®å­—幕ストリームをæŒã¤ãƒ¡ãƒ‡ã‚£ã‚¢ãŒè¦‹ã¤ã‹ã£ãŸã¨ãã€smplayer ã¯å„ªå…ˆè¨€èªžã®ä½¿ç”¨ã‚’試行ã—ã¾ã™ã€‚<br>ã“れ㯠DVD ã¾ãŸã¯ mkv ファイルã®ã‚ˆã†ãªã€å­—幕ストリームã®è¨€èªžã«ã¤ã„ã¦ã®æƒ…å ±ãŒæä¾›ã•ã‚Œã¦ã„るメディアã§ã®ã¿æ©Ÿèƒ½ã—ã¾ã™ã€‚<br>ã“ã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã¯æ­£è¦è¡¨ç¾ã‚’å—ã‘入れã¾ã™ã€‚例: <b>es|esp|spa</b> ã§ã¯ <i>es</i>ã€<i>esp</i> ã¾ãŸã¯ <i>spa</i> ã«ä¸€è‡´ã™ã‚‹å ´åˆã«å­—幕ストリームãŒé¸æŠžã•ã‚Œã¾ã™ã€‚ + + + + Software video equalizer + ソフトウェアã®ãƒ“デオ イコライザ + + + + You can check this option if video equalizer is not supported by your graphic card or the selected video output driver.<br><b>Note:</b> this option can be incompatible with some video output drivers. + ビデオ イコライザãŒãŠä½¿ã„ã®ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ カードã¾ãŸã¯é¸æŠžã•ã‚ŒãŸãƒ“デオã®å‡ºåŠ›ãƒ‰ãƒ©ã‚¤ãƒã«ã‚ˆã£ã¦ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„å ´åˆã«ã“ã®ã‚ªãƒ—ションをãƒã‚§ãƒƒã‚¯ã—ã¾ã™ã€‚<br><b>注æ„:</b> ã“ã®ã‚ªãƒ—ションã¯ã„ãã¤ã‹ã®ãƒ“デオã®å‡ºåŠ›ãƒ‰ãƒ©ã‚¤ãƒã¨ã¯äº’æ›æ€§ãŒãªã„å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ + + + + Postprocessing quality + 後処ç†ã®å“質 + + + + Dynamically changes the level of postprocessing depending on the available spare CPU time. The number you specify will be the maximum level used. Usually you can use some big number. + å‹•çš„ã«åˆ©ç”¨å¯èƒ½ãªã‚¹ãƒšã‚¢ CPU 時間次第ã§å¾Œå‡¦ç†ã®ãƒ¬ãƒ™ãƒ«ã‚’変更ã—ã¾ã™ã€‚指定ã™ã‚‹ç•ªå·ã¯ä½¿ç”¨ã•ã‚Œã‚‹æœ€å¤§ãƒ¬ãƒ™ãƒ«ã«ãªã‚Šã¾ã™ã€‚通常ã„ãらã‹ã®å¤§ãã„番å·ã‚’ç§ç”¨ã—ã¾ã™ã€‚ + + + + Start videos in fullscreen + 全画é¢è¡¨ç¤ºã§ãƒ“デオを開始ã™ã‚‹ + + + + If this option is checked, all videos will start to play in fullscreen mode. + ã“ã®ã‚ªãƒ—ションãŒãƒã‚§ãƒƒã‚¯ã•ã‚Œã¦ã„ã‚‹å ´åˆã€ã™ã¹ã¦ã®ãƒ“デオã¯å…¨ç”»é¢è¡¨ç¤ºãƒ¢ãƒ¼ãƒ‰ã§é–‹å§‹ã•ã‚Œã¾ã™ã€‚ + + + + Disable screensaver + スクリーンセーãƒãƒ¼ã‚’無効ã«ã™ã‚‹ + + + + Check this option to disable the screensaver while playing.<br>The screensaver will enabled again when play finishes.<br><b>Note:</b> This option works only in X11 and Windows. + å†ç”Ÿä¸­ã«ã‚¹ã‚¯ãƒªãƒ¼ãƒ³ã‚»ãƒ¼ãƒãƒ¼ã‚’無効ã«ã™ã‚‹ã«ã¯ã“ã®ã‚ªãƒ—ションをãƒã‚§ãƒƒã‚¯ã—ã¾ã™ã€‚<br>スクリーンセーãƒãƒ¼ã¯å†ç”Ÿã®å®Œäº†æ™‚ã«å†ã³æœ‰åŠ¹ã«ãªã‚Šã¾ã™ã€‚<br><b>注æ„:</b>ã“ã®ã‚ªãƒ—ション㯠X11 㨠Windows ã®ã¿ã§æ©Ÿèƒ½ã—ã¾ã™ã€‚ + + + + Software volume control + ソフトウェアã®ãƒœãƒªãƒ¥ãƒ¼ãƒ  コントロール + + + + Check this option to use the software mixer, instead of using the sound card mixer. + サウンド カード ミキサを使用ã™ã‚‹ä»£ã‚ã‚Šã«ã€ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ ミキサを使用ã™ã‚‹ã«ã¯ã“ã®ã‚ªãƒ—ションをãƒã‚§ãƒƒã‚¯ã—ã¾ã™ã€‚ + + + + &General + 一般(&G) + + + + Paths + パス + + + + Search... + 検索... + + + + Select... + é¸æŠž... + + + + Select the MPlayer executable: + MPlayer ã®å®Ÿè¡Œãƒ•ã‚¡ã‚¤ãƒ«ã‚’é¸æŠžã—ã¾ã™: + + + + Folder for storing screenshots: + スクリーンショットを格ç´ã™ã‚‹ãƒ•ã‚©ãƒ«ãƒ€: + + + + Output drivers + ドライãƒã®å‡ºåŠ› + + + + Video: + ビデオ: + + + + Audio: + オーディオ: + + + + Media settings + メディアã®è¨­å®š + + + + Don't remember time position (files start playing from the beginning) + 時間ã®ä½ç½®ã‚’記憶ã—ãªã„ (ファイルã¯æœ€åˆã‹ã‚‰å†ç”ŸãŒé–‹å§‹ã•ã‚Œã¾ã™) + + + + Remember settings for all files (audio track, subtitles...) + ã™ã¹ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®è¨­å®šã‚’記憶ã™ã‚‹ (オーディオ トラックã€å­—幕...) + + + + Preferred audio and subtitles + 優先オーディオãŠã‚ˆã³å­—幕 + + + + Subtitles: + 字幕: + + + + &Video and audio + ビデオã¨ã‚ªãƒ¼ãƒ‡ã‚£ã‚ª(&V) + + + + Video + ビデオ + + + + Use software video equalizer + ソフトウェアã®ãƒ“デオ イコライザを使用ã™ã‚‹ + + + + Enable postprocessing for all videos + ã™ã¹ã¦ã®ãƒ“デオã«å¾Œå‡¦ç†ã‚’有効ã«ã™ã‚‹ + + + + Quality: + å“質: + + + + Audio + オーディオ + + + + Use software volume control + ソフトウェアã®ãƒœãƒªãƒ¥ãƒ¼ãƒ  コントロールを使用ã™ã‚‹ + + + + Max. Amplification: + 最大増幅: + + + + AC3/DTS pass-through S/PDIF + AC3/DTS pass-through S/PDIF + + + + Volume normalization + ボリュームã®é€šå¸¸åŒ– + + + + Change volume + 音é‡ã®å¤‰æ›´ + + + + If checked, SMPlayer will remember the volume for every file and will restore it when played again. For new files the default volume will be used. + ãƒã‚§ãƒƒã‚¯ã•ã‚Œã¦ã„ã‚‹å ´åˆã€SMPlayer ã¯ãã‚Œãžã‚Œã®ãƒ•ã‚¡ã‚¤ãƒ«ã®éŸ³é‡ã‚’記憶ã—ã¦å†ã³å†ç”Ÿã•ã‚ŒãŸã¨ãã«å¾©å…ƒã—ã¾ã™ã€‚æ–°ã—ã„ファイルã«ã¯æ—¢å®šã®éŸ³é‡ãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ + + + + Default volume: + 既定ã®éŸ³é‡: + + + + 0 + 0 + + + + &Change volume on every file + ãã‚Œãžã‚Œã®ãƒ•ã‚¡ã‚¤ãƒ«ã§éŸ³é‡ã‚’変更ã™ã‚‹(&C) + + + + &Search... + 検索(&S)... + + + + S&elect... + é¸æŠž(&E)... + + + + Select the &MPlayer executable: + MPlayer ã®å®Ÿè¡Œãƒ•ã‚¡ã‚¤ãƒ«ã‚’é¸æŠžã—ã¾ã™(&M): + + + + &Folder for storing screenshots: + スクリーンショットを格ç´ã™ã‚‹ãƒ•ã‚©ãƒ«ãƒ€(&F): + + + + V&ideo: + ビデオ(&I): + + + + &Audio: + オーディオ(&A): + + + + &Don't remember time position (files start playing from the beginning) + 時間ã®ä½ç½®ã‚’記憶ã—ãªã„ (ファイルã¯æœ€åˆã‹ã‚‰å†ç”ŸãŒé–‹å§‹ã•ã‚Œã¾ã™)(&D) + + + + &Remember settings for all files (audio track, subtitles...) + ã™ã¹ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®è¨­å®šã‚’記憶ã™ã‚‹ (オーディオ トラックã€å­—幕...)(&R) + + + + A&udio: + オーディオ(&U): + + + + Su&btitles: + 字幕(&B): + + + + &Use software video equalizer + ソフトウェアã®ãƒ“デオ イコライザを使用ã™ã‚‹(&U) + + + + &Enable postprocessing for all videos + ã™ã¹ã¦ã®ãƒ“デオã«å¾Œå‡¦ç†ã‚’有効ã«ã™ã‚‹(&E) + + + + &Quality: + å“質(&Q): + + + + Start videos in &fullscreen + 全画é¢è¡¨ç¤ºã§ãƒ“デオを開始ã™ã‚‹(&F) + + + + Disable &screensaver + スクリーンセーãƒãƒ¼ã‚’無効ã«ã™ã‚‹(&S) + + + + &Default volume: + 既定ã®éŸ³é‡(&D): + + + + Use s&oftware volume control + ソフトウェアã®ãƒœãƒªãƒ¥ãƒ¼ãƒ  コントロールを使用ã™ã‚‹(&O) + + + + Ma&x. Amplification: + 最大増幅(&X): + + + + &AC3/DTS pass-through S/PDIF + AC3/DTS pass-through S/PDIF(&A) + + + + Volume &normalization + 音é‡ã®é€šå¸¸åŒ–(&N) + + + + Direct rendering + 直接æç”» + + + + If checked, turns on direct rendering (not supported by all codecs and video outputs)<br><b>WARNING:</b> May cause OSD/SUB corruption! + ãƒã‚§ãƒƒã‚¯ã•ã‚Œã¦ã„ã‚‹å ´åˆã€ç›´æŽ¥æ画をオンã«ã—ã¾ã™ (ã™ã¹ã¦ã®ã‚³ãƒ¼ãƒ‡ãƒƒã‚¯ã¨ãƒ“デオ出力ã«ã‚ˆã£ã¦ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“)<br><b>警告:</b> OSD/SUB ã®ç ´æを引ãèµ·ã“ã™å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™! + + + + Double buffering + ダブル ãƒãƒƒãƒ•ã‚¡ + + + + D&irect rendering + 直接æç”»(&R) + + + + Dou&ble buffering + ダブル ãƒãƒƒãƒ•ã‚¡(&B) + + + + Double buffering fixes flicker by storing two frames in memory, and displaying one while decoding another. If disabled it can affect OSD negatively, but often removes OSD flickering. + ダブル ãƒãƒƒãƒ•ã‚¡ã¯ãƒ¡ãƒ¢ãƒªã« 2 ã¤ã®ãƒ•ãƒ¬ãƒ¼ãƒ ãŒæ ¼ç´ã•ã‚Œã‚‹ã®ã¨ã€åˆ¥ã®ãƒ‡ã‚³ãƒ¼ãƒ‰ä¸­ã«è¡¨ç¤ºã™ã‚‹ã“ã¨ã«ã‚ˆã‚‹ã¡ã‚‰ã¤ãを修正ã—ã¾ã™ã€‚無効ã®å ´åˆã¯ OSD を悪化ã•ã›ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ãŒã€å¤§æŠµ OSD ã®ã¡ã‚‰ã¤ãを削除ã—ã¾ã™ã€‚ + + + + &Enable postprocessing by default + 既定ã§å¾Œå‡¦ç†ã‚’有効ã«ã™ã‚‹(&E) + + + + Volume &normalization by default + 既定ã§ã®éŸ³é‡ã®é€šå¸¸åŒ–(&N) + + + + Close when finished + 完了時ã«é–‰ã˜ã‚‹ + + + + If this option is checked, the main window will be automatically closed when the current file/playlist finishes. + ã“ã®ã‚ªãƒ—ションãŒãƒã‚§ãƒƒã‚¯ã•ã‚Œã¦ã„ã‚‹å ´åˆã€ãƒ¡ã‚¤ãƒ³ ウィンドウã¯ç¾åœ¨ã®ãƒ•ã‚¡ã‚¤ãƒ«/プレイリストã®å®Œäº†æ™‚ã«è‡ªå‹•çš„ã«é–‰ã˜ã‚‰ã‚Œã¾ã™ã€‚ + + + + &Close when finished + 完了時ã«é–‰ã˜ã‚‹(&C) + + + + 2 (Stereo) + 2 (ステレオ) + + + + 4 (4.0 Surround) + 4 (4.0 サラウンド) + + + + 6 (5.1 Surround) + 6 (5.1 サラウンド) + + + + C&hannels by default: + 既定ã§ã®ãƒãƒ£ãƒ³ãƒãƒ«(&H): + + + + &Pause when minimized + 最å°åŒ–時ã«ä¸€æ™‚åœæ­¢ã™ã‚‹(&P) + + + + Pause when minimized + 最å°åŒ–時ã«ä¸€æ™‚åœæ­¢ã™ã‚‹ + + + + If this option is enabled, the file will be paused when the main window is hidden. When the window is restored, play will be resumed. + ã“ã®ã‚ªãƒ—ションãŒæœ‰åŠ¹ã®å ´åˆã€ãƒ•ã‚¡ã‚¤ãƒ«ã¯ãƒ¡ã‚¤ãƒ³ ウィンドウãŒéžè¡¨ç¤ºã§ã‚ã‚‹ã¨ãã«ä¸€æ™‚åœæ­¢ã•ã‚Œã¾ã™ã€‚ウィンドウãŒå¾©å…ƒã•ã‚Œã‚‹ã¨ã€å†ç”Ÿã¯å†é–‹ã•ã‚Œã¾ã™ã€‚ + + + + Enable postprocessing by default + 既定ã§å¾Œå‡¦ç†ã‚’有効ã«ã™ã‚‹ + + + + Max. Amplification + 最大増幅 + + + + Volume normalization by default + 既定ã§ã®éŸ³é‡ã®é€šå¸¸åŒ– + + + + Maximizes the volume without distorting the sound. + サウンドã®æ­ªæ›²ãªã—ã§éŸ³é‡ã‚’最大化ã—ã¾ã™ã€‚ + + + + Default volume + 既定ã®éŸ³é‡ + + + + Sets the initial volume that new files will use. + æ–°ã—ã„ファイルãŒä½¿ç”¨ã™ã‚‹åˆæœŸéŸ³é‡ã‚’設定ã—ã¾ã™ã€‚ + + + + Channels by default + 既定ã§ã®ãƒãƒ£ãƒ³ãƒãƒ« + + + + Sets the maximum amplification level in percent (default: 110). A value of 200 will allow you to adjust the volume up to a maximum of double the current level. With values below 100 the initial volume (which is 100%) will be above the maximum, which e.g. the OSD cannot display correctly. + パーセントã§æœ€å¤§å¢—幅レベルを設定ã—ã¾ã™ (既定: 110)。200 ã®å€¤ã¯æœ€å¤§ã§ç¾åœ¨ã®ãƒ¬ãƒ™ãƒ«ã®å€ã¸éŸ³é‡ã‚’上方調整ã™ã‚‹ã“ã¨ã‚’許å¯ã—ã¾ã™ã€‚100 以下ã®å€¤ã§åˆæœŸéŸ³é‡ (100%) ã¯ä¾‹ãˆã° OSD ã‚’æ­£ã—ã表示ã§ããªã„ã€æœ€å¤§ä»¥ä¸Šã«ãªã‚Šã¾ã™ã€‚ + + + + Uses hardware AC3 passthrough + ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ AC3 passthrough を使用ã—ã¾ã™ + + + + Requests the number of playback channels. MPlayer asks the decoder to decode the audio into as many channels as specified. Then it is up to the decoder to fulfill the requirement. This is usually only important when playing videos with AC3 audio (like DVDs). In that case liba52 does the decoding by default and correctly downmixes the audio into the requested number of channels. NOTE: This option is honored by codecs (AC3 only), filters (surround) and audio output drivers (OSS at least). + å†ç”Ÿãƒãƒ£ãƒ³ãƒãƒ«ã®æ•°ã‚’è¦æ±‚ã—ã¾ã™ã€‚MPlayer ã¯æŒ‡å®šã•ã‚ŒãŸã ã‘ã®æ•°ã®ãƒãƒ£ãƒ³ãƒãƒ«ã«ã‚ªãƒ¼ãƒ‡ã‚£ã‚ªã‚’デコードã™ã‚‹ã‚ˆã†ãƒ‡ã‚³ãƒ¼ãƒ€ã«è¦æ±‚ã—ã¾ã™ã€‚次ã«è¦æ±‚ãŒæº€ãŸã•ã‚Œã‚‹ã®ã¯ãƒ‡ã‚³ãƒ¼ãƒ€æ¬¡ç¬¬ã§ã™ã€‚ã“ã‚Œã¯é€šå¸¸ AC3 オーディオ (DVD ã®ã‚ˆã†ãª) ã§ãƒ“デオをå†ç”Ÿã™ã‚‹ã¨ãã®ã¿é‡è¦ã§ã™ã€‚ãã®å ´åˆã«ã¯ liba52 ãŒæ—¢å®šã§ãƒ‡ã‚³ãƒ¼ãƒ‰ã—ã¦è¦æ±‚ã•ã‚ŒãŸãƒãƒ£ãƒ³ãƒãƒ«ã®æ•°ã«ã‚ªãƒ¼ãƒ‡ã‚£ã‚ªã‚’ダウンミックスã—ã¾ã™ã€‚注æ„: ã“ã®ã‚ªãƒ—ションã¯ã‚³ãƒ¼ãƒ‡ãƒƒã‚¯ (AC3 ã®ã¿)ã€ãƒ•ã‚£ãƒ«ã‚¿ (サラウンド) ãŠã‚ˆã³ã‚ªãƒ¼ãƒ‡ã‚£ã‚ªå‡ºåŠ›ãƒ‰ãƒ©ã‚¤ãƒ (å°‘ãªãã¨ã‚‚ OSS) ã«ã‚ˆã£ã¦å°Šé‡ã•ã‚Œã¦ã„ã¾ã™ã€‚ + + + + Postprocessing will be used by default on new opened files. + 後処ç†ã¯æ–°ã—ãé–‹ã‹ã‚Œã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã§æ—¢å®šã§ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ + + + + PrefInput + + + Keyboard and mouse + キーボードã¨ãƒžã‚¦ã‚¹ + + + + None + ãªã— + + + + &Keyboard + キーボード(&K) + + + + icon + アイコン + + + + Here you can change any key shortcut. To do it double click or start typing over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + ã“ã“ã§ã™ã¹ã¦ã®ã‚·ãƒ§ãƒ¼ãƒˆã‚«ãƒƒãƒˆã‚’変更ã§ãã¾ã™ã€‚ãれをã™ã‚‹ã«ã¯ã‚·ãƒ§ãƒ¼ãƒˆã‚«ãƒƒãƒˆ セルã®ä¸Šã§ãƒ€ãƒ–ル クリックã¾ãŸã¯ enter を押ã—ã¾ã™ã€‚ã¾ãŸä»»æ„ã«ãã®ä»–ã®äººã¾ãŸã¯åˆ¥ã®ã‚³ãƒ³ãƒ”ュータã§ã®èª­ã¿è¾¼ã¿ãŠã‚ˆã³å…±æœ‰ã™ã‚‹ã®ã«ä¸€è¦§ã‚’ä¿å­˜ã§ãã¾ã™ã€‚ + + + + &Mouse + マウス(&M) + + + + Button functions: + ボタンã®æ©Ÿèƒ½: + + + + Media seeking + メディア シーク + + + + Volume control + ボリューム コントロール + + + + Zoom video + ビデオã®æ‹¡å¤§ã¨ç¸®å° + + + + Here you can change any key shortcut. To do it double click or press enter over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + ã“ã“ã§ã™ã¹ã¦ã®ã‚·ãƒ§ãƒ¼ãƒˆã‚«ãƒƒãƒˆã‚’変更ã§ãã¾ã™ã€‚ãれをã™ã‚‹ã«ã¯ã‚·ãƒ§ãƒ¼ãƒˆã‚«ãƒƒãƒˆ セルã®ä¸Šã§ãƒ€ãƒ–ル クリックã¾ãŸã¯ enter を押ã—ã¾ã™ã€‚ã¾ãŸä»»æ„ã«ãã®ä»–ã®äººã¾ãŸã¯åˆ¥ã®ã‚³ãƒ³ãƒ”ュータã§ã®èª­ã¿è¾¼ã¿ãŠã‚ˆã³å…±æœ‰ã™ã‚‹ã®ã«ä¸€è¦§ã‚’ä¿å­˜ã§ãã¾ã™ã€‚ + + + + &Left click + 左クリック(&L) + + + + &Double click + ダブル クリック(&D) + + + + &Wheel function: + ホイール機能(&W): + + + + Shortcut editor + ショートカット エディタ + + + + This table allows you to change the key shortcuts of most available actions. Double click or press enter on a item, or press the <b>Change shortcut</b> button to enter in the <i>Modify shortcut</i> dialog. There are two ways to change a shortcut: if the <b>Capture</b> button is on then just press the new key or combination of keys that you want to assign for the action (unfortunately this doesn't work for all keys). If the <b>Capture</b> button is off then you could enter the full name of the key. + ã“ã®è¡¨ã¯åˆ©ç”¨å¯èƒ½ãªå‹•ä½œã®ã‚­ãƒ¼ ショートカットを変更ã™ã‚‹ã“ã¨ã‚’許å¯ã—ã¾ã™ã€‚<i>ショートカットã®å¤‰æ›´</i> ダイアログã«å…¥ã‚‹ã«ã¯ã‚¢ã‚¤ãƒ†ãƒ ã§ãƒ€ãƒ–ルクリックã™ã‚‹ã‹ enter を押ã™ã‹ã€<b>ショートカットã®å¤‰æ›´</b> ボタンを押ã—ã¾ã™ã€‚ショートカットを変更ã™ã‚‹ 2 ã¤ã®æ–¹æ³•ãŒã‚ã‚Šã¾ã™: <b>キャプãƒãƒ£</b> ボタンãŒã‚ªãƒ³ã®å ´åˆã¯æ¬¡ã«å‹•ä½œã«å‰²ã‚Šå½“ã¦ã—ãŸã„æ–°ã—ã„キーã¾ãŸã¯ã‚­ãƒ¼ã®çµ„ã¿åˆã‚ã›ã‚’押ã—ã¾ã™ã€‚<b>キャプãƒãƒ£</b> ボタンãŒã‚ªãƒ•ã®å ´åˆã¯æ¬¡ã«ã‚­ãƒ¼ã®ãƒ•ãƒ« ãƒãƒ¼ãƒ ã‚’入力ã§ãã¾ã™ã€‚ + + + + Left click + 左クリック + + + + Select the action for left click on the mouse. + マウスã§ã®å·¦ã‚¯ãƒªãƒƒã‚¯ã®å‹•ä½œã‚’é¸æŠžã—ã¾ã™ã€‚ + + + + Double click + ダブル クリック + + + + Select the action for double click on the mouse. + マウスã§ã®ãƒ€ãƒ–ル クリックã®å‹•ä½œã‚’é¸æŠžã—ã¾ã™ã€‚ + + + + Wheel function + ボタンã®æ©Ÿèƒ½ + + + + Select the action for the mouse wheel. + マウス ホイールã®å‹•ä½œã‚’é¸æŠžã—ã¾ã™ã€‚ + + + + PrefInterface + + + Interface + インターフェイス + + + + Bulgarian + ブルガリア語 + + + + Czech + ãƒã‚§ã‚³èªž + + + + German + ドイツ語 + + + + Greek + ギリシャ語 + + + + English + 英語 + + + + Spanish + スペイン語 + + + + Finnish + フィンランド語 + + + + French + フランス語 + + + + Hungarian + ãƒãƒ³ã‚¬ãƒªãƒ¼èªž + + + + Italian + イタリア語 + + + + Japanese + 日本語 + + + + Georgian + グルジア語 + + + + Dutch + オランダ語 + + + + Polish + ãƒãƒ¼ãƒ©ãƒ³ãƒ‰èªž + + + + Portuguese - Brazil + ãƒãƒ«ãƒˆã‚¬ãƒ«èªž - ブラジル + + + + Portuguese - Portugal + ãƒãƒ«ãƒˆã‚¬ãƒ«èªž - ãƒãƒ«ãƒˆã‚¬ãƒ« + + + + Romanian + ルーマニア語 + + + + Russian + ロシア語 + + + + Slovak + スロãƒã‚­ã‚¢èªž + + + + Serbian + セルビア語 + + + + Swedish + スウェーデン語 + + + + Turkish + トルコ語 + + + + Ukrainian + ウクライナ語 + + + + Simplified-Chinese + 簡体字中国語 + + + + Traditional Chinese + ç¹ä½“字中国語 + + + + <Autodetect> + <自動検出> + + + + Default + 既定 + + + + Language + 言語 + + + + &Interface + インターフェイス(&I) + + + + Seeking + シーク + + + + Recent files + 最近使ã£ãŸãƒ•ã‚¡ã‚¤ãƒ« + + + + Never + ã—ãªã„ + + + + Whenever it's needed + å¿…è¦ãªã¨ãã¯ã„ã¤ã‚‚ + + + + Only after loading a new video + æ–°ã—ã„ビデオã®èª­ã¿è¾¼ã¿å¾Œã®ã¿ + + + + Here you can change the language of the application. + ã“ã“ã§ã‚¢ãƒ—リケーションã®è¨€èªžã‚’変更ã§ãã¾ã™ã€‚ + + + + Instances + èµ·å‹• + + + + Catalan + カタロニア語 + + + + Basque + ãƒã‚¹ã‚¯èªž + + + + Galician + ガリシア語 + + + + &Short jump + 短ã„ジャンプ(&S) + + + + &Medium jump + 中ジャンプ(&M) + + + + &Long jump + é•·ã„ジャンプ(&L) + + + + Mouse &wheel jump + マウス ホイール ジャンプ(&W) + + + + &Use only one running instance of SMPlayer + 1 ã¤ã®ã¿ã® SMPlayer ã®èµ·å‹•ã‚’使用ã™ã‚‹(&U) + + + + SMPlayer will listen to this &port to receive commands from other instances: + SMPlayer ã¯ãã®ä»–ã‹ã‚‰ã‚³ãƒžãƒ³ãƒ‰ã‚’å—ä¿¡ã™ã‚‹ã®ã«ã“ã®ãƒãƒ¼ãƒˆã‚’è´ãã¾ã™(&P): + + + + Main window &resize method + メイン ウィンドウã®ã‚µã‚¤ã‚ºã®å¤‰æ›´æ–¹æ³•(&R) + + + + Ma&x. items + 最大ã®ã‚¢ã‚¤ãƒ†ãƒ æ•°(&X) + + + + St&yle: + スタイル(&Y): + + + + Ico&n set: + アイコン セット(&N): + + + + L&anguage: + 言語(&A): + + + + Main window + メイン ウィンドウ + + + + Auto&resize: + 自動サイズ変更(&R): + + + + R&emember position and size + ä½ç½®ã¨ã‚µã‚¤ã‚ºã‚’記憶ã™ã‚‹(&E) + + + + Default font: + 既定ã®ãƒ•ã‚©ãƒ³ãƒˆ: + + + + &Change... + 変更(&C)... + + + + PrefPerformance + + + Performance + パフォーマンス + + + + Priority + 優先度 + + + + Set process priority for mplayer according to the predefined priorities available under Windows.<br><b>WARNING:</b> Using realtime priority can cause system lockup. + Windows 下ã§åˆ©ç”¨å¯èƒ½ãªæ‰€å®šã®å„ªå…ˆåº¦ã«å¾“ã£ã¦ mplayer ã®ãƒ—ロセス優先度を設定ã—ã¾ã™ã€‚<br><b>警告:</b> リアルタイム優先度ã®ä½¿ç”¨ã¯ã‚·ã‚¹ãƒ†ãƒ  ロックアップを引ãèµ·ã“ã™å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ + + + + <br><b>Note:</b> This option is for Windows only. + <br><b>注æ„:</b> ã“ã®ã‚ªãƒ—ション㯠Windows 専用ã§ã™ã€‚ + + + + Cache + キャッシュ + + + + This option specifies how much memory (in kBytes) to use when precaching a file or URL. Especially useful on slow media. + ã“ã®ã‚ªãƒ—ションã¯ãƒ•ã‚¡ã‚¤ãƒ«ã¾ãŸã¯ URL をプリキャッãƒã—ãŸã¨ãã«ãƒ¡ãƒ¢ãƒª (k ãƒã‚¤ãƒˆ) ã‚’ã©ã®ãらã„使用ã™ã‚‹ã‹ã‚’指定ã—ã¾ã™ã€‚特ã«é…ã„メディアã«ãŠã„ã¦æœ‰ç”¨ã§ã™ã€‚ + + + + Allow frame drop + フレーム ドロップを許å¯ã™ã‚‹ + + + + Skip displaying some frames to maintain A/V sync on slow systems. + ã„ãã¤ã‹ã®ãƒ•ãƒ¬ãƒ¼ãƒ ã®è¡¨ç¤ºã‚’スキップã—ã¦é…ã„システムã§ã® A/V åŒæœŸã‚’維æŒã•ã›ã¾ã™ã€‚ + + + + Allow hard frame drop + ãƒãƒ¼ãƒ‰ フレーム ドロップを許å¯ã™ã‚‹ + + + + More intense frame dropping (breaks decoding). Leads to image distortion! + より強烈ãªãƒ•ãƒ¬ãƒ¼ãƒ  ドロップã§ã™ (デコードãŒç ´æã—ã¾ã™)。イメージã®æ­ªæ›²ã®åŽŸå› ã¨ãªã‚Šã¾ã™! + + + + Audio/video auto synchronization + オーディオ/ビデオã®è‡ªå‹•åŒæœŸåŒ– + + + + Gradually adjusts the A/V sync based on audio delay measurements. + å¾ã€…ã«ã‚ªãƒ¼ãƒ‡ã‚£ã‚ªã®é…延測定を基準ã«ã—㦠A/V åŒæœŸã‚’調整ã—ã¾ã™ã€‚ + + + + Form + フォーム + + + + &Performance + パフォーマンス(&P) + + + + Select the priority for the MPlayer process. + MPlayer プロセスã®å„ªå…ˆåº¦ã‚’é¸æŠžã—ã¾ã™ã€‚ + + + + Priority: + 優先度: + + + + realtime + リアルタイム + + + + high + 高 + + + + abovenormal + 通常ã®ä¸Š + + + + normal + 通常 + + + + belownormal + 通常ã®ä¸‹ + + + + idle + アイドル + + + + Size: + サイズ: + + + + KB + KB + + + + Use cache + キャッシュを使用ã™ã‚‹ + + + + Setting a cache may improve performance on slow media + キャッシュã®è¨­å®šã¯é…ã„メディアã§ã®ãƒ‘フォーマンスをå‘上ã•ã›ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ + + + + Allow hard frame drop (can lead to image distortion) + ãƒãƒ¼ãƒ‰ メディア ドロップを許å¯ã™ã‚‹ (イメージã®æ­ªæ›²ã®åŽŸå› ã¨ãªã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™) + + + + Synchronization + åŒæœŸåŒ– + + + + Factor: + è¦å› : + + + + Fast audio track switching + オーディオ トラックã®é«˜é€Ÿåˆ‡ã‚Šæ›¿ãˆ + + + + Fast seek to chapters in dvds + Dvd ã®ãƒãƒ£ãƒ—タを高速シークã™ã‚‹ + + + + Priorit&y: + 優先度(&Y): + + + + Si&ze: + サイズ(&Z): + + + + &Use cache + キャッシュを使用ã™ã‚‹(&U) + + + + &Allow frame drop + フレーム ドロップを許å¯ã™ã‚‹(&A) + + + + Allow &hard frame drop (can lead to image distortion) + ãƒãƒ¼ãƒ‰ フレーム ドロップを許å¯ã™ã‚‹ (イメージã®æ­ªæ›²ã®åŽŸå› ã¨ãªã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™)(&H) + + + + Audio/&video auto synchronization + オーディオ/ビデオã®è‡ªå‹•åŒæœŸåŒ–(&V) + + + + Fact&or: + è¦å› (&O): + + + + &Fast audio track switching + オーディオ トラックã®é«˜é€Ÿåˆ‡ã‚Šæ›¿ãˆ(&F) + + + + Fast &seek to chapters in dvds + Dvd ã®ãƒãƒ£ãƒ—タを高速シークã™ã‚‹(&S) + + + + Create index if needed + å¿…è¦ãªã‚‰ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’作æˆã™ã‚‹ + + + + Rebuilds index of files if no index was found, allowing seeking. Useful with broken/incomplete downloads, or badly created files. This option only works if the underlying media supports seeking (i.e. not with stdin, pipe, etc).<br> Note: the creation of the index may take some time. + インデックスãŒè¦‹ã¤ã‹ã‚‰ãªã‹ã£ãŸå ´åˆã«ãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’å†æ§‹ç¯‰ã—ã€ã‚·ãƒ¼ã‚¯ã‚’許å¯ã—ã¾ã™ã€‚ç ´æã—ãŸ/未完了ã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã€ã¾ãŸã¯ä¸è‰¯ã«ä½œæˆã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã«æœ‰ç”¨ã§ã™ã€‚ã“ã®ã‚ªãƒ—ションã¯åŸºç¤Žã¨ãªã‚‹ãƒ¡ãƒ‡ã‚£ã‚¢ãŒã‚·ãƒ¼ã‚¯ã‚’サãƒãƒ¼ãƒˆã™ã‚‹å ´åˆã®ã¿å‹•ä½œã—ã¾ã™ (ã™ãªã‚ã¡ stdinã€pipeã€ãªã©ã‚’æŒãŸãªã„ã‚‚ã®)。<br> 注æ„: インデックスã®ä½œæˆã«ã¯æ™‚é–“ãŒã‹ã‹ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ + + + + &Create index if needed + å¿…è¦ãªã‚‰ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’作æˆã™ã‚‹(&C) + + + + If checked, it will try the fastest method to switch audio tracks but might not work with some formats. + ãƒã‚§ãƒƒã‚¯ã•ã‚Œã¦ã„ã‚‹å ´åˆã€ã‚ªãƒ¼ãƒ‡ã‚£ã‚ª トラックを切り替ãˆã‚‹ã®ã«æœ€é€Ÿã®æ–¹æ³•ã‚’試行ã—ã¾ã™ãŒã„ãã¤ã‹ã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã§ã¯å‹•ä½œã—ãªã„å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ + + + + If checked, it will try the fastest method to seek to chapters but it might not work with some discs. + ãƒã‚§ãƒƒã‚¯ã•ã‚Œã¦ã„ã‚‹å ´åˆã€ãƒãƒ£ãƒ—タをシークã™ã‚‹ã®ã«æœ€é€Ÿã®æ–¹æ³•ã‚’試行ã—ã¾ã™ãŒã„ãã¤ã‹ã®ãƒ‡ã‚£ã‚¹ã‚¯ã§ã¯å‹•ä½œã—ãªã„å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ + + + + PrefSubtitles + + + Subtitles + 字幕 + + + + Choose a ttf file + Ttf ファイルをé¸æŠžã—ã¾ã™ + + + + Truetype Fonts + Truetype フォント + + + + Subtitle position + 字幕ã®ä½ç½® + + + + This option specifies the position of the subtitles over the video window. <i>100</i> means the bottom, while <i>0</i> means the top. + ã“ã®ã‚ªãƒ—ションã¯ãƒ“デオ ウィンドウ上ã®å­—幕ã®ä½ç½®ã‚’指定ã—ã¾ã™ã€‚<i>100</i> ã¯æœ€ä¸‹ã‚’æ„味ã—ã¾ã™ãŒã€<i>0</i> ã¯æœ€ä¸Šã‚’æ„味ã—ã¾ã™ã€‚ + + + + SSA/ASS styles + SSA/ASS スタイル + + + + Form + フォーム + + + + &Subtitles + 字幕(&S) + + + + Autoload + 自動読ã¿è¾¼ã¿ + + + + Autoload subtitles files (*.srt, *.sub...): + 自動読ã¿è¾¼ã¿å­—幕ファイル (*.srt, *.sub...): + + + + Select first available subtitle + ã¾ãšåˆ©ç”¨å¯èƒ½ãªå­—幕をé¸æŠžã™ã‚‹ + + + + Same name as movie + ムービーã¨åŒã˜åå‰ + + + + All subs containing movie name + ムービーã®åå‰ã‚’å«ã‚€ã™ã¹ã¦ã®å­—幕 + + + + All subs in directory + ディレクトリ内ã®ã™ã¹ã¦ã®å­—幕 + + + + Default subtitle encoding: + 既定ã®å­—幕エンコード: + + + + Position + ä½ç½® + + + + Default position of the subtitles on screen + ç”»é¢ä¸Šã®å­—幕ã®æ—¢å®šã®ä½ç½® + + + + 0 + 0 + + + + Top + 先頭㸠+ + + + Bottom + 末尾㸠+ + + + Include subtitles on screenshots + スクリーンショットã«å­—幕をå«ã‚ã‚‹ + + + + Use -subfont option (required by recent MPlayer releases) + -subfont オプションを使用ã™ã‚‹ (最近㮠MPlayer リリースã«ã‚ˆã£ã¦å¿…è¦ã¨ã•ã‚Œã¦ã„ã¾ã™) + + + + &Font + フォント(&F) + + + + Font + フォント + + + + TTF font: + TTF フォント: + + + + Search... + 検索... + + + + System font: + システム フォント: + + + + Select the font which will be used for subtitles (and OSD): + 字幕 (㨠OSD) ã«ä½¿ç”¨ã™ã‚‹ãƒ•ã‚©ãƒ³ãƒˆã‚’é¸æŠžã—ã¾ã™: + + + + Size + サイズ + + + + Autoscale: + オートスケール: + + + + No autoscale + 自動縮尺ãªã— + + + + Proportional to movie height + ムービーã®é«˜ã•ã«æ¯”例ã™ã‚‹ + + + + Proportional to movie width + ムービーã®å¹…ã«æ¯”例ã™ã‚‹ + + + + Proportional to movie diagonal + ムービーã®å¯¾è§’ç·šã«æ¯”例ã™ã‚‹ + + + + Scale: + スケール: + + + + SSA/&ASS library + SSA/ASS ライブラリ(&A) + + + + The new SSA/ASS library will provide nice styled subtitles for external SSA/ASS subtitles files and Matroska tracks. But it will be used too for rendering other formats like SUB and SRT files. + æ–°ã—ã„ SSA/ASS ライブラリã¯å¤–部㮠SSA/ASS 字幕ファイルãŠã‚ˆã³ Matroska トラックã«ã™ã¦ããªã‚¹ã‚¿ã‚¤ãƒ«ã®å­—幕をæä¾›ã—ã¾ã™ã€‚ã—ã‹ã— SUB ãŠã‚ˆã³ SRT ファイルã®ã‚ˆã†ãªãã®ä»–ã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã®æç”»ã«ã‚‚使用ã•ã‚Œã¾ã™ã€‚ + + + + Use SSA/ASS library for subtitle rendering + 字幕ã®æ画㫠SSA/ASS ライブラリを使用ã™ã‚‹ + + + + Text color: + テキストã®è‰²: + + + + Border color: + æž ã®è‰²: + + + + Here you can override styles for SSA/ASS subtitles. It can be also used for fine-tuning the rendering of SRT and SUB subtitles by the SSA/ASS library. Example: <b>Bold=1,Outline=2,Shadow=4</b> + ã“ã“㧠SSA/ASS 字幕ã®ã‚¹ã‚¿ã‚¤ãƒ«ã‚’優先的ã«æŒ‡å®šã§ãã¾ã™ã€‚SSA/ASS ライブラリã«ã‚ˆã‚‹ SRT ãŠã‚ˆã³ SUB 字幕ã®æç”»ã®å¾®èª¿æ•´ã«ã‚‚使用ã§ãã¾ã™ã€‚<br>例: <b>Bold=1,Outline=2,Shadow=4</b> + + + + Styles: + スタイル: + + + + Au&toload subtitles files (*.srt, *.sub...): + 字幕ファイル (*.srt, *.sub...) を自動読ã¿è¾¼ã¿ã™ã‚‹(&T): + + + + S&elect first available subtitle + 最åˆã«åˆ©ç”¨å¯èƒ½ãªå­—幕をé¸æŠžã™ã‚‹(&E) + + + + &Default subtitle encoding: + 既定ã®å­—幕エンコード(&D): + + + + Default &position of the subtitles on screen + 既定ã®ç”»é¢ä¸Šã®å­—幕ã®ä½ç½®(&P) + + + + &Include subtitles on screenshots + スクリーンショットã§å­—幕をå«ã‚ã‚‹(&I) + + + + &Use -subfont option (required by recent MPlayer releases) + -subfont オプションを使用ã™ã‚‹ (最近㮠MPlayer リリースã§å¿…è¦ã¨ã•ã‚Œã¦ã„ã¾ã™)(&U) + + + + &TTF font: + TTF フォント(&T): + + + + Sea&rch... + 検索(&R)... + + + + S&ystem font: + システム フォント(&Y): + + + + A&utoscale: + 自動縮尺(&U): + + + + S&cale: + 縮尺(&C): + + + + &Use SSA/ASS library for subtitle rendering + 字幕ã®æ画㫠SSA/ASS ライブラリを使用ã™ã‚‹(&U) + + + + &Text color: + テキストã®è‰²(&T): + + + + &Border color: + æž ã®è‰²(&B): + + + + St&yles: + スタイル(&Y): + + + + PreferencesDialog + + + SMPlayer - Help + SMPlayer - ヘルプ + + + + OK + OK + + + + Cancel + キャンセル + + + + Apply + é©ç”¨ + + + + Help + ヘルプ + + + + SMPlayer - Preferences + SMPlayer - 環境設定 + + + + QObject + + + 1 second + 1 秒 + + + + %1 seconds + %1 秒 + + + + %1 minutes + %1 分 + + + + %1 minutes and %2 seconds + %1 分㨠%2 秒 + + + + 1 minute + 1 分 + + + + 1 minute and 1 second + 1 分㨠2 秒 + + + + 1 minute and %1 seconds + 1 分㨠%1 秒 + + + + %1 minutes and 1 second + %1 分㨠1 秒 + + + + Usage: %1 [-ini-path [directory]] [-action action_name] [-close-at-end] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + 使用法: %1 [-ini-path [ディレクトリ]] [-action アクションå] [-close-at-end] [-help|--help|-h|-?] [[-playlist] メディア] [[-playlist] メディア]... + + + + specifies the directory for the configuration file (smplayer.ini). If directory is omitted, the application directory will be used. + 構æˆãƒ•ã‚¡ã‚¤ãƒ«ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’指定ã—ã¾ã™ (smplayer.ini)。ディレクトリãŒçœç•¥ã•ã‚Œã¦ã„ã‚‹å ´åˆã€ã‚¢ãƒ—リケーション ディレクトリãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ + + + + tries to make a connection to another running instance and send to it the specified action. Example: -action pause The rest of options (if any) will be ignored and the application will exit. It will return 0 on success or -1 on failure. + 別ã®èµ·å‹•ã¸ã®æŽ¥ç¶šã®ä½œæˆã¨æŒ‡å®šã•ã‚ŒãŸå‹•ä½œã®é€ä¿¡ã‚’試行ã—ã¾ã™ã€‚例: -action pause 残りã®ã‚ªãƒ—ション㯠(ã‚‚ã—ã‚ã‚Œã°) 無視ã•ã‚Œã¦ã‚¢ãƒ—リケーションã¯çµ‚了ã—ã¾ã™ã€‚æˆåŠŸæ™‚ã«ã¯ 0 ã¾ãŸã¯ 失敗時ã«ã¯ -1 ã‚’è¿”ã—ã¾ã™ã€‚ + + + + will show this message and then will exit. + ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã—ã¦æ¬¡ã«çµ‚了ã—ã¾ã™ã€‚ + + + + 'media' is any kind of file that SMPlayer can open. It can be a local file, a DVD (e.g. dvd://1), an Internet stream (e.g. mms://....) or a local playlist in format m3u. If the -playlist option is used, that means that SMPlayer will pass the -playlist option to MPlayer, so MPlayer will handle the playlist, not SMPlayer. + 'メディア' 㯠SMPlayer ãŒé–‹ãã“ã¨ã®ã§ãるファイルã®ã™ã¹ã¦ã®ã‚‚ã®ã§ã™ã€‚ローカル ファイルã€DVD (例ãˆã° dvd://1)ã€ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆ ストリーム (例ãˆã° mms://....) ã¾ãŸã¯ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆ m3u ã®ãƒ­ãƒ¼ã‚«ãƒ« プレイリストã«ã§ãã¾ã™ã€‚-playlist オプションãŒä½¿ç”¨ã•ã‚Œã¦ã„ã‚‹å ´åˆã€ãれ㯠MPlayer ㌠SMPlayer ã§ã¯ãªãã€ãƒ—レイリストをãƒãƒ³ãƒ‰ãƒ«ã™ã‚‹ã‚ˆã†ã«ã€SMPlayer ㌠MPlayer 㸠-playlist オプションを渡ã™ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚ + + + + the main window will be closed when the file/playlist finishes. + メイン ウィンドウã¯ãƒ•ã‚¡ã‚¤ãƒ«/プレイリストã®å®Œäº†æ™‚ã«é–‰ã˜ã‚‰ã‚Œã¾ã™ã€‚ + + + + This is SMPlayer v. %1 running on %2 + ã“れ㯠%2 ã§èµ·å‹•ä¸­ã® SMPlayer v. %1 ã§ã™ + + + + Usage: %1 [-ini-path [directory]] [-send-action action_name] [-actions action_list [-close-at-end] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + 使用法: %1 [-ini-path [ディレクトリ]] [-send-action 動作å] [-actions 動作ã®ä¸€è¦§ [-close-at-end] [-help|--help|-h|-?] [[-playlist] メディア] [[-playlist] メディア]... + + + + tries to make a connection to another running instance and send to it the specified action. Example: -send-action pause The rest of options (if any) will be ignored and the application will exit. It will return 0 on success or -1 on failure. + 別ã®èµ·å‹•ã¸ã®æŽ¥ç¶šã®ä½œæˆã¨æŒ‡å®šã•ã‚ŒãŸå‹•ä½œã®é€ä¿¡ã‚’試行ã—ã¾ã™ã€‚例: -send-action pause 残りã®ã‚ªãƒ—ション㯠(ã‚‚ã—ã‚ã‚Œã°) 無視ã•ã‚Œã¦ã‚¢ãƒ—リケーションã¯çµ‚了ã—ã¾ã™ã€‚æˆåŠŸæ™‚ã«ã¯ 0 ã¾ãŸã¯ 失敗時ã«ã¯ -1 ã‚’è¿”ã—ã¾ã™ã€‚ + + + + action_list is a list of actions separated by spaces. The actions will be executed just after loading the file (if any) in the same order you entered. For checkable actions you can pass true or false as parameter. Example: -actions "fullscreen compact true". Quotes are necessary in case you pass more than one action. + action_list ã¯ã‚¹ãƒšãƒ¼ã‚¹ã§åŒºåˆ‡ã‚‰ã‚ŒãŸå‹•ä½œã®ä¸€è¦§ã§ã™ã€‚動作ã¯å…¥åŠ›ã—ãŸã®ã¨åŒã˜é †åºã§ãƒ•ã‚¡ã‚¤ãƒ« (ã‚‚ã—ã‚ã‚Œã°) ã®èª­ã¿è¾¼ã¿ç›´å¾Œã«å®Ÿè¡Œã•ã‚Œã¾ã™ã€‚ãƒã‚§ãƒƒã‚¯å¯èƒ½ãªå‹•ä½œã«ã¯ãƒ‘ラメータã¨ã—㦠true ã¾ãŸã¯ false を渡ã™ã“ã¨ãŒã§ãã¾ã™ã€‚例: -actions "fullscreen compact true"。引用符㯠1 ã¤ä»¥ä¸Šã®å‹•ä½œã‚’渡ã™å ´åˆã«å¿…è¦ã§ã™ã€‚ + + + + media + メディア + + + + Usage: %1 [-ini-path [directory]] [-send-action action_name] [-actions action_list [-close-at-end] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + 使用法: %1 [-ini-path [ディレクトリ]] [-send-action アクションå] [-actions アクションã®ä¸€è¦§ [-close-at-end] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] メディア] [[-playlist] メディア]... + + + + if there's another instance running, the media will be added to that instance's playlist. If there's no other instance, this option will be ignored and the files will be opened in a new instance. + 別ã®èµ·å‹•ãŒã‚ã‚‹å ´åˆã€ãƒ¡ãƒ‡ã‚£ã‚¢ã¯èµ·å‹•ã®ãƒ—レイリストã«è¿½åŠ ã•ã‚Œã¾ã™ã€‚ãã®ä»–ã®èµ·å‹•ãŒãªã„å ´åˆã€ã“ã®ã‚ªãƒ—ションã¯ç„¡è¦–ã•ã‚Œã¦ãƒ•ã‚£ãƒ«ã¯æ–°ã—ã„èµ·å‹•ã§é–‹ã‹ã‚Œã¾ã™ã€‚ + + + + Usage: %1 [-ini-path directory] [-send-action action_name] [-actions action_list [-close-at-end] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + 使用法: %1 [-ini-path ディレクトリ] [-send-action 動作å] [-actions 動作ã®ä¸€è¦§ [-close-at-end] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] メディア] [[-playlist] メディア]... + + + + specifies the directory for the configuration file (smplayer.ini). + 構æˆãƒ•ã‚¡ã‚¤ãƒ« (smplayer.ini) ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’指定ã—ã¾ã™ã€‚ + + + + the main window won't be closed when the file/playlist finishes. + メイン ウィンドウã¯ãƒ•ã‚¡ã‚¤ãƒ«/プレイリストã®å®Œäº†æ™‚ã«é–‰ã˜ã‚‰ã‚Œã¾ã›ã‚“。 + + + + Usage: %1 [-ini-path directory] [-send-action action_name] [-actions action_list [-close-at-end] [-no-close-at-end] [-fullscreen] [-no-fullscreen] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + 使用法: %1 [-ini-path ディレクトリ] [-send-action 動作å] [-actions 動作ã®ä¸€è¦§ [-close-at-end] [-no-close-at-end] [-fullscreen] [-no-fullscreen] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] メディア] [[-playlist] メディア]... + + + + the video will be played in fullscreen mode. + ビデオã¯å…¨ç”»é¢è¡¨ç¤ºãƒ¢ãƒ¼ãƒ‰ã§å†ç”Ÿã•ã‚Œã¾ã™ã€‚ + + + + the video will be played in window mode. + ビデオã¯ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ モードã§å†ç”Ÿã•ã‚Œã¾ã™ã€‚ + + + + SeekWidget + + + icon + アイコン + + + + label + ラベル + + + + ShortcutGetter + + + Modify shortcut + ショートカットã®å¤‰æ›´ + + + + Clear + クリア + + + + Press the key combination you want to assign + 指定ã—ãŸã„キー コンビãƒãƒ¼ã‚·ãƒ§ãƒ³ã‚’押ã—ã¾ã™ + + + + Capture + キャプãƒãƒ£ + + + + Capture keystrokes + キーストロークã®ã‚­ãƒ£ãƒ—ãƒãƒ£ + + + + VideoEqualizer + + + Equalizer + イコライザ + + + + Contrast + コントラスト + + + + Brightness + 明る㕠+ + + + Hue + 色åˆã„ + + + + Saturation + 鮮やã‹ã• + + + + Gamma + ガンマ + + + + &Reset + リセット(&R) + + + + &Set as default values + 既定値ã¨ã—ã¦è¨­å®š(&S) + + + + Use the current values as default values for new videos. + ç¾åœ¨ã®å€¤ã‚’æ–°ã—ã„ビデオã®æ—¢å®šã®å€¤ã¨ã—ã¦ä½¿ç”¨ã—ã¾ã™ã€‚ + + + + Set all controls to zero. + ã™ã¹ã¦ã®ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«ã‚’ 0 ã«è¨­å®šã—ã¾ã™ã€‚ + + + diff --git a/retroshare-gui/src/apps/smplayer/translations/smplayer_ka.qm b/retroshare-gui/src/apps/smplayer/translations/smplayer_ka.qm new file mode 100644 index 000000000..6dc523bc2 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/translations/smplayer_ka.qm differ diff --git a/retroshare-gui/src/apps/smplayer/translations/smplayer_ka.ts b/retroshare-gui/src/apps/smplayer/translations/smplayer_ka.ts new file mode 100644 index 000000000..24ab51064 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/translations/smplayer_ka.ts @@ -0,0 +1,3800 @@ + + + + AboutDialog + + + Version: %1 + ვერსიáƒ: %1 + + + + 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. + ეს პრáƒáƒ’რáƒáƒ›áƒ წáƒáƒ áƒ›áƒáƒáƒ“გენს თáƒáƒ•áƒ˜áƒ¡áƒ£áƒ¤áƒáƒš პრáƒáƒ’რáƒáƒ›áƒ£áƒš უზრუნველყáƒáƒ¤áƒáƒ¡; თქვენ შეგიძლიáƒáƒ— გáƒáƒáƒ•áƒ áƒªáƒ”ლáƒáƒ— ის დáƒ/áƒáƒœ შეცვáƒáƒšáƒáƒ— ის Free Software Foundation ფáƒáƒœáƒ“ის მიერ გáƒáƒ›áƒáƒ¥áƒ•áƒ”ყნებული GNU GPL ლიცენზიáƒáƒ¨áƒ˜ გáƒáƒ—ვáƒáƒšáƒ˜áƒ¡áƒ¬áƒ˜áƒœáƒ”ბული წესების მიხედვით; რáƒáƒ’áƒáƒ áƒª ლიცენზიის მეáƒáƒ áƒ” ვერსიით, áƒáƒ¡áƒ”ვე (თქვენი გáƒáƒ“áƒáƒ¬áƒ§áƒ•áƒ”ტილებით) ნებისმიერი უფრრáƒáƒ®áƒáƒšáƒ˜ ვერსიით. + + + + Translators: + თáƒáƒ áƒ¯áƒ˜áƒ›áƒœáƒ”ბი: + + + + German + გერმáƒáƒœáƒ£áƒšáƒ˜ + + + + Slovak + სლáƒáƒ•áƒáƒ™áƒ£áƒ áƒ˜ + + + + Italian + იტáƒáƒšáƒ˜áƒ£áƒ áƒ˜ + + + + French + ფრáƒáƒœáƒ’ული + + + + Simplified-Chinese + გáƒáƒ›áƒáƒ áƒ¢áƒ˜áƒ•áƒ”ბული ჩინური + + + + Russian + რუსული + + + + Hungarian + უნგრული + + + + Japanese + იáƒáƒžáƒáƒœáƒ£áƒ áƒ˜ + + + + Dutch + ჰáƒáƒšáƒáƒœáƒ“იური + + + + Ukrainian + უკრáƒáƒ˜áƒœáƒ£áƒšáƒ˜ + + + + Georgian + ქáƒáƒ áƒ—ული + + + + Czech + ჩეხური + + + + Logo designed by %1 + ლáƒáƒ’áƒáƒ¡ áƒáƒ•áƒ¢áƒáƒ áƒ˜ - %1 + + + + Get updates at: %1 + მიიღეთ გáƒáƒœáƒáƒ®áƒšáƒ”ბები გვერდიდáƒáƒœ: %1 + + + + About SMPlayer + SMPlayer-ის შესáƒáƒ®áƒ”ბ + + + + Polish + პáƒáƒšáƒáƒœáƒ£áƒ áƒ˜ + + + + Bulgarian + + + + + Turkish + თურქული + + + + Swedish + + + + + Serbian + + + + + Traditional Chinese + + + + + Romanian + + + + + Portuguese - Brazil + + + + + Portuguese - Portugal + + + + + Compiled with Qt %1 + + + + + %1, %2 and %3 + + + + + %1 and %2 + + + + + http://smplayer.sourceforge.net/en/windows/download.php + If the web page is translated into your language you can change the URL so it points to the download page in the translation.Otherwise leave as is. + + + + + http://smplayer.sourceforge.net/en/linux/download.php + If the web page is translated into your language you can change the URL so it points to the download page in the translation.Otherwise leave as is. + + + + + <b>%1</b>: %2 + + + + + ActionsEditor + + + Name + დáƒáƒ¡áƒáƒ®áƒ”ლებრ+ + + + Description + + + + + Shortcut + + + + + &Save + შენáƒ&ხვრ+ + + + &Load + ჩáƒ&ტვირთვრ+ + + + Key files + + + + + Choose a filename + áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი + + + + Confirm overwrite? + დáƒáƒ•áƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒáƒ— შეცვლáƒ? + + + + The file %1 already exists. +Do you want to overwrite? + ფáƒáƒ˜áƒšáƒ˜ %1 უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს. +გსურთ მისი შეცვლáƒ? + + + + Choose a file + áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ ფáƒáƒ˜áƒšáƒ˜ + + + + Error + + + + + The file couldn't be saved + + + + + The file couldn't be loaded + + + + + &Change shortcut... + + + + + BaseGui + + + &File... + &ფáƒáƒ˜áƒšáƒ˜... + + + + D&irectory... + დ&ირექტáƒáƒ áƒ˜áƒ... + + + + &Playlist... + რე&პერტუáƒáƒ áƒ˜... + + + + &DVD from drive + &DVD áƒáƒ›áƒ«áƒ áƒáƒ•áƒ˜áƒ“áƒáƒœ + + + + D&VD from folder... + D&VD დáƒáƒ¡áƒ¢áƒ˜áƒ“áƒáƒœ... + + + + &URL... + &URL... + + + + P&lay + დáƒ&კვრრ+ + + + &Pause + &პáƒáƒ£áƒ–რ+ + + + &Stop + &გáƒáƒ©áƒ”რებრ+ + + + &Frame step + კáƒáƒ“რული ბი&ჯი + + + + &Repeat + გáƒáƒ›áƒ”áƒ&რებრ+ + + + &Normal speed + &ნáƒáƒ áƒ›áƒáƒšáƒ£áƒ áƒ˜ სიჩქáƒáƒ áƒ” + + + + &Halve speed + ნáƒ&ხევáƒáƒ áƒ˜ სიჩქáƒáƒ áƒ” + + + + &Double speed + &áƒáƒ áƒ›áƒáƒ’ი სიჩქáƒáƒ áƒ” + + + + Speed &-10% + სიჩქáƒáƒ áƒ” &-10% + + + + Speed &+10% + სიჩქáƒáƒ áƒ” &+10% + + + + Sp&eed + სი&ჩქáƒáƒ áƒ” + + + + &Fullscreen + მთელს ეკრáƒáƒœ&ზე + + + + &Compact mode + &კáƒáƒ›áƒžáƒáƒ¥áƒ¢áƒ£áƒ áƒ˜ რეჟიმი + + + + &Equalizer + &ეკვáƒáƒšáƒáƒ˜áƒ–ერი + + + + &Screenshot + ეკრáƒáƒœáƒ˜&ს áƒáƒœáƒáƒ‘ეჭდი + + + + S&tay on top + &ყáƒáƒ•áƒ”ლთვის ზემáƒáƒ“áƒáƒœ + + + + &Postprocessing + &შემდგáƒáƒ›áƒ˜ დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბრ+ + + + &Autodetect phase + ფáƒáƒ–ის &áƒáƒ•áƒ¢áƒáƒáƒ›áƒáƒªáƒœáƒáƒ‘რ+ + + + &Deblock + &Deblock + + + + De&ring + De&ring + + + + Add n&oise + &ხმáƒáƒ£áƒ áƒ˜áƒ¡ დáƒáƒ›áƒáƒ¢áƒ”ბრ+ + + + F&ilters + ფ&ილტრები + + + + &Mute + გáƒ&ჩუმებრ+ + + + Volume &- + ხმრ&- + + + + Volume &+ + ხმრ&+ + + + + &Delay - + &დáƒáƒ§áƒáƒ•áƒœáƒ”ბრ- + + + + D&elay + + დáƒ&ყáƒáƒ•áƒœáƒ”ბრ+ + + + + &Extrastereo + &ექსტრáƒáƒ¡áƒ¢áƒ”რერ+ + + + &Karaoke + &კáƒáƒ áƒáƒáƒ™áƒ” + + + + &Filters + &ფილტრები + + + + &Load... + ჩáƒ&ტვირთვáƒ... + + + + Delay &- + დáƒáƒ§áƒáƒ•áƒœáƒ”ბრ&- + + + + Delay &+ + დáƒáƒ§áƒáƒ•áƒœáƒ”ბრ&+ + + + + &Up + &ზევით + + + + &Down + &ქვევით + + + + &Playlist + რე&პერტუáƒáƒ áƒ˜ + + + + &Show frame counter + კáƒáƒ“რების მ&თვლელის ჩვენებრ+ + + + P&references + პáƒ&რáƒáƒ›áƒ”ტრები + + + + &View logs + &ჟურნáƒáƒšáƒ”ბის ჩვენებრ+ + + + About &Qt + &Qt-ს შესáƒáƒ®áƒ”ბ + + + + About &SMPlayer + &SMPlayer-ის შესáƒáƒ®áƒ”ბ + + + + &Open + &გáƒáƒ®áƒ¡áƒœáƒ + + + + &Play + დáƒ&კვრრ+ + + + &Video + &ვიდერ+ + + + &Audio + &áƒáƒ£áƒ“ირ+ + + + &Subtitles + &სუბტიტრები + + + + &Browse + &ნუსხრ+ + + + Op&tions + პáƒáƒ áƒáƒ›áƒ”&ტრები + + + + &Help + დáƒ&ხმáƒáƒ áƒ”ბრ+ + + + &Recent files + &წინრფáƒáƒ˜áƒšáƒ”ბი + + + + &Clear + &გáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•áƒ”ბრ+ + + + Si&ze + &ზáƒáƒ›áƒ + + + + &Aspect ratio + &ფáƒáƒ áƒ“áƒáƒ‘რ+ + + + &Deinterlace + &დეინტერლáƒáƒªáƒ˜áƒ + + + + De&noise + &ხმáƒáƒ£áƒ áƒ˜áƒ¡ მáƒáƒ®áƒ¡áƒœáƒ + + + + &Autodetect + &áƒáƒ•áƒ¢áƒáƒáƒ›áƒáƒªáƒœáƒáƒ‘რ+ + + + &4:3 + &4:3 + + + + &5:4 + &5:4 + + + + &14:9 + &14:9 + + + + 16:&9 + 16:&9 + + + + 1&6:10 + 1&6:10 + + + + &2.35:1 + &2.35:1 + + + + 4:3 &Letterbox + 4:3 &Letterbox + + + + 16:9 L&etterbox + 16:9 L&etterbox + + + + 4:3 &Panscan + 4:3 &Panscan + + + + 4:3 &to 16:9 + 4:3 -> 16:9-&ზე + + + + &None + &áƒáƒ áƒáƒ + + + + &Lowpass5 + &Lowpass5 + + + + Linear &Blend + სწრფივი &შერევრ+ + + + N&ormal + ნ&áƒáƒ áƒ›áƒáƒšáƒ£áƒ áƒ˜ + + + + &Soft + რ&ბილი + + + + &Track + &ჩáƒáƒœáƒáƒ¬áƒ”რი + + + + &Channels + áƒáƒ &ხები + + + + &Stereo mode + &სტერეáƒáƒ áƒ”ჟიმი + + + + &Default + &ნáƒáƒ’ულისხმები + + + + &Stereo + &სტერერ+ + + + &4.0 Surround + &4.0 Surround + + + + &5.1 Surround + &5.1 Surround + + + + &Left channel + მáƒáƒ &ცხენრáƒáƒ áƒªáƒ˜ + + + + &Right channel + მáƒáƒ &ჯვენრáƒáƒ áƒ®áƒ˜ + + + + &Select + áƒ&რჩევრ+ + + + &Title + &სáƒáƒ—áƒáƒ£áƒ áƒ˜ + + + + &Chapter + &თáƒáƒ•áƒ˜ + + + + &Angle + &კუთხე + + + + &OSD + &OSD + + + + &Disabled + გáƒáƒ—ი&შულირ+ + + + &Seek bar + გáƒáƒ“áƒ&სვლის ზáƒáƒšáƒ˜ + + + + &Time + &დრრ+ + + + Time + T&otal time + დრრ+ &ჯáƒáƒ›áƒ£áƒ áƒ˜ დრრ+ + + + SMPlayer - mplayer log + SMPlayer - mplayer-ის ჟურნáƒáƒšáƒ˜ + + + + SMPlayer - smplayer log + SMPlayer - smplayer-ის ჟურნáƒáƒšáƒ˜ + + + + <empty> + <ცáƒáƒ áƒ˜áƒ”ლიáƒ> + + + + Video + ვიდერ+ + + + Audio + áƒáƒ£áƒ“ირ+ + + + Playlists + რეპერტუáƒáƒ áƒ”ბი + + + + All files + ყველრფáƒáƒ˜áƒšáƒ˜ + + + + Choose a file + áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ ფáƒáƒ˜áƒšáƒ˜ + + + + SMPlayer - Information + SMPlayer - ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ + + + + The CDROM / DVD drives are not configured yet. +The configuration dialog will be shown now, so you can do it. + CDROM / DVD áƒáƒ›áƒ«áƒ áƒáƒ•áƒ”ბი ჯერ áƒáƒ  áƒáƒ áƒ˜áƒ¡ გáƒáƒ›áƒáƒ áƒ—ული.(new line)კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ დიáƒáƒšáƒáƒ’ი áƒáƒ®áƒšáƒ გáƒáƒ›áƒáƒ©áƒœáƒ“ებáƒ, შეგიძლიáƒáƒ— გáƒáƒ›áƒáƒ áƒ—áƒáƒ— ისინი. + + + + Choose a directory + áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ დáƒáƒ¡áƒ¢áƒ + + + + Subtitles + სუბტიტრები + + + + About Qt + Qt-ს შესáƒáƒ®áƒ”ბ + + + + Playing %1 + ვუკრáƒáƒ• %1-ს + + + + Pause + პáƒáƒ£áƒ–რ+ + + + Stop + შეჩერებრ+ + + + Play / Pause + დáƒáƒ™áƒ•áƒ áƒ / პáƒáƒ£áƒ–რ+ + + + Pause / Frame step + პáƒáƒ£áƒ–რ/ კáƒáƒ“რული ბიჯი + + + + U&nload + &გáƒáƒ›áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვრ+ + + + V&CD + + + + + C&lose + + + + + View &info and properties... + + + + + Zoom &- + + + + + Zoom &+ + + + + + &Reset + &სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრები + + + + Move &left + + + + + Move &right + + + + + Move &up + &ზევით áƒáƒ¬áƒ”ვრ+ + + + Move &down + &ქვევით ჩáƒáƒ¬áƒ”ვრ+ + + + &Pan && scan + + + + + &Previous line in subtitles + + + + + N&ext line in subtitles + + + + + -%1 + + + + + +%1 + + + + + Dec volume (2) + + + + + Inc volume (2) + + + + + Exit fullscreen + + + + + OSD - Next level + + + + + Dec contrast + + + + + Inc contrast + + + + + Dec brightness + + + + + Inc brightness + + + + + Dec hue + + + + + Inc hue + + + + + Dec saturation + + + + + Dec gamma + + + + + Next audio + + + + + Next subtitle + + + + + Next chapter + + + + + Previous chapter + + + + + Inc saturation + + + + + Inc gamma + + + + + &Load external file... + + + + + &Kerndeint + + + + + &Yadif (normal) + + + + + Y&adif (double framerate) + + + + + &Next + &შემდეგი + + + + Pre&vious + &წინრ+ + + + Volume &normalization + + + + + &Audio CD + + + + + Denoise nor&mal + + + + + Denoise &soft + + + + + Denoise o&ff + + + + + Use SSA/&ASS library + + + + + Flip i&mage + + + + + &Toggle double size + + + + + BaseGuiPlus + + + SMPlayer is still running here + + + + + S&how icon in system tray + + + + + &Hide + + + + + &Restore + + + + + &Recent files + &წინრფáƒáƒ˜áƒšáƒ”ბი + + + + &Quit + + + + + Playlist + რეპერტუáƒáƒ áƒ˜ + + + + Core + + + Brightness: %1 + სიკáƒáƒ¨áƒ™áƒáƒ¨áƒ”: %1 + + + + Contrast: %1 + კáƒáƒœáƒ¢áƒ áƒáƒ¡áƒ¢áƒ˜: %1 + + + + Gamma: %1 + გáƒáƒ›áƒ: %1 + + + + Hue: %1 + ტáƒáƒœáƒ˜: %1 + + + + Saturation: %1 + ინტენსივáƒáƒ‘áƒ: %1 + + + + Volume: %1 + ხმáƒ: %1 + + + + Zoom: %1 + + + + + DefaultGui + + + Welcome to SMPlayer + მáƒáƒ’ესáƒáƒšáƒ›áƒ”ბáƒáƒ— SMPlayer + + + + Volume + ხმრ+ + + + Audio + áƒáƒ£áƒ“ირ+ + + + Subtitle + სუბტიტრები + + + + Playlist + რეპერტუáƒáƒ áƒ˜ + + + + &Main toolbar + &ძირითáƒáƒ“ი პáƒáƒœáƒ”ლი + + + + &Language toolbar + ენის პáƒ&ნელი + + + + &Toolbars + &ინსრუმენტთრპáƒáƒœáƒ”ლები + + + + Encodings + + + Western European Languages + დáƒáƒ¡áƒáƒ•áƒšáƒ”თევრáƒáƒžáƒ£áƒšáƒ˜ ენები + + + + Western European Languages with Euro + დáƒáƒ¡áƒáƒ•áƒšáƒ”თევრáƒáƒžáƒ£áƒšáƒ˜ ენები ევრáƒáƒ¡ მხáƒáƒ áƒ“áƒáƒ­áƒ”რით + + + + Slavic/Central European Languages + სლáƒáƒ•áƒ£áƒ áƒ˜/ცენტრáƒáƒšáƒ£áƒ áƒ”ვრáƒáƒžáƒ£áƒšáƒ˜ ენები + + + + Esperanto, Galician, Maltese, Turkish + ესპერáƒáƒœáƒ¢áƒ, გáƒáƒšáƒ˜áƒªáƒ˜áƒ£áƒ áƒ˜, მáƒáƒšáƒ¢áƒ£áƒ áƒ˜, თურქული + + + + Old Baltic charset + ძველი ბáƒáƒšáƒ¢áƒ˜áƒ£áƒ áƒ˜ სიმბáƒáƒšáƒáƒ”ბის ნáƒáƒ™áƒ áƒ”ბი + + + + Cyrillic + კირილიცრ+ + + + Arabic + áƒáƒ áƒáƒ‘ული + + + + Modern Greek + თáƒáƒœáƒáƒ›áƒ”დრáƒáƒ•áƒ” ბერძნული + + + + Turkish + თურქული + + + + Baltic + ბáƒáƒšáƒ¢áƒ˜áƒ£áƒ áƒ˜ + + + + Celtic + კელტური + + + + Hebrew charsets + ებრáƒáƒ£áƒš სიმბáƒáƒšáƒáƒ—რნáƒáƒ™áƒ áƒ”ბი + + + + Russian + რუსული + + + + Ukrainian, Belarusian + უკრáƒáƒ˜áƒœáƒ£áƒšáƒ˜, ბელáƒáƒ áƒ£áƒ¡áƒ£áƒšáƒ˜ + + + + Simplified Chinese charset + გáƒáƒ›áƒáƒ áƒ¢áƒ˜áƒ•áƒ”ბული ჩინურის სიმბáƒáƒšáƒáƒ—რნáƒáƒ™áƒ áƒ”ბი + + + + Traditional Chinese charset + ტრáƒáƒ“იციული ჩინურის სიმბáƒáƒšáƒáƒ—რნáƒáƒ™áƒ áƒ”ბი + + + + Japanese charsets + იáƒáƒžáƒáƒœáƒ£áƒ  სიმბáƒáƒšáƒáƒ—რნáƒáƒ™áƒ áƒ”ბი + + + + Korean charset + კáƒáƒ áƒ”ულ სიმბáƒáƒšáƒáƒ—რნáƒáƒ™áƒ áƒ”ბი + + + + Thai charset + ტáƒáƒ˜áƒšáƒáƒœáƒ“ურ სიმბáƒáƒšáƒáƒ—რნáƒáƒ™áƒ áƒ”ბი + + + + Cyrillic Windows + Windows-ის კირილიცრ+ + + + Slavic/Central European Windows + Windows-ის სლáƒáƒ•áƒ£áƒ áƒ˜/დენტრáƒáƒšáƒ£áƒ áƒ”ვრáƒáƒžáƒ£áƒšáƒ˜ + + + + Arabic Windows + + + + + EqSlider + + + icon + ხáƒáƒ¢áƒ£áƒšáƒ + + + + FilePropertiesDialog + + + SMPlayer - File properties + + + + + &Information + + + + + &Demuxer + &დემულტიპლექსáƒáƒ áƒ˜ + + + + &Select the demuxer that will be used for this file: + áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ áƒáƒ› ფáƒáƒ˜áƒšáƒ˜áƒ¡ დემულტიპლექ&სáƒáƒ áƒ˜: + + + + &Reset + &სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრები + + + + &Video codec + &ვიდერკáƒáƒ“ეკი + + + + &Select the video codec: + áƒáƒ˜áƒ &ჩიეთ ვიდერკáƒáƒ“ეკი: + + + + A&udio codec + áƒ&უდირკáƒáƒ“ეკი + + + + &Select the audio codec: + áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ áƒáƒ£áƒ“ირ&კáƒáƒ“ეკი: + + + + &MPlayer options + &MPlayer-ის პáƒáƒ áƒáƒ›áƒ”ტრები + + + + Additional Options for MPlayer + + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + + + + + &Options: + &პáƒáƒ áƒáƒ›áƒ”ტრები: + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + áƒáƒ’რეთქე შეგიძლიáƒáƒ— დáƒáƒ›áƒáƒ¢áƒ”ბითი ვიდეáƒáƒ¤áƒ˜áƒšáƒ áƒ”ბის მითითებáƒ. +გáƒáƒ›áƒáƒ§áƒáƒ•áƒ˜áƒ— ისინი "," სიმბáƒáƒšáƒáƒ¡ სáƒáƒ¨áƒ£áƒáƒšáƒ”ბით. áƒáƒ  გáƒáƒ›áƒáƒ¢áƒáƒ•áƒáƒ— áƒáƒ“გილი! +მáƒáƒ’áƒáƒšáƒ˜áƒ—ი: scale=512:-2,eq2=1.1 + + + + V&ideo filters: + ვ&იდეáƒáƒ¤áƒ˜áƒšáƒ¢áƒ áƒ”ბი: + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + დრბáƒáƒšáƒáƒ¡ - áƒáƒ£áƒ“იáƒáƒ¤áƒ˜áƒšáƒ áƒ¢áƒ áƒ”ბი. იგივე წესით რáƒáƒ’áƒáƒ áƒª ვიდეáƒáƒ¤áƒ˜áƒšáƒ áƒ”ბი. +მáƒáƒ’áƒáƒšáƒ˜áƒ—ი: resample=44100:0:0,volnorm + + + + Audio &filters: + áƒáƒ£áƒ“იáƒ&ფილტრები: + + + + OK + + + + + Cancel + + + + + Apply + + + + + InfoFile + + + General + ძირითáƒáƒ“ი + + + + Size + ზáƒáƒ›áƒ + + + + %1 KB (%2 MB) + %1 კბ (%2 მბ) + + + + URL + URL + + + + Length + ხáƒáƒœáƒ’რძლივáƒáƒ‘რ+ + + + Demuxer + დემულტიპლექსáƒáƒ áƒ˜ + + + + Name + დáƒáƒ¡áƒáƒ®áƒ”ლებრ+ + + + Artist + შემსრულებელი + + + + Author + áƒáƒ•áƒ¢áƒáƒ áƒ˜ + + + + Album + áƒáƒšáƒ‘áƒáƒ›áƒ˜ + + + + Genre + ჟáƒáƒœáƒ áƒ˜ + + + + Date + თáƒáƒ áƒ˜áƒ¦áƒ˜ + + + + Track + ჩáƒáƒœáƒáƒ¬áƒ”რი + + + + Copyright + სáƒáƒáƒ•áƒ¢áƒáƒ áƒ უფლებები + + + + Comment + კáƒáƒ›áƒ”ნტáƒáƒ áƒ˜ + + + + Software + პრáƒáƒ’რáƒáƒ›áƒ + + + + Clip info + ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ - კლიპი + + + + Video + ვიდერ+ + + + Resolution + გáƒáƒ áƒ©áƒ”ვáƒáƒ“áƒáƒ‘რ+ + + + Aspect ratio + თáƒáƒœáƒáƒ¤áƒáƒ áƒ“áƒáƒ‘რ+ + + + Format + ფáƒáƒ áƒ›áƒáƒ¢áƒ˜ + + + + Bitrate + ბიტური სიხშირე + + + + %1 kbps + %1 კბწმ + + + + Frames per second + კáƒáƒ“რი წáƒáƒ›áƒ¨áƒ˜ + + + + Selected codec + áƒáƒ áƒ©áƒ”ული კáƒáƒ“ეკი + + + + Initial Audio Stream + სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ áƒáƒ£áƒ“იáƒáƒœáƒáƒ™áƒáƒ“ი + + + + Rate + სიხშირე + + + + %1 Hz + %1 ჰც + + + + Channels + áƒáƒ áƒ®áƒ”ბი + + + + Audio Streams + áƒáƒ£áƒ“იáƒáƒœáƒáƒ™áƒáƒ“ები + + + + Language + ენრ+ + + + empty + ცáƒáƒ áƒ˜áƒ”ლირ+ + + + Subtitles + სუბტიტრები + + + + Type + ტიპი + + + + ID + Info for translators: this is a identification code + ID + + + + # + Info for translators: this is a abbreviation for number + # + + + + Stream title + + + + + Stream URL + + + + + File + + + + + InputDVDDirectory + + + Choose a directory + áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ დირექტáƒáƒ áƒ˜áƒ + + + + SMPlayer - Play a DVD from a folder + SMPlayer - დáƒáƒ£áƒ™áƒáƒ áƒ˜áƒ— DVD დáƒáƒ¡áƒ¢áƒ˜áƒ“áƒáƒœ + + + + You can play a dvd from your hard disc. Just select the folder which contains the VIDEO_TS and AUDIO_TS directories. + თქვენ შეგიძლიáƒáƒ— გáƒáƒ£áƒ¨áƒ•áƒáƒ— dvd თქვენი მყáƒáƒ áƒ˜ დისკიდáƒáƒœ. უბრáƒáƒšáƒáƒ“ áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ დáƒáƒ¡áƒ¢áƒ რáƒáƒ›áƒ”ლიც შეიცვს VIDEO_TS დრAUDIO_TS დირექტáƒáƒ áƒ˜áƒ”ბს. + + + + Choose a directory... + áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ დირექტáƒáƒ áƒ˜áƒ... + + + + InputURL + + + SMPlayer - Enter URL + + + + + &URL: + + + + + It's a &playlist + + + + + If this option is checked, the URL will be treated as a playlist: it will be opened as text and will play the URLs in it. + + + + + LogWindow + + + Choose a filename to save under + áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ ჩáƒáƒ¡áƒáƒ¬áƒ”რი ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი + + + + Confirm overwrite? + დáƒáƒ•áƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒáƒ— შეცვლáƒ? + + + + The file already exists. +Do you want to overwrite? + ფáƒáƒ˜áƒšáƒ˜ უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს. +გსურთ მისი შეცვლáƒ? + + + + Error saving file + შეცდáƒáƒ›áƒ ფáƒáƒ˜áƒšáƒ˜áƒ¡ შენáƒáƒ®áƒ•áƒ˜áƒ¡áƒáƒ¡ + + + + The log couldn't be saved + ჟურნáƒáƒšáƒ˜áƒ¡ შენáƒáƒ®áƒ•áƒ ვერ მáƒáƒ®áƒ”რხდრ+ + + + Logs + ჟურნáƒáƒšáƒ”ბი + + + + LogWindowBase + + + Log Window + ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒœáƒ¯áƒáƒ áƒ + + + + Save + შენáƒáƒ®áƒ•áƒ + + + + Copy to clipboard + გáƒáƒªáƒ•áƒšáƒ˜áƒ¡ ბუფერში შენáƒáƒ®áƒ•áƒ + + + + Close + დáƒáƒ™áƒ”ტვრ+ + + + &Close + დáƒ&კეტვრ+ + + + Playlist + + + Name + დáƒáƒ¡áƒáƒ®áƒ”ლებრ+ + + + Length + ხáƒáƒœáƒ’რძლივáƒáƒ‘რ+ + + + &Play + დáƒ&კვრრ+ + + + &Edit + რ&ედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბრ+ + + + Playlists + რეპერტუáƒáƒ áƒ”ბი + + + + Choose a file + áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ ფáƒáƒ˜áƒšáƒ˜ + + + + Choose a filename + áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი + + + + Confirm overwrite? + დáƒáƒ•áƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒáƒ— შეცვლáƒ? + + + + The file %1 already exists. +Do you want to overwrite? + ფáƒáƒ˜áƒšáƒ˜ %1 უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს. +გსურთ მისი შეცვლáƒ? + + + + All files + ყველრფáƒáƒ˜áƒšáƒ˜ + + + + Select one or more files to open + გáƒáƒ¡áƒáƒ®áƒ¡áƒœáƒ”ლáƒáƒ“ áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ ერთი áƒáƒœ რáƒáƒ›áƒáƒ“ენიმე ფáƒáƒ˜áƒšáƒ˜ + + + + Choose a directory + áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ დირექტáƒáƒ áƒ˜áƒ + + + + Edit name + სáƒáƒ®áƒ”ლის რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბრ+ + + + Type the name that will be displayed in the playlist for this file: + შეიყვáƒáƒœáƒ”თ სáƒáƒ®áƒ”ლი რáƒáƒ›áƒ”ლიც იქნებრგáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ˜ რეპერტუáƒáƒ áƒ˜áƒ¨áƒ˜ áƒáƒ› ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ—ვის: + + + + &Load + ჩáƒ&ტვირთვრ+ + + + &Save + შენáƒ&ხვრ+ + + + &Next + &შემდეგი + + + + Pre&vious + &წინრ+ + + + Move &up + &ზევით áƒáƒ¬áƒ”ვრ+ + + + Move &down + &ქვევით ჩáƒáƒ¬áƒ”ვრ+ + + + &Repeat + გáƒáƒ›áƒ”áƒ&რებრ+ + + + S&huffle + áƒáƒ áƒ”&ვრ+ + + + Add &current file + &მიმდინáƒáƒ áƒ” ფáƒáƒ˜áƒšáƒ˜áƒ¡ დáƒáƒ›áƒáƒ¢áƒ”ბრ+ + + + Add &file(s) + &ფáƒáƒ˜áƒš(ებ)ის დáƒáƒ›áƒáƒ¢áƒ”ბრ+ + + + Add &directory + &დირექტáƒáƒ áƒ˜áƒ˜áƒ¡ დáƒáƒ›áƒáƒ¢áƒ”ბრ+ + + + Remove &selected + áƒ&რჩეულის áƒáƒ›áƒáƒ¦áƒ”ბრ+ + + + Remove &all + ყველ&áƒáƒ¡ áƒáƒ›áƒáƒ¦áƒ”ბრ+ + + + SMPlayer - Playlist + SMPlayer - რეპერტუáƒáƒ áƒ˜ + + + + Add... + დáƒáƒ›áƒáƒ¢áƒ”ბáƒ... + + + + Remove... + áƒáƒ›áƒáƒ¦áƒ”ბáƒ... + + + + Playlist modified + + + + + There are unsaved changes, do you want to save the playlist? + + + + + PrefAdvanced + + + Advanced + დáƒáƒ›áƒáƒ¢áƒ”ბითი + + + + Auto + + + + + &Advanced + + + + + icon + ხáƒáƒ¢áƒ£áƒšáƒ + + + + Additional Options for MPlayer + + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + áƒáƒ’რეთქე შეგიძლიáƒáƒ— დáƒáƒ›áƒáƒ¢áƒ”ბითი ვიდეáƒáƒ¤áƒ˜áƒšáƒ áƒ”ბის მითითებáƒ. +გáƒáƒ›áƒáƒ§áƒáƒ•áƒ˜áƒ— ისინი "," სიმბáƒáƒšáƒáƒ¡ სáƒáƒ¨áƒ£áƒáƒšáƒ”ბით. áƒáƒ  გáƒáƒ›áƒáƒ¢áƒáƒ•áƒáƒ— áƒáƒ“გილი! +მáƒáƒ’áƒáƒšáƒ˜áƒ—ი: scale=512:-2,eq2=1.1 + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + დრბáƒáƒšáƒáƒ¡ - áƒáƒ£áƒ“იáƒáƒ¤áƒ˜áƒšáƒ áƒ¢áƒ áƒ”ბი. იგივე წესით რáƒáƒ’áƒáƒ áƒª ვიდეáƒáƒ¤áƒ˜áƒšáƒ áƒ”ბი. +მáƒáƒ’áƒáƒšáƒ˜áƒ—ი: resample=44100:0:0,volnorm + + + + Don't repaint the background of the video window + + + + + &Logs + + + + + Log MPlayer output + + + + + Log SMPlayer output + + + + + This option is mainly intended for debugging the application. + ეს პáƒáƒ áƒáƒ›áƒ”ტრი ძირითáƒáƒ“áƒáƒ“ გáƒáƒœáƒ™áƒ£áƒ—ვნილირპრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ გáƒáƒ›áƒáƒ áƒ—ვისáƒáƒ—ვის. + + + + &MPlayer language + + + + + SMPlayer needs to read and parse the output of MPlayer and sometimes it relies on English text. If you are using a MPlayer translated into another language, then you need to change the texts that SMPlayer looks for. (Technically you should enter regular expressions)<br><br> +The drop-down lists may provide already made regular expression for several languages. + + + + + Checking this option may reduce flickering, but it also might produce that the video won't be displayed properly. + + + + + If checked, smplayer will store the output of mplayer (you can see it in <b>Options->View logs->mplayer</b>). In case of problems this log can contain important information, so it's recommended to keep this option checked. + თუ მáƒáƒœáƒ˜áƒ¨áƒœáƒ£áƒšáƒ˜áƒ, მáƒáƒ¨áƒ˜áƒœ smplayer შეინáƒáƒ®áƒáƒ•áƒ¡ mplayer-ის გáƒáƒ›áƒáƒœáƒáƒ¢áƒáƒœáƒ¡ (შეგიძლიáƒáƒ— იხილáƒáƒ— მენიუში <b>პáƒáƒ áƒáƒ›áƒ”ტრები->ჟურáƒáƒœáƒšáƒ”ბის ჩვენებáƒ->mplayer</b>). პრáƒáƒ‘ლემების შემთხვევáƒáƒ¨áƒ˜ áƒáƒ› ჟურნáƒáƒšáƒ¨áƒ˜ შეიძლებრიყáƒáƒ¡ მნიშვნელáƒáƒ•áƒáƒœáƒ˜ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ, áƒáƒ›áƒ˜áƒ¢áƒáƒ› რეკáƒáƒ›áƒ”ნდირებულირმისი ჩáƒáƒ áƒ—ვáƒ. + + + + If this option is checked, smplayer will store the debugging messages that smplayer outputs (you can see the log in <b>Options->View logs->smplayer</b>). This information can be very useful for the developer in case you find a bug. + თუ ეს პáƒáƒ áƒáƒ›áƒ”ტრი მáƒáƒœáƒ˜áƒ¨áƒœáƒ£áƒšáƒ˜áƒ, smplayer შეინáƒáƒ®áƒáƒ•áƒ¡ გáƒáƒ›áƒáƒ áƒ—ვის შეტყáƒáƒ‘ინებებს smplayer-ის გáƒáƒ›áƒáƒœáƒáƒ¢áƒáƒœáƒ˜áƒ“áƒáƒœ (შეგიძლიáƒáƒ— იხილáƒáƒ— მენიუში <b>პáƒáƒ áƒáƒ›áƒ”ტრები->ჟურნáƒáƒšáƒ”ბის ჩვენებáƒ->smplayer</b>). ეს ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ შეიძლებრიყáƒáƒ¡ ძáƒáƒšáƒ˜áƒáƒœ მნიშვნელáƒáƒ•áƒáƒœáƒ˜ შემმუშáƒáƒ•áƒ”ბლისთვის იმ შემთხვევáƒáƒ¨áƒ˜ თუ თქვენ პრáƒáƒ‘ლემáƒáƒ¡ áƒáƒ¦áƒ›áƒáƒáƒ©áƒ”ნთ. + + + + Filter for SMPlayer logs + + + + + This option allows to filter the smplayer messages that will be stored in the log. Here you can write any regular expression.<br>For instance: <i>^Core::.*</i> will display only the lines starting with <i>Core::</i> + ეს პáƒáƒ áƒáƒ›áƒ”ტრი გáƒáƒ«áƒšáƒ”ვთ smplayer-ის ჟურნáƒáƒšáƒ¨áƒ˜ შესáƒáƒœáƒáƒ®áƒ˜ ელემენტების ფილტრáƒáƒªáƒ˜áƒ˜áƒ¡ სáƒáƒ¨áƒ£áƒáƒšáƒ”ბáƒáƒ¡. áƒáƒ¥ თქვენ შეგიძლიáƒáƒ— მიუთითáƒáƒ— ნებისმიერი რეგულáƒáƒ áƒ£áƒšáƒ˜ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒ.<br>მáƒáƒ’áƒáƒšáƒ˜áƒ—áƒáƒ“: <i>^Core::.*</i> áƒáƒ©áƒ•áƒ”ნებს მხáƒáƒšáƒáƒ“ იმ სტრიქáƒáƒœáƒ”ბს რáƒáƒ›áƒ”ლიც იწყებრრáƒáƒ’áƒáƒ áƒª <i>Core::</i> + + + + &Monitor aspect: + + + + + &Run MPlayer in its own window + + + + + &Options: + &პáƒáƒ áƒáƒ›áƒ”ტრები: + + + + V&ideo filters: + ვ&იდეáƒáƒ¤áƒ˜áƒšáƒ¢áƒ áƒ”ბი: + + + + Audio &filters: + áƒáƒ£áƒ“იáƒ&ფილტრები: + + + + &Colorkey: + + + + + &Don't repaint the background of the video window + + + + + Log &MPlayer output + + + + + Log &SMPlayer output + + + + + &Filter for SMPlayer logs: + + + + + &End of file: + + + + + &No video: + + + + + C&hange... + + + + + PrefAssociations + + + Warning + + + + + Not all files could be associated. Please check your security permissions and retry. + + + + + File Types + + + + + Select all + + + + + Check all file types in the list + + + + + Uncheck all file types in the list + + + + + List of file types + + + + + File types + + + + + Media files handled by SMPlayer: + + + + + Select All + + + + + Select None + + + + + Check the media file extensions you would like SMPlayer to handle. When you click Apply, the checked files will be associated with SMPlayer. If you uncheck a media type, the file association will be restored. + + + + + Select none + + + + + PrefDrives + + + Drives + áƒáƒ›áƒ«áƒ áƒáƒ•áƒ”ბი + + + + Currently SMPlayer does not autodetect cdrom or dvd devices. So in order to play cdroms or dvds you must first select here your cdrom and dvd drives (can be the same). + áƒáƒ› მáƒáƒ›áƒ”ნტში SMPlayer-ს áƒáƒ  შეუძლირcdrom áƒáƒœ dvd მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘ების áƒáƒ›áƒáƒªáƒœáƒáƒ‘áƒ. áƒáƒ›áƒ˜áƒ¢áƒáƒ› მáƒáƒ— გáƒáƒ›áƒáƒ¡áƒáƒ§áƒ”ნებლáƒáƒ— სáƒáƒ­áƒ˜áƒ áƒáƒ მითითებრ(შეგიძლიáƒáƒ— ერთი დრიგივე áƒáƒ˜áƒ áƒ©áƒ˜áƒáƒ—). + + + + icon + ხáƒáƒ¢áƒ£áƒšáƒ + + + + Select your CD device: + áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ თქვენი CD მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘áƒ: + + + + Select your DVD device: + áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ თქვენი DVD მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘áƒ: + + + + CD device + + + + + Choose your CDROM device. It will be used to play VCDs and Audio CDs. + + + + + DVD device + + + + + Choose your DVD device. It will be used to play DVDs. + + + + + Select your &CD device: + + + + + Select your &DVD device: + + + + + PrefGeneral + + + General + ძირითáƒáƒ“ი + + + + &General + + + + + Paths + გეზები + + + + Select... + áƒáƒ áƒ©áƒ”ვáƒ... + + + + Folder for storing screenshots: + ეკრáƒáƒœáƒ˜áƒ¡ áƒáƒœáƒáƒ‘ეჭდების შესáƒáƒœáƒáƒ®áƒ˜ დáƒáƒ¡áƒ¢áƒ: + + + + Search... + ძებნáƒ... + + + + Output drivers + გáƒáƒ›áƒáƒ›áƒ§áƒ•áƒáƒœáƒ˜ დრáƒáƒ˜áƒ•áƒ”რები + + + + Video: + ვიდეáƒ: + + + + Audio: + áƒáƒ£áƒ“იáƒ: + + + + Media settings + მედიáƒáƒžáƒáƒ áƒáƒ›áƒ”ტრები + + + + Remember settings for all files (audio track, subtitles...) + ყველრფáƒáƒ˜áƒšáƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრის დáƒáƒ›áƒáƒ®áƒ¡áƒáƒ•áƒ áƒ”ბრ(áƒáƒ£áƒ“ირჩáƒáƒœáƒáƒ¬áƒ”რი, სუბტიტრები...) + + + + Don't remember time position (files start playing from the beginning) + áƒáƒ  დáƒáƒ˜áƒ›áƒáƒ®áƒ¡áƒáƒ•áƒ áƒ მდებáƒáƒ áƒ”áƒáƒ‘რდრáƒáƒ¨áƒ˜ (ფáƒáƒ˜áƒšáƒ”ბის დáƒáƒ™áƒ•áƒ áƒ დáƒáƒ˜áƒ¬áƒ§áƒ”ბრთáƒáƒ•áƒ˜áƒ“áƒáƒœ) + + + + Preferred audio and subtitles + უპირáƒáƒ¢áƒ”სი áƒáƒ£áƒ“ირდრსუბტიტრები + + + + Subtitles: + სუბტიტრები: + + + + &Video and audio + + + + + Video + ვიდერ+ + + + Use software video equalizer + პრáƒáƒ’რáƒáƒ›áƒ£áƒšáƒ˜ ვიდეáƒáƒ”კვáƒáƒšáƒáƒ˜áƒ–ერის გáƒáƒ›áƒáƒ§áƒ”ნებრ+ + + + Start videos in fullscreen + ვიდეáƒáƒ¡ მთელს ეკრáƒáƒœáƒ–ე გáƒáƒ¨áƒ•áƒ”ბრ+ + + + Disable screensaver + ეკრáƒáƒœáƒ›áƒ–áƒáƒ’ის გáƒáƒ—იშვრ+ + + + Audio + áƒáƒ£áƒ“ირ+ + + + Use software volume control + პრáƒáƒ’რáƒáƒ›áƒ£áƒšáƒ˜ ხმის მáƒáƒ áƒ—ვის გáƒáƒ›áƒáƒ§áƒ”ნებრ+ + + + Select the mplayer executable + áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ mplayer-ის გáƒáƒ¨áƒ•áƒ”ბáƒáƒ“ი ფáƒáƒ˜áƒšáƒ˜ + + + + Executables + გáƒáƒ¨áƒ•áƒ”ბáƒáƒ“ი ფáƒáƒ˜áƒšáƒ”ბი + + + + All files + ყველრფáƒáƒ˜áƒšáƒ˜ + + + + Select a directory + áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ დირექტáƒáƒ áƒ˜áƒ + + + + MPlayer executable + + + + + Here you must specify the mplayer executable that smplayer will use.<br>smplayer requires at least mplayer 1.0rc1 (svn recommended).<br><b>If this setting is wrong, smplayer won't be able to play anything!</b> + áƒáƒ¥ თქვენ უნდრმიუთითáƒáƒ— mplayer-ის გáƒáƒ¨áƒ•áƒ”ბáƒáƒ“ი ფáƒáƒ˜áƒšáƒ˜ რáƒáƒ›áƒ”ლსáƒáƒª smplayer გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებს..<br>smplayer მáƒáƒ˜áƒ—ხáƒáƒ•áƒ¡ mplayer-ის 1.0rc1 ვერსიáƒáƒ¡ მáƒáƒ˜áƒœáƒª (რეკáƒáƒ›áƒ”ნდირებულირsvn).<br><b>თუ ეს პáƒáƒ áƒáƒ›áƒ”ტრი áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ, smplayer ვერáƒáƒ¤áƒ”რს ვერ დáƒáƒ£áƒ™áƒ áƒáƒ•áƒ¡!</b> + + + + Screenshots folder + + + + + Here you can specify a folder where the screenshots taken by smplayer will be stored. If this field is empty the screenshot feature will be disabled. + áƒáƒ¥ თქვენ შეგიძლიáƒáƒ— მიუთითáƒáƒ— დáƒáƒ¡áƒ¢áƒ სáƒáƒ“áƒáƒª შეინáƒáƒ®áƒ”ბრsmplayer-ის ეკრáƒáƒœáƒ˜áƒ¡ áƒáƒœáƒáƒ‘ეჭდები. თu ეს ველი ცáƒáƒ áƒ˜áƒ”ლიáƒ, მáƒáƒ¨áƒ˜áƒœ ეკრáƒáƒœáƒ˜áƒ¡ áƒáƒœáƒáƒ‘ეჭის მáƒáƒ®áƒ¡áƒœáƒ შეუძლებელი იქნებáƒ. + + + + Video output driver + + + + + Select the video output driver. Usually xv (linux) and directx (windows) provide the best performance. + áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ ვიდეáƒáƒ’áƒáƒ›áƒáƒ›áƒ§áƒ•áƒáƒœáƒ˜áƒ¡ დრáƒáƒ˜áƒ•áƒ”რი. რáƒáƒ’áƒáƒ áƒª წესი xv (linux) დრdirectx (windows) სáƒáƒ£áƒ™áƒ”თესრწáƒáƒ áƒ›áƒáƒ“áƒáƒ‘ისáƒáƒ. + + + + Audio output driver + + + + + Select the audio output driver. + áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ áƒáƒ£áƒ“იáƒáƒ’áƒáƒ›áƒáƒ›áƒ§áƒ•áƒáƒœáƒ˜áƒ¡ დრáƒáƒ˜áƒ•áƒ”რი + + + + Remember settings + + + + + Usually smplayer will remember the settings for each file you play (audio track selected, volume, filters...). Uncheck this option if you don't like this feature. + რáƒáƒ’áƒáƒ áƒª წესი smplayer იმáƒáƒ®áƒ¡áƒáƒ•áƒ áƒ”ბს პáƒáƒ áƒáƒ›áƒ”ტრებს ყáƒáƒ•áƒ”ლი დáƒáƒ™áƒ áƒ£áƒšáƒ˜ ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒáƒ—ვის (áƒáƒ áƒ©áƒ”ული áƒáƒ£áƒ“იáƒáƒ©áƒáƒœáƒáƒ¬áƒ”რს, ხმáƒáƒ¡, ფილტრებს...). გáƒáƒ›áƒáƒ áƒ—ეთ ეს პáƒáƒ áƒáƒ›áƒ”ტრი თუ თქვენ áƒáƒ  მáƒáƒ’წáƒáƒœáƒ— ის. + + + + Don't remember time position + + + + + If you check this option, smplayer will play all files from the beginning. + თუ თქვენ მáƒáƒœáƒ˜áƒ¨áƒœáƒáƒ•áƒ— áƒáƒ› პáƒáƒ áƒáƒ›áƒ”ტრს, მáƒáƒ¨áƒ˜áƒœ smplayer დáƒáƒ£áƒ™áƒ áƒáƒ•áƒ¡ ყველრფáƒáƒ˜áƒšáƒ¡ დáƒáƒ¡áƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜áƒ“áƒáƒœ. + + + + Preferred audio language + + + + + Here you can type your preferred language for the audio streams. When a media with multiple audio streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the audio streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the audio track if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + áƒáƒ¥ თქვენ შეგიძლიáƒáƒ— მიუთითáƒáƒ— თქვენი პრიáƒáƒ áƒ˜áƒ¢áƒ”ტული ენრáƒáƒ£áƒ“იáƒáƒœáƒáƒ™áƒáƒ“ებისთვის. რáƒáƒ“ესáƒáƒª áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილი იქნებრმáƒáƒ¢áƒáƒ áƒ”ბელი რáƒáƒ›áƒáƒ“ენიმე áƒáƒ£áƒ“იáƒáƒœáƒáƒ™áƒáƒ“ით, smplayer ეცდებრგáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒ¡ პრიáƒáƒ áƒ˜áƒ¢áƒ”ტული ენáƒ.<br>ეს პáƒáƒ áƒáƒ”მეტრი იმუშáƒáƒ•áƒ”ბს მხáƒáƒšáƒáƒ“ იმ მáƒáƒ¢áƒáƒ áƒ”ბლებთáƒáƒœ სáƒáƒ“áƒáƒª მითითებულირინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ áƒáƒ£áƒ“იáƒáƒœáƒáƒ™áƒáƒ“ების ენების შესáƒáƒ®áƒ”ბ, რáƒáƒ’áƒáƒ áƒ˜áƒªáƒáƒ DVD áƒáƒœ mkv ფáƒáƒ˜áƒšáƒ”ბი.<br>შესáƒáƒ«áƒšáƒ”ბელირრეგულáƒáƒ áƒ£áƒšáƒ˜ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბების შეყვáƒáƒœáƒ. მáƒáƒ’áƒáƒšáƒ˜áƒ—áƒáƒ“: <b>es|esp|spa</b> áƒáƒ˜áƒ áƒ©áƒ”ვს áƒáƒ£áƒ“იáƒáƒœáƒáƒ™áƒáƒ“ს რáƒáƒ›áƒ”ლიც ემთხვევრ<i>es</i>, <i>esp</i> áƒáƒœ <i>spa</i>-ს. + + + + Preferred subtitle language + + + + + Here you can type your preferred language for the subtitle stream. When a media with multiple subtitle streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the subtitle streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the subtitle stream if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + áƒáƒ¥ თქვენ შეგიძლიáƒáƒ— მიუთითáƒáƒ— თქვენი პრიáƒáƒ áƒ˜áƒ¢áƒ”ტული ენრსუბტიტრებისáƒáƒ—ვის. რáƒáƒ“ესáƒáƒª áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილი იქნებრმáƒáƒ¢áƒáƒ áƒ”ბელი რáƒáƒ›áƒáƒ“ენიმე სუბტიტრით, smplayer ეცდებრგáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒ¡ პრიáƒáƒ áƒ˜áƒ¢áƒ”ტული ენáƒ.<br>ეს პáƒáƒ áƒáƒ”მეტრი იმუშáƒáƒ•áƒ”ბს მხáƒáƒšáƒáƒ“ იმ მáƒáƒ¢áƒáƒ áƒ”ბლებთáƒáƒœ სáƒáƒ“áƒáƒª მითითებულირინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ სუბტიტრების ენების შესáƒáƒ®áƒ”ბ, რáƒáƒ’áƒáƒ áƒ˜áƒªáƒáƒ DVD áƒáƒœ mkv ფáƒáƒ˜áƒšáƒ”ბი.<br>შესáƒáƒ«áƒšáƒ”ბელირრეგულáƒáƒ áƒ£áƒšáƒ˜ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბების შეყვáƒáƒœáƒ. მáƒáƒ’áƒáƒšáƒ˜áƒ—áƒáƒ“: <b>es|esp|spa</b> áƒáƒ˜áƒ áƒ©áƒ”ვს áƒáƒ£áƒ“იáƒáƒœáƒáƒ™áƒáƒ“ს რáƒáƒ›áƒ”ლიც ემთხვევრ<i>es</i>, <i>esp</i> áƒáƒœ <i>spa</i>-ს. + + + + Software video equalizer + + + + + You can check this option if video equalizer is not supported by your graphic card or the selected video output driver.<br><b>Note:</b> this option can be incompatible with some video output drivers. + თქვენ შეგიძლიáƒáƒ— მáƒáƒœáƒ˜áƒ¨áƒœáƒáƒ— ეს პáƒáƒ áƒáƒ›áƒ”ტრი თუ თქვენს გრáƒáƒ¤áƒ˜áƒ™áƒ£áƒš დáƒáƒ¤áƒáƒ¡ áƒáƒœ გáƒáƒ›áƒáƒ›áƒ§áƒ•áƒáƒœ დრáƒáƒ˜áƒ•áƒ”რს áƒáƒ  áƒáƒ¥áƒ•áƒ¡ ვიდეáƒáƒ”კვáƒáƒšáƒáƒ˜áƒ–ერი.<br><b>შენიშვნáƒ:</b> ეს პáƒáƒ áƒáƒ›áƒ”ტრში შეიძლებრáƒáƒ áƒáƒ—áƒáƒ•áƒ¡áƒ”ბáƒáƒ“ი áƒáƒ¦áƒ›áƒáƒ©áƒœáƒ“ეს ზáƒáƒ’იერთ გáƒáƒ›áƒáƒ›áƒ§áƒ•áƒáƒœ დრáƒáƒ˜áƒ•áƒ”რთáƒáƒœ. + + + + If this option is checked, all videos will start to play in fullscreen mode. + თუ ეს პáƒáƒ áƒáƒ›áƒ”ტრი მáƒáƒœáƒ˜áƒ¨áƒœáƒ£áƒšáƒ˜áƒ, მáƒáƒ¨áƒ˜áƒœ ყველრვიდერგáƒáƒ˜áƒ¨áƒ•áƒ”ბს სრულეკრáƒáƒœáƒ˜áƒáƒœ რეჟიმში. + + + + Check this option to disable the screensaver while playing.<br>The screensaver will enabled again when play finishes.<br><b>Note:</b> This option works only in X11 and Windows. + მáƒáƒœáƒ˜áƒ¨áƒœáƒ”თ ეს პáƒáƒ áƒáƒ›áƒ”ტრი ეკრáƒáƒœáƒ›áƒ–áƒáƒ’ის დáƒáƒ™áƒ•áƒ áƒ˜áƒ¡ დრáƒáƒ¡ გáƒáƒ—იშვისთვის.<br>ეკრáƒáƒœáƒ›áƒ–áƒáƒ’ი ისევ ჩáƒáƒ˜áƒ áƒ—ვებრრáƒáƒ“ესáƒáƒª დáƒáƒ™áƒ•áƒ áƒáƒ¡ დáƒáƒáƒ¡áƒ áƒ£áƒšáƒ”ბთ.<br><b>შენიშვნáƒ:</b> ეს პáƒáƒ áƒáƒ›áƒ”ტრი მუშáƒáƒáƒ‘ს მხáƒáƒšáƒáƒ“ X11-ში დრWindows-ში. + + + + Software volume control + + + + + Check this option to use the software mixer, instead of using the sound card mixer. + მáƒáƒœáƒ˜áƒ¨áƒœáƒ”თ ეს პáƒáƒ áƒáƒ›áƒ”ტრი áƒáƒ£áƒ“იáƒáƒ“áƒáƒ¤áƒ˜áƒ¡ მიქშერის მáƒáƒ’ივრáƒáƒ“ პრáƒáƒ’რáƒáƒ›áƒ£áƒšáƒ˜ მიქშერის გáƒáƒ›áƒáƒ¡áƒáƒ§áƒ”ნებლáƒáƒ“. + + + + Postprocessing quality + + + + + Dynamically changes the level of postprocessing depending on the available spare CPU time. The number you specify will be the maximum level used. Usually you can use some big number. + დინáƒáƒ›áƒ˜áƒ£áƒ áƒáƒ“ ცვლის შემდგáƒáƒ›áƒ˜ დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბის დáƒáƒœáƒ”ს პრáƒáƒªáƒ”სáƒáƒ áƒ˜áƒ¡ დáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვის მიხედვით. თქვენს მიერ მითითებული რიცხვი იქნებრმáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ დáƒáƒœáƒ”. რáƒáƒ’áƒáƒ áƒª წესი უთითებენ რáƒáƒ¦áƒáƒª დიდ რიცხვს. + + + + Change volume + + + + + If checked, SMPlayer will remember the volume for every file and will restore it when played again. For new files the default volume will be used. + + + + + Default volume: + ნáƒáƒ’ულისხმები ხმáƒ: + + + + 0 + 0 + + + + &Change volume on every file + + + + + &Search... + + + + + S&elect... + + + + + Select the &MPlayer executable: + + + + + &Folder for storing screenshots: + + + + + V&ideo: + + + + + &Audio: + + + + + &Don't remember time position (files start playing from the beginning) + + + + + &Remember settings for all files (audio track, subtitles...) + + + + + A&udio: + + + + + Su&btitles: + + + + + &Use software video equalizer + + + + + &Quality: + + + + + Start videos in &fullscreen + + + + + Disable &screensaver + + + + + &Default volume: + + + + + Use s&oftware volume control + + + + + Ma&x. Amplification: + + + + + &AC3/DTS pass-through S/PDIF + + + + + Direct rendering + + + + + If checked, turns on direct rendering (not supported by all codecs and video outputs)<br><b>WARNING:</b> May cause OSD/SUB corruption! + + + + + Double buffering + + + + + D&irect rendering + + + + + Dou&ble buffering + + + + + Double buffering fixes flicker by storing two frames in memory, and displaying one while decoding another. If disabled it can affect OSD negatively, but often removes OSD flickering. + + + + + &Enable postprocessing by default + + + + + Volume &normalization by default + + + + + Close when finished + + + + + If this option is checked, the main window will be automatically closed when the current file/playlist finishes. + + + + + &Close when finished + + + + + 2 (Stereo) + + + + + 4 (4.0 Surround) + + + + + 6 (5.1 Surround) + + + + + C&hannels by default: + + + + + &Pause when minimized + + + + + Pause when minimized + + + + + If this option is enabled, the file will be paused when the main window is hidden. When the window is restored, play will be resumed. + + + + + Enable postprocessing by default + + + + + Max. Amplification + + + + + AC3/DTS pass-through S/PDIF + + + + + Volume normalization by default + + + + + Maximizes the volume without distorting the sound. + + + + + Default volume + + + + + Sets the initial volume that new files will use. + + + + + Channels by default + + + + + Sets the maximum amplification level in percent (default: 110). A value of 200 will allow you to adjust the volume up to a maximum of double the current level. With values below 100 the initial volume (which is 100%) will be above the maximum, which e.g. the OSD cannot display correctly. + + + + + Uses hardware AC3 passthrough + + + + + Requests the number of playback channels. MPlayer asks the decoder to decode the audio into as many channels as specified. Then it is up to the decoder to fulfill the requirement. This is usually only important when playing videos with AC3 audio (like DVDs). In that case liba52 does the decoding by default and correctly downmixes the audio into the requested number of channels. NOTE: This option is honored by codecs (AC3 only), filters (surround) and audio output drivers (OSS at least). + + + + + Postprocessing will be used by default on new opened files. + + + + + PrefInput + + + Keyboard and mouse + + + + + &Keyboard + + + + + icon + ხáƒáƒ¢áƒ£áƒšáƒ + + + + &Mouse + + + + + Button functions: + ღილáƒáƒ™áƒ”ბის ფუნქციები: + + + + Media seeking + გáƒáƒ“áƒáƒ¡áƒ•áƒšáƒ”ბი მáƒáƒ¢áƒáƒ áƒ”ბელში + + + + Volume control + ხმის მáƒáƒ áƒ—ვრ+ + + + Zoom video + + + + + None + áƒáƒ áƒáƒ + + + + Here you can change any key shortcut. To do it double click or press enter over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + + + + + Here you can change any key shortcut. To do it double click or start typing over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + + + + + &Left click + + + + + &Double click + + + + + &Wheel function: + + + + + Shortcut editor + + + + + This table allows you to change the key shortcuts of most available actions. Double click or press enter on a item, or press the <b>Change shortcut</b> button to enter in the <i>Modify shortcut</i> dialog. There are two ways to change a shortcut: if the <b>Capture</b> button is on then just press the new key or combination of keys that you want to assign for the action (unfortunately this doesn't work for all keys). If the <b>Capture</b> button is off then you could enter the full name of the key. + + + + + Left click + + + + + Select the action for left click on the mouse. + + + + + Double click + + + + + Select the action for double click on the mouse. + + + + + Wheel function + + + + + Select the action for the mouse wheel. + + + + + PrefInterface + + + Interface + ინტერფეისი + + + + Bulgarian + + + + + Czech + ჩეხური + + + + German + გერმáƒáƒœáƒ£áƒšáƒ˜ + + + + Greek + + + + + English + ინგლისური + + + + Spanish + ესპáƒáƒœáƒ£áƒ áƒ˜ + + + + Finnish + + + + + French + ფრáƒáƒœáƒ’ული + + + + Hungarian + უნგრული + + + + Italian + იტáƒáƒšáƒ˜áƒ£áƒ áƒ˜ + + + + Japanese + იáƒáƒžáƒáƒœáƒ£áƒ áƒ˜ + + + + Georgian + ქáƒáƒ áƒ—ული + + + + Dutch + ჰáƒáƒšáƒáƒœáƒ“იური + + + + Polish + პáƒáƒšáƒáƒœáƒ£áƒ áƒ˜ + + + + Portuguese - Brazil + + + + + Portuguese - Portugal + + + + + Romanian + + + + + Russian + რუსული + + + + Slovak + სლáƒáƒ•áƒáƒ™áƒ£áƒ áƒ˜ + + + + Serbian + + + + + Swedish + + + + + Turkish + თურქული + + + + Ukrainian + უკრáƒáƒ˜áƒœáƒ£áƒšáƒ˜ + + + + Simplified-Chinese + გáƒáƒ›áƒáƒ áƒ¢áƒ˜áƒ•áƒ”ბული ჩინური + + + + Traditional Chinese + + + + + <Autodetect> + <áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒ˜> + + + + Default + ნáƒáƒ’ულისხმები + + + + &Interface + + + + + Seeking + გáƒáƒ“áƒáƒ¡áƒ•áƒšáƒ + + + + Never + áƒáƒ áƒáƒ¡áƒ“რáƒáƒ¡ + + + + Whenever it's needed + რáƒáƒ“ესáƒáƒª სáƒáƒ­áƒ˜áƒ áƒáƒ + + + + Only after loading a new video + მხáƒáƒšáƒáƒ“ áƒáƒ®áƒáƒšáƒ˜ ვიდეáƒáƒ¡ ჩáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვისáƒáƒ¡ + + + + Recent files + წინრფáƒáƒ˜áƒšáƒ”ბი + + + + Language + + + + + Here you can change the language of the application. + + + + + Instances + + + + + Catalan + + + + + Basque + + + + + Galician + + + + + &Short jump + + + + + &Medium jump + + + + + &Long jump + + + + + Mouse &wheel jump + + + + + &Use only one running instance of SMPlayer + + + + + SMPlayer will listen to this &port to receive commands from other instances: + + + + + Ma&x. items + + + + + St&yle: + + + + + Ico&n set: + + + + + L&anguage: + + + + + Main window + + + + + Auto&resize: + + + + + R&emember position and size + + + + + Default font: + + + + + &Change... + + + + + PrefPerformance + + + Performance + წáƒáƒ áƒ›áƒáƒ“áƒáƒ‘რ+ + + + &Performance + + + + + Priority + პრიáƒáƒ áƒ˜áƒ¢áƒ”ტი + + + + Select the priority for the MPlayer process. + + + + + Priority: + პრიáƒáƒ áƒ˜áƒ¢áƒ”ტი: + + + + realtime + რეáƒáƒšáƒ£áƒ  დრáƒáƒ¨áƒ˜ + + + + high + მáƒáƒ¦áƒáƒšáƒ˜ + + + + abovenormal + ნáƒáƒ áƒ›áƒáƒšáƒ£áƒ áƒ–ე მáƒáƒ¦áƒáƒšáƒ˜ + + + + normal + ნáƒáƒ áƒ›áƒáƒšáƒ£áƒ áƒ˜ + + + + belownormal + ნáƒáƒ áƒ›áƒáƒšáƒ£áƒ áƒ–ე მცირე + + + + idle + ყრუ + + + + Cache + + + + + KB + კბ + + + + Setting a cache may improve performance on slow media + ბუფერის მითითებáƒáƒ› შეიძლებრგáƒáƒáƒ£áƒ›áƒ¯áƒáƒ‘ესáƒáƒ¡ წáƒáƒ áƒ›áƒáƒ“áƒáƒ‘რნელ მáƒáƒ¢áƒáƒ áƒ”ბლებზე + + + + Allow frame drop + კáƒáƒ“რების გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბრ+ + + + Allow hard frame drop (can lead to image distortion) + კáƒáƒ“რების მძიმედ გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბრ(შეიძლებრგáƒáƒ›áƒáƒ˜áƒ¬áƒ•áƒ˜áƒáƒ¡ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბის დáƒáƒ›áƒáƒ®áƒ˜áƒœáƒ¯áƒ”ბáƒ) + + + + Synchronization + სინქრáƒáƒœáƒ˜áƒ–ებრ+ + + + Audio/video auto synchronization + áƒáƒ£áƒ“იáƒ/ვიდეáƒáƒ¡ áƒáƒ•áƒ¢áƒ სინქრáƒáƒœáƒ˜áƒ–ებრ+ + + + Factor: + ფáƒáƒ áƒ“áƒáƒ‘áƒ: + + + + Fast audio track switching + ხმის ჩáƒáƒœáƒáƒ¬áƒ”რის სწრáƒáƒ¤áƒ˜ გáƒáƒ“áƒáƒ áƒ—ვრ+ + + + Fast seek to chapters in dvds + თáƒáƒ•áƒ”ბს შáƒáƒ áƒ˜áƒ¡ სწრáƒáƒ¤áƒ˜ გáƒáƒ“áƒáƒ¡áƒ•áƒšáƒ dvdებში + + + + Set process priority for mplayer according to the predefined priorities available under Windows.<br><b>WARNING:</b> Using realtime priority can cause system lockup. + áƒáƒ˜áƒ áƒ©áƒ˜áƒáƒ— mplayer-ის პრიáƒáƒ áƒ˜áƒ¢áƒ”ტი Windows-ში წინáƒáƒ¡áƒ¬áƒáƒ  გáƒáƒœáƒ¡áƒáƒ–ღვრული მნიშნელáƒáƒ‘ებიდáƒáƒœ.<br><b>ყურáƒáƒ“ღებáƒ:</b> რეáƒáƒšáƒ£áƒ áƒ˜ დრáƒáƒ˜áƒ¡ პრიáƒáƒ áƒ˜áƒ¢áƒ”ტის გáƒáƒ›áƒáƒ§áƒ”ნებáƒáƒ› შეიძლებრგáƒáƒ›áƒáƒ˜áƒ¬áƒ•áƒ˜áƒáƒ¡ სისტემის უმáƒáƒ¥áƒ›áƒ”დáƒáƒ‘áƒ. + + + + <br><b>Note:</b> This option is for Windows only. + <br><b>შენიშვნáƒ:</b> ეს პáƒáƒ áƒáƒ›áƒ”ტრი გáƒáƒœáƒ™áƒ£áƒ—ვნილირმხáƒáƒšáƒáƒ“ Windows-თვის. + + + + This option specifies how much memory (in kBytes) to use when precaching a file or URL. Especially useful on slow media. + ეს პáƒáƒ áƒáƒ›áƒ”ტრი უთითებს თუ რáƒáƒ›áƒ“ენი მეხსიერებრშეიძლებრიყáƒáƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებული (კილáƒáƒ‘áƒáƒ˜áƒ¢áƒ”ბში) ფáƒáƒ˜áƒšáƒ˜áƒ¡ áƒáƒœ URL-ის ბუფერირებისთვის. გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებრნელ მáƒáƒ¢áƒáƒ áƒ”ბლებში. + + + + Skip displaying some frames to maintain A/V sync on slow systems. + ზáƒáƒ’იერთი კáƒáƒ“რის გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბრA/V სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ ნელ სისტემებზე შესáƒáƒœáƒáƒ áƒ©áƒ£áƒœáƒ”ბლáƒáƒ“. + + + + Allow hard frame drop + + + + + More intense frame dropping (breaks decoding). Leads to image distortion! + კáƒáƒ“რების უფრრინტენსიური გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბრ(áƒáƒ áƒ¦áƒ•áƒ”ვს დეკáƒáƒ“ირებáƒáƒ¡). áƒáƒ›áƒáƒ®áƒ˜áƒœáƒ¯áƒ”ბს გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒáƒ¡! + + + + Gradually adjusts the A/V sync based on audio delay measurements. + ნáƒáƒ‘იჯნáƒáƒ‘იჯ áƒáƒ áƒ”გულირებს A/V სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒáƒ¡ ხმის დáƒáƒ§áƒáƒ•áƒœáƒ”ბების გáƒáƒ–áƒáƒ›áƒ•áƒ˜áƒ—. + + + + Priorit&y: + + + + + Si&ze: + + + + + &Use cache + + + + + &Allow frame drop + + + + + Allow &hard frame drop (can lead to image distortion) + + + + + Audio/&video auto synchronization + + + + + Fact&or: + + + + + &Fast audio track switching + + + + + Fast &seek to chapters in dvds + + + + + Create index if needed + + + + + Rebuilds index of files if no index was found, allowing seeking. Useful with broken/incomplete downloads, or badly created files. This option only works if the underlying media supports seeking (i.e. not with stdin, pipe, etc).<br> Note: the creation of the index may take some time. + + + + + &Create index if needed + + + + + If checked, it will try the fastest method to switch audio tracks but might not work with some formats. + + + + + If checked, it will try the fastest method to seek to chapters but it might not work with some discs. + + + + + PrefSubtitles + + + Subtitles + სუბტიტრები + + + + Choose a ttf file + áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ ttf ფáƒáƒ˜áƒšáƒ˜ + + + + Truetype Fonts + Truetype შრიფტები + + + + &Subtitles + &სუბტიტრები + + + + Autoload + áƒáƒ•áƒ¢áƒáƒ©áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვრ+ + + + Autoload subtitles files (*.srt, *.sub...): + სუბტიტრების áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“ ჩáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვრ(*.srt, *.sub...): + + + + Same name as movie + იგივე სáƒáƒ®áƒ”ლი რáƒáƒª ფილმს áƒáƒ¥áƒ•áƒ¡ + + + + All subs containing movie name + ყველრსუბტიტრი რáƒáƒ›áƒ”ლიც შეიცáƒáƒ•áƒ¡ ფილმის სáƒáƒ®áƒ”ლს + + + + All subs in directory + ყველრსუბტიტრი დირექტáƒáƒ áƒ˜áƒáƒ¨áƒ˜ + + + + Default subtitle encoding: + სუბტიტრების ნáƒáƒ’ულისხმები კáƒáƒ“ირებáƒ: + + + + Position + + + + + 0 + 0 + + + + Top + + + + + Bottom + + + + + Include subtitles on screenshots + სუბტიტრების ეკრáƒáƒœáƒ˜áƒ¡ áƒáƒœáƒáƒ‘ეჭდებში ჩვენებრ+ + + + &Font + + + + + Font + შრიფტი + + + + TTF font: + TTF შრიფტი: + + + + Search... + ძებნáƒ... + + + + System font: + სისტემური შრიფტი: + + + + Select the font which will be used for subtitles (and OSD): + áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ შრიფტი რáƒáƒ›áƒ”ლიც გáƒáƒ›áƒáƒ§áƒ”ნებული იქნებრსუბტიტრებისთვის (დრOSD-თვის): + + + + Size + ზáƒáƒ›áƒ + + + + Autoscale: + áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¡áƒ¨áƒ¢áƒáƒ‘ირებáƒ: + + + + No autoscale + áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¡áƒ¨áƒ¢áƒáƒ‘ირების გáƒáƒ áƒ”შე + + + + Proportional to movie height + ფილმის სიმáƒáƒ¦áƒšáƒ˜áƒ¡ პრáƒáƒžáƒáƒ áƒªáƒ˜áƒ£áƒšáƒ˜ + + + + Proportional to movie width + ფილმის სიგრძის პრáƒáƒžáƒáƒ áƒªáƒ˜áƒ£áƒšáƒ˜ + + + + Proportional to movie diagonal + ფილმის დიáƒáƒ’áƒáƒœáƒáƒšáƒ˜áƒ¡ პრáƒáƒžáƒáƒ áƒªáƒ˜áƒ£áƒšáƒ˜ + + + + Scale: + მáƒáƒ¡áƒ¨áƒ¢áƒáƒ‘ი: + + + + SSA/&ASS library + + + + + The new SSA/ASS library will provide nice styled subtitles for external SSA/ASS subtitles files and Matroska tracks. But it will be used too for rendering other formats like SUB and SRT files. + + + + + Use SSA/ASS library for subtitle rendering + SSA/ASS ბიბლიáƒáƒ—ეკის გáƒáƒ›áƒáƒ§áƒ”ნებრსუბტიტრების გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ•áƒ˜áƒ¡áƒ—ვის + + + + Text color: + ტექსტის ფერი: + + + + Border color: + ჩáƒáƒ áƒ©áƒáƒ¡ ფერი: + + + + Here you can override styles for SSA/ASS subtitles. It can be also used for fine-tuning the rendering of SRT and SUB subtitles by the SSA/ASS library. Example: <b>Bold=1,Outline=2,Shadow=4</b> + + + + + Subtitle position + + + + + This option specifies the position of the subtitles over the video window. <i>100</i> means the bottom, while <i>0</i> means the top. + + + + + SSA/ASS styles + + + + + Au&toload subtitles files (*.srt, *.sub...): + + + + + S&elect first available subtitle + + + + + &Default subtitle encoding: + + + + + Default &position of the subtitles on screen + + + + + &Include subtitles on screenshots + + + + + &Use -subfont option (required by recent MPlayer releases) + + + + + &TTF font: + + + + + Sea&rch... + + + + + S&ystem font: + + + + + A&utoscale: + + + + + S&cale: + + + + + &Use SSA/ASS library for subtitle rendering + + + + + &Text color: + + + + + &Border color: + + + + + St&yles: + + + + + PreferencesDialog + + + SMPlayer - Help + + + + + OK + + + + + Cancel + + + + + Apply + + + + + Help + + + + + SMPlayer - Preferences + SMPlayer - პáƒáƒ áƒáƒ›áƒ”ტრები + + + + QObject + + + 1 second + + + + + %1 seconds + + + + + %1 minutes + + + + + %1 minutes and %2 seconds + + + + + 1 minute + + + + + 1 minute and 1 second + + + + + 1 minute and %1 seconds + + + + + %1 minutes and 1 second + + + + + will show this message and then will exit. + + + + + 'media' is any kind of file that SMPlayer can open. It can be a local file, a DVD (e.g. dvd://1), an Internet stream (e.g. mms://....) or a local playlist in format m3u. If the -playlist option is used, that means that SMPlayer will pass the -playlist option to MPlayer, so MPlayer will handle the playlist, not SMPlayer. + + + + + the main window will be closed when the file/playlist finishes. + + + + + This is SMPlayer v. %1 running on %2 + + + + + tries to make a connection to another running instance and send to it the specified action. Example: -send-action pause The rest of options (if any) will be ignored and the application will exit. It will return 0 on success or -1 on failure. + + + + + action_list is a list of actions separated by spaces. The actions will be executed just after loading the file (if any) in the same order you entered. For checkable actions you can pass true or false as parameter. Example: -actions "fullscreen compact true". Quotes are necessary in case you pass more than one action. + + + + + media + + + + + if there's another instance running, the media will be added to that instance's playlist. If there's no other instance, this option will be ignored and the files will be opened in a new instance. + + + + + specifies the directory for the configuration file (smplayer.ini). + + + + + the main window won't be closed when the file/playlist finishes. + + + + + Usage: %1 [-ini-path directory] [-send-action action_name] [-actions action_list [-close-at-end] [-no-close-at-end] [-fullscreen] [-no-fullscreen] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + + + + + the video will be played in fullscreen mode. + + + + + the video will be played in window mode. + + + + + SeekWidget + + + icon + ხáƒáƒ¢áƒ£áƒšáƒ + + + + label + დáƒáƒ¡áƒáƒ®áƒ”ლებრ+ + + + ShortcutGetter + + + Modify shortcut + + + + + Clear + + + + + Press the key combination you want to assign + + + + + Capture + + + + + Capture keystrokes + + + + + VideoEqualizer + + + Equalizer + ეკვáƒáƒšáƒáƒ˜áƒ–ერი + + + + Contrast + კáƒáƒœáƒ¢áƒ áƒáƒ¡áƒ¢áƒ˜ + + + + Brightness + სიკáƒáƒ¨áƒ™áƒáƒ¨áƒ” + + + + Hue + ტáƒáƒœáƒ˜ + + + + Saturation + ინტენსივáƒáƒ‘რ+ + + + Gamma + გáƒáƒ›áƒ + + + + &Reset + &სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრები + + + + &Set as default values + ნáƒáƒ’ულის&ხმებáƒáƒ“ შენáƒáƒ®áƒ•áƒ + + + + Use the current values as default values for new videos. + მიმდინáƒáƒ áƒ” მნიშვნელáƒáƒ‘ების áƒáƒ®áƒáƒšáƒ˜ ვიფდეáƒáƒ”ბისთვის გáƒáƒ›áƒáƒ§áƒ”ნებáƒ. + + + + Set all controls to zero. + ყველáƒáƒ¤áƒ áƒ˜áƒ¡ ნáƒáƒ áƒ›áƒáƒšáƒ˜áƒ–ებáƒ. + + + diff --git a/retroshare-gui/src/apps/smplayer/translations/smplayer_nl.qm b/retroshare-gui/src/apps/smplayer/translations/smplayer_nl.qm new file mode 100644 index 000000000..14f9389fe Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/translations/smplayer_nl.qm differ diff --git a/retroshare-gui/src/apps/smplayer/translations/smplayer_nl.ts b/retroshare-gui/src/apps/smplayer/translations/smplayer_nl.ts new file mode 100644 index 000000000..463d939c0 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/translations/smplayer_nl.ts @@ -0,0 +1,3852 @@ + + + + AboutDialog + + + Version: %1 + Versie: %1 + + + + 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. + Dit programma is vrije software; u kan het verspreiden en/of wijzigen onder de bepalingen van de GNU Algemene Publieke Licentie, zoals uitgegeven door de Free Software Foundation; oftewel versie 2 van de Licentie, of (naar vrije keuze) een latere versie. + + + + Translators: + Vertalers: + + + + German + Duits + + + + Slovak + Slowaak + + + + Italian + Italiaans + + + + French + Frans + + + + Simplified-Chinese + Vereenvoudigd Chinees + + + + Russian + Russisch + + + + Hungarian + Hongaars + + + + Japanese + Japans + + + + Dutch + Nederlands + + + + Ukrainian + Oekraïens + + + + Georgian + Georgisch + + + + Czech + Tsjechisch + + + + Logo designed by %1 + Logo ontworpen door %1 + + + + Get updates at: %1 + Verkrijg updates via: %1 + + + + About SMPlayer + Over SMPlayer + + + + Polish + Pools + + + + Bulgarian + Bulgaars + + + + Turkish + Turks + + + + Swedish + Zweeds + + + + Serbian + Servisch + + + + Traditional Chinese + Traditioneel Chinees + + + + Romanian + Roemeens + + + + Portuguese - Brazil + Portugees - Brazilië + + + + Portuguese - Portugal + Portugees - Portugal + + + + Compiled with Qt %1 + Gecompileerd met Qt %1 + + + + %1, %2 and %3 + %1, %2 en %3 + + + + %1 and %2 + %1 en %2 + + + + http://smplayer.sourceforge.net/en/windows/download.php + If the web page is translated into your language you can change the URL so it points to the download page in the translation.Otherwise leave as is. + http://smplayer.sourceforge.net/en/windows/download.php + + + + http://smplayer.sourceforge.net/en/linux/download.php + If the web page is translated into your language you can change the URL so it points to the download page in the translation.Otherwise leave as is. + http://smplayer.sourceforge.net/en/linux/download.php + + + + <b>%1</b>: %2 + <b>%1</b>: %2 + + + + ActionsEditor + + + Name + Naam + + + + Description + Omschrijving + + + + Shortcut + Sneltoets + + + + &Save + &Opslaan + + + + &Load + &Laden + + + + Key files + Sleutel bestanden + + + + Choose a filename + Kies een bestandsnaam + + + + Confirm overwrite? + Bevestig overschrijven? + + + + The file %1 already exists. +Do you want to overwrite? + Het bestand bestaat al. +Wil je het overschrijven? + + + + Choose a file + Kies een bestand + + + + Error + Foutmelding + + + + The file couldn't be saved + Het bestand kon niet opgeslagen worden + + + + The file couldn't be loaded + Het bestand kon niet ingeladen worden + + + + &Change shortcut... + &Sneltoets aanpassen... + + + + BaseGui + + + SMPlayer - mplayer log + SMPlayer - mplayer log + + + + SMPlayer - smplayer log + SMPlayer - smplayer log + + + + &Open + &Openen + + + + &Play + Af&spelen + + + + &Video + &Video + + + + &Audio + &Audio + + + + &Subtitles + O&ndertitels + + + + &Browse + &Bladeren + + + + Op&tions + Op&ties + + + + &Help + &Help + + + + &File... + &Bestand... + + + + D&irectory... + &Map... + + + + &Playlist... + &Afspeellijst... + + + + &DVD from drive + &DVD vanaf schijfstation + + + + D&VD from folder... + D&VD vanaf map... + + + + &URL... + &URL... + + + + &Clear + &Leegmaken + + + + &Recent files + &Recente bestanden + + + + P&lay + &Afspelen + + + + &Pause + &Pauzeren + + + + &Stop + &Stoppen + + + + &Frame step + &Frame stap + + + + &Normal speed + &Normale snelheid + + + + &Halve speed + &Halve snelheid + + + + &Double speed + &Dubbele snelheid + + + + Speed &-10% + Snelheid &-10% + + + + Speed &+10% + Snelheid &+10% + + + + Sp&eed + S&nelheid + + + + &Repeat + &Herhalen + + + + &Fullscreen + &Volledig scherm + + + + &Compact mode + &Compacte modus + + + + Si&ze + &Grootte + + + + &Autodetect + &Automatisch detecteren + + + + &4:3 + &4:3 + + + + &5:4 + &5:4 + + + + &14:9 + &14:9 + + + + 16:&9 + 16:&9 + + + + 1&6:10 + 1&6:10 + + + + &2.35:1 + &2.35:1 + + + + 4:3 &Letterbox + 4:3 &Letterbox + + + + 16:9 L&etterbox + 16:9 L&etterbox + + + + 4:3 &Panscan + 4:3 &Panscan + + + + 4:3 &to 16:9 + 4:3 &naar 16:9 + + + + &Aspect ratio + &Aspect verhouding + + + + &None + &Geen + + + + &Lowpass5 + &Lowpass5 + + + + Linear &Blend + Linear &Blend + + + + &Deinterlace + &Deinterlace + + + + &Postprocessing + &Nabewerking + + + + &Autodetect phase + &Automatisch fase detecteren + + + + &Deblock + &Deblock + + + + De&ring + De&ring + + + + Add n&oise + N&oise toevoegen + + + + F&ilters + F&ilters + + + + &Equalizer + &Equalizer + + + + &Screenshot + &Schermafdruk + + + + S&tay on top + Venster &bovenaan houden + + + + &Track + &Spoor + + + + &Extrastereo + &Extrastereo + + + + &Karaoke + &Karaoke + + + + &Filters + &Filters + + + + &Default + &Standaard + + + + &Stereo + &Stereo + + + + &4.0 Surround + &4.0 Surround + + + + &5.1 Surround + &5.1 Surround + + + + &Channels + &Kanalen + + + + &Left channel + &Linkerkanaal + + + + &Right channel + &Rechterkanaal + + + + &Stereo mode + &Stereo modus + + + + &Mute + &Dempen + + + + Volume &- + Volume &- + + + + Volume &+ + Volume &+ + + + + &Delay - + &Vertraging - + + + + D&elay + + V&ertraging + + + + + &Select + &Kiezen + + + + &Load... + &Laden... + + + + Delay &- + Vertraging &- + + + + Delay &+ + Vertraging &+ + + + + &Up + &Omhoog + + + + &Down + O&mlaag + + + + &Title + &Titel + + + + &Chapter + &Hoofdstuk + + + + &Angle + Hoek (&angle) + + + + &Playlist + &Afspeellijst + + + + &Show frame counter + &Frame teller weergeven + + + + &Disabled + &Uitgeschakeld + + + + &Seek bar + &Zoekbalk + + + + &Time + &Tijd + + + + Time + T&otal time + Tijd + T&otale tijd + + + + &OSD + &OSD + + + + &View logs + Bekijk &logs + + + + P&references + &Voorkeuren + + + + About &Qt + Over &Qt + + + + About &SMPlayer + Over &SMPlayer + + + + <empty> + <leeg> + + + + Video + Video + + + + Audio + Audio + + + + Playlists + Afspeellijsten + + + + All files + Alle bestanden + + + + Choose a file + Kies een bestand + + + + SMPlayer - Information + SMPlayer - Informatie + + + + The CDROM / DVD drives are not configured yet. +The configuration dialog will be shown now, so you can do it. + De CDROM / DVD stations zijn nog niet geconfigureerd. +Het configuratie dialoogvenster zal nu getoond worden, zodat je dit nu kan doen. + + + + Choose a directory + Kies een map + + + + Subtitles + Ondertitels + + + + About Qt + Over Qt + + + + Playing %1 + Afspelen van %1 + + + + Pause + Pauze + + + + Stop + Stop + + + + De&noise + De&noise + + + + N&ormal + N&ormaal + + + + &Soft + &Zacht + + + + Play / Pause + Afspelen / Pauzeren + + + + Pause / Frame step + Pauze / Frame stap + + + + U&nload + O&ntladen + + + + V&CD + V&CD + + + + C&lose + &Sluiten + + + + View &info and properties... + Bekijk &informatie en eigenschappen... + + + + Zoom &- + Uitzoomen &- + + + + Zoom &+ + Inzoomen &+ + + + + &Reset + &Reset + + + + Move &left + Naar &links verplaatsen + + + + Move &right + Naar &rechts verplaatsen + + + + Move &up + Naar &omhoog verplaatsen + + + + Move &down + Naar &beneden verplaatsen + + + + &Pan && scan + &Pan && scan + + + + &Previous line in subtitles + &Vorige lijn in ondertitels + + + + N&ext line in subtitles + V&olgende lijn in ondertitels + + + + -%1 + -%1 + + + + +%1 + +%1 + + + + Dec volume (2) + Volume zachter (2) + + + + Inc volume (2) + Volume luider (2) + + + + Exit fullscreen + Volledig scherm verlaten + + + + OSD - Next level + OSD - Volgende niveau + + + + Dec contrast + Contrast verlagen + + + + Inc contrast + Contrast verhogen + + + + Dec brightness + Helderheid verlagen + + + + Inc brightness + Helderheid verhogen + + + + Dec hue + Tint verlagen + + + + Inc hue + Tint verhogen + + + + Dec saturation + Verzadiging verlagen + + + + Dec gamma + Gamma verlagen + + + + Next audio + Volgend audiospoor + + + + Next subtitle + Volgende ondertitel + + + + Next chapter + Volgend hoofdstuk + + + + Previous chapter + Vorig hoofdstuk + + + + Inc saturation + Verzadiging verhogen + + + + Inc gamma + Gamma verhogen + + + + Toggle double size + Dubbele grootte + + + + &Load external file... + Extern bestand &laden... + + + + &Kerndeint + &Kerndeint + + + + &Yadif (normal) + &Yadif (normaal) + + + + Y&adif (double framerate) + Y&adif (dubbele framerate) + + + + &Next + &Volgende + + + + Pre&vious + V&orige + + + + Volume &normalization + Volume &normalisatie + + + + &Audio CD + &Audio cd + + + + Denoise nor&mal + Denoise nor&maal + + + + Denoise &soft + Denoise &zacht + + + + Denoise o&ff + Denoise &uit + + + + Use SSA/&ASS library + Gebruik SSA/&ASS bibliotheek + + + + Flip i&mage + Draai a&fbeelding + + + + &Toggle double size + &Zet dubbele grootte aan/uit + + + + BaseGuiPlus + + + SMPlayer is still running here + SMPlayer draait hier nog steeds + + + + S&how icon in system tray + Icoon in systeemvak &weergeven + + + + &Hide + &Verbergen + + + + &Restore + &Herstellen + + + + &Recent files + &Recente bestanden + + + + &Quit + &Afsluiten + + + + Playlist + Afspeellijst + + + + Core + + + Brightness: %1 + Helderheid: %1 + + + + Contrast: %1 + Contrast: %1 + + + + Gamma: %1 + Gamma: %1 + + + + Hue: %1 + Tint: %1 + + + + Saturation: %1 + Verzadiging: %1 + + + + Volume: %1 + Volume: %1 + + + + Zoom: %1 + Zoom: %1 + + + + DefaultGui + + + Welcome to SMPlayer + Welkom bij SMPlayer + + + + Volume + Volume + + + + Audio + Audio + + + + Subtitle + Ondertitel + + + + Playlist + Afspeellijst + + + + &Main toolbar + &Hoofdwerkbalk + + + + &Language toolbar + &Taalwerkbalk + + + + &Toolbars + &Werkbalken + + + + Encodings + + + Western European Languages + West-Europese Talen + + + + Western European Languages with Euro + West-Europese Talen met Euro + + + + Slavic/Central European Languages + Slavisch/Centraal-Europese Talen + + + + Esperanto, Galician, Maltese, Turkish + Esperanto, Galicisch, Maltees, Turks + + + + Old Baltic charset + Oude Baltische karakterset + + + + Cyrillic + Cyrillisch + + + + Arabic + Arabisch + + + + Modern Greek + Modern Grieks + + + + Turkish + Turks + + + + Baltic + Baltisch + + + + Celtic + Keltisch + + + + Hebrew charsets + Hebreeuwse karaktersets + + + + Russian + Russisch + + + + Ukrainian, Belarusian + Oekraïens + + + + Simplified Chinese charset + Vereenvoudigde Chinese karakterset + + + + Traditional Chinese charset + Traditionele Chinese karakterset + + + + Japanese charsets + Japanse karaktersets + + + + Korean charset + Koreaanse karakterset + + + + Thai charset + Thaise karakterset + + + + Cyrillic Windows + Cyrillisch Windows + + + + Slavic/Central European Windows + Slavisch/Centraal-Europees Windows + + + + Arabic Windows + + + + + EqSlider + + + icon + icoon + + + + FilePropertiesDialog + + + SMPlayer - File properties + SMPlayer - Eigenschappen van bestand + + + + &Information + &Informatie + + + + &Demuxer + &Demuxer + + + + &Select the demuxer that will be used for this file: + &Kies de demuxer die gebruikt moet worden voor dit bestand: + + + + &Reset + &Reset + + + + &Video codec + &Video codec + + + + &Select the video codec: + &Kies de video codec: + + + + A&udio codec + A&udio codec + + + + &Select the audio codec: + &Kies de audio codec: + + + + &MPlayer options + &MPlayer opties + + + + Additional Options for MPlayer + Extra opties voor MPlayer + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + Hier kan je extra opties meegeven aan MPlayer. +Schrijf ze gescheiden door spaties. +Voorbeeld: -flip -nosound + + + + &Options: + &Opties: + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + Je kan ook extra video filters meegeven. +De video filters moeten van elkaar gescheiden worden door ",". Gebruik geen spaties! +Voorbeeld: scale=512:-2,eq2=1.1 + + + + V&ideo filters: + V&ideo filters: + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + En tot slot audio filters. Dezelfde regel als voor video filters. +Voorbeeld: resample=44100:0:0,volnorm + + + + Audio &filters: + Audio &filters: + + + + OK + O + + + + Cancel + Annuleren + + + + Apply + OK + + + + InfoFile + + + General + Algemeen + + + + Size + Grootte + + + + %1 KB (%2 MB) + %1 KB (%2 MB) + + + + URL + URL + + + + Length + Lengte + + + + Demuxer + Demuxer + + + + Name + Naam + + + + Artist + Artiest + + + + Author + Auteur + + + + Album + Album + + + + Genre + Genre + + + + Date + Datum + + + + Track + Spoor + + + + Copyright + Auteursrecht + + + + Comment + Commentaar + + + + Software + Software + + + + Clip info + Clip info + + + + Video + Video + + + + Resolution + Resolutie + + + + Aspect ratio + Aspect verhouding + + + + Format + Formaat + + + + Bitrate + Bitrate + + + + %1 kbps + %1 kbps + + + + Frames per second + Frames per seconde + + + + Selected codec + Geselecteerde codec + + + + Initial Audio Stream + Initieel Audio Spoor + + + + Rate + Rate + + + + %1 Hz + %1 Hz + + + + Channels + Kanalen + + + + Audio Streams + Audio Sporen + + + + Language + Taal + + + + empty + leeg + + + + Subtitles + Ondertitels + + + + Type + Type + + + + ID + Info for translators: this is a identification code + ID + + + + # + Info for translators: this is a abbreviation for number + # + + + + Stream title + Stream titel + + + + Stream URL + Stream URL + + + + File + Bestand + + + + InputDVDDirectory + + + Choose a directory + Kies een map + + + + SMPlayer - Play a DVD from a folder + SMPlayer - Speel een DVD vanuit een map + + + + You can play a dvd from your hard disc. Just select the folder which contains the VIDEO_TS and AUDIO_TS directories. + Je kan een dvd vanaf je harde schijf afspelen. Kies gewoon de map die de submappen VIDEO_TS en AUDIO_TS bevat. + + + + Choose a directory... + Kies een map... + + + + InputURL + + + SMPlayer - Enter URL + SMPlayer - URL invoeren + + + + &URL: + &URL: + + + + It's a &playlist + Dit is een &afspeellijst + + + + If this option is checked, the URL will be treated as a playlist: it will be opened as text and will play the URLs in it. + Indien deze optie gemarkeerd is, dan zal de URL als een playlist verwerkt worden: het zal geopend worden als een tekstbestand en de URL's in het tekstbestand zullen afgespeeld worden. + + + + LogWindow + + + Choose a filename to save under + Kies een bestandsnaam waaronder opgeslagen moet worden + + + + Confirm overwrite? + Bevestig overschrijven? + + + + The file already exists. +Do you want to overwrite? + Het bestand bestaat al. +Wil je het overschrijven? + + + + Error saving file + Fout bij opslaan van het bestand + + + + The log couldn't be saved + Het logbestand kon niet worden opgeslagen + + + + Logs + Logs + + + + LogWindowBase + + + Log Window + Log Venster + + + + Save + Opslaan + + + + Copy to clipboard + Kopiëren naar klembord + + + + Close + Sluiten + + + + &Close + &Sluiten + + + + Playlist + + + Name + Naam + + + + Length + Lengte + + + + &Play + Af&spelen + + + + &Edit + Aan&passen + + + + Playlists + Afspeellijsten + + + + Choose a file + Kies een bestand + + + + Choose a filename + Kies een bestandsnaam + + + + Confirm overwrite? + Bevestig overschrijven? + + + + The file %1 already exists. +Do you want to overwrite? + Het bestand bestaat al. +Wil je het overschrijven? + + + + All files + Alle bestanden + + + + Select one or more files to open + Kies één of meerdere bestanden om te openen + + + + Choose a directory + Kies een map + + + + Edit name + Naam aanpassen + + + + Type the name that will be displayed in the playlist for this file: + Typ de naam waaronder dit bestand bekend zal staan in de afspeellijst: + + + + &Load + &Laden + + + + &Save + &Opslaan + + + + &Next + &Volgende + + + + Pre&vious + V&orige + + + + Move &up + Naar &omhoog verplaatsen + + + + Move &down + Naar &beneden verplaatsen + + + + &Repeat + &Herhalen + + + + S&huffle + &Willekeurig + + + + Add &current file + &Huidig bestand toevoegen + + + + Add &file(s) + &Bestand(en) toevoegen + + + + Add &directory + &Map toevoegen + + + + Remove &selected + Verwijder &geselecteerde + + + + Remove &all + Verwijder &alles + + + + SMPlayer - Playlist + SMPlayer - Afspeellijst + + + + Add... + Toevoegen... + + + + Remove... + Verwijderen... + + + + Playlist modified + Afspeellijst aangepast + + + + There are unsaved changes, do you want to save the playlist? + Er zijn veranderingen gebeurd die nog niet zijn opgeslagen. +Wil je de afspeellijst opslaan? + + + + PrefAdvanced + + + Advanced + Geavanceerd + + + + Auto + Automatisch + + + + Form + Formulier + + + + &Advanced + Ge&avanceerd + + + + icon + icoon + + + + Additional Options for MPlayer + Extra opties voor MPlayer + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + Hier kan je extra opties meegeven aan MPlayer. +Schrijf ze gescheiden door spaties. +Voorbeeld: -flip -nosound + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + Je kan ook extra video filters meegeven. +De video filters moeten van elkaar gescheiden worden door ",". Gebruik geen spaties! +Voorbeeld: scale=512:-2,eq2=1.1 + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + En tot slot audio filters. Dezelfde regel als voor video filters. +Voorbeeld: resample=44100:0:0,volnorm + + + + Don't repaint the background of the video window + Geen repaint uitvoeren op de achtergrond van het videovenster + + + + &Logs + &Logs + + + + Log MPlayer output + MPlayer uitvoer loggen + + + + Log SMPlayer output + SMPlayer uitvoer loggen + + + + This option is mainly intended for debugging the application. + Deze optie is vooral bedoeld om het programma te debuggen. + + + + &MPlayer language + &MPlayer taal + + + + SMPlayer needs to read and parse the output of MPlayer and sometimes it relies on English text. If you are using a MPlayer translated into another language, then you need to change the texts that SMPlayer looks for. (Technically you should enter regular expressions)<br><br> +The drop-down lists may provide already made regular expression for several languages. + SMPlayer moet de uitvoer van MPlayer lezen en verwerken en daardoor is SMPlayer afhankelijk van Engelse tekst. Indien er gebruik gemaakt wordt van een anderstalige MPlayer moeten de onderstaande teksten veranderd worden. (Technisch gezien moet je reguliere expressies invoeren)<br /><br /> +De drop-down lijsten kunnen al reguliere expressies voor bepaalde talen bevatten. + + + + Checking this option may reduce flickering, but it also might produce that the video won't be displayed properly. + Deze optie aanduiden kan flikkering verminderen, maar het kan mogelijk ook een foutieve weergave van de video veroorzaken. + + + + If checked, smplayer will store the output of mplayer (you can see it in <b>Options->View logs->mplayer</b>). In case of problems this log can contain important information, so it's recommended to keep this option checked. + Vink deze optie aan om de uitvoer van mplayer op te slaan (je kan de uitvoer bekijken via <b>Opties->Bekijk logs->mplayer</b>). In het geval van problemen kan deze log belangrijke informatie bevatten, dus het wordt aanbevolen om deze optie aan te vinken. + + + + If this option is checked, smplayer will store the debugging messages that smplayer outputs (you can see the log in <b>Options->View logs->smplayer</b>). This information can be very useful for the developer in case you find a bug. + Vink deze optie aan om de debugberichten van smplayer op te slaan (je kan de berichten bekijken via <b>Opties->Bekijk logs->smplayer</b>). Deze informatie kan heel nuttig zijn voor de ontwikkelaar indien je tegen bugs aanloopt. + + + + Filter for SMPlayer logs + Filter voor SMPlayer logs + + + + This option allows to filter the smplayer messages that will be stored in the log. Here you can write any regular expression.<br>For instance: <i>^Core::.*</i> will display only the lines starting with <i>Core::</i> + Deze optie staat je toe om de smplayer berichten die in het log worden opgeslagen te filteren. Je kan hier eender welke reguliere expressie neerzetten.<br>Bijvoorbeeld: <i>^Core::.*</i> zal alleen lijnen weergeven die beginnen met <i>Core::</i> + + + + &Monitor aspect: + &Monitor aspect: + + + + &Run MPlayer in its own window + &Laat MPlayer videobestanden in een eigen venster afspelen + + + + &Options: + &Opties: + + + + V&ideo filters: + V&ideo filters: + + + + Audio &filters: + Audio &filters: + + + + &Colorkey: + &Kleursleutel: + + + + &Don't repaint the background of the video window + &Geen 'repaint' uitvoeren op de achtergrond van het videovenster + + + + Log &MPlayer output + &MPlayer uitvoer loggen + + + + Log &SMPlayer output + &SMPlayer uitvoer loggen + + + + &Filter for SMPlayer logs: + &Filter voor SMPlayer logs: + + + + &End of file: + &Einde van bestand: + + + + &No video: + &Geen video: + + + + C&hange... + &Aanpassen... + + + + PrefAssociations + + + Warning + + + + + Not all files could be associated. Please check your security permissions and retry. + + + + + File Types + + + + + Select all + + + + + Check all file types in the list + + + + + Uncheck all file types in the list + + + + + List of file types + + + + + File types + + + + + Media files handled by SMPlayer: + + + + + Select All + + + + + Select None + + + + + Check the media file extensions you would like SMPlayer to handle. When you click Apply, the checked files will be associated with SMPlayer. If you uncheck a media type, the file association will be restored. + + + + + Select none + + + + + PrefDrives + + + Drives + Schijfstations + + + + Currently SMPlayer does not autodetect cdrom or dvd devices. So in order to play cdroms or dvds you must first select here your cdrom and dvd drives (can be the same). + SMPlayer detecteert momenteel niet automatisch cdrom of dvd apparaten. Dus om cdrom's of dvd's af te kunnen spelen moet je eerst hier je cdrom en dvd schijfstations instellen (kan hetzelfde zijn). + + + + icon + icoon + + + + Select your CD device: + Kies CD apparaat: + + + + Select your DVD device: + Kies DVD apparaat: + + + + CD device + cd apparaat + + + + Choose your CDROM device. It will be used to play VCDs and Audio CDs. + Kies het cd-rom apparaat. Het zal gebruikt worden om Video cd's (VCD's) en Audio cd's af te spelen. + + + + DVD device + dvd apparaat + + + + Choose your DVD device. It will be used to play DVDs. + Kies het dvd apparaat. Het zal gebruikt worden om dvd films af te spelen. + + + + Select your &CD device: + Kies &cd apparaat: + + + + Select your &DVD device: + Kies &dvd apparaat: + + + + PrefGeneral + + + General + Algemeen + + + + &General + &Algemeen + + + + Paths + Paden + + + + Select... + Kiezen... + + + + Folder for storing screenshots: + Map om schermafdrukken in op te slaan: + + + + Search... + Zoeken... + + + + Select the MPlayer executable: + Kies het mplayer uitvoerbaar bestand: + + + + Output drivers + Uitvoer drivers + + + + Video: + Video: + + + + Audio: + Audio: + + + + Media settings + Media instellingen + + + + Remember settings for all files (audio track, subtitles...) + Onthoud instellingen voor alle bestanden (audiospoor, ondertitels...) + + + + Don't remember time position (files start playing from the beginning) + Positie niet onthouden (bestanden starten met afspelen vanaf het begin) + + + + Preferred audio and subtitles + Voorkeur voor audio en ondertitels + + + + Subtitles: + Ondertitels: + + + + &Video and audio + &Video en audio + + + + Video + Video + + + + Use software video equalizer + Gebruik software video equalizer + + + + Start videos in fullscreen + Start videobestanden in volledig scherm + + + + Disable screensaver + Schermbeveiliging uitschakelen + + + + Audio + Audio + + + + Use software volume control + Gebruik software volumeregeling + + + + Select the mplayer executable + Kies het mplayer uitvoerbaar bestand + + + + Executables + Uitvoerbare bestanden (executables) + + + + All files + Alle bestanden + + + + Select a directory + Kies een map + + + + MPlayer executable + MPlayer uitvoerbaar bestand + + + + Here you must specify the mplayer executable that smplayer will use.<br>smplayer requires at least mplayer 1.0rc1 (svn recommended).<br><b>If this setting is wrong, smplayer won't be able to play anything!</b> + Hier moet je het mplayer uitvoerbaar bestand kiezen dat smplayer zal gebruiken.<br />smplayer vereist ten minste mplayer 1.0rc1 (svn aanbevolen)<br /><b>Als deze instelling foutief is, dan zal smplayer niets kunnen afspelen!</b> + + + + Screenshots folder + Schermafdrukken map + + + + Here you can specify a folder where the screenshots taken by smplayer will be stored. If this field is empty the screenshot feature will be disabled. + Hier kan je een map instellen waar de schermafdrukken die door smplayer genomen worden bewaard kunnen worden. Als dit veld leeg is zal de schermafdruk mogelijkheid uitgeschakeld worden. + + + + Video output driver + Video uitvoer driver + + + + Select the video output driver. Usually xv (linux) and directx (windows) provide the best performance. + Kies de video uitvoer driver. Normaal gezien leveren xv (linux) en directx (windows) de beste prestaties. + + + + Audio output driver + Audio uitvoer driver + + + + Select the audio output driver. + Kies de audio uitvoer driver. + + + + Remember settings + Instellingen onthouden + + + + Usually smplayer will remember the settings for each file you play (audio track selected, volume, filters...). Uncheck this option if you don't like this feature. + Normaal gezien onthoudt smplayer de instellingen voor elk bestand dat je afspeelt (geselecteerd audio spoor, volume, filters...). Vink deze optie uit als je geen gebruik wilt maken van deze mogelijkheid. + + + + Don't remember time position + Tijdspositie niet onthouden + + + + If you check this option, smplayer will play all files from the beginning. + Als je deze optie aanvinkt, dan zal SMPlayer alle bestanden vanaf het begin afspelen. + + + + Preferred audio language + Taalvoorkeur voor audiosporen + + + + Here you can type your preferred language for the audio streams. When a media with multiple audio streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the audio streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the audio track if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + Hier kan je een taalvoorkeur instellen voor audiosporen. Wanneer een mediabestand met meerdere audiosporen wordt gevonden, dan zal smplayer trachten om uw taalvoorkeur te gebruiken.<br>Dit werkt alleen bij mediabestanden die informatie over de taal bij de audiosporen hebben, zoals dvd's of mkv-bestanden.<br>Dit veld accepteert reguliere expressies. Voorbeeld: <b>es|esp|spa</b> zal het audiospoor selecteren indien het overeenkomt met <i>es</i>, <i>esp</i> of <i>spa</i>. + + + + Preferred subtitle language + Taalvoorkeur voor ondertitels + + + + Here you can type your preferred language for the subtitle stream. When a media with multiple subtitle streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the subtitle streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the subtitle stream if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + Hier kan je een taalvoorkeur instellen voor ingebedde ondertitels. Wanneer een mediabestand met meerdere ondertitels wordt gevonden, dan zal smplayer trachten om uw taalvoorkeur te gebruiken.<br>Dit werkt alleen bij mediabestanden die informatie over de taal bij de ondertitels hebben, zoals dvd's of mkv-bestanden.<br>Dit veld accepteert reguliere expressies. Voorbeeld: <b>es|esp|spa</b> zal het ondertitelingsspoor selecteren indien het overeenkomt met <i>es</i>, <i>esp</i> of <i>spa</i>. + + + + Software video equalizer + Software video equalizer + + + + You can check this option if video equalizer is not supported by your graphic card or the selected video output driver.<br><b>Note:</b> this option can be incompatible with some video output drivers. + Je kan deze optie aanvinken als video equalizer niet wordt ondersteund door je grafische kaart of door de geselecteerde video uitvoer driver.<br /><b>Let op:</b> deze optie kan incompatibel zijn met sommige video uitvoer drivers. + + + + If this option is checked, all videos will start to play in fullscreen mode. + Als je deze optie aanvinkt, dan zullen alle videobestanden starten in de modus volledig scherm. + + + + Check this option to disable the screensaver while playing.<br>The screensaver will enabled again when play finishes.<br><b>Note:</b> This option works only in X11 and Windows. + Vink deze optie aan om de schermbeveiliging uit te schakelen tijdens het afspelen.<br />De screensaver zal terug ingeschakeld worden wanneer het afspelen voltooid is.<br /><b>Let op:</b> Deze optie werkt alleen in X11 en Windows. + + + + Software volume control + Software volumeregeling + + + + Check this option to use the software mixer, instead of using the sound card mixer. + Vink deze optie aan om de software mixer te gebruiken, in plaats van de geluidskaart mixer. + + + + Postprocessing quality + Kwaliteit van nabewerking + + + + Dynamically changes the level of postprocessing depending on the available spare CPU time. The number you specify will be the maximum level used. Usually you can use some big number. + Dynamisch het niveau van nabewerking veranderen, rekening houdend met de beschikbare CPU tijd. Het nummer dat je instelt zal het maximum niveau zijn dat gebruikt zal worden. Gewoonlijk kan je hier een groot nummer gebruiken. + + + + Change volume + Volume aanpassen + + + + If checked, SMPlayer will remember the volume for every file and will restore it when played again. For new files the default volume will be used. + Als deze optie is aangevinkt, dan zal SMPlayer het geluidsniveau van elk bestand onthouden. Voor nieuwe bestanden wordt het standaard geluidsniveau gebruikt. + + + + Default volume: + Standaardvolume: + + + + 0 + 0 + + + + &Change volume on every file + &Volume bij elk bestand veranderen + + + + &Search... + &Zoek... + + + + S&elect... + &Kiezen... + + + + Select the &MPlayer executable: + Kies het &MPlayer uitvoerbaar bestand: + + + + &Folder for storing screenshots: + Map om &schermafdrukken in op te slaan: + + + + V&ideo: + V&ideo: + + + + &Audio: + &Audio: + + + + &Don't remember time position (files start playing from the beginning) + &Tijdspositie niet onthouden (bestanden spelen af vanaf het begin) + + + + &Remember settings for all files (audio track, subtitles...) + I&nstellingen voor alle bestanden onthouden (audiospoor, ondertitels...) + + + + A&udio: + A&udio: + + + + Su&btitles: + &Ondertitels: + + + + &Use software video equalizer + &Gebruik software video equalizer + + + + &Quality: + K&waliteit: + + + + Start videos in &fullscreen + Start videobestanden in &volledig scherm + + + + Disable &screensaver + &Schermbeveiliging uitschakelen + + + + &Default volume: + Standaard &geluidsniveau: + + + + Use s&oftware volume control + Gebruikt s&oftware volumeregeling + + + + Ma&x. Amplification: + Ma&x. versterking: + + + + &AC3/DTS pass-through S/PDIF + &AC3/DTS pass-through S/PDIF + + + + Direct rendering + Direct rendering + + + + If checked, turns on direct rendering (not supported by all codecs and video outputs)<br><b>WARNING:</b> May cause OSD/SUB corruption! + Als deze optie is aangevinkt, dan zal 'direct rendering' ingeschakeld worden (wordt niet ondersteund door alle codecs en video uitvoer drivers)<br /><b>WAARSCHUWING:</b> Veroorzaakt mogelijk OSD/SUB corruptie! + + + + Double buffering + Double buffering + + + + D&irect rendering + D&irect rendering + + + + Dou&ble buffering + Dou&ble buffering + + + + Double buffering fixes flicker by storing two frames in memory, and displaying one while decoding another. If disabled it can affect OSD negatively, but often removes OSD flickering. + 'Double buffering' verwijdert flikkering door twee frames in het geheugen te plaatsen, en slechts één frame te weergeven terwijl het andere gedecodeerd wordt. Als deze optie is uitgeschakeld kan het OSD negatief beïnvloed worden, maar vaak verwijdert het flikkering van het OSD. + + + + &Enable postprocessing by default + &Nabewerking standaard inschakelen + + + + Volume &normalization by default + &Volume normalisatie standaard toepassen + + + + Close when finished + Sluiten na afloop + + + + If this option is checked, the main window will be automatically closed when the current file/playlist finishes. + Als deze optie is aangevinkt, dan zal het hoofdvenster automatisch gesloten worden wanneer het huidige bestand of de huidige afspeellijst is afgelopen. + + + + &Close when finished + &Sluiten na afloop + + + + 2 (Stereo) + 2 (Stereo) + + + + 4 (4.0 Surround) + 4 (4.0 Surround) + + + + 6 (5.1 Surround) + 6 (5.1 Surround) + + + + C&hannels by default: + &Standaard kanalen: + + + + &Pause when minimized + &Pauzeer wanneer geminimaliseerd + + + + Pause when minimized + + + + + If this option is enabled, the file will be paused when the main window is hidden. When the window is restored, play will be resumed. + + + + + Enable postprocessing by default + + + + + Postprocessing will be used by default on new opened files. + + + + + Max. Amplification + + + + + Sets the maximum amplification level in percent (default: 110). A value of 200 will allow you to adjust the volume up to a maximum of double the current level. With values below 100 the initial volume (which is 100%) will be above the maximum, which e.g. the OSD cannot display correctly. + + + + + AC3/DTS pass-through S/PDIF + + + + + Uses hardware AC3 passthrough + + + + + Volume normalization by default + + + + + Maximizes the volume without distorting the sound. + + + + + Default volume + + + + + Sets the initial volume that new files will use. + + + + + Channels by default + + + + + Requests the number of playback channels. MPlayer asks the decoder to decode the audio into as many channels as specified. Then it is up to the decoder to fulfill the requirement. This is usually only important when playing videos with AC3 audio (like DVDs). In that case liba52 does the decoding by default and correctly downmixes the audio into the requested number of channels. NOTE: This option is honored by codecs (AC3 only), filters (surround) and audio output drivers (OSS at least). + + + + + PrefInput + + + Keyboard and mouse + Toetsenbord en muis + + + + &Keyboard + &Toetsenbord + + + + icon + icoon + + + + Here you can change any key shortcut. To do it double click or start typing over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + Hier kan je eender welke sneltoets instellen. Om een sneltoets aan te passen moet u op de desbetreffende cel dubbelklikken of typen terwijl de desbetreffende cel de focus heeft. Optioneel bestaat de mogelijkheid om uw sneltoetsen configuratie op te slaan zodat u het kan delen met andere mensen of zodat u het in een andere computer kan inladen. + + + + &Mouse + &Muis + + + + Button functions: + Knop functies: + + + + Media seeking + Media zoeken + + + + Volume control + Volumeregeling + + + + Zoom video + Video zoomen + + + + None + Geen + + + + Here you can change any key shortcut. To do it double click or press enter over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + Hier kan je eender welke sneltoets instellen. Om een sneltoets aan te passen moet u op de desbetreffende cel dubbelklikken of de enter-toets indrukken terwijl de desbetreffende cel de focus heeft. Optioneel bestaat de mogelijkheid om uw sneltoetsen configuratie op te slaan zodat u het kan delen met andere mensen of zodat u het in een andere computer kan inladen. + + + + &Left click + Klik met &linkermuisknop + + + + &Double click + &Dubbelklikken + + + + &Wheel function: + &Wielfunctie: + + + + Shortcut editor + + + + + This table allows you to change the key shortcuts of most available actions. Double click or press enter on a item, or press the <b>Change shortcut</b> button to enter in the <i>Modify shortcut</i> dialog. There are two ways to change a shortcut: if the <b>Capture</b> button is on then just press the new key or combination of keys that you want to assign for the action (unfortunately this doesn't work for all keys). If the <b>Capture</b> button is off then you could enter the full name of the key. + + + + + Left click + + + + + Select the action for left click on the mouse. + + + + + Double click + + + + + Select the action for double click on the mouse. + + + + + Wheel function + + + + + Select the action for the mouse wheel. + + + + + PrefInterface + + + Interface + Interface + + + + Bulgarian + Bulgaars + + + + Czech + Tsjechisch + + + + German + Duits + + + + Greek + Grieks + + + + English + Engels + + + + Spanish + Spaans + + + + Finnish + Fins + + + + French + Frans + + + + Hungarian + Hongaars + + + + Italian + Italiaans + + + + Japanese + Japans + + + + Georgian + Georgisch + + + + Dutch + Nederlands + + + + Polish + Pools + + + + Portuguese - Brazil + Portugees - Brazilië + + + + Portuguese - Portugal + Portugees - Portugal + + + + Romanian + Roemeens + + + + Russian + Russisch + + + + Slovak + Slowaak + + + + Serbian + Servisch + + + + Swedish + Zweeds + + + + Turkish + Turks + + + + Ukrainian + Oekraïens + + + + Simplified-Chinese + Vereenvoudigd Chinees + + + + Traditional Chinese + Traditioneel Chinees + + + + <Autodetect> + <Automatisch detecteren> + + + + Default + Standaard + + + + &Interface + &Interface + + + + Seeking + Zoeken + + + + Never + Nooit + + + + Whenever it's needed + Wanneer nodig + + + + Only after loading a new video + Alleen na het laden van een nieuw videobestand + + + + Recent files + Recente bestanden + + + + Language + Taal + + + + Here you can change the language of the application. + Hier kan je de taal van het programma aanpassen. + + + + Instances + Instanties + + + + Catalan + Catalaans + + + + Basque + Baskisch + + + + Galician + Galicisch + + + + &Short jump + &Korte sprong + + + + &Medium jump + &Middelmatige sprong + + + + &Long jump + &Lange sprong + + + + Mouse &wheel jump + Muis&wiel sprong + + + + &Use only one running instance of SMPlayer + &Slechts één draaiende instantie van SMPlayer gebruiken + + + + SMPlayer will listen to this &port to receive commands from other instances: + SMPlayer zal op deze &poort luisteren om commando's van andere instanties te ontvangen: + + + + Ma&x. items + Ma&x. items + + + + St&yle: + &Stijl: + + + + Ico&n set: + Ico&nen set: + + + + L&anguage: + &Taal: + + + + Main window + Hoofdvenster + + + + Auto&resize: + Automatisch &herschalen: + + + + R&emember position and size + &Positie en grootte onthouden + + + + Default font: + Standaard lettertype: + + + + &Change... + &Verander... + + + + PrefPerformance + + + Performance + Prestaties + + + + &Performance + &Prestaties + + + + Priority + Prioriteit + + + + Select the priority for the MPlayer process. + Kies de prioriteit van het MPlayer proces. + + + + Priority: + Prioriteit: + + + + realtime + realtime + + + + high + hoog + + + + abovenormal + hoger dan normaal + + + + normal + normaal + + + + belownormal + lager dan normaal + + + + idle + idle + + + + Cache + Cache + + + + KB + KB + + + + Setting a cache may improve performance on slow media + Een cache instellen kan prestaties verbeteren bij trage media + + + + Allow frame drop + Frame drops toestaan + + + + Allow hard frame drop (can lead to image distortion) + Harde frame drops toestaan (kan leiden tot beeldvervorming) + + + + Synchronization + Synchronisatie + + + + Audio/video auto synchronization + Audio/video automatische synchronisatie + + + + Factor: + Factor: + + + + Fast audio track switching + Snelle audio spoor wisseling + + + + Fast seek to chapters in dvds + Snel zoeken naar hoofdstukken bij dvds + + + + Set process priority for mplayer according to the predefined priorities available under Windows.<br><b>WARNING:</b> Using realtime priority can cause system lockup. + Prioriteit van het mplayer proces instellen volgens de vooraf gedefinieerde prioriteiten die beschikbaar zijn onder Windows.<br><b>WAARSCHUWING:</b> Gebruik van realtime prioriteit kan een systeem lockup veroorzaken. + + + + <br><b>Note:</b> This option is for Windows only. + <br><b>Opgelet:</b> Deze optie is alleen voor Windows. + + + + This option specifies how much memory (in kBytes) to use when precaching a file or URL. Especially useful on slow media. + Deze optie bepaalt hoeveel geheugen (in kBytes) gebruikt moet worden bij het precachen van een bestand of URL. Vooral handig bij trage media. + + + + Skip displaying some frames to maintain A/V sync on slow systems. + Sommige frames overslaan om A/V sync te behouden op trage systemen. + + + + Allow hard frame drop + Harde frame drops toestaan + + + + More intense frame dropping (breaks decoding). Leads to image distortion! + Meer intense frame dropping (breekt decodering). Leidt tot beeldvervorming! + + + + Gradually adjusts the A/V sync based on audio delay measurements. + Geleidelijk A/V sync bijstellen, gebaseerd op audio delay metingen. + + + + Priorit&y: + Pr&ioriteit: + + + + Si&ze: + Groo&tte: + + + + &Use cache + &Gebruik cache + + + + &Allow frame drop + &Frame drops toestaan + + + + Allow &hard frame drop (can lead to image distortion) + &Harde frame drops toestaan (kan leiden tot beeldvervorming) + + + + Audio/&video auto synchronization + Audio/&video automatische synchronisatie + + + + Fact&or: + Fact&or: + + + + &Fast audio track switching + &Snel wisselen van audiospoor + + + + Fast &seek to chapters in dvds + Snel &zoeken naar hoofdstukken bij dvd's + + + + Create index if needed + Maak index wanneer nodig + + + + Rebuilds index of files if no index was found, allowing seeking. Useful with broken/incomplete downloads, or badly created files. This option only works if the underlying media supports seeking (i.e. not with stdin, pipe, etc).<br> Note: the creation of the index may take some time. + Herbouwt index van bestanden wanneer er geen index is gevonden, waardoor zoeken mogelijk is. Handig bij onderbroken/niet complete downloads, of slecht gemaakte bestanden. De optie werkt alleen als de onderliggende media zoeken ondersteunt (d.w.z. niet met stdin, pipe, etc).<br>Let op: het aanmaken van de index kan redelijk wat tijd in beslag nemen. + + + + &Create index if needed + &Maak index wanneer nodig + + + + If checked, it will try the fastest method to switch audio tracks but might not work with some formats. + + + + + If checked, it will try the fastest method to seek to chapters but it might not work with some discs. + + + + + PrefSubtitles + + + Subtitles + Ondertitels + + + + Choose a ttf file + Kies een ttf bestand + + + + Truetype Fonts + Truetype Lettertypes + + + + &Subtitles + O&ndertitels + + + + Autoload + Automatisch laden + + + + Autoload subtitles files (*.srt, *.sub...): + Automatisch ondertitels laden (*.srt, *.sub...): + + + + Select first available subtitle + Kies eerste ondertitel die beschikbaar is + + + + Same name as movie + Dezelfde naam als film + + + + All subs containing movie name + Alle ondertitels die de filmnaam bevatten + + + + All subs in directory + Alle ondertitels in map + + + + Default subtitle encoding: + Standaard ondertitel encodering: + + + + Position + Plaatsing + + + + Default position of the subtitles on screen + Standaard plaatsing van ondertitels op het scherm + + + + 0 + 0 + + + + Top + Bovenaan + + + + Bottom + Onderaan + + + + Include subtitles on screenshots + Ondertitels weergeven op schermafdrukken + + + + &Font + &Lettertype + + + + Font + Lettertype + + + + TTF font: + TTF lettertype: + + + + Search... + Zoeken... + + + + System font: + Systeemlettertype: + + + + Select the font which will be used for subtitles (and OSD): + Kies het lettertype dat gebruikt moet worden voor ondertitels (en OSD): + + + + Size + Grootte + + + + Autoscale: + Automatisch schalen: + + + + No autoscale + Geen automatische herschaling + + + + Proportional to movie height + Evenredig met hoogte van film + + + + Proportional to movie width + Evenredig met breedte van film + + + + Proportional to movie diagonal + Evenredig met diagonaal van film + + + + Scale: + Schalen: + + + + SSA/&ASS library + SSA/&ASS bibliotheek + + + + The new SSA/ASS library will provide nice styled subtitles for external SSA/ASS subtitles files and Matroska tracks. But it will be used too for rendering other formats like SUB and SRT files. + De nieuwe SSA/ASS bibliotheek levert mooie stijlvolle ondertitels voor externe SSA/ASS ondertitelbestanden en Matroska sporen. Maar het kan ook gebruikt worden voor andere formaten zoals SUB en SRT bestanden. + + + + Use SSA/ASS library for subtitle rendering + Gebruik SSA/ASS bibliotheek voor ondertitel rendering + + + + Text color: + Tekstkleur: + + + + Border color: + Randkleur: + + + + Here you can override styles for SSA/ASS subtitles. It can be also used for fine-tuning the rendering of SRT and SUB subtitles by the SSA/ASS library. Example: <b>Bold=1,Outline=2,Shadow=4</b> + De stijl voor SSA/ASS ondertitels kan hier aangepast worden. Het kan ook gebruikt worden om de rendering van SRT of SUB ondertitels te verfijnen door de SSA/ASS bibliotheek te gebruiken. Voorbeeld: <b>Bold=1,Outline=2,Shadow=4</b> + + + + Styles: + Stijlen: + + + + Subtitle position + Ondertitel positie + + + + This option specifies the position of the subtitles over the video window. <i>100</i> means the bottom, while <i>0</i> means the top. + Deze optie bepaalt de positie van de ondertitels op het afspeelvenster. <i>100</i> betekent onderaan en <i>0</i> betekent bovenaan. + + + + SSA/ASS styles + SSA/ASS stijlen + + + + Au&toload subtitles files (*.srt, *.sub...): + Au&tomatisch ondertitels inladen (*.srt, *.sub...): + + + + S&elect first available subtitle + &Kies eerste beschikbare ondertitel + + + + &Default subtitle encoding: + &Standaard ondertiteling encodering: + + + + Default &position of the subtitles on screen + Standaard &positie voor ondertitels op het scherm + + + + &Include subtitles on screenshots + Ondertitels &weergeven op schermafdrukken + + + + &Use -subfont option (required by recent MPlayer releases) + &Gebruik -subfont optie (benodigd bij recente MPlayer uitgaves) + + + + &TTF font: + &TTF lettertype: + + + + Sea&rch... + &Zoek... + + + + S&ystem font: + S&ysteem lettertype: + + + + A&utoscale: + A&utomatische herschaling: + + + + S&cale: + &Herschalen: + + + + &Use SSA/ASS library for subtitle rendering + &Gebruik SSA/ASS bibliotheek om ondertitels te weergeven + + + + &Text color: + &Tekstkleur: + + + + &Border color: + &Randkleur: + + + + St&yles: + St&ijlen: + + + + PreferencesDialog + + + SMPlayer - Help + SMPlayer - Help + + + + OK + OK + + + + Cancel + Annuleren + + + + Apply + Toepassen + + + + Help + Help + + + + SMPlayer - Preferences + SMPlayer - Voorkeuren + + + + QObject + + + 1 second + 1 seconde + + + + %1 seconds + %1 seconden + + + + %1 minutes + %1 minuten + + + + %1 minutes and %2 seconds + %1 minuten en %2 seconden + + + + 1 minute + 1 minuut + + + + 1 minute and 1 second + 1 minuut en 1 seconde + + + + 1 minute and %1 seconds + 1 minuut en %1 seconden + + + + %1 minutes and 1 second + %1 minuten en 1 seconde + + + + specifies the directory for the configuration file (smplayer.ini). If directory is omitted, the application directory will be used. + Specifieert de map voor het configuratiebestand (smplayer.ini). Als de map niet is ingevuld, dan wordt de map van het programma gebruikt. + + + + will show this message and then will exit. + zal dit bericht tonen en daarna sluiten. + + + + 'media' is any kind of file that SMPlayer can open. It can be a local file, a DVD (e.g. dvd://1), an Internet stream (e.g. mms://....) or a local playlist in format m3u. If the -playlist option is used, that means that SMPlayer will pass the -playlist option to MPlayer, so MPlayer will handle the playlist, not SMPlayer. + 'media' is elk soort bestand at SMPlayer kan openen. Het kan een lokaal bestand zijn, maar ook een dvd (bv. dvd://1), een internetstream (bv. mms://...) of een lokale playlist in het m3u formaat. Indien de -playlist optie wordt gebruikt, dan zal SMPlayer de -playlist optie doorgeven aan MPlayer, zodat MPlayer de afspeellijst kan verwerken in plaats van SMPlayer. + + + + the main window will be closed when the file/playlist finishes. + het hoofdvenster zal gesloten worden na afloop van het bestand of de afspeellijst. + + + + This is SMPlayer v. %1 running on %2 + Dit is SMPlayer v. %1 draaiend op %2 + + + + Usage: %1 [-ini-path [directory]] [-send-action action_name] [-actions action_list [-close-at-end] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + Gebruik: %1 [-ini-path [directory]] [-send-action action_name] [-actions action_list [-close-at-end] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + + + + tries to make a connection to another running instance and send to it the specified action. Example: -send-action pause The rest of options (if any) will be ignored and the application will exit. It will return 0 on success or -1 on failure. + probeert een verbinding naar een draaiende instantie van te maken en de gespecifieerde actie te sturen. Voorbeeld: -send-action pause; De rest van de opties (indien die er zijn) worden genegeerd en het programma zal stoppen. De functie geeft 0 terug bij een succesvolle actie of -1 wanneer de actie niet verstuurd kon worden. + + + + action_list is a list of actions separated by spaces. The actions will be executed just after loading the file (if any) in the same order you entered. For checkable actions you can pass true or false as parameter. Example: -actions "fullscreen compact true". Quotes are necessary in case you pass more than one action. + action_list is een lijst van acties, gescheiden door spaties. De acties zullen uitgevoerd worden direct na het laden van het bestand in de volgorde waarin ze werden ingevoerd. Voor aan/uit acties kan de parameter true of false toegevoegd worden. Voorbeeld: -actions "fullscreen compact true". Aanhalingstekens zijn nodig indien er meer dan één actie wordt ingevoerd. + + + + media + media + + + + Usage: %1 [-ini-path [directory]] [-send-action action_name] [-actions action_list [-close-at-end] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + Gebruik: %1 [-ini-path [directory]] [-send-action action_name] [-actions action_list [-close-at-end] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + + + + if there's another instance running, the media will be added to that instance's playlist. If there's no other instance, this option will be ignored and the files will be opened in a new instance. + Als er een instantie van het programma draait zal de media worden toegevoegd aan de speellijst van die instantie. Als er geen instantie draait zal deze optie worden genegeerd en dan worden de bestanden geopend in een nieuwe instantie van het programma. + + + + specifies the directory for the configuration file (smplayer.ini). + + + + + the main window won't be closed when the file/playlist finishes. + + + + + Usage: %1 [-ini-path directory] [-send-action action_name] [-actions action_list [-close-at-end] [-no-close-at-end] [-fullscreen] [-no-fullscreen] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + + + + + the video will be played in fullscreen mode. + + + + + the video will be played in window mode. + + + + + SeekWidget + + + icon + icoon + + + + label + label + + + + ShortcutGetter + + + Modify shortcut + Sneltoets aanpassen + + + + Clear + Leegmaken + + + + Press the key combination you want to assign + Druk de toetsencombinatie in die je wil toewijzen + + + + Capture + Opvangen + + + + Capture keystrokes + Toetsencombinaties opvangen + + + + VideoEqualizer + + + Equalizer + Equalizer + + + + Contrast + Contrast + + + + Brightness + Helderheid + + + + Hue + Tint + + + + Saturation + Verzadiging + + + + Gamma + Gamma + + + + &Reset + &Reset + + + + &Set as default values + &Instellen als standaardwaarden + + + + Use the current values as default values for new videos. + Gebruik de huidige waarden als standaardwaarden voor nieuwe videobestanden. + + + + Set all controls to zero. + Zet alle besturingselementen op nul. + + + diff --git a/retroshare-gui/src/apps/smplayer/translations/smplayer_pl.qm b/retroshare-gui/src/apps/smplayer/translations/smplayer_pl.qm new file mode 100644 index 000000000..29dddd72c Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/translations/smplayer_pl.qm differ diff --git a/retroshare-gui/src/apps/smplayer/translations/smplayer_pl.ts b/retroshare-gui/src/apps/smplayer/translations/smplayer_pl.ts new file mode 100644 index 000000000..5157a1c1e --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/translations/smplayer_pl.ts @@ -0,0 +1,3964 @@ + + + + + AboutDialog + + + Version: %1 + Wersja: %1 + + + + 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. + Ten program jest Wolnym Oprogramowaniem; możesz go redystrybuować i/lub modyfikować na warunkach GNU General Public License wydanej przez Free Software Foundation; albo wersja 2 licencji, lub (twój wybór) każdÄ… późniejszÄ… wersjÄ™. + + + + Translators: + TÅ‚umacze: + + + + German + German + + + + Slovak + Slovak + + + + Italian + Italian + + + + French + French + + + + Simplified-Chinese + Simplified-Chinese + + + + Russian + Russian + + + + Hungarian + Hungarian + + + + Japanese + Japanese + + + + Dutch + Dutch + + + + Ukrainian + Ukrainian + + + + Georgian + Georgian + + + + Czech + Czech + + + + Logo designed by %1 + Logo wykonane przez %1 + + + + Get updates at: %1 + Sprawdź uaktualnienia : %1 + + + + About SMPlayer + O SMPlayer + + + + Polish + Polish + + + + Bulgarian + Bulgarian + + + + Turkish + Turkish + + + + Swedish + Swedish + + + + Serbian + Serbian + + + + Traditional Chinese + Traditional Chinese + + + + Romanian + Romanian + + + + Portuguese - Brazil + Portuguese - Brazil + + + + Portuguese - Portugal + Portuguese - Portugal + + + + Compiled with Qt %1 + Kompilowany z Qt4 %1 + + + + %1, %2 and %3 + %1, %2 i %3 + + + + %1 and %2 + %1 i %2 + + + + http://smplayer.sourceforge.net/en/windows/download.php + If the web page is translated into your language you can change the URL so it points to the download page in the translation.Otherwise leave as is. + http://smplayer.sourceforge.net/pl/windows/download.php + + + + http://smplayer.sourceforge.net/en/linux/download.php + If the web page is translated into your language you can change the URL so it points to the download page in the translation.Otherwise leave as is. + http://smplayer.sourceforge.net/pl/linux/download.php + + + + <b>%1</b>: %2 + <b>%1</b>: %2 + + + + ActionsEditor + + + Name + Nazwa + + + + Description + Opis + + + + Shortcut + Klawisz skrótu + + + + &Save + &Zapisz + + + + &Load + &Wczytaj + + + + Key files + Pliki Key + + + + Choose a filename + Wybierz nazwÄ™ pliku + + + + Confirm overwrite? + Nadpisać? + + + + The file %1 already exists. +Do you want to overwrite? + Plik %1 istnieje +Nadpisać? + + + + Choose a file + Wybierz plik + + + + Error + BÅ‚Ä…d + + + + The file couldn't be saved + Plik nie może zostać zapisany + + + + The file couldn't be loaded + Plik nie może zostać wczytany + + + + &Change shortcut... + &ZmieÅ„ klawisz skrótu... + + + + BaseGui + + + SMPlayer - mplayer log + SMPlayer - mplayer log + + + + SMPlayer - smplayer log + SMPlayer - smplayer log + + + + &Open + &Otwórz + + + + &Play + &Odtwarzanie + + + + &Video + &Wideo + + + + &Audio + &Audio + + + + &Subtitles + &Napisy + + + + &Browse + &PrzeglÄ…daj + + + + Op&tions + Op&cje + + + + &Help + &Pomoc + + + + &File... + &Plik ... + + + + D&irectory... + K&atalog... + + + + &Playlist... + &Lista odtwarzania... + + + + &DVD from drive + &DVD z napÄ™du + + + + D&VD from folder... + D&VD z katalogu... + + + + &URL... + &URL... + + + + &Clear + &Wyczyść + + + + &Recent files + &Ostatnio otwierane pliki + + + + P&lay + O&dtwarzaj + + + + &Pause + &Pauza + + + + &Stop + &Stop + + + + &Frame step + &Krok + + + + &Normal speed + &Normala prÄ™dkość + + + + &Halve speed + &PoÅ‚owa prÄ™dkoÅ›ci + + + + &Double speed + &Podwójna prÄ™dkość + + + + Speed &-10% + PrÄ™dkość &-10% + + + + Speed &+10% + PrÄ™dkość &+10% + + + + Sp&eed + &PrÄ™dkość + + + + &Repeat + &Powtarzaj + + + + &Fullscreen + &PeÅ‚ny ekran + + + + &Compact mode + &Ukryj menu i przyciski + + + + Si&ze + Ro&zmiar + + + + &Autodetect + &Autodetekcja + + + + &4:3 + &4:3 + + + + &5:4 + &5:4 + + + + &14:9 + &14:9 + + + + 16:&9 + 16:&9 + + + + 1&6:10 + 1&6:10 + + + + &2.35:1 + &2.35:1 + + + + 4:3 &Letterbox + 4:3 &Letterbox + + + + 16:9 L&etterbox + 16:9 L&etterbox + + + + 4:3 &Panscan + 4:3 &Panscan + + + + 4:3 &to 16:9 + 4:3 &zu 16:9 + + + + &Aspect ratio + &Współczynnik proporcji + + + + &None + &Brak + + + + &Lowpass5 + &Lowpass5 + + + + Linear &Blend + Liniowy &Mieszany + + + + &Deinterlace + &Usuwanie przeplotu + + + + &Postprocessing + &Przetwarzanie koÅ„cowe + + + + &Autodetect phase + &Autodetekcja fazy + + + + &Deblock + &Deblock + + + + De&ring + De&ring + + + + Add n&oise + &Dodaj szum + + + + F&ilters + F&iltry + + + + &Equalizer + &Korektor + + + + &Screenshot + &Zrzut ekranu + + + + S&tay on top + Z&awsze na wierzchu + + + + &Track + &Åšcieżka + + + + &Extrastereo + &Extrastereo + + + + &Karaoke + &Karaoke + + + + &Filters + &Filtry + + + + &Default + &DomyÅ›lne + + + + &Stereo + &Stereo + + + + &4.0 Surround + &4.0 Surround + + + + &5.1 Surround + &5.1 Surround + + + + &Channels + &KanaÅ‚y + + + + &Left channel + &Lewy kanaÅ‚ + + + + &Right channel + &Prawy kanaÅ‚ + + + + &Stereo mode + &Tryb stereo + + + + &Mute + &Wycisz + + + + Volume &- + Ciszej &- + + + + Volume &+ + GÅ‚oÅ›niej &+ + + + + &Delay - + &Opóźnij audio - + + + + D&elay + + P&rzyÅ›piesz audio + + + + + &Select + &Wybierz + + + + &Load... + &Wczytaj... + + + + Delay &- + Opóźnij napisy &- + + + + Delay &+ + PrzyÅ›piesz napisy &+ + + + + &Up + &PrzesuÅ„ napisy w górÄ™ + + + + &Down + &PrzesuÅ„ napisy w dół + + + + &Title + &TytuÅ‚ + + + + &Chapter + &RozdziaÅ‚ + + + + &Angle + &KÄ…t widzenia + + + + &Playlist + &Lista odtwarzania + + + + &Show frame counter + &Pokaż licznik klatek + + + + &Disabled + &WyÅ‚Ä…czone + + + + &Seek bar + &Pasek wyszukiwania + + + + &Time + &Czas + + + + Time + T&otal time + Czas +C&aÅ‚kowity czas + + + + &OSD + &OSD + + + + &View logs + &Pokaż logi + + + + P&references + &Ustawienia + + + + About &Qt + O &Qt + + + + About &SMPlayer + O &SMPlayer + + + + <empty> + <brak> + + + + Video + Wideo + + + + Audio + Audio + + + + Playlists + Listy odtwarzania + + + + All files + Wszystkie pliki + + + + Choose a file + Wybierz plik + + + + SMPlayer - Information + SMPlayer - Informacje + + + + The CDROM / DVD drives are not configured yet. +The configuration dialog will be shown now, so you can do it. + CDROM / DVD nie jest jeszcze skonfigurowany. +Zobaczysz zaraz dialog konfiguracji i możesz dokonać ustaweÅ„. + + + + Choose a directory + Wybierz katalog + + + + Subtitles + Napisy + + + + About Qt + O... Qt + + + + Playing %1 + Odtwarzanie %1 + + + + Pause + Pauza + + + + Stop + Stop + + + + De&noise + Od&szumianie + + + + N&ormal + N&ormalne + + + + &Soft + &Programowe + + + + Play / Pause + Odtwarzaj / Pauza + + + + Pause / Frame step + Pauza / Krok + + + + U&nload + W&yÅ‚aduj + + + + V&CD + V&CD + + + + C&lose + Z&amknij + + + + View &info and properties... + Pokaż &informacjÄ™ i wÅ‚aÅ›ciwoÅ›ci... + + + + Zoom &- + Zoom &- + + + + Zoom &+ + Zoom &+ + + + + &Reset + &Reset + + + + Move &left + PrzesuÅ„ w &lewo + + + + Move &right + PrzesuÅ„ w &prawo + + + + Move &up + PrzesuÅ„ w &górÄ™ + + + + Move &down + PrzesuÅ„ w &dół + + + + &Pan && scan + &Pan && scan + + + + &Previous line in subtitles + &Poprzedni wiersz napisów + + + + N&ext line in subtitles + N&astÄ™pny wiersz napisów + + + + -%1 + -%1 + + + + +%1 + +%1 + + + + Dec volume (2) + Zmniejsz gÅ‚oÅ›ność (2) + + + + Inc volume (2) + ZwiÄ™ksz gÅ‚oÅ›ność (2) + + + + Exit fullscreen + Wyjdź z peÅ‚nego ekranu + + + + OSD - Next level + OSD-nastÄ™pny poziom + + + + Dec contrast + Zmniejsz kontrast + + + + Inc contrast + ZwiÄ™ksz kontrast + + + + Dec brightness + Zmniesz jasność + + + + Inc brightness + ZwiÄ™ksz jasność + + + + Dec hue + Zmniejsz odcieÅ„ + + + + Inc hue + ZwiÄ™ksz odcieÅ„ + + + + Dec saturation + Zmniejsz saturacjÄ™ + + + + Dec gamma + Zmniejsz gamma + + + + Next audio + NastÄ™pne audio + + + + Next subtitle + NastÄ™pne napisy + + + + Next chapter + NastÄ™pny rozdziaÅ‚ + + + + Previous chapter + Poprzedni rozdziaÅ‚ + + + + Inc saturation + ZwiÄ™ksz saturacjÄ™ + + + + Inc gamma + ZwiÄ™ksz gamma + + + + Toggle double size + Podwójny rozmiar + + + + &Load external file... + &Wczytaj zewnÄ™trzny plik... + + + + &Kerndeint + &Kerndeint + + + + &Yadif (normal) + &Yadif (normalny) + + + + Y&adif (double framerate) + Y&adif (podwójna szybkość klatek) + + + + &Next + &NastÄ™pny + + + + Pre&vious + Pop&rzedni + + + + Volume &normalization + Normalizacja &gÅ‚oÅ›noÅ›ci + + + + &Audio CD + &Audio CD + + + + Denoise nor&mal + Normalne &odszumianie + + + + Denoise &soft + Programowe &odszumianie + + + + Denoise o&ff + WyÅ‚Ä…czone &odszumianie + + + + SMPlayer - Enter URL + SMPlayer - Wprowadź URL + + + + URL: + URL: + + + + Use SSA/&ASS library + Użyj biblioteki SSA/&ASS + + + + + Flip i&mage + Odwróć &obraz + + + + &Toggle double size + &PrzeÅ‚Ä…cz na podwójny rozmiar + + + + BaseGuiPlus + + + SMPlayer is still running here + SMPlayer nadal dziaÅ‚a + + + + S&how icon in system tray + P&okaż ikonÄ™ w tacce systemowej + + + + &Hide + &Ukryj + + + + &Restore + &Przywróć + + + + &Recent files + &Ostatnio otwierane pliki + + + + &Quit + &Wyjdź + + + + Playlist + Lista odtwarzania + + + + Core + + + Brightness: %1 + Jasność: %1 + + + + Contrast: %1 + Kontrast: %1 + + + + Gamma: %1 + Gamma: %1 + + + + Hue: %1 + OdcieÅ„: %1 + + + + Saturation: %1 + Nasycenie: %1 + + + + Volume: %1 + GÅ‚oÅ›ność: %1 + + + + Zoom: %1 + Zoom: %1 + + + + DefaultGui + + + Welcome to SMPlayer + Witaj w SMPlayer + + + + Volume + GÅ‚oÅ›ność + + + + Audio + Audio + + + + Subtitle + Napisy + + + + Playlist + Lista odtwarzania + + + + &Main toolbar + &Główny pasek narzÄ™dzi + + + + &Language toolbar + &Pasek wyboru jÄ™zyka dla napisów i Å›cieżki audio + + + + &Toolbars + &Paski narzÄ™dzi + + + + Encodings + + + Western European Languages + Western European Languages + + + + Western European Languages with Euro + Western European Languages with Euro + + + + Slavic/Central European Languages + Slavic/Central European Languages + + + + Esperanto, Galician, Maltese, Turkish + Esperanto, Galician, Maltese, Turkish + + + + Old Baltic charset + Old Baltic charset + + + + Cyrillic + Cyrylica + + + + Arabic + Arabic + + + + Modern Greek + Modern Greek + + + + Turkish + Tureski + + + + Baltic + Baltic + + + + Celtic + Celtic + + + + Hebrew charsets + Hebrew charsets + + + + Russian + Rosyjski + + + + Ukrainian, Belarusian + Ukrainian, Belarusian + + + + Simplified Chinese charset + Simplified Chinese charset + + + + Traditional Chinese charset + Traditional Chinese charset + + + + Japanese charsets + Japanese charsets + + + + Korean charset + Korean charset + + + + Thai charset + Thai charset + + + + Cyrillic Windows + Cyrillic Windows + + + + Slavic/Central European Windows + Slavic/Central European Windows + + + + Arabic Windows + Arabic Windows + + + + EqSlider + + + icon + ikona + + + + FilePropertiesDialog + + + SMPlayer - File properties + SMPlayer - Ustawienia pliku + + + + &Information + &Informacja + + + + &Demuxer + &Demuxer + + + + &Select the demuxer that will be used for this file: + &Wybierz Demuxer, dla tego pliku: + + + + &Reset + &Resetuj + + + + &Video codec + &Wideo-Kodek + + + + &Select the video codec: + &Wybierz Wideo-Kodek: + + + + A&udio codec + A&udio-Kodek + + + + &Select the audio codec: + &Wybierz Audio-Kodek: + + + + &MPlayer options + &Opcje Mplayer-a + + + + Additional Options for MPlayer + Dodatkowe opcje MPlayer-a + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + Tu możesz wpisać dodatkowe opcje MPlayer-a. +Wpisz oddzielajÄ…c spacjÄ…. +PrzykÅ‚ad: -flip -nosound + + + + &Options: + &Opcje: + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + Dodatkowe opcje filtrów wideo. +Wpisz oddzielajÄ…c przecinkiem ",". Nie używaj spacji! +PrzykÅ‚ad: scale=512:-2,eq2=1.1 + + + + V&ideo filters: + F&iltry Wideo: + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + Opcje dla filtrów audio. Takie same zasady jak dla filtrów wideo. +PrzykÅ‚ad: resample=44100:0:0,volnorm + + + + Audio &filters: + Filtry &Audio: + + + + OK + OK + + + + Cancel + Anuluj + + + + Apply + Zatwierdź + + + + InfoFile + + + General + Ogólne + + + + Size + Rozmiar + + + + %1 KB (%2 MB) + %1 KB (%2 MB) + + + + URL + URL + + + + Length + DÅ‚ugość + + + + Demuxer + Demuxer + + + + Name + Nazwa + + + + Artist + Artysta + + + + Author + Autor + + + + Album + Album + + + + Genre + Gatunek + + + + Date + Data + + + + Track + Track + + + + Copyright + Copyright + + + + Comment + Komentarz + + + + Software + Oprogramowanie + + + + Clip info + Info o klipie + + + + Video + Wideo + + + + Resolution + Rozdzielczość + + + + Aspect ratio + Współczynnik proporcji + + + + Format + Format + + + + Bitrate + Bitrate + + + + %1 kbps + %1 kbps + + + + Frames per second + Ramek na sekundÄ™ + + + + Selected codec + Użyty dekoder + + + + Initial Audio Stream + PoczÄ…tkowy strumieÅ„ audio + + + + Rate + Tempo + + + + %1 Hz + %1 Hz + + + + Channels + KanaÅ‚y + + + + Audio Streams + Strumienie audio + + + + Language + JÄ™zyk + + + + empty + brak + + + + Subtitles + Napisy + + + + Type + Typ + + + + ID + Info for translators: this is a identification code + ID + + + + # + Info for translators: this is a abbreviation for number + # + + + + Stream title + Nazwa strumienia + + + + Stream URL + URL strumienia + + + + File + Plik + + + + InputDVDDirectory + + + Choose a directory + Wybierz katalog + + + + SMPlayer - Play a DVD from a folder + SMPlayer - Odtwórz DVD z katalogu + + + + You can play a dvd from your hard disc. Just select the folder which contains the VIDEO_TS and AUDIO_TS directories. + Możesz odtwarzać DVD z dysku. +Wybierz katalog, w którym jest VIDEO_TS i AUDIO_TS. + + + + Choose a directory... + Wybierz katalog ... + + + + InputURL + + + SMPlayer - Enter URL + SMPlayer - Wprowadź URL + + + + &URL: + &URL: + + + + It's a &playlist + To jest &lista odtwarzania + + + + If this option is checked, the URL will be treated as a playlist: it will be opened as text and will play the URLs in it. + JeÅ›li ta opcja jest zaznaczona, URL bÄ™dzie traktowany jako lista odtwarzania: bÄ™dzie otwarty jako tekst i z tego odtwarzany URL. + + + + LogWindow + + + Choose a filename to save under + Wybierz plik do zapisania + + + + Confirm overwrite? + Nadpisać? + + + + The file already exists. +Do you want to overwrite? + Plik istnieje. +Nadpisać? + + + + Error saving file + BÅ‚Ä…d zapisu pliku + + + + The log couldn't be saved + Log nie zapisany + + + + Logs + Logi + + + + LogWindowBase + + + Log Window + Okno logu + + + + Save + Zapisz + + + + Copy to clipboard + Kopiuj do schowka + + + + Close + Zamknij + + + + &Close + &Zamknij + + + + Playlist + + + Name + Nazwa + + + + Length + DÅ‚ugość + + + + Choose a file + Wybierz plik + + + + Choose a filename + Wybierz nazwÄ™ pliku + + + + Confirm overwrite? + Potwierdź nadpisanie? + + + + Select one or more files to open + Wybierz jeden lub wiÄ™cej plików do otwarcia + + + + Choose a directory + Wybierz katalog + + + + The file %1 already exists. +Do you want to overwrite? + Plik %1 istnieje +Nadpisać? + + + + Edit name + Edytuj nazwÄ™ + + + + Type the name that will be displayed in the playlist for this file: + Wpisz nowÄ… nazwÄ™ dla tego pliku która bÄ™dzie wyÅ›wietlana w liÅ›cie +odtwarzania : + + + + &Play + &Odtwarzaj + + + + &Edit + &Edytuj + + + + Playlists + Listy odtwarzania + + + + All files + Wszystkie pliki + + + + &Load + &Wczytaj + + + + &Save + &Zapisz + + + + &Next + &NastÄ™pny + + + + Pre&vious + Pop&rzedni + + + + Move &up + PrzesuÅ„ w &górÄ™ + + + + Move &down + PrzesuÅ„ w &dół + + + + &Repeat + &Powtarzaj + + + + S&huffle + T&asuj + + + + Add &current file + Dodaj &bieżący plik + + + + Add &file(s) + Dodaj &plik(i) + + + + Add &directory + Dodaj &katalog + + + + Remove &selected + UsuÅ„ &zaznaczony + + + + Remove &all + UsuÅ„ &wszystko + + + + SMPlayer - Playlist + SMPlayer-lista odtwarzania + + + + Add... + Dodaj... + + + + Remove... + UsuÅ„... + + + + Playlist modified + Lista odtwarzania zmodyfikowana + + + + There are unsaved changes, do you want to save the playlist? + Tu sÄ… niezapisane zmiany, czy chcesz zapisać listÄ™ odtwarzania? + + + + PrefAdvanced + + + Advanced + Zaawansowane + + + + Auto + Auto + + + + Form + Forma + + + + &Advanced + &Zaawansowane + + + + icon + ikona + + + + Additional Options for MPlayer + Dodatkowe opcje MPlayer-a + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + Tu możesz wpisać dodatkowe opcje MPlayer-a. +Wpisz oddzielajÄ…c spacjÄ…. +PrzykÅ‚ad: -flip -nosound + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + Dodatkowe opcje filtrów wideo. +Wpisz oddzielajÄ…c przecinkiem ",". Nie używaj spacji! +PrzykÅ‚ad: scale=512:-2,eq2=1.1 + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + Opcje dla filtrów audio. Takie same zasady jak dla filtrów wideo. +PrzykÅ‚ad: resample=44100:0:0, + + + + Don't repaint the background of the video window + Nie odÅ›wieżaj tÅ‚a okna wideo + + + + &Logs + &Logi + + + + Log MPlayer output + Komunikaty wyjÅ›ciowe MPlayer-a + + + + Log SMPlayer output + Komunikaty wyjÅ›ciowe SMPlayer-a + + + + This option is mainly intended for debugging the application. + Ta opcja jest przeznaczona głównie do debugowania programu. + + + + &MPlayer language + &JÄ™zyk MPlayer-a + + + + SMPlayer needs to read and parse the output of MPlayer and sometimes it relies on English text. If you are using a MPlayer translated into another language, then you need to change the texts that SMPlayer looks for. (Technically you should enter regular expressions)<br><br> +The drop-down lists may provide already made regular expression for several languages. + Aby odczytać i przeprowadzić analizÄ™ tekstu SMplayer potrzebuje danych od programu MPlayer i czasami opiera siÄ™ na angielskim tekÅ›cie. JeÅ›li używasz MPlayer-a przetÅ‚umaczonego na inny jÄ™zyk, to należy przerobić teksty, których SMPlayer bÄ™dzie szukaÅ‚. (Technicznie powinieneÅ› wpisać regularne wyrażenia)<br><br> +Rozwijalna lista dostarcza już regularne wyrażenia dla kilku jÄ™zyków. + + + + + + Checking this option may reduce flickering, but it also might produce that the video won't be displayed properly. + Zaznaczenie tej opcji może zredukować migotanie, ale jednoczeÅ›nie może spowodować, że obraz wideo nie bÄ™dzie poprawnie wyÅ›wietlany. + + + + If checked, smplayer will store the output of mplayer (you can see it in <b>Options->View logs->mplayer</b>). In case of problems this log can contain important information, so it's recommended to keep this option checked. + JeÅ›li opcja jest zaznaczona, smplayer bÄ™dzie pamiÄ™taÅ‚ komunikaty z mplayer-a (możesz zobaczyć te komunikaty klikajÄ…c + <b>Opcje->Pokaż logi->mplayer</b>). W przypadku problemów ten komunikat bÄ™dzie miaÅ‚ bardzo ważne informacje, wiÄ™c zaleca siÄ™ wÅ‚Ä…czyć tÄ… opcjÄ™. + + + + + + If this option is checked, smplayer will store the debugging messages that smplayer outputs (you can see the log in <b>Options->View logs->smplayer</b>). This information can be very useful for the developer in case you find a bug. + JeÅ›li ta opcja jest zaznaczona, smplayer bÄ™dzie pamiÄ™taÅ‚ komunikaty debugowania (możesz zobaczyć te komunikaty +klikajÄ…c <b>Opcje->Pokaż logi->smplayer</b>). Ta informacja bÄ™dzie bardzo przydatna dla programisty jeÅ›li znajdziesz +bÅ‚Ä…d w programie. + + + + + + Filter for SMPlayer logs + Filtr logów SMPlayer-a + + + + This option allows to filter the smplayer messages that will be stored in the log. Here you can write any regular expression.<br>For instance: <i>^Core::.*</i> will display only the lines starting with <i>Core::</i> + Ta opcja pozwala filtrować komunikaty wyjÅ›ciowe które bÄ™dÄ… zapamiÄ™tane w logu. Wpisz tutaj wyrażenie regularne. <br>Na przykÅ‚ad wpisanie: <i>^Core::.*</i> pokaże tylko linie zaczynajÄ…ce siÄ™ od <i>Core::</i> + + + + + &Monitor aspect: + &Rozmiar ekranu: + + + + &Run MPlayer in its own window + &Uruchom MPlayer w oddzielnym oknie + + + + &Options: + &Opcje: + + + + V&ideo filters: + F&iltry Wideo: + + + + Audio &filters: + Filtry &Audio: + + + + &Colorkey: + &Kolor tÅ‚a okna gÅ‚ownego: + + + + &Don't repaint the background of the video window + &Nie odÅ›wieżaj tÅ‚a okna wideo + + + + Log &MPlayer output + Komunikaty &wyjÅ›ciowe MPlayer-a + + + + Log &SMPlayer output + Komunikaty &wyjÅ›ciowe SMPlayer-a + + + + &Filter for SMPlayer logs: + &Filtr logów SMPlayer-a: + + + + &End of file: + &Koniec pliku: + + + + &No video: + &Brak wideo: + + + + C&hange... + Z&mieÅ„... + + + + PrefAssociations + + + Warning + Uwaga + + + + Not all files could be associated. Please check your security permissions and retry. + Nie wszystkie pliki mogÄ… zostać skojarzone. Sprawdź swoje uprawnienia dostÄ™pu do systemu plików i spróbuj ponownie. + + + + File Types + Rodzaj plików + + + + Select all + Wybierz wszystko + + + + Check all file types in the list + Zaznacz wszystkie rodzaje plików z listy + + + + Uncheck all file types in the list + Odznacz wszystkie rodzaje plików z listy + + + + List of file types + Lista rodzaju plików + + + + File types + Rodzaj plików + + + + Media files handled by SMPlayer: + Rodzaj plików obsÅ‚ugiwanych przez SMPlayer: + + + + Select All + Wybierz wszystko + + + + Select None + Nie wybieraj nic + + + + Check the media file extensions you would like SMPlayer to handle. When you click Apply, the checked files will be associated with SMPlayer. If you uncheck a media type, the file association will be restored. + Zaznacz rozszerzenia plików, które chciaÅ‚byÅ› aby obsÅ‚ugiwaÅ‚ SMPlayer. Gdy naciÅ›niesz Ok, zaznaczone pliki zostanÄ… skojarzone z SMPlayer-em. JeÅ›li odznaczysz noÅ›nik, skojarzenie plików zostanie przywrócone. + + + + Select none + Nie wybieraj nic + + + + PrefDrives + + + Drives + NapÄ™dy + + + + Currently SMPlayer does not autodetect cdrom or dvd devices. So in order to play cdroms or dvds you must first select here your cdrom and dvd drives (can be the same). + Aktualnie SMPlayer nie wykrywa automatycznie urzÄ…dzeÅ„ cdrom lub dvd. +Aby odtwarzać z cdrom lub dvd musisz ustawić napÄ™d cdrom i dvd (może być ten sam). + + + + icon + ikona + + + + Select your CD device: + Wybierz napÄ™d CD: + + + + Select your DVD device: + Wybierz napÄ™d DVD: + + + + CD device + NapÄ™d CD + + + + Choose your CDROM device. It will be used to play VCDs and Audio CDs. + Wybierz napÄ™d CD. BÄ™dzie on użyty do odtwarzania pÅ‚yt VCD oraz CD. + + + + DVD device + NapÄ™d DVD + + + + Choose your DVD device. It will be used to play DVDs. + Wybierz napÄ™d DVD. BÄ™dzie on użyty do odtwarzania DVD. + + + + Select your &CD device: + Wybierz napÄ™d &CD: + + + + Select your &DVD device: + Wybierz napÄ™d &DVD: + + + + PrefGeneral + + + General + Główne + + + + &General + &Główne + + + + Paths + Åšcieżka + + + + Select... + Wybierz ... + + + + Folder for storing screenshots: + Katalog dla zrzutów ekranu: + + + + Search... + Szukaj ... + + + + Select the MPlayer executable: + Wybierz plik wykonywalny MPlayer-a: + + + + Output drivers + Sterownik wyjÅ›ciowy + + + + Video: + Wideo: + + + + Audio: + Audio: + + + + Media settings + Ustawienia mediów + + + + Remember settings for all files (audio track, subtitles...) + ZapamiÄ™taj ustawienia dla wszystkich plików (Å›cieżki audio, napisy...) + + + + Don't remember time position (files start playing from the beginning) + Nie zapamiÄ™tuj pozycji czasu (start odtwarzania od poczÄ…tku) + + + + Preferred audio and subtitles + Preferowana Å›cieżka dźwiÄ™kowa i napisy + + + + Subtitles: + Napisy: + + + + &Video and audio + &Wideo i audio + + + + Video + Wideo + + + + Use software video equalizer + Użyj programowego korektora wideo + + + + Enable postprocessing for all videos + WÅ‚Ä…cz postprocessing dla wszystkich plików wideo + + + + Quality: + Jakość: + + + + Start videos in fullscreen + Start odtwarzania na peÅ‚nym ekranie + + + + Disable screensaver + Zablokuj wygaszacz ekranu + + + + Audio + Audio + + + + Use software volume control + Użyj programowej regulacji gÅ‚oÅ›noÅ›ci + + + + Max. Amplification: + Maksymalne wzmocnienie: + + + + AC3/DTS pass-through S/PDIF + AC3/DTS pass-through S/PDIF + + + + Volume normalization + Normalizacja gÅ‚oÅ›noÅ›ci + + + + Select the mplayer executable + Wybierz plik wykonywalny mplayer-a + + + + Executables + Wykonywalne + + + + All files + Wszystkie pliki + + + + Select a directory + Wybierz katalog + + + + MPlayer executable + Plik wykonywalny MPlayer-a + + + + Here you must specify the mplayer executable that smplayer will use.<br>smplayer requires at least mplayer 1.0rc1 (svn recommended).<br><b>If this setting is wrong, smplayer won't be able to play anything!</b> + Tutaj musisz podać plik wykonywalny mplayera.<br>minimalna wymagana wersja to 1.0rc1(svn zalecany).<br><b>JeÅ›li +tego nie zrobisz smplayer nie bÄ™dzie odtwarzać plików!</b> + + + + Screenshots folder + Folder dla zrzutów ekranu + + + + Here you can specify a folder where the screenshots taken by smplayer will be stored. If this field is empty the screenshot feature will be disabled. + Tutaj podajesz katalog, w którym bÄ™dÄ… zapisywane zrzuty ekranu wykonane przez smplayer. JeÅ›li zostawisz to pole puste opcja zrzutów ekranu bÄ™dzie wyÅ‚Ä…czona. + + + + Video output driver + Strerownik wyjÅ›ciowy wideo + + + + Select the video output driver. Usually xv (linux) and directx (windows) provide the best performance. + Wybierz sterownik wyjÅ›ciowy wideo. Zwykle xv (Linux) i directx (Windows) dajÄ… najlepszÄ… wydajność. + + + + Audio output driver + Sterownik wyjÅ›ciowy audio + + + + Select the audio output driver. + Wybierz sterownik wyjÅ›ciowy audio. + + + + Remember settings + ZapamiÄ™taj ustawienia + + + + Usually smplayer will remember the settings for each file you play (audio track selected, volume, filters...). Uncheck this option if you don't like this feature. + Zwykle smplayer pamiÄ™ta ustawienia dla każdego odtwarzanego pliku (wybranej Å›cieżki audio,gÅ‚oÅ›noÅ›ci,fitrów...). Odznacz tÄ… opcjÄ™ aby tego nie robiÅ‚. + + + + Don't remember time position + Nie zapamiÄ™tuj pozycji czasu + + + + If you check this option, smplayer will play all files from the beginning. + Gdy ta opcja jest zaznaczona, smplayer bÄ™dzie odtwarzaÅ‚ wszystkie pliki od poczÄ…tku. + + + + Preferred audio language + Preferowany jÄ™zyk audio + + + + Here you can type your preferred language for the audio streams. When a media with multiple audio streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the audio streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the audio track if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + Tutaj możesz ustawić preferowany jÄ™zyk Å›cieżki dźwiÄ™kowej. JeÅ›li smplayer wykryje wiÄ™cej niż jednÄ… Å›cieżkÄ™ dźwiÄ™kowÄ… spróbuje użyć preferowanej.<br>Ta funkcja dziaÅ‚a tylko z mediami, które podajÄ… informacjÄ™ o Å›cieżkach dźwiÄ™kowych, takie jak DVD lub pliki mkv.<br>To pole akceptuje regularne wyrażenia. Na przykÅ‚ad: <b>es|esp|spa</b> bÄ™dzie dobierać Å›cieżkÄ™ dźwiÄ™kowÄ… odpowiadajÄ…cÄ… <i>es</i>, <i>esp</i> lub <i>spa</i>. + + + + + Preferred subtitle language + Preferowany jÄ™zyk napisów + + + + Here you can type your preferred language for the subtitle stream. When a media with multiple subtitle streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the subtitle streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the subtitle stream if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + Tutaj możesz ustawić preferowany jÄ™zyk napisów. JeÅ›li smplayer wykryje wiÄ™cej niż jednÄ… Å›cieżkÄ™ z napisami, spróbuje użyć preferowanej.<br>Ta funkcja dziaÅ‚a tylko z mediami, które podajÄ… informacjÄ™ o Å›cieżkach napisów takie jak DVD lub pliki mkv.<br>To pole akceptuje regularne wyrażenia. Na przykÅ‚ad: <b>es|esp|spa</b> bÄ™dzie dobierać Å›cieżkÄ™ napisów odpowiadajÄ…cÄ… <i>es</i>, <i>esp</i> lub <i>spa</i>. + + + + + Software video equalizer + Programowy korektor wideo + + + + You can check this option if video equalizer is not supported by your graphic card or the selected video output driver.<br><b>Note:</b> this option can be incompatible with some video output drivers. + Zaznacz tÄ… opcjÄ™ jeÅ›li korektor wideo nie jest obsÅ‚ugiwany przez twojÄ… kartÄ™ graficznÄ… lub wybrany sterownik wyjÅ›ciowy wideo.<br><b>Notka:</b>ta opcja nie jest kompatybilna z niektórymi sterownikami wideo. + + + + Postprocessing quality + Jakość przetwarzania koÅ„cowego + + + + Dynamically changes the level of postprocessing depending on the available spare CPU time. The number you specify will be the maximum level used. Usually you can use some big number. + Dynamiczne zmiany przetwarzania koÅ„cowego (postprocessing) zależne sÄ… od dostÄ™pnej wolnej mocy +obliczeniowej procesora (CPU). Poziom który ustawisz bÄ™dzie maksymalny w użyciu. Zwykle można ustawić +trochÄ™ wyższÄ… wartość. + + + + + If this option is checked, all videos will start to play in fullscreen mode. + Gdy ta opcja jest zaznaczona wszystkie pliki wideo bÄ™dÄ… odtwarzane w trybie peÅ‚nego ekranu. + + + + Check this option to disable the screensaver while playing.<br>The screensaver will enabled again when play finishes.<br><b>Note:</b> This option works only in X11 and Windows. + Zaznacz tÄ… opcjÄ™ aby wyÅ‚Ä…czyć wygaszacz ekranu podczas odtwarzania.<br>Wygaszacz ekranu bÄ™dzie uruchomiony ponownie po zakoÅ„czonym odtwarzaniu.<br><b>Notka:<br>Ta opcja dziaÅ‚a tylko w X11 i Windows. + + + + Software volume control + Programowa kontrola gÅ‚oÅ›noÅ›ci + + + + Check this option to use the software mixer, instead of using the sound card mixer. + Zaznacz tÄ… opcjÄ™ aby użyć programowego miksera, zamiast miksera karty muzycznej. + + + + Change volume + ZmieÅ„ gÅ‚oÅ›ność + + + + If checked, SMPlayer will remember the volume for every file and will restore it when played again. For new files the default volume will be used. + Zaznaczenie tej opcji spowoduje, że SMPlayer zapamiÄ™ta gÅ‚oÅ›ność dla każdego pliku i przywróci jÄ… przy jego ponownym odtwarzaniu . Dla nowych plików używana bÄ™dzie gÅ‚oÅ›ność domyÅ›lna. + + + + Default volume: + DomyÅ›lna gÅ‚oÅ›ność: + + + + 0 + 0 + + + + &Change volume on every file + &ZmieÅ„ gÅ‚oÅ›ność dla każdego pliku + + + + &Search... + &Szukaj... + + + + S&elect... + W&ybierz... + + + + Select the &MPlayer executable: + Wybierz plik wykonywalny &MPlayer-a: + + + + &Folder for storing screenshots: + &Katalog dla zrzutów ekranu: + + + + V&ideo: + W&ideo: + + + + &Audio: + &Audio: + + + + &Don't remember time position (files start playing from the beginning) + &Nie zapamiÄ™tuj pozycji czasu (start odtwarzania od poczÄ…tku) + + + + &Remember settings for all files (audio track, subtitles...) + &ZapamiÄ™taj ustawienia dla wszystkich plików (Å›cieżki audio, napisy...) + + + + A&udio: + A&udio: + + + + Su&btitles: + Na&pisy: + + + + &Use software video equalizer + &Użyj programowego korektora wideo + + + + &Enable postprocessing for all videos + &WÅ‚Ä…cz postprocessing dla wszystkich plików wideo + + + + &Quality: + &Jakość: + + + + Start videos in &fullscreen + Start odtwarzania na &peÅ‚nym ekranie + + + + Disable &screensaver + Zablokuj &wygaszacz ekranu + + + + &Default volume: + &DomyÅ›lna gÅ‚oÅ›ność: + + + + Use s&oftware volume control + Użyj &programowej regulacji gÅ‚oÅ›noÅ›ci + + + + Ma&x. Amplification: + Ma&ksymalne wzmocnienie: + + + + &AC3/DTS pass-through S/PDIF + &AC3/DTS pass-through S/PDIF + + + + Volume &normalization + Normalizacja &gÅ‚oÅ›noÅ›ci + + + + Direct rendering + BezpoÅ›redni rendering + + + + If checked, turns on direct rendering (not supported by all codecs and video outputs)<br><b>WARNING:</b> May cause OSD/SUB corruption! + JeÅ›li jest zaznaczony, zmienisz na bezpoÅ›redni rendering (nie obsÅ‚ugiwane z wszystkimi kodekami i wyjÅ›ciem wideo)<br><b>UWAGA:</b> Może spowodować uszkodzenie OSD/SUB! + + + + Double buffering + Podwójne buforowanie + + + + D&irect rendering + B&ezpoÅ›redni rendering + + + + Dou&ble buffering + P&odwójne buforowanie + + + + Double buffering fixes flicker by storing two frames in memory, and displaying one while decoding another. If disabled it can affect OSD negatively, but often removes OSD flickering. + Podwójne buforowanie redukuje migotanie przez przechowywanie dwóch klatek w pamiÄ™ci, i wyÅ›wietlanie jednej podczas dekodowania drugiej. JeÅ›li jest to wyÅ‚Ä…czone może oddziaÅ‚ywać negatywnie na OSD, ale czÄ™sto usuwa jego migotanie. + + + + &Enable postprocessing by default + &WÅ‚Ä…cz domyÅ›lnie przetwarzanie koÅ„cowe + + + + Volume &normalization by default + DomyÅ›lna &normalizacja gÅ‚oÅ›noÅ›ci + + + + Close when finished + Zamknij program gdy zakoÅ„czy odtwarzanie + + + + If this option is checked, the main window will be automatically closed when the current file/playlist finishes. + JeÅ›li ta opcja jest zaznaczona, okno główne automatycznie zamknie siÄ™ po zakoÅ„czeniu bieżącego pliku/listy odtwarzania. + + + + &Close when finished + &Zamknij program gdy zakoÅ„czy odtwarzanie + + + + 2 (Stereo) + 2 (Stereo) + + + + 4 (4.0 Surround) + 4 (4.0 Surround) + + + + 6 (5.1 Surround) + 6 (5.1 Surround) + + + + C&hannels by default: + &Standardowo kanaÅ‚y: + + + + &Pause when minimized + &Pauza gdy minimalizujesz + + + + Pause when minimized + Pauza gdy minimalizujesz + + + + If this option is enabled, the file will be paused when the main window is hidden. When the window is restored, play will be resumed. + JeÅ›li opcja ta jest wÅ‚Ä…czona i okno główne jest ukryte, plik zostanie zapauzowany. Gdy okno główne zostanie przywrócone, nastÄ…pi wznowienie odtwarzania. + + + + Enable postprocessing by default + WÅ‚Ä…cz domyÅ›lne przetwarzanie koÅ„cowe + + + + Posprocessing will be used by default on new open files. + Przetwarzanie koÅ„cowe bÄ™dzie użyte domyÅ›lnie dla nowo otwartych plików. + + + + Max. Amplification + Maksymalne wzmocnienie + + + + Volume normalization by default + DomyÅ›lna normalizacja gÅ‚oÅ›noÅ›ci + + + + Maximizes the volume without distorting the sound. + ZwiÄ™ksz gÅ‚oÅ›ność bez znieksztaÅ‚cenia dźwiÄ™ku. + + + + Default volume + DomyÅ›lna gÅ‚oÅ›ność + + + + Sets the initial volume that new files will use. + Ustaw poczÄ…tkowÄ… gÅ‚oÅ›ność dla nowych plików. + + + + Channels by default + DomyÅ›lnie kanaÅ‚y + + + + Sets the maximum amplification level in percent (default: 110). A value of 200 will allow you to adjust the volume up to a maximum of double the current level. With values below 100 the initial volume (which is 100%) will be above the maximum, which e.g. the OSD cannot display correctly. + Ustaw maksymalny poziom wzmocnienia w procentach (domyÅ›lnie: 110). Wartość 200 pozwoli wyregulować gÅ‚oÅ›ność do maksymalnie podwójnego bieżącego poziomu. Z wartoÅ›ciami poniżej 100 poczÄ…tkowa gÅ‚oÅ›ność (która wynosi 100%) bÄ™dzie powyżej maksimum, której np. OSD nie wyÅ›wietli poprawnie. + + + + Uses hardware AC3 passthrough + Użyj sprzÄ™towego przejÅ›cia AC3 (AC3 passthrough) + + + + Requests the number of playback channels. MPlayer asks the decoder to decode the audio into as many channels as specified. Then it is up to the decoder to fulfill the requirement. This is usually only important when playing videos with AC3 audio (like DVDs). In that case liba52 does the decoding by default and correctly downmixes the audio into the requested number of channels. NOTE: This option is honored by codecs (AC3 only), filters (surround) and audio output drivers (OSS at least). + ProÅ›ba o ilość kanałów odtwarzania. MPlayer pyta dekoder na jak wiele przewidzianych kanałów dekodować audio. NastÄ™pnie żądanie to zostaje wykonane przez dekoder. Jest to istotne tylko gdy odtwarzane jest wideo z audio AC3 (takie jak DVD). W takim przypadku domyÅ›lnie dekoduje liba52 i poprawnie miksuje audio do wymaganych kanałów. NOTKA: Opcja ta dziaÅ‚a tylko z kodekami (tylko AC3), filtrami (surround) i sterownikami wyjÅ›ciowymi audio (co najmniej OSS). + + + + Postprocessing will be used by default on new opened files. + Przetwarzanie koÅ„cowe bÄ™dzie użyte domyÅ›lnie dla nowo otwartych plików. + + + + PrefInput + + + Keyboard and mouse + Klawiatura i myszka + + + + &Keyboard + &Klawiatura + + + + icon + ikona + + + + Here you can change any key shortcut. To do it double click or start typing over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + Tutaj możesz zmienić każdy klawisz skrótu. Aby to zrobić kliknij dwa razy w polu klawisza skrótu i przyporzÄ…dkuj mu klawisz klawiatury. Dodatkowo możesz także zapisać listÄ™ aby podzielić siÄ™ niÄ… z innymi lub wykorzystać na innym komputerze. + + + + &Mouse + &Myszka + + + + Button functions: + Funkcje przycisku: + + + + Media seeking + Pasek postÄ™pu odtwarzania + + + + Volume control + Kontrola gÅ‚oÅ›noÅ›ci + + + + Zoom video + Zoom wideo + + + + None + Nic + + + + Here you can change any key shortcut. To do it double click or press enter over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + Tutaj możesz zmienić każdy klawisz skrótu. Aby to zrobić kliknij dwa razy w polu klawisza skrótu i przyporzÄ…dkuj mu klawisz klawiatury. Dodatkowo możesz także zapisać listÄ™ aby podzielić siÄ™ niÄ… z innymi lub wykorzystać na innym komputerze. + + + + &Left click + &Lewy przycisk + + + + &Double click + &Podwójny klik + + + + &Wheel function: + &Funkcje kółka: + + + + Shortcut editor + Edytor skrótów klawiszowych + + + + This table allows you to change the key shortcuts of most available actions. Double click or press enter on a item, or press the <b>Change shortcut</b> button to enter in the <i>Modify shortcut</i> dialog. There are two ways to change a shortcut: if the <b>Capture</b> button is on then just press the new key or combination of keys that you want to assign for the action (unfortunately this doesn't work for all keys). If the <b>Capture</b> button is off then you could enter the full name of the key. + Tabela ta pozwala zmienić klawisz skrótu dla każdej dostÄ™pnej funkcji. Kliknij dwa razu lub wciÅ›nij enter na pozycjÄ™, lub wybierz <b>ZmieÅ„ klawisz skrótu</b> w dialogu <i>Modyfikuj klawisz skrótu</i>. IstniejÄ… dwie metody zmiany klawisza skrótu: przez funkcjÄ™ <b>Zrzut</b> po prostu naciÅ›nij nowy klawisz lub ich kombinacjÄ™ której chcesz przypisać odpowiedniÄ… funkcjÄ™ (niestety nie dziaÅ‚a to z wszystkimi klawiszami). JeÅ›li przycisk <b>Zrzut</b> jest wyÅ‚Ä…czony wtedy możesz wpisać peÅ‚nÄ… nazwÄ™ klawisza. + + + + Left click + Lewy przycisk myszki + + + + Select the action for left click on the mouse. + Wybierz funkcjÄ™ dla lewego przycisku myszki. + + + + Double click + Dwuklik myszki + + + + Select the action for double click on the mouse. + Wybierz funkcjÄ™ dla dwukliku myszki. + + + + Wheel function + Funkcje kółka + + + + Select the action for the mouse wheel. + Wybierz funkcjÄ™ dla kółka myszki. + + + + PrefInterface + + + Interface + Interfejs + + + + Bulgarian + Bulgarian + + + + Czech + Czech + + + + German + German + + + + Greek + Greek + + + + English + English + + + + Spanish + Spanish + + + + Finnish + Finnish + + + + French + French + + + + Hungarian + Hungarian + + + + Italian + Italian + + + + Japanese + Japanese + + + + Georgian + Georgian + + + + Dutch + Dutch + + + + Polish + Polish + + + + Portuguese - Brazil + Portuguese - Brazil + + + + Portuguese - Portugal + Portuguese - Portugal + + + + Romanian + Romanian + + + + Russian + + + + + Slovak + Slovak + + + + Serbian + Serbian + + + + Swedish + Swedish + + + + Turkish + + + + + Ukrainian + Ukrainian + + + + Simplified-Chinese + Simplified-Chinese + + + + Traditional Chinese + Traditional Chinese + + + + <Autodetect> + <Autodetekcja> + + + + Default + DomyÅ›lne + + + + &Interface + &Interfejs + + + + Seeking + Wyszukiwanie + + + + Recent files + Ostanio otwarte pliki + + + + Never + Nigdy + + + + Whenever it's needed + Jeżeli jest taka potrzeba + + + + Only after loading a new video + Tylko po zaÅ‚adowaniu nowego filmu + + + + Language + JÄ™zyk + + + + Here you can change the language of the application. + Tutaj można zmienić jÄ™zyk programu. + + + + Instances + Przypadki + + + + Catalan + Catalan + + + + Basque + Basque + + + + Galician + Galician + + + + &Short jump + &MaÅ‚y skok + + + + &Medium jump + &Åšredni skok + + + + &Long jump + &Duży skok + + + + Mouse &wheel jump + Skok &kółka myszki + + + + &Use only one running instance of SMPlayer + &Użyj tylko jednej uruchomionej kopii programu SMPlayer + + + + SMPlayer will listen to this &port to receive commands from other instances: + SMPlayer bÄ™dzie nasÅ‚uchiwaÅ‚ na tym &porcie w celu otrzymania komend od innych przypadków: + + + + Main window &resize method + Metoda zmiany &rozmiaru głównego okna + + + + Ma&x. items + Ma&x. pozycji + + + + St&yle: + St&yle: + + + + Ico&n set: + Wybie&rz ikony: + + + + L&anguage: + J&Ä™zyk: + + + + Main window + Główne okno + + + + Auto&resize: + Automatyczna &zmiana rozmiaru: + + + + R&emember position and size + Z&apamietaj pozycjÄ™ i rozmiar + + + + Default font: + DomyÅ›lna czcionka: + + + + &Change... + &ZmieÅ„... + + + + PrefPerformance + + + Performance + Wydajność + + + + Form + Forma + + + + &Performance + &Wydajność + + + + Priority + Priorytet + + + + Select the priority for the MPlayer process. + Wybierz priorytet dla MPlayer-a. + + + + Priority: + Priorytet: + + + + realtime + realtime + + + + high + wysoki + + + + abovenormal + poniżej normalego + + + + normal + normalny + + + + belownormal + powyżej normalnego + + + + idle + bezczynny + + + + Cache + Bufor + + + + Size: + Rozmiar: + + + + KB + KB + + + + Use cache + Użyj bufora + + + + Setting a cache may improve performance on slow media + Ustawienie bufora może polepszyć odtwarzanie na wolnych napÄ™dach + + + + Allow frame drop + Pozwól na pomijanie klatek + + + + Allow hard frame drop (can lead to image distortion) + Mocne pomijanie klatek - może spowodować niestabilność wyÅ›wietlania + + + + Synchronization + Synchronizacja + + + + Audio/video auto synchronization + Automatyczna synchronizacja Audio/Wideo + + + + Factor: + Współczynnik: + + + + Fast audio track switching + Szybkie przeÅ‚Ä…czanie Å›cieżek audio + + + + Fast seek to chapters in dvds + Szybkie szukanie rozdziałów w dvd + + + + Set process priority for mplayer according to the predefined priorities available under Windows.<br><b>WARNING:</b> Using realtime priority can cause system lockup. + Ustaw priorytet procesu mplayer-a zgodnie z hierarchiÄ… wartoÅ›ci pod Windows.<br><b>UWAGA:</b>Użycie najwyższego priorytetu może być przyczynÄ… niestabilnoÅ›ci systemu. + + + + <br><b>Note:</b> This option is for Windows only. + <br><b>Notka:</b> Ta opcja jest tylko dla Windows. + + + + This option specifies how much memory (in kBytes) to use when precaching a file or URL. Especially useful on slow media. + Ta opcja precyzuje ile pamiÄ™ci (w KB) należy użyć dla buforowania pliku lub URL. Zalecane dla wolnych napÄ™dów. + + + + Skip displaying some frames to maintain A/V sync on slow systems. + Wybranie tej opcji powoduje pomijanie wyÅ›wietlania niektórych klatek +aby utrzymać synchronizacjÄ™ A/V na sÅ‚abszym sprzÄ™cie. + + + + Allow hard frame drop + Mocne pomijanie klatek + + + + More intense frame dropping (breaks decoding). Leads to image distortion! + Wybranie tej opcji powoduje mocne pomijanie klatek (bÅ‚Ä™dy w dekodowaniu +obrazu). Może to powodować znieksztaÅ‚cenia obrazu! + + + + Gradually adjusts the A/V sync based on audio delay measurements. + Stopniowa regulacja synchronizacji A/V bazujÄ…ca na pomiarach opóźnieÅ„. + + + + Priorit&y: + P&riorytet: + + + + Si&ze: + &Rozmiar: + + + + &Use cache + &Użyj bufora + + + + &Allow frame drop + &Pozwól na pomijanie klatek + + + + Allow &hard frame drop (can lead to image distortion) + Mocne &pomijanie klatek (może spowodować niestabilność wyÅ›wietlania) + + + + Audio/&video auto synchronization + Automatyczna synchronizacja Audio/&Wideo + + + + Fact&or: + Współ&czynnik: + + + + &Fast audio track switching + &Szybkie przeÅ‚Ä…czanie Å›cieżek audio + + + + Fast &seek to chapters in dvds + Szybkie &szukanie rozdziałów w dvd + + + + Create index if needed + Jeżeli potrzeba utwórz index + + + + Rebuilds index of files if no index was found, allowing seeking. Useful with broken/incomplete downloads, or badly created files. This option only works if the underlying media supports seeking (i.e. not with stdin, pipe, etc).<br> Note: the creation of the index may take some time. + Przebuduj indeks plików jeÅ›li go nie znaleziono, uwzglÄ™dniajÄ…c wyszukiwanie. Opcja przydatna przy uszkodzonych,niekompletnych pobieraniach, lub niepoprawnym tworzeniem plików. DziaÅ‚a tylko jeÅ›li odpowiednie media obsÅ‚ugujÄ… wyszukiwanie (np. nie z stdin, pipe, itp).<br>Notka: tworzenie indeksu może trochÄ™ potrwać. + + + + &Create index if needed + &Jeżeli potrzeba utwórz index + + + + If checked, it will try the fastest method to switch audio tracks but might not work with some formats. + JeÅ›li jest zaznaczone to spróbuje użyć szybszej metody przeÅ‚Ä…czania Å›cieżek audio, jednak może to nie dziaÅ‚ać z niektórymi formatami. + + + + If checked, it will try the fastest method to seek to chapters but it might not work with some discs. + JeÅ›li jest zaznaczone to spróbuje użyć szybszej metody wyszukiwania rozdziałów, jednak może to nie dziaÅ‚ać z niektórymi dyskami. + + + + PrefSubtitles + + + Subtitles + Napisy + + + + Choose a ttf file + Wybierz TTF - plik + + + + Truetype Fonts + Czcionki truetyp + + + + Form + Forma + + + + &Subtitles + &Napisy + + + + Autoload + AutoÅ‚adowanie + + + + Autoload subtitles files (*.srt, *.sub...): + Automatycznie Å‚aduj napisy (*.srt,*.sub...): + + + + Select first available subtitle + Wybierz pierwsze dostÄ™pne napisy + + + + Same name as movie + Taka sama nazwa jak film + + + + All subs containing movie name + Wszystkie napisy zawierajÄ…ce nazwÄ™ filmu + + + + All subs in directory + Wszystkie napisy w katalogu + + + + Default subtitle encoding: + DomyÅ›lne kodowanie napisów: + + + + Position + Pozycja + + + + Default position of the subtitles on screen + DomyÅ›lna pozycja napisów na ekranie + + + + 0 + 0 + + + + Top + Góra + + + + Bottom + Dół + + + + Include subtitles on screenshots + DoÅ‚Ä…cz napisy w zrzucie ekranu + + + + Use -subfont option (required by recent MPlayer releases) + Użyj czcionki subfont (wymaga ostatniej wersji MPlayer-a) + + + + &Font + &Czcionka + + + + Font + Czcionka + + + + TTF font: + Czcionka TTF: + + + + Search... + Szukaj ... + + + + System font: + Czcionka systemowa: + + + + Select the font which will be used for subtitles (and OSD): + Wybierz czcionkÄ™ dla napisów (oraz OSD): + + + + Size + Rozmiar + + + + Autoscale: + Autoskalowanie: + + + + No autoscale + Bez autoskalowania + + + + Proportional to movie height + Proporcjonalnie do wysokoÅ›ci + + + + Proportional to movie width + Proporcjonalnie do szerokoÅ›ci + + + + Proportional to movie diagonal + Proporcjonalnie do przekÄ…tnej filmu + + + + Scale: + Skalowanie: + + + + SSA/&ASS library + Biblioteka SSA/&ASS + + + + The new SSA/ASS library will provide nice styled subtitles for external SSA/ASS subtitles files and Matroska tracks. But it will be used too for rendering other formats like SUB and SRT files. + Nowa biblioteka SSA/ASS dostarcza Å‚adny styl napisów dla zewnÄ™rznych plików napisów SSA/ASS i Å›cieżek Matroska. BÄ™dzie ona również użyta do wyÅ›wietlania innych formatów takich jak SUB I SRT. + + + + Use SSA/ASS library for subtitle rendering + Użyj biblioteki SSA/ASS do wyÅ›wietlania napisów + + + + Text color: + Kolor tekstu: + + + + Border color: + Kolor obwódki: + + + + Here you can override styles for SSA/ASS subtitles. It can be also used for fine-tuning the rendering of SRT and SUB subtitles by the SSA/ASS library. Example: <b>Bold=1,Outline=2,Shadow=4</b> + Tutaj możesz zmienić styl wyÅ›wietlania napisów za pomocÄ… SSA/ASS. Można tego również użyć do zmiany wyglÄ…du wyÅ›wietlanych napisów SRT i SUB przez bibliotekÄ™ SSA/ASS .PrzykÅ‚ad: <b>Bold=1,Outline=2,Shadow=4</b> + + + + Styles: + Style: + + + + Subtitle position + Pozycja napisów + + + + This option specifies the position of the subtitles over the video window. <i>100</i> means the bottom, while <i>0</i> means the top. + Ta opcja okreÅ›la pozycjÄ™ napisów w wyÅ›wietlanym filmie. <i>100</i> napisy na dole filmu, a <i>0</i> napisy na górze. + + + + SSA/ASS styles + styl SSA/ASS + + + + Au&toload subtitles files (*.srt, *.sub...): + Au&tomatycznie Å‚aduj napisy (*.srt, *.sub...): + + + + S&elect first available subtitle + W&ybierz piewsze dostÄ™pne napisy + + + + &Default subtitle encoding: + &DomyÅ›lne kodowanie napisów: + + + + Default &position of the subtitles on screen + DomyÅ›lna &pozycja napisów na ekranie + + + + &Include subtitles on screenshots + &DoÅ‚Ä…cz napisy w zrzucie ekranu + + + + &Use -subfont option (required by recent MPlayer releases) + &Użyj opcji -subfont (wymagane przez ostatniÄ… wersje MPlayer-a) + + + + &TTF font: + &Czcionka TTF: + + + + Sea&rch... + Sz&ukaj... + + + + S&ystem font: + Cz&cionka systemowa: + + + + A&utoscale: + A&utoskalowanie: + + + + S&cale: + S&kalowanie: + + + + &Use SSA/ASS library for subtitle rendering + &Użyj biblioteki SSA/ASS do wyÅ›wietlania napisów + + + + &Text color: + &Kolor tekstu: + + + + &Border color: + &Kolor obwódki: + + + + St&yles: + St&yle: + + + + PreferencesDialog + + + SMPlayer - Help + SMPlayer-Pomoc + + + + OK + OK + + + + Cancel + Anuluj + + + + Apply + Zatwierdź + + + + Help + Pomoc + + + + SMPlayer - Preferences + SMPlayer - Ustawienia + + + + QObject + + + 1 second + 1 sekunda + + + + %1 seconds + %1 sekund + + + + %1 minutes + %1 minut + + + + %1 minutes and %2 seconds + %1 minut i %2 sekund + + + + 1 minute + 1 minuta + + + + 1 minute and 1 second + 1 minuta i 1 sekunda + + + + 1 minute and %1 seconds + 1 minuta i %1 sekund + + + + %1 minutes and 1 second + %1 minut i 1 sekunda + + + + Usage: %1 [-ini-path [directory]] [-action action_name] [-close-at-end] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + Użycie: %1 [-ini-path [katalog]] [-action action_name] [-close-at-end] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + + + + specifies the directory for the configuration file (smplayer.ini). If directory is omitted, the application directory will be used. + okreÅ›la katalog dla pliku konfiguracyjnego (smplayer.ini). JeÅ›li katalog jest pominiÄ™ty, użyty zostanie katalog programu. + + + + tries to make a connection to another running instance and send to it the specified action. Example: -action pause The rest of options (if any) will be ignored and the application will exit. It will return 0 on success or -1 on failure. + próby wykonania poÅ‚Ä…czenia z innÄ… uruchomionÄ… kopiÄ… programu i wysÅ‚ania do niej okreÅ›lonej operacji. Na przykÅ‚ad: -action pause Reszta opcji (jeÅ›li sÄ…) bÄ™dÄ… ignorowane i program zostanie zamkniÄ™ty. BÄ™dzie zwracać 0 w przypadku powodzenia lub -1 przy niepowodzeniu. + + + + will show this message and then will exit. + pokaże siÄ™ ta wiadomość i wtedy zostanie zamkniÄ™ty. + + + + 'media' is any kind of file that SMPlayer can open. It can be a local file, a DVD (e.g. dvd://1), an Internet stream (e.g. mms://....) or a local playlist in format m3u. If the -playlist option is used, that means that SMPlayer will pass the -playlist option to MPlayer, so MPlayer will handle the playlist, not SMPlayer. + 'media' to każdy plik, który SMPlayer jest w stanie otworzyć.Może to być plik lokalny, DVD (n.p. dvd://1), strumieÅ„ internetowy (n.p. mms://1) lub lista odtwarzania w formacie m3u. JeÅ›li opcja -playlist jest użyta, oznacza to, że SMPlayer przeniesie opcjÄ™ -playlist do MPlayer-a, wiÄ™c MPlayer obsÅ‚uży listÄ™ odtwarzania. + + + + the main window will be closed when the file/playlist finishes. + okno główne zostanie zamkniÄ™te gdy zakoÅ„czy siÄ™ plik/lista odtwarzania. + + + + This is SMPlayer v. %1 running on %2 + To jest SMPlayer v. %1 uruchomiony o %2 + + + + Usage: %1 [-ini-path [directory]] [-send-action action_name] [-actions action_list [-close-at-end] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + Użycie: %1 [-ini-path [katalog]] [-send-action action_name] [-actions action_list [-close-at-end] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + + + + tries to make a connection to another running instance and send to it the specified action. Example: -send-action pause The rest of options (if any) will be ignored and the application will exit. It will return 0 on success or -1 on failure. + próby wykonania poÅ‚Ä…czenia z innÄ… uruchomionÄ… kopiÄ… programu i wysÅ‚ania do niej okreÅ›lonej operacji. Na przykÅ‚ad: -action pause Reszta opcji (jeÅ›li sÄ…) bÄ™dÄ… ignorowane i program zostanie zamkniÄ™ty. BÄ™dzie zwracać 0 w przypadku powodzenia lub -1 przy niepowodzeniu. + + + + action_list is a list of actions separated by spaces. The actions will be executed just after loading the file (if any) in the same order you entered. For checkable actions you can pass true or false as parameter. Example: -actions "fullscreen compact true". Quotes are necessary in case you pass more than one action. + action_list to lista poleceÅ„ oddzielonych spacjÄ…. Polecenia bÄ™dÄ… po prostu wykonywane po zaÅ‚adowaniu pliku (jeÅ›li jest), we wpisanej wczeÅ›niej kolejnoÅ›ci. Dla skontrolowanych poleceÅ„ możesz pominąć prawdÄ™ lub faÅ‚sz jako parametr. Na przykÅ‚ad: -actions "fullscreen compact true".CudzysÅ‚owy sÄ… niezbÄ™dne w przypadku pominiÄ™cia wiÄ™cej niż jednego polecenia. + + + + media + media + + + + Usage: %1 [-ini-path [directory]] [-send-action action_name] [-actions action_list [-close-at-end] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + Użycie: %1 [-ini-path [directory]] [-send-action action_name] [-actions action_list [-close-at-end] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + + + + if there's another instance running, the media will be added to that instance's playlist. If there's no other instance, this option will be ignored and the files will be opened in a new instance. + jeÅ›li uruchomiona jest inna kopia programu, media zostanÄ… dodane do jej listy odtwarzania. JeÅ›li nie ma innej kopii programu, opcja ta jest ignorowana i pliki zostana otwarte w nowej kopii programu. + + + + Usage: %1 [-ini-path directory] [-send-action action_name] [-actions action_list [-close-at-end] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + Użycie: %1 [-ini-path directory] [-send-action action_name] [-actions action_list [-close-at-end] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + + + + specifies the directory for the configuration file (smplayer.ini). + okreÅ›la katalog dla pliku konfiguracyjnego (smplayer.ini). + + + + the main window won't be closed when the file/playlist finishes. + gdy zakoÅ„czy siÄ™ plik/lista odtwarzania okno główne nie zostanie zamkniÄ™te. + + + + Usage: %1 [-ini-path directory] [-send-action action_name] [-actions action_list [-close-at-end] [-no-close-at-end] [-fullscreen] [-no-fullscreen] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + Użycie: %1 [-ini-path directory] [-send-action action_name] [-actions action_list [-close-at-end] [-no-close-at-end] [-fullscreen] [-no-fullscreen] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + + + + the video will be played in fullscreen mode. + wideo bÄ™dzie odtwarzane w trybie peÅ‚nego ekranu. + + + + the video will be played in window mode. + wideo bÄ™dzie odtwarzane w trybie wyÅ›wietlania obrazu w oknie. + + + + SeekWidget + + + icon + ikona + + + + label + etykieta + + + + ShortcutGetter + + + Modify shortcut + Modyfikuj klawisz skrótu + + + + Clear + Wyczyść + + + + Press the key combination you want to assign + NaciÅ›nij kombinacjÄ™ klawiszy, które chcesz wyznaczyć + + + + Capture + Zrzut + + + + Capture keystrokes + Capture keystrokes + + + + VideoEqualizer + + + Contrast + Kontrast + + + + Brightness + Jasność + + + + Hue + OdcieÅ„ + + + + Saturation + Nasycenie + + + + Gamma + Gamma + + + + Equalizer + Korektor + + + + &Reset + &Wyzeruj + + + + &Set as default values + &Ustaw wartoÅ›ci jako domyÅ›lne + + + + Use the current values as default values for new videos. + Użyj aktualnych wartoÅ›ci jako domyÅ›lnych dla nowych plików wideo. + + + + Set all controls to zero. + Ustaw wszystkie suwaki na zero. + + + diff --git a/retroshare-gui/src/apps/smplayer/translations/smplayer_pt_BR.qm b/retroshare-gui/src/apps/smplayer/translations/smplayer_pt_BR.qm new file mode 100644 index 000000000..31ed0b89a Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/translations/smplayer_pt_BR.qm differ diff --git a/retroshare-gui/src/apps/smplayer/translations/smplayer_pt_BR.ts b/retroshare-gui/src/apps/smplayer/translations/smplayer_pt_BR.ts new file mode 100644 index 000000000..2877c38ff --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/translations/smplayer_pt_BR.ts @@ -0,0 +1,3866 @@ + + + + AboutDialog + + + Version: %1 + Versão: %1 + + + + 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. + Este programa é software livre, você pode redistribui-lo e/ou modificá-lo de acordo com os termos da Licença Pública Geral GNU que é publicado pela Free Software Foundation; seja na versão 2 dessa licença, ou (a sua escolha) em qualquer versão posterior. + + + + Translators: + Tradutores: + + + + German + Alemão + + + + Slovak + Eslovênio + + + + Italian + Italiano + + + + French + Francês + + + + Simplified-Chinese + Chinês Simplificado + + + + Russian + Russo + + + + Hungarian + Hungaro + + + + Japanese + Japonês + + + + Dutch + Holandês + + + + Ukrainian + Ucraniano + + + + Georgian + Georgiano + + + + Czech + Tcheco + + + + Logo designed by %1 + Logotipo criado por %1 + + + + Get updates at: %1 + Verificar atualizações em: %1 + + + + About SMPlayer + Sobre o SMPlayer + + + + Polish + Polonês + + + + Bulgarian + Bulgaro + + + + Turkish + Turco + + + + Swedish + Sueco + + + + Serbian + Sérvio + + + + Traditional Chinese + Chinês Tradicional + + + + Romanian + Romeno + + + + Portuguese - Brazil + Português do Brasil + + + + Portuguese - Portugal + Português de Portugal + + + + Compiled with Qt %1 + + + + + %1, %2 and %3 + + + + + %1 and %2 + + + + + http://smplayer.sourceforge.net/en/windows/download.php + If the web page is translated into your language you can change the URL so it points to the download page in the translation.Otherwise leave as is. + + + + + http://smplayer.sourceforge.net/en/linux/download.php + If the web page is translated into your language you can change the URL so it points to the download page in the translation.Otherwise leave as is. + + + + + <b>%1</b>: %2 + + + + + ActionsEditor + + + Name + Nome + + + + Description + Descrição + + + + Shortcut + Atalho + + + + &Save + &Gravar + + + + &Load + &Abrir + + + + Key files + Arquivos chaves + + + + Choose a filename + Escolhar um nome de arquivo + + + + Confirm overwrite? + Confirma a sobregravação? + + + + The file %1 already exists. +Do you want to overwrite? + O arquivo %1 já existe. +Você quer sobregravá-lo? + + + + Choose a file + Escolhar um arquivo + + + + Error + Erro + + + + The file couldn't be saved + O arquivo não pode ser salvo + + + + The file couldn't be loaded + O arquivo não pode ser carregado + + + + &Change shortcut... + + + + + BaseGui + + + SMPlayer - mplayer log + SMPlayer - mplayer log + + + + SMPlayer - smplayer log + SMPlayer - SMPlayer log + + + + &Open + &Abrir + + + + &Play + &Reproduzir + + + + &Video + &Vídeo + + + + &Audio + Ãu&dio + + + + &Subtitles + &Legendas + + + + &Browse + &Navegar + + + + Op&tions + &Opções + + + + &Help + &Ajuda + + + + &File... + &Arquivo... + + + + D&irectory... + D&iretório... + + + + &Playlist... + Lista de &reprodução... + + + + &DVD from drive + &DVD do drive + + + + D&VD from folder... + D&VD de um diretório... + + + + &URL... + &URL... + + + + &Clear + &Limpar + + + + &Recent files + &Arquivos recentes + + + + P&lay + &Reproduzir + + + + &Pause + &Pausar + + + + &Stop + &Parar + + + + &Frame step + Avanço de &quadro + + + + &Normal speed + &Velocidade Normal + + + + &Halve speed + &Metade da velocidade + + + + &Double speed + Velocidade &Dupla + + + + Speed &-10% + Velocidade &-10% + + + + Speed &+10% + Velocidade &+10% + + + + Sp&eed + Vel&ocidade + + + + &Repeat + &Repetir + + + + &Fullscreen + &Tela cheia + + + + &Compact mode + &Modo compacto + + + + Si&ze + &Tamanho + + + + &Autodetect + &Autodetectar + + + + &4:3 + &4:3 + + + + &5:4 + &5:4 + + + + &14:9 + &14:9 + + + + 16:&9 + 16:&9 + + + + 1&6:10 + 1&6:10 + + + + &2.35:1 + &2.35:1 + + + + 4:3 &Letterbox + 4:3 &Letterbox + + + + 16:9 L&etterbox + 16:9 L&etterbox + + + + 4:3 &Panscan + 4:3 &Panscan + + + + 4:3 &to 16:9 + 4:3 &para 16:9 + + + + &Aspect ratio + &Relação de tamanho + + + + &None + &Nenhum + + + + &Lowpass5 + &Lowpass5 + + + + Linear &Blend + Linear &Blend + + + + &Deinterlace + &Desentrelaçar + + + + &Postprocessing + &Postprocessing + + + + &Autodetect phase + &Autodetectar fase + + + + &Deblock + &Deblock + + + + De&ring + De&ring + + + + Add n&oise + Adicionar r&uido + + + + F&ilters + F&iltros + + + + &Equalizer + &Equalizador + + + + &Screenshot + &Screenshot + + + + S&tay on top + Man&ter no topo + + + + &Track + &Trilha + + + + &Extrastereo + &Extrastéreo + + + + &Karaoke + &Karaoke + + + + &Filters + &Filtros + + + + &Default + &Padrão + + + + &Stereo + E&stéreo + + + + &4.0 Surround + &4.0 Surround + + + + &5.1 Surround + &5.1 Surround + + + + &Channels + &Canais + + + + &Left channel + Canal &Esquerdo + + + + &Right channel + Canal &Direito + + + + &Stereo mode + &Modo estéreo + + + + &Mute + &Silêncio + + + + Volume &- + Volume &- + + + + Volume &+ + Volume &+ + + + + &Delay - + &Atraso - + + + + D&elay + + A&traso + + + + + &Select + &Selecionar + + + + &Load... + &Carregar... + + + + Delay &- + Atraso &- + + + + Delay &+ + Atraso &+ + + + + &Up + &Acima + + + + &Down + A&baixo + + + + &Title + &Título + + + + &Chapter + &Capítulo + + + + &Angle + Â&ngulo + + + + &Playlist + &Lista de reprodução + + + + &Show frame counter + &Mostrar contador de quadros + + + + &Disabled + &Desativado + + + + &Seek bar + &Barra de procura + + + + &Time + &Tempo + + + + Time + T&otal time + Tempo + T&empo Total + + + + &OSD + &OSD + + + + &View logs + &Ver logs + + + + P&references + P&referências + + + + About &Qt + Sobre o &Qt + + + + About &SMPlayer + Sobre o &SMPlayer + + + + <empty> + <vazio> + + + + Video + Vídeo + + + + Audio + Ãudio + + + + Playlists + Lista de reprodução + + + + All files + Todos os arquivos + + + + Choose a file + Escolha um arquivo + + + + SMPlayer - Information + SMPlayer - Informações + + + + The CDROM / DVD drives are not configured yet. +The configuration dialog will be shown now, so you can do it. + Os drives de CDRom / DVD não estão configurados ainda. +O diálogo de configuração será aberto agora, e você poderá faze-lo. + + + + Choose a directory + Escolha um diretório + + + + Subtitles + Legendas + + + + About Qt + Sobre Qt + + + + Playing %1 + Reproduzindo %1 + + + + Pause + Pausar + + + + Stop + Parar + + + + De&noise + De&noise + + + + N&ormal + N&ormal + + + + &Soft + &Suave + + + + Play / Pause + Reproduzir / Pausar + + + + Pause / Frame step + Pausar / Pulo de quadro + + + + U&nload + &Descarregar + + + + V&CD + V&CD + + + + C&lose + F&echar + + + + View &info and properties... + Ver &informações e propriedades... + + + + Zoom &- + Zoom &- + + + + Zoom &+ + Zoom &+ + + + + &Reset + &Resetar + + + + Move &left + Mover &esquerda + + + + Move &right + Mover &direita + + + + Move &up + Mover para ci&ma + + + + Move &down + Mover para &baixo + + + + &Pan && scan + &Pan && scan + + + + &Previous line in subtitles + Linha &prévia nas legendas + + + + N&ext line in subtitles + &Próxima linha nas legendas + + + + -%1 + -%1 + + + + +%1 + +%1 + + + + Dec volume (2) + Reduzir volume (2) + + + + Inc volume (2) + Aumentar volume (2) + + + + Exit fullscreen + Sair de tela cheia + + + + OSD - Next level + OSD - Próximo nível + + + + Dec contrast + Reduzir contraste + + + + Inc contrast + Aumentar contraste + + + + Dec brightness + Reduzir brilho + + + + Inc brightness + Aumentar brilho + + + + Dec hue + Reduzir matiz + + + + Inc hue + Aumentar matiz + + + + Dec saturation + Reduzir Saturação + + + + Dec gamma + Reduzir gamma + + + + Next audio + Próximo áudio + + + + Next subtitle + Proxima legenda + + + + Next chapter + Próximo capítulo + + + + Previous chapter + Capítulo prévio + + + + Inc saturation + Aumentar saturação + + + + Inc gamma + Aumentar gamma + + + + Toggle double size + Alternar tamanho duplo + + + + &Load external file... + &Carregar arquivo externo... + + + + &Kerndeint + &Kerndeint + + + + &Yadif (normal) + &Yadif + + + + Y&adif (double framerate) + Y&adif (dupla velocidade) + + + + &Next + &Próximo + + + + Pre&vious + Pré&vio + + + + Volume &normalization + &Normalização do volume + + + + &Audio CD + CD de áu&dio + + + + Denoise nor&mal + + + + + Denoise &soft + + + + + Denoise o&ff + + + + + Use SSA/&ASS library + + + + + Flip i&mage + + + + + &Toggle double size + + + + + BaseGuiPlus + + + SMPlayer is still running here + SMPlayer continua sendo executado aqui + + + + S&how icon in system tray + &Mostrar icone ao painel do sistema + + + + &Hide + &Esconder + + + + &Restore + &Restaurar + + + + &Recent files + &Arquivo recente + + + + &Quit + &Sair + + + + Playlist + Lista de Reprodução + + + + Core + + + Brightness: %1 + Brilho: %1 + + + + Contrast: %1 + Contraste: %1 + + + + Gamma: %1 + Gamma: %1 + + + + Hue: %1 + Matiz: %1 + + + + Saturation: %1 + Saturação: %1 + + + + Volume: %1 + Volume: %1 + + + + Zoom: %1 + Zoom: %1 + + + + DefaultGui + + + Welcome to SMPlayer + Bemvindo ao SMPlayer + + + + Volume + Volume + + + + Audio + Ãudio + + + + Subtitle + Legenda + + + + Playlist + Lista de Reprodução + + + + &Main toolbar + Barra de Ferramentas &Principal + + + + &Language toolbar + Barra de Ferramentas de &Linguagem + + + + &Toolbars + & Barras de Ferramentas + + + + Encodings + + + Western European Languages + Línguas do Oeste Europeu + + + + Western European Languages with Euro + Línguas do Oeste Europeu com Euro + + + + Slavic/Central European Languages + Línguas Centro-Européias e Eslavas + + + + Esperanto, Galician, Maltese, Turkish + Esperanto, Galício, Maltês, Turco + + + + Old Baltic charset + Antigo Charset Báltico + + + + Cyrillic + Cirílico + + + + Arabic + Ãrabe + + + + Modern Greek + Grego Moderno + + + + Turkish + Turco + + + + Baltic + Báltico + + + + Celtic + Celta + + + + Hebrew charsets + Charsets Hebreus + + + + Russian + Russo + + + + Ukrainian, Belarusian + Ucraniano, Bielorusso + + + + Simplified Chinese charset + Charset Chinês Simplificado + + + + Traditional Chinese charset + Charset Chinês Tradicional + + + + Japanese charsets + Charset Japonês + + + + Korean charset + Charset Coreano + + + + Thai charset + Charset Tailandês + + + + Cyrillic Windows + Windows Cirílico + + + + Slavic/Central European Windows + Windows Europa Central e Eslavo + + + + Arabic Windows + + + + + EqSlider + + + icon + + + + + FilePropertiesDialog + + + SMPlayer - File properties + SMPlayer - propriedades do arquivo + + + + &Information + &Informação + + + + &Demuxer + &Demuxer + + + + &Select the demuxer that will be used for this file: + &Selecione o demuxer que será usado para este arquivo: + + + + &Reset + &Resetar + + + + &Video codec + &Video codec + + + + &Select the video codec: + &Selecionar o codec de vídeo: + + + + A&udio codec + Codec de Ã&udio + + + + &Select the audio codec: + &Selecione o codec de áudio: + + + + &MPlayer options + Opções do &MPlayer + + + + Additional Options for MPlayer + + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + + + + + &Options: + &Opções: + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + + + + + V&ideo filters: + Filtro&s de Vídeo: + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + + + + + Audio &filters: + &Filtros de áudio: + + + + OK + + + + + Cancel + + + + + Apply + + + + + InfoFile + + + General + Geral + + + + Size + Tamanho + + + + %1 KB (%2 MB) + %1 KB (%2 MB) + + + + URL + URL + + + + Length + Duração + + + + Demuxer + Demuxer + + + + Name + Nome + + + + Artist + Artista + + + + Author + Autor + + + + Album + Ãlbum + + + + Genre + Gênero + + + + Date + Data + + + + Track + Trilha + + + + Copyright + Copyright + + + + Comment + Comentário + + + + Software + Software + + + + Clip info + Informações do clip + + + + Video + Vídeo + + + + Resolution + Resolução + + + + Aspect ratio + Relação de tamanho + + + + Format + Formato + + + + Bitrate + Taxa de bits + + + + %1 kbps + %1 kbps + + + + Frames per second + Quadros por segundo + + + + Selected codec + Codec selecionado + + + + Initial Audio Stream + Fluxo de vídeo inicial + + + + Rate + Taxa + + + + %1 Hz + %1 Hz + + + + Channels + Canais + + + + Audio Streams + Faixas de áudio + + + + Language + Língua + + + + empty + vazio + + + + Subtitles + Legendas + + + + Type + Tipo + + + + ID + Info for translators: this is a identification code + ID + + + + # + Info for translators: this is a abbreviation for number + # + + + + Stream title + Título da faixa + + + + Stream URL + URL da faixa + + + + File + + + + + InputDVDDirectory + + + Choose a directory + Escolha um diretório + + + + SMPlayer - Play a DVD from a folder + SMPlayer - Reproduzir um DVD a partir de um diretório + + + + You can play a dvd from your hard disc. Just select the folder which contains the VIDEO_TS and AUDIO_TS directories. + Você pode reproduzir um DVD de seu HD. Apenas selecione o diretório que contém as pastas VIDEO_TS e AUDIO_TS. + + + + Choose a directory... + Escolhar um diretório... + + + + InputURL + + + SMPlayer - Enter URL + + + + + &URL: + + + + + It's a &playlist + + + + + If this option is checked, the URL will be treated as a playlist: it will be opened as text and will play the URLs in it. + + + + + LogWindow + + + Choose a filename to save under + Escolha com que nome o arquivo será gravado + + + + Confirm overwrite? + Confirma a sobregravação? + + + + The file already exists. +Do you want to overwrite? + Este arquivo já existe. +Você quer sobregravá-lo? + + + + Error saving file + Erro ao gravar o arquivo + + + + The log couldn't be saved + O arquivo de log não pode ser gravado + + + + Logs + Logs + + + + LogWindowBase + + + Log Window + Janela de Log + + + + Save + Gravar + + + + Copy to clipboard + Copiar para a área de transferência + + + + Close + Fechar + + + + &Close + &Fechar + + + + Playlist + + + Name + Nome + + + + Length + Duração + + + + &Play + &Reproduzir + + + + &Edit + &Editar + + + + Playlists + Lista de reprodução + + + + Choose a file + Escolhar um arquivo + + + + Choose a filename + Escolhar um nome de arquivo + + + + Confirm overwrite? + Confirma a sobregravação? + + + + The file %1 already exists. +Do you want to overwrite? + Este arquivo já existe. +Você quer sobregravá-lo? + + + + All files + Todos os arquivos + + + + Select one or more files to open + Selecione um ou mais arquivos para abrir + + + + Choose a directory + Escolhar um diretório + + + + Edit name + Editar o nome + + + + Type the name that will be displayed in the playlist for this file: + Digite o nome que será usado na lista de reprodução para este arquivo: + + + + &Load + &Carregar + + + + &Save + &Gravar + + + + &Next + &Próximo + + + + Pre&vious + Pré&vios + + + + Move &up + Mover &acima + + + + Move &down + Mover a&baixo + + + + &Repeat + &Repetir + + + + S&huffle + &Aleatório + + + + Add &current file + Adicionar arquivo &atual + + + + Add &file(s) + Adicionar a&rquivo(s) + + + + Add &directory + Adicionar &diretório + + + + Remove &selected + Remover &selecionado + + + + Remove &all + Remover &tudos + + + + SMPlayer - Playlist + SMPlayer - Lista de Reprodução + + + + Add... + Adicionar... + + + + Remove... + Remover... + + + + Playlist modified + Lista de reprodução modificada + + + + There are unsaved changes, do you want to save the playlist? + Existe modificações não salvas, você gostaria de gravar a lista de reprodução? + + + + PrefAdvanced + + + Advanced + Avançado + + + + Auto + + + + + &Advanced + &Avançado + + + + icon + icone + + + + Additional Options for MPlayer + Opções adicionais para o MPlayer + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + Aqui você pode passar opções extras para o MPlayer. +Escreva-as separadas por espaços. +Exemplo; -flip -nosound + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + Você pode também passar filtros adicionais de video. +Separados com ".". Não use espaços! +Exemplo: scale=512:-2.eq2=1.1 + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + E finalmente filtros de áudio. As mesmas regras dos filtros de video. +Exemplo: resample=44100:0:0.volnorm + + + + Don't repaint the background of the video window + Não repinte o fundo da janela de vídeo + + + + &Logs + &Logs + + + + Log MPlayer output + Saída de log do MPlayer + + + + Log SMPlayer output + Saída de log do SMPlayer + + + + This option is mainly intended for debugging the application. + Esta opção é usada principalmente para o debugging da aplicação. + + + + &MPlayer language + Linguagem do &MPlayer + + + + SMPlayer needs to read and parse the output of MPlayer and sometimes it relies on English text. If you are using a MPlayer translated into another language, then you need to change the texts that SMPlayer looks for. (Technically you should enter regular expressions)<br><br> +The drop-down lists may provide already made regular expression for several languages. + SMPlayer necessita de ler e converter a saída do MPlayer e muitas vezes isso é feito em inglês. Se você está usando um MPlayer traduzido para outra linguagem, então você deve modificar os textos que o SMPlayer procura. (Técnicamente você deve entrar com expressões regulares)<br><br> +A lista drop-down vai providenciar as expressões regulares para várias linguagens. + + + + Checking this option may reduce flickering, but it also might produce that the video won't be displayed properly. + Marcando essa opção poderá reduzir a cintilação, mas poderá também produzir um vídeo não adequado para exibição. + + + + If checked, smplayer will store the output of mplayer (you can see it in <b>Options->View logs->mplayer</b>). In case of problems this log can contain important information, so it's recommended to keep this option checked. + Se escolher essa opção, o SMPlayer irá salvar o log do mplayer (você pode vê-lo em <b>Opções -> Ver logs -> mplayer</b>). Em caso de problemas o log contém importantes informações, portanto é recomendável escolher essa opção. + + + + If this option is checked, smplayer will store the debugging messages that smplayer outputs (you can see the log in <b>Options->View logs->smplayer</b>). This information can be very useful for the developer in case you find a bug. + Se está opção for escolhida, SMPlayer irá salvar as mensagens de debuggin da saída do SMPlayer (você pode ver esse log em <b>Opções -> Ver logs -> SMPlayer</b>). Esta informação pode ser muito útil para os desenvolvedores no caso de você encontrar um bug. + + + + Filter for SMPlayer logs + + + + + This option allows to filter the smplayer messages that will be stored in the log. Here you can write any regular expression.<br>For instance: <i>^Core::.*</i> will display only the lines starting with <i>Core::</i> + Esta opção permite filtrar mensagens do SMPlayer que será salva no log. Aqui você pode escrever qualquer expressão regular. <br>Por exemplo: <i>^Core::.*</i> ira mostrar apenas linhas começando com <i>Core::</i> + + + + &Monitor aspect: + + + + + &Run MPlayer in its own window + + + + + &Options: + &Opções: + + + + V&ideo filters: + Filtro&s de Vídeo: + + + + Audio &filters: + &Filtros de áudio: + + + + &Colorkey: + + + + + &Don't repaint the background of the video window + + + + + Log &MPlayer output + + + + + Log &SMPlayer output + + + + + &Filter for SMPlayer logs: + + + + + &End of file: + + + + + &No video: + + + + + C&hange... + + + + + PrefAssociations + + + Warning + + + + + Not all files could be associated. Please check your security permissions and retry. + + + + + File Types + + + + + Select all + + + + + Check all file types in the list + + + + + Uncheck all file types in the list + + + + + List of file types + + + + + File types + + + + + Media files handled by SMPlayer: + + + + + Select All + + + + + Select None + + + + + Check the media file extensions you would like SMPlayer to handle. When you click Apply, the checked files will be associated with SMPlayer. If you uncheck a media type, the file association will be restored. + + + + + Select none + + + + + PrefDrives + + + Drives + Drives + + + + Currently SMPlayer does not autodetect cdrom or dvd devices. So in order to play cdroms or dvds you must first select here your cdrom and dvd drives (can be the same). + Atualmente o SMPlayer não auto-detecta dispositivos cdrom ou dvd. Portanto para usar um cdrom ou dvd você deve primeiro selecionar aqui os seus dispositivos (que podem ser o mesmo). + + + + icon + icone + + + + Select your CD device: + Selecione seu dispositivo de CD: + + + + Select your DVD device: + Selecione seu dispositivo de DVD: + + + + CD device + + + + + Choose your CDROM device. It will be used to play VCDs and Audio CDs. + + + + + DVD device + + + + + Choose your DVD device. It will be used to play DVDs. + + + + + Select your &CD device: + + + + + Select your &DVD device: + + + + + PrefGeneral + + + General + Geral + + + + &General + + + + + Paths + Caminhos + + + + Select... + Selecionar... + + + + Folder for storing screenshots: + Pasta para salvar os screenshots: + + + + Search... + Procurar... + + + + Select the MPlayer executable: + Selecionar o executável MPlayer: + + + + Output drivers + Drivers de saída + + + + Video: + Vídeo: + + + + Audio: + Ãudio: + + + + Media settings + Ajustes da mídia + + + + Remember settings for all files (audio track, subtitles...) + Lembrar dos ajustes de todos os arquivos (trilhas de áudio, legendas,...) + + + + Don't remember time position (files start playing from the beginning) + Não lembrar da posição do filme (arquivos começam a reproduzir do ínicio) + + + + Preferred audio and subtitles + Legenda e áudio preferenciais + + + + Subtitles: + Legendas: + + + + &Video and audio + + + + + Video + Vídeo + + + + Use software video equalizer + Usar equalizador de vídeo por software + + + + Enable postprocessing for all videos + Habilitar pós-processamento para todos os vídeos + + + + Quality: + Qualidade: + + + + Start videos in fullscreen + Iniciar os vídeos em tela cheia + + + + Disable screensaver + Desativar salva telas + + + + Audio + Ãudio + + + + Use software volume control + Usar controle de volume por software + + + + Max. Amplification: + Máx. Amplificação: + + + + AC3/DTS pass-through S/PDIF + AC3/DTS passando via S/PDIF + + + + Volume normalization + Normalização de volume + + + + Select the mplayer executable + Selecione o executável do mplayer + + + + Executables + Executáveis + + + + All files + Todos os arquivos + + + + Select a directory + Selecione um diretório + + + + MPlayer executable + + + + + Here you must specify the mplayer executable that smplayer will use.<br>smplayer requires at least mplayer 1.0rc1 (svn recommended).<br><b>If this setting is wrong, smplayer won't be able to play anything!</b> + Aqui você deve especificar o executável do mplayer que o SMPlayer usará. <br>SMPlayer necessita pelo menos do mplayer 1.0rc1 (recomendado do svn)<br><b>Se esta escolha estiver errada, o SMPlayer não poderá reproduzir nada!</b> + + + + Screenshots folder + + + + + Here you can specify a folder where the screenshots taken by smplayer will be stored. If this field is empty the screenshot feature will be disabled. + Aqui você pode especificar uma pasta onde os screenshots feitos pelo smplayer serão guardados. Se este campo estiver vazio a função de screenshot será desativada. + + + + Video output driver + + + + + Select the video output driver. Usually xv (linux) and directx (windows) provide the best performance. + Selecione um driver de saída de vídeo. Geralmente xv (linux) e directx (windows) geram um melhor desempenho. + + + + Audio output driver + + + + + Select the audio output driver. + Selecione um driver de saída de áudio. + + + + Remember settings + + + + + Usually smplayer will remember the settings for each file you play (audio track selected, volume, filters...). Uncheck this option if you don't like this feature. + Geralmente o SMPlayer irá lembrar dos ajustes de cada um dos arquivos que você reproduziu (trilha de áudio selecionada, volume, filtros,...). Não selecione essa opção caso você não gosta dessa função. + + + + Don't remember time position + + + + + If you check this option, smplayer will play all files from the beginning. + Se você escolher essa opção, o SMPlayer irá reproduzir todos os arquivos desde o ínicio. + + + + Preferred audio language + + + + + Here you can type your preferred language for the audio streams. When a media with multiple audio streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the audio streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the audio track if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + Aqui você pode digitar a sua linguagem preferida para faixas de áudio. Quando uma mídia com várias faixas de áudio for detectada, o smplayer tentará usar sua linguagem preferida <br> Isso apenas funciona com mídia que oferece informações sobre a linguagem da faixa de áudio, como DVD ou arquivos mkv. <br> Este arquivo aceita expressões regulares. Exemplo: <b> ptbr|pt|es</b> vai selecionar faixas de áudio que combinem com <i>ptbr</i> <i>pt</i> ou <i>es</i>. + + + + Preferred subtitle language + + + + + Here you can type your preferred language for the subtitle stream. When a media with multiple subtitle streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the subtitle streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the subtitle stream if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + Aqui você pode digitar a sua linguagem preferida para as legendas. Quando uma mídia com várias legendas for detectada, o smplayer tentará usar sua linguagem preferida <br> Isso apenas funciona com mídia que oferece informações sobre legendas, como DVD ou arquivos mkv. <br> Este arquivo aceita expressões regulares. Exemplo: <b> ptbr|pt|es</b> vai selecionar legendas que combinem com <i>ptbr</i> <i>pt</i> ou <i>es</i>. + + + + Software video equalizer + + + + + You can check this option if video equalizer is not supported by your graphic card or the selected video output driver.<br><b>Note:</b> this option can be incompatible with some video output drivers. + Você pode escolher esse opção a equalização de vídeo não é suportada por sua placa de vídeo ou pelo driver de saída de vídeo selecionado. <br><b>Observação:</b> esta opção pode ser incompatível com alguns drivers de saída de vídeo. + + + + If this option is checked, all videos will start to play in fullscreen mode. + Se esta opção for escolhida, todos os vídeos serão reproduzidos no modo de tela cheia. + + + + Check this option to disable the screensaver while playing.<br>The screensaver will enabled again when play finishes.<br><b>Note:</b> This option works only in X11 and Windows. + Escolha essa opção para desativar o sala telas enquanto reproduzindo. <br>O salva telas será ativado novamente ao final da reprodução.<br><b>Observação:</b> Esta opção funciona apenas com o X11 e Windows. + + + + Software volume control + + + + + Check this option to use the software mixer, instead of using the sound card mixer. + Escolha essa opção para usar um mixer por software, ao invés de usar o mixer da placa de som. + + + + Postprocessing quality + + + + + Dynamically changes the level of postprocessing depending on the available spare CPU time. The number you specify will be the maximum level used. Usually you can use some big number. + Muda dinamicamente o nivel de pós-processamento dependendo da disponibilidade de tempo na CPU. O número que você especificar será o máximo nível usado. Geralmente você pode usar números grandes. + + + + Change volume + + + + + If checked, SMPlayer will remember the volume for every file and will restore it when played again. For new files the default volume will be used. + + + + + Default volume: + Volume padrão: + + + + 0 + 0 + + + + &Change volume on every file + + + + + &Search... + + + + + S&elect... + + + + + Select the &MPlayer executable: + + + + + &Folder for storing screenshots: + + + + + V&ideo: + + + + + &Audio: + + + + + &Don't remember time position (files start playing from the beginning) + + + + + &Remember settings for all files (audio track, subtitles...) + + + + + A&udio: + + + + + Su&btitles: + + + + + &Use software video equalizer + + + + + &Quality: + + + + + Start videos in &fullscreen + + + + + Disable &screensaver + + + + + &Default volume: + + + + + Use s&oftware volume control + + + + + Ma&x. Amplification: + + + + + &AC3/DTS pass-through S/PDIF + + + + + Volume &normalization + &Normalização do volume + + + + Direct rendering + + + + + If checked, turns on direct rendering (not supported by all codecs and video outputs)<br><b>WARNING:</b> May cause OSD/SUB corruption! + + + + + Double buffering + + + + + D&irect rendering + + + + + Dou&ble buffering + + + + + Double buffering fixes flicker by storing two frames in memory, and displaying one while decoding another. If disabled it can affect OSD negatively, but often removes OSD flickering. + + + + + &Enable postprocessing by default + + + + + Volume &normalization by default + + + + + Close when finished + + + + + If this option is checked, the main window will be automatically closed when the current file/playlist finishes. + + + + + &Close when finished + + + + + 2 (Stereo) + + + + + 4 (4.0 Surround) + + + + + 6 (5.1 Surround) + + + + + C&hannels by default: + + + + + &Pause when minimized + + + + + Pause when minimized + + + + + If this option is enabled, the file will be paused when the main window is hidden. When the window is restored, play will be resumed. + + + + + Enable postprocessing by default + + + + + Max. Amplification + + + + + Volume normalization by default + + + + + Maximizes the volume without distorting the sound. + + + + + Default volume + + + + + Sets the initial volume that new files will use. + + + + + Channels by default + + + + + Sets the maximum amplification level in percent (default: 110). A value of 200 will allow you to adjust the volume up to a maximum of double the current level. With values below 100 the initial volume (which is 100%) will be above the maximum, which e.g. the OSD cannot display correctly. + + + + + Uses hardware AC3 passthrough + + + + + Requests the number of playback channels. MPlayer asks the decoder to decode the audio into as many channels as specified. Then it is up to the decoder to fulfill the requirement. This is usually only important when playing videos with AC3 audio (like DVDs). In that case liba52 does the decoding by default and correctly downmixes the audio into the requested number of channels. NOTE: This option is honored by codecs (AC3 only), filters (surround) and audio output drivers (OSS at least). + + + + + Postprocessing will be used by default on new opened files. + + + + + PrefInput + + + Keyboard and mouse + Teclado e mouse + + + + &Keyboard + &Teclado + + + + icon + icone + + + + Here you can change any key shortcut. To do it double click or start typing over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + Aqui você pode modificar qualquer atalho de teclado. Para fazê-lo de um duplo clique ou digite sobre uma célula de atalho. Opcionalmente grave a lista e compartilhe com outras pessoas ou carregue em outro computador. + + + + &Mouse + &Mouse + + + + Button functions: + Botão de função: + + + + Media seeking + Procurar na mídia + + + + Volume control + Controle de volume + + + + Zoom video + Zoom vídeo + + + + None + Nenhum + + + + Here you can change any key shortcut. To do it double click or press enter over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + + + + + &Left click + + + + + &Double click + + + + + &Wheel function: + + + + + Shortcut editor + + + + + This table allows you to change the key shortcuts of most available actions. Double click or press enter on a item, or press the <b>Change shortcut</b> button to enter in the <i>Modify shortcut</i> dialog. There are two ways to change a shortcut: if the <b>Capture</b> button is on then just press the new key or combination of keys that you want to assign for the action (unfortunately this doesn't work for all keys). If the <b>Capture</b> button is off then you could enter the full name of the key. + + + + + Left click + + + + + Select the action for left click on the mouse. + + + + + Double click + + + + + Select the action for double click on the mouse. + + + + + Wheel function + + + + + Select the action for the mouse wheel. + + + + + PrefInterface + + + Interface + Interface + + + + Bulgarian + Bulgaro + + + + Czech + Tcheco + + + + German + Alemão + + + + Greek + Grego + + + + English + Inglês + + + + Spanish + Espanhol + + + + Finnish + Finlandês + + + + French + Francês + + + + Hungarian + Hungaro + + + + Italian + Italiano + + + + Japanese + Japonês + + + + Georgian + Georgiano + + + + Dutch + Holandês + + + + Polish + Polonês + + + + Portuguese - Brazil + Português do Brasil + + + + Portuguese - Portugal + Português de Portugal + + + + Romanian + Romeno + + + + Russian + Russo + + + + Slovak + Eslovênio + + + + Serbian + Sérvio + + + + Swedish + Sueco + + + + Turkish + Turco + + + + Ukrainian + Ucraniano + + + + Simplified-Chinese + Chinês Simplificado + + + + Traditional Chinese + Chinês Tradicional + + + + <Autodetect> + <Autodetectar> + + + + Default + Padrão + + + + &Interface + + + + + Seeking + Procurando + + + + Never + Nunca + + + + Whenever it's needed + Sempre que necessário + + + + Only after loading a new video + Apenas após carregar um novo vídeo + + + + Recent files + Arquivos recentes + + + + Language + Língua + + + + Here you can change the language of the application. + + + + + Instances + + + + + Catalan + + + + + Basque + + + + + Galician + + + + + &Short jump + + + + + &Medium jump + + + + + &Long jump + + + + + Mouse &wheel jump + + + + + &Use only one running instance of SMPlayer + + + + + SMPlayer will listen to this &port to receive commands from other instances: + + + + + Ma&x. items + + + + + St&yle: + + + + + Ico&n set: + + + + + L&anguage: + + + + + Main window + + + + + Auto&resize: + + + + + R&emember position and size + + + + + Default font: + + + + + &Change... + + + + + PrefPerformance + + + Performance + Performance + + + + &Performance + + + + + Priority + Prioridade + + + + Select the priority for the MPlayer process. + Selecionar a prioridade para o processo do MPlayer. + + + + Priority: + Prioridade: + + + + realtime + tempo real + + + + high + alto + + + + abovenormal + acima do normal + + + + normal + normal + + + + belownormal + abaixo do normal + + + + idle + baixo + + + + Cache + Cachê + + + + Size: + Tamanho: + + + + KB + KB + + + + Use cache + Usar cachê + + + + Setting a cache may improve performance on slow media + Selecionando um cache pode melhorar a performance em mídia lenta + + + + Allow frame drop + Permitir eliminação de quadros + + + + Allow hard frame drop (can lead to image distortion) + Permitir uma eliminação de quadros pesada (pode gerar distorção na imagem) + + + + Synchronization + Sincronização + + + + Audio/video auto synchronization + Sincronização de áudio/vídeo automática + + + + Factor: + Fator: + + + + Fast audio track switching + Troca de trilha de áudio rápida + + + + Fast seek to chapters in dvds + Busca rápida de capítulos em DVDs + + + + Set process priority for mplayer according to the predefined priorities available under Windows.<br><b>WARNING:</b> Using realtime priority can cause system lockup. + Definir a prioridade do processo do mplayer de acordo com as prioridades definidas pelo Windows.<br><b>AVISO:</b> Usar prioridade tempo real pode causar o travamento do sistema. + + + + <br><b>Note:</b> This option is for Windows only. + <br><b>Observação:</b> Esta opção é apenas para Windows. + + + + This option specifies how much memory (in kBytes) to use when precaching a file or URL. Especially useful on slow media. + Esta opção especifica quanto de memória (em kBytes) será usada para o pré-cache de um arquivo ou URL. Especialmente útil em mídias lentas. + + + + Skip displaying some frames to maintain A/V sync on slow systems. + Descartar a exibição de alguns quadros para manter a sincronia A/V em sistemas lentos. + + + + Allow hard frame drop + + + + + More intense frame dropping (breaks decoding). Leads to image distortion! + Descarte de quadros mais intenso (quebra decodificação). Pode gerar distorção da imagem! + + + + Gradually adjusts the A/V sync based on audio delay measurements. + Gradualmente ajusta o sincronismo A/V baseado na medida de atraso de áudios. + + + + Priorit&y: + + + + + Si&ze: + + + + + &Use cache + + + + + &Allow frame drop + + + + + Allow &hard frame drop (can lead to image distortion) + + + + + Audio/&video auto synchronization + + + + + Fact&or: + + + + + &Fast audio track switching + + + + + Fast &seek to chapters in dvds + + + + + Create index if needed + + + + + Rebuilds index of files if no index was found, allowing seeking. Useful with broken/incomplete downloads, or badly created files. This option only works if the underlying media supports seeking (i.e. not with stdin, pipe, etc).<br> Note: the creation of the index may take some time. + + + + + &Create index if needed + + + + + If checked, it will try the fastest method to switch audio tracks but might not work with some formats. + + + + + If checked, it will try the fastest method to seek to chapters but it might not work with some discs. + + + + + PrefSubtitles + + + Subtitles + Legendas + + + + Choose a ttf file + Escolha um arquivo ttf + + + + Truetype Fonts + Fontes TrueType + + + + &Subtitles + &Legendas + + + + Autoload + Autocarregar + + + + Autoload subtitles files (*.srt, *.sub...): + Autocarregar arquivos de legenda (*.srt, *.sub...): + + + + Select first available subtitle + Selecione a primeira legenda disponível + + + + Same name as movie + O mesmo nome do filme + + + + All subs containing movie name + Todos as legendas contendo o nome do filme + + + + All subs in directory + Todas as legendas no diretório + + + + Default subtitle encoding: + Codificação padrão da legenda: + + + + Position + Posição + + + + Default position of the subtitles on screen + Posição padrão da legenda na tela + + + + 0 + 0 + + + + Top + Acima + + + + Bottom + Abaixo + + + + Include subtitles on screenshots + Incluir legendas nos screenshots + + + + Use -subfont option (required by recent MPlayer releases) + Usar opção -subfont (requerida por recentes lançamentos do MPlayer) + + + + &Font + + + + + Font + Fontes + + + + TTF font: + Fonte TTF: + + + + Search... + Procurar... + + + + System font: + Fonte do Sistema: + + + + Select the font which will be used for subtitles (and OSD): + Selecione qual fonte será usada nas legendas (e OSD): + + + + Size + Tamanho + + + + Autoscale: + Autoescala: + + + + No autoscale + Sem autoescala + + + + Proportional to movie height + Proporcional à altura do filme + + + + Proportional to movie width + Proporcional à largura do filme + + + + Proportional to movie diagonal + Proporcional ao tamanho da diagonal + + + + Scale: + Escala: + + + + SSA/&ASS library + Biblioteca SSA/&ASS + + + + The new SSA/ASS library will provide nice styled subtitles for external SSA/ASS subtitles files and Matroska tracks. But it will be used too for rendering other formats like SUB and SRT files. + A nova biblioteca SSA/ASS irá provêr belos estilos de legenda para arquivos externos de legenda SSA/ASS e trilhas Matroska. Mas será também usada para renderizar outros formatos de arquivo como SUB e SRT. + + + + Use SSA/ASS library for subtitle rendering + Usar biblioteca SSA/ASS para renderização das legendas + + + + Text color: + Cor do texto: + + + + Border color: + Cor da borda: + + + + Here you can override styles for SSA/ASS subtitles. It can be also used for fine-tuning the rendering of SRT and SUB subtitles by the SSA/ASS library. Example: <b>Bold=1,Outline=2,Shadow=4</b> + Aqui você pode sobrepôr os estilos para legendas SSA/ASS. Também pode ser usado para um ajuste fino na renderização de legendas SRT e SUB pela biblioteca SSA/ASS. Exemplo: <b>Bold=1,Outline=2,Shadow=2</b> {1,?} {2,?} {4<?} + + + + Styles: + Estilos: + + + + Subtitle position + + + + + This option specifies the position of the subtitles over the video window. <i>100</i> means the bottom, while <i>0</i> means the top. + Esta opção especifica a posição das legendas sobre a janela de vídeo. <i>100</i> significa a parte de baixo, enquanto <i>0</i> significa a parte de cima. + + + + SSA/ASS styles + + + + + Au&toload subtitles files (*.srt, *.sub...): + + + + + S&elect first available subtitle + + + + + &Default subtitle encoding: + + + + + Default &position of the subtitles on screen + + + + + &Include subtitles on screenshots + + + + + &Use -subfont option (required by recent MPlayer releases) + + + + + &TTF font: + + + + + Sea&rch... + + + + + S&ystem font: + + + + + A&utoscale: + + + + + S&cale: + + + + + &Use SSA/ASS library for subtitle rendering + + + + + &Text color: + + + + + &Border color: + + + + + St&yles: + + + + + PreferencesDialog + + + SMPlayer - Help + + + + + OK + + + + + Cancel + + + + + Apply + + + + + Help + + + + + SMPlayer - Preferences + SMPlayer - Preferências + + + + QObject + + + 1 second + 1 segundo + + + + %1 seconds + %1 segundos + + + + %1 minutes + %1 minutos + + + + %1 minutes and %2 seconds + %! minutos e %2 segundos + + + + 1 minute + 1 minuto + + + + 1 minute and 1 second + 1 minuto e 1 segundo + + + + 1 minute and %1 seconds + 1 minuto e %1 segundos + + + + %1 minutes and 1 second + %1 minutos e 1 segundo + + + + will show this message and then will exit. + + + + + 'media' is any kind of file that SMPlayer can open. It can be a local file, a DVD (e.g. dvd://1), an Internet stream (e.g. mms://....) or a local playlist in format m3u. If the -playlist option is used, that means that SMPlayer will pass the -playlist option to MPlayer, so MPlayer will handle the playlist, not SMPlayer. + + + + + the main window will be closed when the file/playlist finishes. + + + + + This is SMPlayer v. %1 running on %2 + + + + + tries to make a connection to another running instance and send to it the specified action. Example: -send-action pause The rest of options (if any) will be ignored and the application will exit. It will return 0 on success or -1 on failure. + + + + + action_list is a list of actions separated by spaces. The actions will be executed just after loading the file (if any) in the same order you entered. For checkable actions you can pass true or false as parameter. Example: -actions "fullscreen compact true". Quotes are necessary in case you pass more than one action. + + + + + media + + + + + if there's another instance running, the media will be added to that instance's playlist. If there's no other instance, this option will be ignored and the files will be opened in a new instance. + + + + + specifies the directory for the configuration file (smplayer.ini). + + + + + the main window won't be closed when the file/playlist finishes. + + + + + Usage: %1 [-ini-path directory] [-send-action action_name] [-actions action_list [-close-at-end] [-no-close-at-end] [-fullscreen] [-no-fullscreen] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + + + + + the video will be played in fullscreen mode. + + + + + the video will be played in window mode. + + + + + SeekWidget + + + icon + icone + + + + label + rótulo + + + + ShortcutGetter + + + Modify shortcut + + + + + Clear + + + + + Press the key combination you want to assign + + + + + Capture + + + + + Capture keystrokes + + + + + VideoEqualizer + + + Equalizer + Equalizador + + + + Contrast + Contraste + + + + Brightness + Brilho + + + + Hue + Matiz + + + + Saturation + Saturação + + + + Gamma + Gamma + + + + &Reset + &Resetar + + + + &Set as default values + Definir como valor &padrão + + + + Use the current values as default values for new videos. + Usar os valores atuais como padrão para novos vídeos. + + + + Set all controls to zero. + Definir todos os controles como zero. + + + diff --git a/retroshare-gui/src/apps/smplayer/translations/smplayer_pt_PT.qm b/retroshare-gui/src/apps/smplayer/translations/smplayer_pt_PT.qm new file mode 100644 index 000000000..0090dae3a Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/translations/smplayer_pt_PT.qm differ diff --git a/retroshare-gui/src/apps/smplayer/translations/smplayer_pt_PT.ts b/retroshare-gui/src/apps/smplayer/translations/smplayer_pt_PT.ts new file mode 100644 index 000000000..ae9d9fcdb --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/translations/smplayer_pt_PT.ts @@ -0,0 +1,3871 @@ + + + + AboutDialog + + + Version: %1 + Versão: %1 + + + + 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 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. + + + + Translators: + Tradutores: + + + + German + Alemão + + + + Slovak + Eslovaco + + + + Italian + Italiano + + + + French + Francês + + + + Simplified-Chinese + Chinês Simplificado + + + + Russian + Russo + + + + Hungarian + Húngaro + + + + Japanese + Japonês + + + + Dutch + Holandês + + + + Ukrainian + Ucraniano + + + + Georgian + Georgiano + + + + Czech + Checo + + + + Logo designed by %1 + Logotipo criado por %1 + + + + Get updates at: %1 + Obtenha actualizações em: %1 + + + + About SMPlayer + Acerca do SMPlayer + + + + Polish + Polaco + + + + Bulgarian + Búlgaro + + + + Turkish + Turco + + + + Swedish + Sueco + + + + Serbian + Sérvio + + + + Traditional Chinese + Chinês Tradicional + + + + Romanian + Romeno + + + + Portuguese - Brazil + Português - Brasil + + + + Portuguese - Portugal + Português - Portugal + + + + Compiled with Qt %1 + + + + + %1, %2 and %3 + + + + + %1 and %2 + + + + + http://smplayer.sourceforge.net/en/windows/download.php + If the web page is translated into your language you can change the URL so it points to the download page in the translation.Otherwise leave as is. + + + + + http://smplayer.sourceforge.net/en/linux/download.php + If the web page is translated into your language you can change the URL so it points to the download page in the translation.Otherwise leave as is. + + + + + <b>%1</b>: %2 + + + + + ActionsEditor + + + Name + Nome + + + + Description + Descrição + + + + Shortcut + Atalho + + + + &Save + &Guardar + + + + &Load + &Carregar + + + + Key files + Ficheiros de atalhos + + + + Choose a filename + Escolha um nome de ficheiro + + + + Confirm overwrite? + Confirma a substituição? + + + + The file %1 already exists. +Do you want to overwrite? + O ficheiro %1 já existe. +Deseja substituí-lo? + + + + Choose a file + Escolha um ficheiro + + + + Error + Erro + + + + The file couldn't be saved + O ficheiro não pode ser guardado + + + + The file couldn't be loaded + O ficheiro não pode ser carregado + + + + &Change shortcut... + + + + + BaseGui + + + SMPlayer - mplayer log + SMPlayer - mplayer log + + + + SMPlayer - smplayer log + SMPlayer - smplayer log + + + + &Open + A&brir + + + + &Play + &Reproduzir + + + + &Video + &Vídeo + + + + &Audio + Ã&udio + + + + &Subtitles + &Legendas + + + + &Browse + &Navegar + + + + Op&tions + &Opções + + + + &Help + &Ajuda + + + + &File... + &Ficheiro... + + + + D&irectory... + D&irectório... + + + + &Playlist... + &Lista de reprodução... + + + + &DVD from drive + &DVD a partir do leitor + + + + D&VD from folder... + D&VD a partir de uma pasta... + + + + &URL... + &URL... + + + + &Clear + &Limpar + + + + &Recent files + Ficheiros &recentes + + + + P&lay + &Reproduzir + + + + &Pause + &Pausa + + + + &Stop + &Stop + + + + &Frame step + &Avançar fotograma + + + + &Normal speed + Velocidade &normal + + + + &Halve speed + &Reduzir a metade + + + + &Double speed + &Dobro da velocidade + + + + Speed &-10% + Velocidade &-10% + + + + Speed &+10% + Velocidade &+10% + + + + Sp&eed + &Velocidade + + + + &Repeat + R&epetir + + + + &Fullscreen + &Ecrã Inteiro + + + + &Compact mode + &Modo compacto + + + + Si&ze + &Tamanho + + + + &Autodetect + A&utodetectar + + + + &4:3 + &4:3 + + + + &5:4 + &5:4 + + + + &14:9 + &14:9 + + + + 16:&9 + 16:&9 + + + + 1&6:10 + 1&6:10 + + + + &2.35:1 + &2.35:1 + + + + 4:3 &Letterbox + 4:3 &Letterbox + + + + 16:9 L&etterbox + 16:9 L&etterbox + + + + 4:3 &Panscan + 4:3 &Panscan + + + + 4:3 &to 16:9 + 4:3 &a 16:9 + + + + &Aspect ratio + &Aspect ratio (Proporção) + + + + &None + &Nenhum + + + + &Lowpass5 + &Lowpass5 + + + + Linear &Blend + Linear &Blend + + + + &Deinterlace + &Desentrelaçar + + + + &Postprocessing + &Pós-processamento + + + + &Autodetect phase + &Autodetecção de fase + + + + &Deblock + &Deblock + + + + De&ring + De&ring + + + + Add n&oise + Adicionar r&uído + + + + F&ilters + &Filtros + + + + &Equalizer + &Equalizador + + + + &Screenshot + &Captura + + + + S&tay on top + &Manter em cima + + + + &Track + &Pista + + + + &Extrastereo + &Extraestéreo + + + + &Karaoke + &Karaoke + + + + &Filters + &Filtros + + + + &Default + Por &defeito + + + + &Stereo + E&stéreo + + + + &4.0 Surround + &4.0 Surround + + + + &5.1 Surround + &5.1 Surround + + + + &Channels + &Canais + + + + &Left channel + Canal &esquerdo + + + + &Right channel + Canal &direito + + + + &Stereo mode + &Modo estéreo + + + + &Mute + &Silenciar + + + + Volume &- + Volume &- + + + + Volume &+ + Volume &+ + + + + &Delay - + &Atraso - + + + + D&elay + + A&traso + + + + + &Select + &Seleccionar + + + + &Load... + &Carregar... + + + + Delay &- + Atraso &- + + + + Delay &+ + Atraso &+ + + + + &Up + &Para cima + + + + &Down + P&ara baixo + + + + &Title + &Título + + + + &Chapter + &Capítulo + + + + &Angle + &Ângulo + + + + &Playlist + &Lista de reprodução + + + + &Show frame counter + &Mostrar contador de fotogramas + + + + &Disabled + &Desactivado + + + + &Seek bar + &Barra de procura + + + + &Time + &Tempo + + + + Time + T&otal time + Tempo + Tempo t&otal + + + + &OSD + &OSD + + + + &View logs + &Ver logs + + + + P&references + P&referências + + + + About &Qt + Acerca de &Qt + + + + About &SMPlayer + Acerca de &SMPlayer + + + + <empty> + <vazio> + + + + Video + Vídeo + + + + Audio + Ãudio + + + + Playlists + Listas de reprodução + + + + All files + Todos os ficheiros + + + + Choose a file + Escolha um ficheiro + + + + SMPlayer - Information + SMPlayer - Informação + + + + The CDROM / DVD drives are not configured yet. +The configuration dialog will be shown now, so you can do it. + As unidades de CDROM / DVD ainda não foram configuradas. +O diálogo de configuração irá ser mostrado agora, para que o possa fazer. + + + + Choose a directory + Escolha um directório + + + + Subtitles + Legendas + + + + About Qt + Acerca de Qt + + + + Playing %1 + Reproduzindo %1 + + + + Pause + Pausa + + + + Stop + Stop + + + + De&noise + &Remover ruído + + + + N&ormal + N&ormal + + + + &Soft + &Suave + + + + Play / Pause + Reproduzir / Pausa + + + + Pause / Frame step + Pausa / Avançar fotograma + + + + U&nload + &Descarregar + + + + V&CD + V&CD + + + + C&lose + F&echar + + + + View &info and properties... + Ver &informação e propriedades... + + + + Zoom &- + Zoom &- + + + + Zoom &+ + Zoom &+ + + + + &Reset + &Reiniciar + + + + Move &left + Mover para a &esquerda + + + + Move &right + Mover para a &direita + + + + Move &up + Mover para &cima + + + + Move &down + Mover para &baixo + + + + &Pan && scan + &Pan && scan + + + + &Previous line in subtitles + &Linha anterior + + + + N&ext line in subtitles + L&inha seguinte + + + + -%1 + -%1 + + + + +%1 + +%1 + + + + Dec volume (2) + Diminuir volume (2) + + + + Inc volume (2) + Aumentar volume (2) + + + + Exit fullscreen + Sair do Modo de Ecrã Inteiro + + + + OSD - Next level + OSD - Próximo Nível + + + + Dec contrast + Diminuir contraste + + + + Inc contrast + Aumentar contraste + + + + Dec brightness + Diminuir brilho + + + + Inc brightness + Aumentar brilho + + + + Dec hue + Diminuir tonalidade + + + + Inc hue + Aumentar tonalidade + + + + Dec saturation + Diminuir saturação + + + + Dec gamma + Diminuir gamma + + + + Next audio + Ãudio seguinte + + + + Next subtitle + Legenda seguinte + + + + Next chapter + Capítulo seguinte + + + + Previous chapter + Capítulo anterior + + + + Inc saturation + Aumentar saturação + + + + Inc gamma + Aumentar gamma + + + + Toggle double size + Tamanho duplo + + + + &Load external file... + &Carregar ficheiro externo... + + + + &Kerndeint + &Kerndeint + + + + &Yadif (normal) + &Yadif (normal) + + + + Y&adif (double framerate) + Y&adif (double framerate) + + + + &Next + &Próximo + + + + Pre&vious + &Anterior + + + + Volume &normalization + &Normalização de volume + + + + &Audio CD + CD &Ãudio + + + + Denoise nor&mal + + + + + Denoise &soft + + + + + Denoise o&ff + + + + + Use SSA/&ASS library + + + + + Flip i&mage + + + + + &Toggle double size + + + + + BaseGuiPlus + + + SMPlayer is still running here + SMPlayer ainda se encontra aqui + + + + S&how icon in system tray + &Mostrar ícone na área de notificação + + + + &Hide + &Ocultar + + + + &Restore + &Restaurar + + + + &Recent files + Ficheiros &recentes + + + + &Quit + &Sair + + + + Playlist + Lista de reprodução + + + + Core + + + Brightness: %1 + Brilho: %1 + + + + Contrast: %1 + Contraste: %1 + + + + Gamma: %1 + Gamma: %1 + + + + Hue: %1 + Tonalidade: %1 + + + + Saturation: %1 + Saturação: %1 + + + + Volume: %1 + Volume: %1 + + + + Zoom: %1 + Zoom: %1 + + + + DefaultGui + + + Welcome to SMPlayer + Bem-Vindo ao SMPlayer + + + + Volume + Volume + + + + Audio + Ãudio + + + + Subtitle + Legenda + + + + Playlist + Lista de reprodução + + + + &Main toolbar + Barra &principal + + + + &Language toolbar + Barra de &idioma + + + + &Toolbars + &Barras de ferramentas + + + + Encodings + + + Western European Languages + Ocidental + + + + Western European Languages with Euro + Ocidental com euro + + + + Slavic/Central European Languages + Eslavo/Centro-Europeu + + + + Esperanto, Galician, Maltese, Turkish + Esperanto, Galego, Maltês, Turco + + + + Old Baltic charset + Báltico antigo + + + + Cyrillic + Cirílico + + + + Arabic + Ãrabe + + + + Modern Greek + Grego moderno + + + + Turkish + Turco + + + + Baltic + Báltico + + + + Celtic + Céltico + + + + Hebrew charsets + Hebreu + + + + Russian + Russo + + + + Ukrainian, Belarusian + Ucraniano, Bielo-Russo + + + + Simplified Chinese charset + Chinês simplificado + + + + Traditional Chinese charset + Chinês tradicional + + + + Japanese charsets + Japonês + + + + Korean charset + Coreano + + + + Thai charset + Thai + + + + Cyrillic Windows + Cirílico Windows + + + + Slavic/Central European Windows + Eslavo/Centro-Europeu Windows + + + + Arabic Windows + + + + + EqSlider + + + icon + ícone + + + + FilePropertiesDialog + + + SMPlayer - File properties + SMPlayer - Propriedades do ficheiro + + + + &Information + &Informação + + + + &Demuxer + &Demuxer + + + + &Select the demuxer that will be used for this file: + &Seleccionar o demuxer a ser utilizado neste ficheiro: + + + + &Reset + &Reiniciar + + + + &Video codec + Codec de &vídeo + + + + &Select the video codec: + &Seleccione o codec de vídeo: + + + + A&udio codec + Codec de á&udio + + + + &Select the audio codec: + &Seleccione o codec de áudio: + + + + &MPlayer options + Opções do &MPlayer + + + + Additional Options for MPlayer + Opções Adicionais para o MPlayer + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + Aqui pode passar opções extra ao MPlayer. +Escrevê-las separadas por espaços. +Exemplo: -flip -nosound + + + + &Options: + &Opções: + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + Também pode passar filtros de vídeo adicionais. +Separe-os com ",". Não utilizar espaços! +Exemplo: scale=512:-2,eq2=1.1 + + + + V&ideo filters: + Filtros de víd&eo: + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + E finalmente os filtros de áudio. Mesma regra utilizada nos filtros de vídeo. +Exemplo: resample=44100:0:0,volnorm + + + + Audio &filters: + &Filtros de áudio: + + + + OK + + + + + Cancel + + + + + Apply + + + + + InfoFile + + + General + Geral + + + + Size + Tamanho + + + + %1 KB (%2 MB) + %1 KB (%2 MB) + + + + URL + URL + + + + Length + Duração + + + + Demuxer + Demuxer + + + + Name + Nome + + + + Artist + Artista + + + + Author + Autor + + + + Album + Ãlbum + + + + Genre + Género + + + + Date + Data + + + + Track + Pista + + + + Copyright + Copyright + + + + Comment + Comentário + + + + Software + Software + + + + Clip info + Informação do clip + + + + Video + Vídeo + + + + Resolution + Resolução + + + + Aspect ratio + Aspect ratio (Proporção) + + + + Format + Formato + + + + Bitrate + Bitrate + + + + %1 kbps + %1 kbps + + + + Frames per second + Imagens por segundo + + + + Selected codec + Codec seleccionado + + + + Initial Audio Stream + Pista de áudio inicial + + + + Rate + Qualidade + + + + %1 Hz + %1 Hz + + + + Channels + Canais + + + + Audio Streams + Pistas de áudio + + + + Language + Idioma + + + + empty + vazio + + + + Subtitles + Legendas + + + + Type + Tipo + + + + ID + Info for translators: this is a identification code + ID + + + + # + Info for translators: this is a abbreviation for number + # + + + + Stream title + Título do Stream + + + + Stream URL + URL do Stream + + + + File + + + + + InputDVDDirectory + + + Choose a directory + Escolha um directório + + + + SMPlayer - Play a DVD from a folder + SMPlayer - Reproduzir um DVD a partir de uma pasta + + + + You can play a dvd from your hard disc. Just select the folder which contains the VIDEO_TS and AUDIO_TS directories. + Pode reproduzir um dvd a partir do seu disco rígido. Simplemente seleccione a pasta que contém os directórios VIDEO_TS e AUDIO_TS. + + + + Choose a directory... + Escolha um directório... + + + + InputURL + + + SMPlayer - Enter URL + + + + + &URL: + + + + + It's a &playlist + + + + + If this option is checked, the URL will be treated as a playlist: it will be opened as text and will play the URLs in it. + + + + + LogWindow + + + Choose a filename to save under + Escolha o nome do ficheiro + + + + Confirm overwrite? + Confirma a substituição? + + + + The file already exists. +Do you want to overwrite? + O ficheiro já existe. +Deseja substituí-lo? + + + + Error saving file + Erro ao gravar o ficheiro + + + + The log couldn't be saved + Não foi possível gravar o log + + + + Logs + Logs + + + + LogWindowBase + + + Log Window + Janela de Log + + + + Save + Guardar + + + + Copy to clipboard + Copiar para a área de transferência + + + + Close + Fechar + + + + &Close + &Fechar + + + + Playlist + + + Name + Nome + + + + Length + Duração + + + + &Play + &Reproduzir + + + + &Edit + &Editar + + + + Playlists + Listas de reprodução + + + + Choose a file + Escolha um ficheiro + + + + Choose a filename + Escolha um nome de ficheiro + + + + Confirm overwrite? + Confirma a substituição? + + + + The file %1 already exists. +Do you want to overwrite? + O ficheiro %1 já existe. +Deseja substituí-lo? + + + + All files + Todos os ficheiros + + + + Select one or more files to open + Seleccione um ou mais ficheiros a abrir + + + + Choose a directory + Escolha um directório + + + + Edit name + Editar nome + + + + Type the name that will be displayed in the playlist for this file: + Escreva o nome que este ficheiro irá ter na lista de reprodução: + + + + &Load + &Carregar + + + + &Save + &Gravar + + + + &Next + &Próximo + + + + Pre&vious + &Anterior + + + + Move &up + Para &cima + + + + Move &down + Para &baixo + + + + &Repeat + &Repetir + + + + S&huffle + A&leatório + + + + Add &current file + Adicionar ficheiro &actual + + + + Add &file(s) + Adicionar &ficheiro(s) + + + + Add &directory + Adicionar &directório + + + + Remove &selected + Remover &selecção + + + + Remove &all + Remover &tudo + + + + SMPlayer - Playlist + SMPlayer - Lista de reprodução + + + + Add... + Adicionar... + + + + Remove... + Remover... + + + + Playlist modified + Lista de reprodução modificada + + + + There are unsaved changes, do you want to save the playlist? + Existem alterações não guardadas, deseja gravar a lista de reprodução? + + + + PrefAdvanced + + + Advanced + Avançado + + + + Auto + + + + + &Advanced + &Avançado + + + + icon + ícone + + + + Additional Options for MPlayer + Opções Adicionais para o MPlayer + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + Aqui pode passar opções extra ao MPlayer. +Escrevê-las separadas por espaços. +Exemplo: -flip -nosound + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + Também pode passar filtros de vídeo adicionais. +Separe-os com ",". Não utilizar espaços! +Exemplo: scale=512:-2,eq2=1.1 + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + E finalmente os filtros de áudio. Mesma regra utilizada nos filtros de vídeo. +Exemplo: resample=44100:0:0,volnorm + + + + Don't repaint the background of the video window + Não redesenhar o fundo da janela de vídeo + + + + &Logs + &Logs + + + + Log MPlayer output + Guardar os textos de saída do MPlayer + + + + Log SMPlayer output + Guardar os textos de saída do SMPlayer + + + + This option is mainly intended for debugging the application. + Esta opção é principalmente para depurar (debugging) a aplicação. + + + + &MPlayer language + Idioma &Mplayer + + + + SMPlayer needs to read and parse the output of MPlayer and sometimes it relies on English text. If you are using a MPlayer translated into another language, then you need to change the texts that SMPlayer looks for. (Technically you should enter regular expressions)<br><br> +The drop-down lists may provide already made regular expression for several languages. + SMPlayer precisa de ler e interpretar as mensagens de saída do MPlayer e por vezes procura textos em Inglês. Se está a utilizar um MPlayer traduzido para outro idioma, então é necessário alterar o texto que o SMPlayer procura. (Tecnicamente deve introduzir expressões regulares)<br><br> +As listas podem já conter expressões regulares para vários idiomas. + + + + Checking this option may reduce flickering, but it also might produce that the video won't be displayed properly. + Marcando esta opção é possível reduzir a cintilação, mas também pode fazer com que o vídeo não seja mostrado correctamente. + + + + If checked, smplayer will store the output of mplayer (you can see it in <b>Options->View logs->mplayer</b>). In case of problems this log can contain important information, so it's recommended to keep this option checked. + Se marcada, smplayer irá guardar a informação saída do mplayer (pode visualizá-la em <b>Opções->Ver logs->mplayer</b>). Em caso de problemas este log pode conter informação importante, por isso é recomendado manter esta opção activada. + + + + If this option is checked, smplayer will store the debugging messages that smplayer outputs (you can see the log in <b>Options->View logs->smplayer</b>). This information can be very useful for the developer in case you find a bug. + Se esta opção estiver marcada, smplayer irá guardar as mensagens de depuração (debug) que o smplayer emite (pode visualizar o log em <b>Opções->Ver logs->smplayer</b>). Esta informação pode ser útil para o programador no caso de encontrar um problema. + + + + Filter for SMPlayer logs + + + + + This option allows to filter the smplayer messages that will be stored in the log. Here you can write any regular expression.<br>For instance: <i>^Core::.*</i> will display only the lines starting with <i>Core::</i> + Esta opção permite filtrar as mensagens do smplayer que vão ser guardadas no log. Aqui pode escrever uma expressão regular. <br>Por exemplo: <i>^Core::.*</i> irá mostrar somente as linhas que começem com <i>Core::</i> + + + + &Monitor aspect: + + + + + &Run MPlayer in its own window + + + + + &Options: + &Opções: + + + + V&ideo filters: + Filtros de víd&eo: + + + + Audio &filters: + &Filtros de áudio: + + + + &Colorkey: + + + + + &Don't repaint the background of the video window + + + + + Log &MPlayer output + + + + + Log &SMPlayer output + + + + + &Filter for SMPlayer logs: + + + + + &End of file: + + + + + &No video: + + + + + C&hange... + + + + + PrefAssociations + + + Warning + + + + + Not all files could be associated. Please check your security permissions and retry. + + + + + File Types + + + + + Select all + + + + + Check all file types in the list + + + + + Uncheck all file types in the list + + + + + List of file types + + + + + File types + + + + + Media files handled by SMPlayer: + + + + + Select All + + + + + Select None + + + + + Check the media file extensions you would like SMPlayer to handle. When you click Apply, the checked files will be associated with SMPlayer. If you uncheck a media type, the file association will be restored. + + + + + Select none + + + + + PrefDrives + + + Drives + Unidades + + + + Currently SMPlayer does not autodetect cdrom or dvd devices. So in order to play cdroms or dvds you must first select here your cdrom and dvd drives (can be the same). + Actualmente SMPlayer não detecta automaticamente unidades de cdrom ou dvd. Portanto para que seja possível reproduzir cdroms ou dvds é necessário que seleccione a sua unidade de cd e dvd (podem ser a mesma). + + + + icon + ícone + + + + Select your CD device: + Seleccione o seu dispositivo CD: + + + + Select your DVD device: + Seleccione o seu dispositivo DVD: + + + + CD device + + + + + Choose your CDROM device. It will be used to play VCDs and Audio CDs. + + + + + DVD device + + + + + Choose your DVD device. It will be used to play DVDs. + + + + + Select your &CD device: + + + + + Select your &DVD device: + + + + + PrefGeneral + + + General + Geral + + + + &General + &Geral + + + + Paths + Caminhos + + + + Select... + Seleccionar... + + + + Folder for storing screenshots: + Pasta para guardar capturas: + + + + Search... + Procurar... + + + + Select the MPlayer executable: + Seleccionar o executável do MPlayer: + + + + Output drivers + Controladores de saída + + + + Video: + Vídeo: + + + + Audio: + Ãudio: + + + + Media settings + Opções para o vídeo + + + + Remember settings for all files (audio track, subtitles...) + Lembrar as opções para todos os ficheiros (pista de áudio, legendas...) + + + + Don't remember time position (files start playing from the beginning) + Não lembrar posição anterior (reprodução desde o ínicio) + + + + Preferred audio and subtitles + Ãudio e legendas preferidas + + + + Subtitles: + Legendas: + + + + &Video and audio + &Vídeo e áudio + + + + Video + Vídeo + + + + Use software video equalizer + Utilizar equalizador vídeo por software + + + + Enable postprocessing for all videos + Activar pós-processamento para todos os vídeos + + + + Quality: + Qualidade: + + + + Start videos in fullscreen + Iniciar vídeos em modo de ecrã inteiro + + + + Disable screensaver + Desactivar protecção de ecrã + + + + Audio + Ãudio + + + + Use software volume control + Utilizar controle de volume por software + + + + Max. Amplification: + Max. Amplificação: + + + + AC3/DTS pass-through S/PDIF + AC3/DTS pass-through S/PDIF + + + + Volume normalization + Normalização de volume + + + + Select the mplayer executable + Seleccione o executável do mplayer + + + + Executables + Executáveis + + + + All files + Todos os ficheiros + + + + Select a directory + Seleccione um directório + + + + MPlayer executable + + + + + Here you must specify the mplayer executable that smplayer will use.<br>smplayer requires at least mplayer 1.0rc1 (svn recommended).<br><b>If this setting is wrong, smplayer won't be able to play anything!</b> + Aqui deve especificar o executável do mplayer que será utilizado pelo smplayer.<br>smplayer requer pelo menos o mplayer 1.0rc1 (svn recomendado).<br><b>Se esta opção estiver errada, smplayer não será capaz de reproduzir o que seja!</b> + + + + Screenshots folder + + + + + Here you can specify a folder where the screenshots taken by smplayer will be stored. If this field is empty the screenshot feature will be disabled. + Aqui pode especificar uma pasta onde as fotografias capturadas pelo smplayer serão guardadas. Se o campo ficar em branco, a função de Captura ficará desactivada. + + + + Video output driver + + + + + Select the video output driver. Usually xv (linux) and directx (windows) provide the best performance. + Seleccione o controlador de saída vídeo. Normalmente xv (linux) e directx (windows) oferecem o melhor desempenho. + + + + Audio output driver + + + + + Select the audio output driver. + Seleccione o controlador de saída áudio. + + + + Remember settings + + + + + Usually smplayer will remember the settings for each file you play (audio track selected, volume, filters...). Uncheck this option if you don't like this feature. + Normalmente smplayer irá lembrar-se das opções para cada ficheiro que reproduza (pista de áudio seleccionada, volume, filtros...). Desmarque esta opção se não desejar esta funcionalidade. + + + + Don't remember time position + + + + + If you check this option, smplayer will play all files from the beginning. + Se marcar esta opção, smplayer reproduzirá todos os ficheiros desde o ínicio. + + + + Preferred audio language + + + + + Here you can type your preferred language for the audio streams. When a media with multiple audio streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the audio streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the audio track if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + Aqui pode introduzir o idioma preferido para a pista de áudio. Quando um vídeo com múltiplas pistas de áudio é encontrado, smplayer tentará usar o seu idioma preferido.<br>Isto só será possível com vídeos que ofereçam informação acerca do idioma das pistas de áudio, tal como DVDs ou ficheiros mkv.<br>Este campo aceita expressões regulares. Exemplo: <b>es|esp|spa</b> seleccionará a pista de áudio se coincide com <i>es</i>, <i>esp</i> or <i>spa</i>. + + + + Preferred subtitle language + + + + + Here you can type your preferred language for the subtitle stream. When a media with multiple subtitle streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the subtitle streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the subtitle stream if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + Aqui pode introduzir o idioma preferido para as legendasio. Quando um vídeo com múltiplas legendas é encontrado, smplayer tentará usar o seu idioma preferido.<br>Isto só será possível com vídeos que ofereçam informação acerca do idioma das legendas, tal como DVDs ou ficheiros mkv.<br>Este campo aceita expressões regulares. Exemplo: <b>es|esp|spa</b> seleccionará a legenda se coincide com <i>es</i>, <i>esp</i> or <i>spa</i>. + + + + Software video equalizer + + + + + You can check this option if video equalizer is not supported by your graphic card or the selected video output driver.<br><b>Note:</b> this option can be incompatible with some video output drivers. + Pode marcar esta opção se a sua placa gráfica ou controlador de vídeo não suportam o equalizador de vídeo.<br><b>Nota:</b> esta opção poder ser incompatível com alguns controladores de saída vídeo. + + + + If this option is checked, all videos will start to play in fullscreen mode. + Se esta opção estiver marcada, todos os vídeos serão iniciados em modo de ecrã inteiro. + + + + Check this option to disable the screensaver while playing.<br>The screensaver will enabled again when play finishes.<br><b>Note:</b> This option works only in X11 and Windows. + Marque esta opção para desactivar a protecção de ecrã durante a reprodução.<br>A protecção de ecrã será activada novamente quando a reprodução terminar.<br><b>Nota:</b> Esta opção só funciona em X11 e Windows. + + + + Software volume control + + + + + Check this option to use the software mixer, instead of using the sound card mixer. + Marque esta opção para utilizar o misturador por software, em vez de utilizar o misturador da placa de som. + + + + Postprocessing quality + + + + + Dynamically changes the level of postprocessing depending on the available spare CPU time. The number you specify will be the maximum level used. Usually you can use some big number. + Altera dinâmicamente o nível de pós-processamento dependendo do tempo de CPU disponível. O número especificado é o nível máximo a utilizar. Normalmente pode escolher um número elevado. + + + + Change volume + + + + + If checked, SMPlayer will remember the volume for every file and will restore it when played again. For new files the default volume will be used. + + + + + Default volume: + Volume por defeito: + + + + 0 + 0 + + + + &Change volume on every file + + + + + &Search... + + + + + S&elect... + + + + + Select the &MPlayer executable: + + + + + &Folder for storing screenshots: + + + + + V&ideo: + + + + + &Audio: + + + + + &Don't remember time position (files start playing from the beginning) + + + + + &Remember settings for all files (audio track, subtitles...) + + + + + A&udio: + + + + + Su&btitles: + + + + + &Use software video equalizer + + + + + &Quality: + + + + + Start videos in &fullscreen + + + + + Disable &screensaver + + + + + &Default volume: + + + + + Use s&oftware volume control + + + + + Ma&x. Amplification: + + + + + &AC3/DTS pass-through S/PDIF + + + + + Volume &normalization + &Normalização de volume + + + + Direct rendering + + + + + If checked, turns on direct rendering (not supported by all codecs and video outputs)<br><b>WARNING:</b> May cause OSD/SUB corruption! + + + + + Double buffering + + + + + D&irect rendering + + + + + Dou&ble buffering + + + + + Double buffering fixes flicker by storing two frames in memory, and displaying one while decoding another. If disabled it can affect OSD negatively, but often removes OSD flickering. + + + + + &Enable postprocessing by default + + + + + Volume &normalization by default + + + + + Close when finished + + + + + If this option is checked, the main window will be automatically closed when the current file/playlist finishes. + + + + + &Close when finished + + + + + 2 (Stereo) + + + + + 4 (4.0 Surround) + + + + + 6 (5.1 Surround) + + + + + C&hannels by default: + + + + + &Pause when minimized + + + + + Pause when minimized + + + + + If this option is enabled, the file will be paused when the main window is hidden. When the window is restored, play will be resumed. + + + + + Enable postprocessing by default + + + + + Max. Amplification + + + + + Volume normalization by default + + + + + Maximizes the volume without distorting the sound. + + + + + Default volume + + + + + Sets the initial volume that new files will use. + + + + + Channels by default + + + + + Sets the maximum amplification level in percent (default: 110). A value of 200 will allow you to adjust the volume up to a maximum of double the current level. With values below 100 the initial volume (which is 100%) will be above the maximum, which e.g. the OSD cannot display correctly. + + + + + Uses hardware AC3 passthrough + + + + + Requests the number of playback channels. MPlayer asks the decoder to decode the audio into as many channels as specified. Then it is up to the decoder to fulfill the requirement. This is usually only important when playing videos with AC3 audio (like DVDs). In that case liba52 does the decoding by default and correctly downmixes the audio into the requested number of channels. NOTE: This option is honored by codecs (AC3 only), filters (surround) and audio output drivers (OSS at least). + + + + + Postprocessing will be used by default on new opened files. + + + + + PrefInput + + + Keyboard and mouse + Teclado e rato + + + + &Keyboard + &Teclado + + + + icon + ícone + + + + Here you can change any key shortcut. To do it double click or start typing over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + Aqui pode alterar os atalhos de teclado. Para tal faça duplo clique ou começe a escrever sobre um atalho. Opcionalmente também pode guardar a lista para partilhá-la com outras pessoas ou utilizá-la noutro computador. + + + + &Mouse + &Rato + + + + Button functions: + Funções do butão: + + + + Media seeking + Deslocação pelo vídeo/áudio + + + + Volume control + Controle de volume + + + + Zoom video + Zoom vídeo + + + + None + Nenhum + + + + Here you can change any key shortcut. To do it double click or press enter over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + + + + + &Left click + + + + + &Double click + + + + + &Wheel function: + + + + + Shortcut editor + + + + + This table allows you to change the key shortcuts of most available actions. Double click or press enter on a item, or press the <b>Change shortcut</b> button to enter in the <i>Modify shortcut</i> dialog. There are two ways to change a shortcut: if the <b>Capture</b> button is on then just press the new key or combination of keys that you want to assign for the action (unfortunately this doesn't work for all keys). If the <b>Capture</b> button is off then you could enter the full name of the key. + + + + + Left click + + + + + Select the action for left click on the mouse. + + + + + Double click + + + + + Select the action for double click on the mouse. + + + + + Wheel function + + + + + Select the action for the mouse wheel. + + + + + PrefInterface + + + Interface + Interface + + + + Bulgarian + Búlgaro + + + + Czech + Checo + + + + German + Alemão + + + + Greek + Grego + + + + English + Inglês + + + + Spanish + Espanhol + + + + Finnish + Finlandês + + + + French + Francês + + + + Hungarian + Húngaro + + + + Italian + Italiano + + + + Japanese + Japonês + + + + Georgian + Georgiano + + + + Dutch + Holandês + + + + Polish + Polaco + + + + Portuguese - Brazil + Português - Brasil + + + + Portuguese - Portugal + Português - Portugal + + + + Romanian + Romeno + + + + Russian + Russo + + + + Slovak + Eslovaco + + + + Serbian + Sérvio + + + + Swedish + Sueco + + + + Turkish + Turco + + + + Ukrainian + Ucraniano + + + + Simplified-Chinese + Chinês Simplificado + + + + Traditional Chinese + Chinês Tradicional + + + + <Autodetect> + <Autodetectar> + + + + Default + Por defeito + + + + &Interface + + + + + Seeking + Procura + + + + Never + Nunca + + + + Whenever it's needed + Sempre que necessário + + + + Only after loading a new video + Só depois de carregar novo vídeo + + + + Recent files + Ficheiros recentes + + + + Language + Idioma + + + + Here you can change the language of the application. + + + + + Instances + + + + + Catalan + + + + + Basque + + + + + Galician + + + + + &Short jump + + + + + &Medium jump + + + + + &Long jump + + + + + Mouse &wheel jump + + + + + &Use only one running instance of SMPlayer + + + + + SMPlayer will listen to this &port to receive commands from other instances: + + + + + Ma&x. items + + + + + St&yle: + + + + + Ico&n set: + + + + + L&anguage: + + + + + Main window + + + + + Auto&resize: + + + + + R&emember position and size + + + + + Default font: + + + + + &Change... + + + + + PrefPerformance + + + Performance + Desempenho + + + + &Performance + + + + + Priority + Prioridade + + + + Select the priority for the MPlayer process. + Seleccione a prioridade do processo MPlayer. + + + + Priority: + Prioridade: + + + + realtime + tempo real + + + + high + alta + + + + abovenormal + acima do normal + + + + normal + normal + + + + belownormal + abaixo do normal + + + + idle + desocupado + + + + Cache + Cache + + + + Size: + Tamanho: + + + + KB + KB + + + + Use cache + Utilizar cache + + + + Setting a cache may improve performance on slow media + Utilizar uma cache pode melhorar o desempenho em vídeos lentos + + + + Allow frame drop + Permitir saltar fotogramas + + + + Allow hard frame drop (can lead to image distortion) + Permitir saltar ainda mais fotogramas (pode levar a distorção da imagem) + + + + Synchronization + Sincronização + + + + Audio/video auto synchronization + Sincronizaçao automática áudio/vídeo + + + + Factor: + Factor: + + + + Fast audio track switching + Mudança rápida da pista de áudio + + + + Fast seek to chapters in dvds + Selecção rápida de capítulos em dvds + + + + Set process priority for mplayer according to the predefined priorities available under Windows.<br><b>WARNING:</b> Using realtime priority can cause system lockup. + Estabelece a prioridade do processo mplayer de acordo com as prioridades disponíveis no Windows.<br><b>AVISO:</b> Usar a prioridade tempo real pode bloquear o sistema. + + + + <br><b>Note:</b> This option is for Windows only. + <br><b>Nota:</b> Esta opção é apenas para Windows. + + + + This option specifies how much memory (in kBytes) to use when precaching a file or URL. Especially useful on slow media. + Esta opção especifica a quantidade de memória (em kBytes) a utilizar no pré-carregamento de um ficheiro ou URL. Especialmente útil em media lenta. + + + + Skip displaying some frames to maintain A/V sync on slow systems. + Saltar alguns fotogramas para manter a sincronização A/V em sistemas lentos. + + + + Allow hard frame drop + + + + + More intense frame dropping (breaks decoding). Leads to image distortion! + Perda de fotogramas mais intensa (quebra a descodificação). Leva à distorção da imagem! + + + + Gradually adjusts the A/V sync based on audio delay measurements. + Ajusta a sincronização A/V gradualmente baseado em cálculos do atraso áudio. + + + + Priorit&y: + + + + + Si&ze: + + + + + &Use cache + + + + + &Allow frame drop + + + + + Allow &hard frame drop (can lead to image distortion) + + + + + Audio/&video auto synchronization + + + + + Fact&or: + + + + + &Fast audio track switching + + + + + Fast &seek to chapters in dvds + + + + + Create index if needed + + + + + Rebuilds index of files if no index was found, allowing seeking. Useful with broken/incomplete downloads, or badly created files. This option only works if the underlying media supports seeking (i.e. not with stdin, pipe, etc).<br> Note: the creation of the index may take some time. + + + + + &Create index if needed + + + + + If checked, it will try the fastest method to switch audio tracks but might not work with some formats. + + + + + If checked, it will try the fastest method to seek to chapters but it might not work with some discs. + + + + + PrefSubtitles + + + Subtitles + Legendas + + + + Choose a ttf file + Escolha um ficheiro ttf + + + + Truetype Fonts + Tipos de Letra Truetype + + + + &Subtitles + &Legendas + + + + Autoload + Carregar automaticamente + + + + Autoload subtitles files (*.srt, *.sub...): + Autocarregar ficheiros de legendas (*.srt, *.sub...): + + + + Select first available subtitle + Seleccionar a primeira legenda disponível + + + + Same name as movie + Mesmo nome que o filme + + + + All subs containing movie name + Todas as legendas contendo o nome do filme + + + + All subs in directory + Todas as legendas no directório + + + + Default subtitle encoding: + Codificação por defeito das legendas: + + + + Position + Posição + + + + Default position of the subtitles on screen + Posição por defeito das legendas no ecrã + + + + 0 + 0 + + + + Top + Topo + + + + Bottom + Fundo + + + + Include subtitles on screenshots + Incluir legendas nas capturas de ecrã + + + + Use -subfont option (required by recent MPlayer releases) + Utilizar opção -subfont (necessária nas versões mais recentes do MPlayer) + + + + &Font + &Tipo de letra + + + + Font + Tipo de Letra + + + + TTF font: + Tipo de Letra TTF: + + + + Search... + Procurar... + + + + System font: + Tipo de letra do sistema: + + + + Select the font which will be used for subtitles (and OSD): + Seleccione o tipo de letra a usar em legendas (e OSD): + + + + Size + Tamanho + + + + Autoscale: + Auto-escala: + + + + No autoscale + Sem auto-escala + + + + Proportional to movie height + Proporcional à altura do filme + + + + Proportional to movie width + Proporcional à largura do filme + + + + Proportional to movie diagonal + Proporcional à diagonal do filme + + + + Scale: + Escala: + + + + SSA/&ASS library + Biblioteca SSA/&ASS + + + + The new SSA/ASS library will provide nice styled subtitles for external SSA/ASS subtitles files and Matroska tracks. But it will be used too for rendering other formats like SUB and SRT files. + A nova bliblioteca SSA/ASS vai disponibilizar legendas mais vistosas para ficheiros SSA/ASS e pistas Matroska. Também será utilizada para mostrar legendas em outros formatos, como ficheiros SUB e SRT. + + + + Use SSA/ASS library for subtitle rendering + Usar a bibioteca SSA/ASS para desenhar as legendas + + + + Text color: + Cor do texto: + + + + Border color: + Cor do limite: + + + + Here you can override styles for SSA/ASS subtitles. It can be also used for fine-tuning the rendering of SRT and SUB subtitles by the SSA/ASS library. Example: <b>Bold=1,Outline=2,Shadow=4</b> + Aqui pode alterar estilos para legendas SSA/ASS. Também pode ajustar a forma como a biblioteca SSA/ASS cria as legendas a partir de ficheiros srt e sub. Exemplo: <b>Bold=1,Outline=2,Shadow=4</b> + + + + Styles: + Estilos: + + + + Subtitle position + + + + + This option specifies the position of the subtitles over the video window. <i>100</i> means the bottom, while <i>0</i> means the top. + Esta opção especifica a posição das legendas sobre a janela de vídeo. <i>100</i> é o fundo, enquanto <i>0</i> é o topo. + + + + SSA/ASS styles + + + + + Au&toload subtitles files (*.srt, *.sub...): + + + + + S&elect first available subtitle + + + + + &Default subtitle encoding: + + + + + Default &position of the subtitles on screen + + + + + &Include subtitles on screenshots + + + + + &Use -subfont option (required by recent MPlayer releases) + + + + + &TTF font: + + + + + Sea&rch... + + + + + S&ystem font: + + + + + A&utoscale: + + + + + S&cale: + + + + + &Use SSA/ASS library for subtitle rendering + + + + + &Text color: + + + + + &Border color: + + + + + St&yles: + + + + + PreferencesDialog + + + SMPlayer - Help + + + + + OK + + + + + Cancel + + + + + Apply + + + + + Help + + + + + SMPlayer - Preferences + SMPlayer - Preferências + + + + QObject + + + 1 second + 1 segundo + + + + %1 seconds + %1 segundos + + + + %1 minutes + %1 minutos + + + + %1 minutes and %2 seconds + %1 minutos e %2 segundos + + + + 1 minute + 1 minuto + + + + 1 minute and 1 second + 1 minuto e 1 segundo + + + + 1 minute and %1 seconds + 1 minuto e %1 segundos + + + + %1 minutes and 1 second + %1 minutos e 1 segundo + + + + will show this message and then will exit. + + + + + 'media' is any kind of file that SMPlayer can open. It can be a local file, a DVD (e.g. dvd://1), an Internet stream (e.g. mms://....) or a local playlist in format m3u. If the -playlist option is used, that means that SMPlayer will pass the -playlist option to MPlayer, so MPlayer will handle the playlist, not SMPlayer. + + + + + the main window will be closed when the file/playlist finishes. + + + + + This is SMPlayer v. %1 running on %2 + + + + + tries to make a connection to another running instance and send to it the specified action. Example: -send-action pause The rest of options (if any) will be ignored and the application will exit. It will return 0 on success or -1 on failure. + + + + + action_list is a list of actions separated by spaces. The actions will be executed just after loading the file (if any) in the same order you entered. For checkable actions you can pass true or false as parameter. Example: -actions "fullscreen compact true". Quotes are necessary in case you pass more than one action. + + + + + media + + + + + if there's another instance running, the media will be added to that instance's playlist. If there's no other instance, this option will be ignored and the files will be opened in a new instance. + + + + + specifies the directory for the configuration file (smplayer.ini). + + + + + the main window won't be closed when the file/playlist finishes. + + + + + Usage: %1 [-ini-path directory] [-send-action action_name] [-actions action_list [-close-at-end] [-no-close-at-end] [-fullscreen] [-no-fullscreen] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + + + + + the video will be played in fullscreen mode. + + + + + the video will be played in window mode. + + + + + SeekWidget + + + icon + ícone + + + + label + etiqueta + + + + ShortcutGetter + + + Modify shortcut + + + + + Clear + + + + + Press the key combination you want to assign + + + + + Capture + + + + + Capture keystrokes + + + + + VideoEqualizer + + + Equalizer + Equalizador + + + + Contrast + Contraste + + + + Brightness + Brilho + + + + Hue + Tonalidade + + + + Saturation + Saturação + + + + Gamma + Gamma + + + + &Reset + &Reiniciar + + + + &Set as default values + &Usar como valores por defeito + + + + Use the current values as default values for new videos. + Usa os valores actuais como valores por defeito para os novos vídeos. + + + + Set all controls to zero. + Colocar todos os controles a zero. + + + diff --git a/retroshare-gui/src/apps/smplayer/translations/smplayer_ro_RO.qm b/retroshare-gui/src/apps/smplayer/translations/smplayer_ro_RO.qm new file mode 100644 index 000000000..4849fc20e Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/translations/smplayer_ro_RO.qm differ diff --git a/retroshare-gui/src/apps/smplayer/translations/smplayer_ro_RO.ts b/retroshare-gui/src/apps/smplayer/translations/smplayer_ro_RO.ts new file mode 100644 index 000000000..d6ff1feb0 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/translations/smplayer_ro_RO.ts @@ -0,0 +1,3972 @@ + + + + + AboutDialog + + + Version: %1 + Versiunea: %1 + + + + 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. + Acest program este un produs de tip "free software": poate fi redistribuit ÅŸi/sau modificat respectând termenii licenÅ£ei GNU GPL ÅŸi publicată de către fundaÅ£ia 'Free Software Foundation"; fie versiunea 2 a licenÅ£ei fie (la alegere) orice versiune ulterioară. + + + + Translators: + Traducători: + + + + German + Germană + + + + Slovak + Slovacă + + + + Italian + Italiană + + + + French + Franceză + + + + Simplified-Chinese + Chineză simplificată + + + + Russian + Rusă + + + + Hungarian + Maghiară + + + + Japanese + Japoneză + + + + Dutch + Olandeză + + + + Ukrainian + Uckraineană + + + + Georgian + Georgiană + + + + Czech + Cehă + + + + Logo designed by %1 + Logo realizat de %1 + + + + Get updates at: %1 + GăsiÅ£i actualizări la: %1 + + + + About SMPlayer + Despre SMPlayer + + + + Polish + Poloneză + + + + Bulgarian + Bulgară + + + + Turkish + Turcă + + + + Swedish + Suedeză + + + + Serbian + Sârbă + + + + Traditional Chinese + Chineză TradiÅ£ională + + + + Romanian + Română + + + + Portuguese - Brazil + Portugheză - Brazilia + + + + Portuguese - Portugal + Portugheză - Portugalia + + + + Compiled with Qt %1 + Compilat cu suport KDE %1 + + + + %1, %2 and %3 + %1, %2 ÅŸi %3 + + + + %1 and %2 + %1 ÅŸi %2 + + + + http://smplayer.sourceforge.net/en/windows/download.php + If the web page is translated into your language you can change the URL so it points to the download page in the translation.Otherwise leave as is. + http://smplayer.sourceforge.net/ro/windows/download.php + + + + http://smplayer.sourceforge.net/en/linux/download.php + If the web page is translated into your language you can change the URL so it points to the download page in the translation.Otherwise leave as is. + http://smplayer.sourceforge.net/ro/linux/download.php + + + + <b>%1</b>: %2 + <b>%1</b>: %2 + + + + ActionsEditor + + + Name + Nume + + + + Description + Descriere + + + + Shortcut + Acces rapid + + + + &Save + &Salvare + + + + &Load + ÃŽ&ncărcare + + + + Key files + FiÅŸiere taste + + + + Choose a filename + Alegere nume fiÅŸier + + + + Confirm overwrite? + ConfirmaÅ£i suprascrierea? + + + + The file %1 already exists. +Do you want to overwrite? + FiÅŸierul %1 există deja.DoriÅ£i sa-l suprascrieÅ£i? + + + + Choose a file + Alegere fiÅŸier + + + + Error + Eroare + + + + The file couldn't be saved + FiÅŸierul nu aputut fi salvat + + + + The file couldn't be loaded + FiÅŸierul nu a putut fi încărcat + + + + &Change shortcut... + &Modificare acces rapid... + + + + BaseGui + + + SMPlayer - mplayer log + Jurnal SMPlayer - mplayer + + + + SMPlayer - smplayer log + Jurnal SMPlayer - smplayer + + + + &Open + &Deschide + + + + &Play + Re&dare + + + + &Video + &Video + + + + &Audio + &Audio + + + + &Subtitles + &Subtitrare + + + + &Browse + &Browse + + + + Op&tions + OpÅ£i&uni + + + + &Help + &Ajutor + + + + &File... + &FiÅŸier... + + + + D&irectory... + D&irector... + + + + &Playlist... + &Listă_titluri... + + + + &DVD from drive + Citire &DVD din DVDROM + + + + D&VD from folder... + Citire D&VD din fiÅŸier... + + + + &URL... + &URL... + + + + &Clear + Åž&terge_lista + + + + &Recent files + FiÅŸiere deschise &recent + + + + P&lay + Re&dare + + + + &Pause + &Pauză + + + + &Stop + &Stop + + + + &Frame step + &Frecvenţă cadre + + + + &Normal speed + Viteză &Normală + + + + &Halve speed + R&elanti + + + + &Double speed + Viteză &Dublă + + + + Speed &-10% + Viteză &-10% + + + + Speed &+10% + Viteză &+10% + + + + Sp&eed + Vit&eză + + + + &Repeat + &Repetare + + + + &Fullscreen + &Fullscreen + + + + &Compact mode + Mod &Compact + + + + Si&ze + &Dimensiune + + + + &Autodetect + &Autodetectare + + + + &4:3 + &4:3 + + + + &5:4 + &5:4 + + + + &14:9 + &14:9 + + + + 16:&9 + 16:&9 + + + + 1&6:10 + 1&6:10 + + + + &2.35:1 + &2.35:1 + + + + 4:3 &Letterbox + 4:3 &Compact + + + + 16:9 L&etterbox + 16:9 _C&ompact + + + + 4:3 &Panscan + 4:3 &Panscan + + + + 4:3 &to 16:9 + 4:3 î&n 16:9 + + + + &Aspect ratio + Raport &aspect + + + + &None + Fă&ră + + + + &Lowpass5 + &Lowpass5 + + + + Linear &Blend + Amestec &Liniar + + + + &Deinterlace + &DeîntreÅ£esere + + + + &Postprocessing + &Postprocesare + + + + &Autodetect phase + &Autodetectare fază + + + + &Deblock + + + + + De&ring + + + + + Add n&oise + Adăugare &zgomot + + + + F&ilters + F&iltre + + + + &Equalizer + &Egalizor + + + + &Screenshot + &Captură_ecran + + + + S&tay on top + &Fixat deasupra + + + + &Track + C&oloană_sonoră + + + + &Extrastereo + &Extrastereo + + + + &Karaoke + &Karaoke + + + + &Filters + &Filtre + + + + &Default + I&mplicit + + + + &Stereo + &Stereo + + + + &4.0 Surround + &4.0 Surround + + + + &5.1 Surround + &5.1 Surround + + + + &Channels + &Canale + + + + &Left channel + Canal &Stânga + + + + &Right channel + Canal &Dreapta + + + + &Stereo mode + Mod &Stereo + + + + &Mute + &Mute + + + + Volume &- + Volum &- + + + + Volume &+ + Volum &+ + + + + &Delay - + ÃŽntâ&rziere - + + + + D&elay + + ÃŽntâr&ziere + + + + + &Select + &Selectare + + + + &Load... + ÃŽ&ncărcare... + + + + Delay &- + ÃŽntârziere &- + + + + Delay &+ + ÃŽntârziere &+ + + + + &Up + &Sus + + + + &Down + &Jos + + + + &Title + &Titlu + + + + &Chapter + &Capitol + + + + &Angle + &Unghi + + + + &Playlist + &Listă + + + + &Show frame counter + &Arată contor cadre + + + + &Disabled + &Inactivat + + + + &Seek bar + &Bară căutare + + + + &Time + &Durată + + + + Time + T&otal time + Durată + &Durată totală + + + + &OSD + &OSD + + + + &View logs + &Arhivă jurnale + + + + P&references + P&referinÅ£e + + + + About &Qt + Despre &Qt + + + + About &SMPlayer + Despre &SMPlayer + + + + <empty> + <gol> + + + + Video + Video + + + + Audio + Audio + + + + Playlists + Liste_titluri + + + + All files + Toate fiÅŸierele + + + + Choose a file + Alegere fiÅŸier + + + + SMPlayer - Information + SMPlayer - InformaÅ£ii + + + + The CDROM / DVD drives are not configured yet. +The configuration dialog will be shown now, so you can do it. + Driverele pentru CDROM/DVD nu sunt configurate încă. +O fereastră de dialog va fi afiÅŸată pentru a putea face configurarea. + + + + Choose a directory + Alegere director + + + + Subtitles + Subtitrări + + + + About Qt + Despre Qt + + + + Playing %1 + Redare %1 + + + + Pause + Pauză + + + + Stop + Stop + + + + De&noise + De&noise + + + + N&ormal + N&ormal + + + + &Soft + &Fin + + + + Play / Pause + Redare / Pauză + + + + Pause / Frame step + Pauză / Pas cadre + + + + U&nload + + + + + V&CD + V&CD + + + + C&lose + ÃŽnch&ide fereastra + + + + View &info and properties... + Vezi &informaÅ£ii ÅŸi proprietăţi... + + + + Zoom &- + Zoom &- + + + + Zoom &+ + Zoom &+ + + + + &Reset + &Resetare + + + + Move &left + Deplasare la &stânga + + + + Move &right + Deplasare la &dreapta + + + + Move &up + Deplasare în s&us + + + + Move &down + Deplasare în &jos + + + + &Pan && scan + + + + + &Previous line in subtitles + &Linia anterioară a subtitrării + + + + N&ext line in subtitles + &Următoarea linie a subtitrării + + + + -%1 + -%1 + + + + +%1 + +%1 + + + + Dec volume (2) + Reducere volum (2) + + + + Inc volume (2) + CreÅŸtere volum (2) + + + + Exit fullscreen + EÅŸire mod fullscreen + + + + OSD - Next level + OSD - Nivel următor + + + + Dec contrast + Reducere contrast + + + + Inc contrast + CreÅŸtere contrast + + + + Dec brightness + Reducere strălucire + + + + Inc brightness + CreÅŸtere strălucire + + + + Dec hue + Reducere culoare + + + + Inc hue + CreÅŸtere culoare + + + + Dec saturation + Reducere saturaÅ£ie + + + + Dec gamma + Reducere gamma + + + + Next audio + Coloana sonoră următoare + + + + Next subtitle + Următoarea subtitrare + + + + Next chapter + Capitol următor + + + + Previous chapter + Capitol anterior + + + + Inc saturation + CreÅŸtere saturaÅ£ie + + + + Inc gamma + CreÅŸtere gamma + + + + &Load external file... + ÃŽ&ncărcare fiÅŸier extern... + + + + &Kerndeint + &Kerndeint + + + + &Yadif (normal) + &Yadif (normal) + + + + Y&adif (double framerate) + Y&adif (frecvenţă cadre dublă) + + + + &Next + &Următorul + + + + Pre&vious + A&nteriorul + + + + Volume &normalization + &Normalizare volum + + + + &Audio CD + CD &Audio + + + + Denoise nor&mal + + + + + Denoise &soft + + + + + Denoise o&ff + + + + + Use SSA/&ASS library + Utilizează biblioteca SSA/&ASS + + + + Flip i&mage + I&magine răturnată + + + + &Toggle double size + + + + + BaseGuiPlus + + + SMPlayer is still running here + SMPlayer încă funcÅ£ionează de aici + + + + S&how icon in system tray + A&fiÅŸază iconiţă în system tray + + + + &Hide + &Ascunde + + + + &Restore + &Restaurare_fereastră + + + + &Recent files + FiÅŸiere &recente + + + + &Quit + ÃŽ&nchide program + + + + Playlist + Listă_Titluri + + + + Core + + + Brightness: %1 + Luminozitate: %1 + + + + Contrast: %1 + Contrast: %1 + + + + Gamma: %1 + Gamma: %1 + + + + Hue: %1 + Culoare: %1 + + + + Saturation: %1 + SaturaÅ£ie: %1 + + + + Volume: %1 + Volum: %1 + + + + Zoom: %1 + Zoom: %1 + + + + DefaultGui + + + Welcome to SMPlayer + Bun venit la SMPlayer + + + + Volume + Volum + + + + Audio + Audio + + + + Subtitle + Subtitrare + + + + Playlist + Listă_Titluri + + + + &Main toolbar + &Bară_principală unelte + + + + &Language toolbar + Bară_unelte &limbă + + + + &Toolbars + B&are_unelte + + + + Encodings + + + Western European Languages + Limbi Vest Europene + + + + Western European Languages with Euro + Limbi Vest Europene cu Euro + + + + Slavic/Central European Languages + Limbi Slave/Central Europene + + + + Esperanto, Galician, Maltese, Turkish + Esperanto, GaliÅ£iană, Malteză, Turcă + + + + Old Baltic charset + Caractere Vechi Baltice + + + + Cyrillic + Alfabet Chirilic + + + + Arabic + Arabă + + + + Modern Greek + Greacă Modernă + + + + Turkish + Turcă + + + + Baltic + Baltică + + + + Celtic + Celtă + + + + Hebrew charsets + Alfabet Ebraic + + + + Russian + Rusă + + + + Ukrainian, Belarusian + Ucraineană, Belarusă + + + + Simplified Chinese charset + Alfabet Chinez Simplificat + + + + Traditional Chinese charset + Alfabet Chinez TradiÅ£ional + + + + Japanese charsets + Alfabet Japonez + + + + Korean charset + Alfabet Corean + + + + Thai charset + Alfabet Tailandez + + + + Cyrillic Windows + Alfabet Chirilic Windows + + + + Slavic/Central European Windows + Alfabet Slavon/Central European Windows + + + + Arabic Windows + Alfabet Arab Windows + + + + EqSlider + + + icon + Iconiţă + + + + FilePropertiesDialog + + + SMPlayer - File properties + SMPlayer - Proprietăţi fiÅŸier + + + + &Information + &InformaÅ£ii + + + + &Demuxer + &Demuxer + + + + &Select the demuxer that will be used for this file: + &Selectare demuxer care va fi utilizat pentru acest fiÅŸier: + + + + &Reset + &Valori_implicite + + + + &Video codec + Codec &video + + + + &Select the video codec: + &Selectare codec video: + + + + A&udio codec + Codec a&udio + + + + &Select the audio codec: + &Selectare codec audio: + + + + &MPlayer options + OpÅ£iuni &MPlayer + + + + Additional Options for MPlayer + OpÅ£iuni suplimentare pentru MPlayer + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + Aici se pot adăuga opÅ£iuni suplimentare pentru MPlayer.OpÅ£iunile trebuie separate prin spaÅ£ii.Exemplu: -flip nosound + + + + &Options: + &OpÅ£iuni: + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + PuteÅ£i introduce filtre video suplimentareSeparaÅ£i-le prin ",".Nu utilizaÅ£i spaÅ£ii!Exemplu: scale=512:-2,eq2=1.1 + + + + V&ideo filters: + Filtre V&ideo: + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + Åži, în sfârÅŸit, filtrele audio.Se folosesc aceleaÅŸi reguli ca pentru filtrele video.Exemplu: resample=44100:0:0,volnorm + + + + Audio &filters: + &Filtre audio: + + + + OK + + + + + Cancel + RenunÅ£are + + + + Apply + Validare + + + + InfoFile + + + General + General + + + + Size + Dimensiune + + + + %1 KB (%2 MB) + %1 KB (%2 MB) + + + + URL + URL + + + + Length + Durată + + + + Demuxer + Demuxer + + + + Name + Nume + + + + Artist + Artist + + + + Author + Autor + + + + Album + Album + + + + Genre + Gen + + + + Date + Dată + + + + Track + Coloană sonoră + + + + Copyright + Licenţă + + + + Comment + Comentariu + + + + Software + Software + + + + Clip info + InformaÅ£ii Clip + + + + Video + Video + + + + Resolution + RezoluÅ£ie + + + + Aspect ratio + Raport aspect + + + + Format + Format + + + + Bitrate + Viteză_transfer + + + + %1 kbps + %1 kbps + + + + Frames per second + Cadre pe secundă + + + + Selected codec + Codec-ul selectat + + + + Initial Audio Stream + + + + + Rate + + + + + %1 Hz + %1 Hz + + + + Channels + + + + + Audio Streams + + + + + Language + Limbă + + + + empty + gol + + + + Subtitles + Subtitrări + + + + Type + Tipul + + + + ID + Info for translators: this is a identification code + Cod Identificare + + + + # + Info for translators: this is a abbreviation for number + + + + + Stream title + + + + + Stream URL + + + + + File + FiÅŸier + + + + InputDVDDirectory + + + Choose a directory + Alegere director + + + + SMPlayer - Play a DVD from a folder + SMPlayer - ÃŽncărcare DVD dintr-un director + + + + You can play a dvd from your hard disc. Just select the folder which contains the VIDEO_TS and AUDIO_TS directories. + PuteÅ£i reda un dvd de pe hard disc.SelectaÅ£i directorul care conÅ£ine fiÅŸierele VIDEO_TS ÅŸi AUDIO_TS. + + + + Choose a directory... + Alegere director... + + + + InputURL + + + SMPlayer - Enter URL + SMPlayer - IntroduceÅ£i URL + + + + &URL: + &UR: + + + + It's a &playlist + Este o &listă de titluri + + + + If this option is checked, the URL will be treated as a playlist: it will be opened as text and will play the URLs in it. + Dacă această opÅ£iune este selectată atunci URL va fi tratat ca o listă de titluri: va fi deschis ca text ÅŸi va reda adresele URL din listă. + + + + LogWindow + + + Choose a filename to save under + Alegere nume fiÅŸier de salvat + + + + Confirm overwrite? + Se confirmă suprascrierea? + + + + The file already exists. +Do you want to overwrite? + Un fiÅŸier cu acelaÅŸi nume există deja. +Se doreÅŸte suprascrierea lui? + + + + Error saving file + Eroare la salvarea fisierului + + + + The log couldn't be saved + Jurnalul nu a putut fi salvat + + + + Logs + Arhivă jurnale + + + + LogWindowBase + + + Log Window + Fereastră Jurnal + + + + Save + Salvare + + + + Copy to clipboard + Copiere pe clipboard + + + + Close + ÃŽnchide + + + + &Close + ÃŽn&chide + + + + Playlist + + + Name + Nume + + + + Length + Durată + + + + &Play + &Redare + + + + &Edit + &Editare + + + + Playlists + Liste_Titluri + + + + Choose a file + Alegere fiÅŸier + + + + Choose a filename + Alegere nume fiÅŸier + + + + Confirm overwrite? + ConfirmaÅ£i suprascrierea? + + + + The file %1 already exists. +Do you want to overwrite? + FiÅŸierul %1 există. +DoriÅ£i suprascrierea? + + + + All files + Toate fiÅŸierele + + + + Select one or more files to open + SelectaÅ£i unul sau mai multe fiÅŸiere pentru a le deschide + + + + Choose a directory + Alegere director + + + + Edit name + Editare nume + + + + Type the name that will be displayed in the playlist for this file: + TastaÅ£i numele care va fi afiÅŸat în Listă pentru acest fiÅŸier: + + + + &Load + ÃŽ&ncărcare + + + + &Save + &Salvare + + + + &Next + &Următorul + + + + Pre&vious + Ant&eriorul + + + + Move &up + Mutare în s&us + + + + Move &down + Mutare în &jos + + + + &Repeat + &Repetare + + + + S&huffle + A&leator + + + + Add &current file + Adăugare fiÅŸier &curent + + + + Add &file(s) + Adăugare &fiÅŸier(e) + + + + Add &directory + Adăugare &director + + + + Remove &selected + ÅžtergeÅ£i &selecÅ£ie + + + + Remove &all + ÅžtergeÅ£i &tot + + + + SMPlayer - Playlist + SMPlayer - Listă _titluri + + + + Add... + Adăugare... + + + + Remove... + ÃŽnlăturare... + + + + Playlist modified + Listă_titluri modificată + + + + There are unsaved changes, do you want to save the playlist? + Există modificări nesalvate, doriÅ£i să salvaÅ£i lista? + + + + PrefAdvanced + + + Advanced + OpÅ£iuni_avansate + + + + Auto + Automat + + + + &Advanced + OpÅ£iuni_&Avansate + + + + icon + Iconiţă + + + + Additional Options for MPlayer + OpÅ£iuni suplimentare pentru MPlayer + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + Aici se pot introduce opÅ£iuni suplimentare pentru MPlayer. +OpÅ£iunile se vor scrie separate de spaÅ£ii. +Exemplu: -flip -nosound + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + PuteÅ£i introduce filtre video suplimentare. +OpÅ£iunile se vor separa prin "," (virgulă).Nu se utilizează spaÅ£ii! +Exemplu: scale=512:-2,eq2=1.1 + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + Filtre audio.Se folosesc aceleaÅŸi reguli ca la filtrele video. +Exemplu: resample=44100:0:0,volnorm + + + + Don't repaint the background of the video window + Fără modificarea culorii fundalului ferestrei video + + + + &Logs + Arhivă &Jurnale + + + + Log MPlayer output + ÃŽnscrie în jurnal datele furnizate de MPlayer + + + + Log SMPlayer output + ÃŽnscrie în jurnal datele furnizate de SMPlayer + + + + This option is mainly intended for debugging the application. + Această opÅ£iune se adresează în principal depanării aplicaÅ£iei. + + + + &MPlayer language + Limbă &MPlayer + + + + SMPlayer needs to read and parse the output of MPlayer and sometimes it relies on English text. If you are using a MPlayer translated into another language, then you need to change the texts that SMPlayer looks for. (Technically you should enter regular expressions)<br><br> +The drop-down lists may provide already made regular expression for several languages. + SMPlayer trebuie să citească ÅŸi să analizeze informaÅ£iile furnizate de MPlayer ÅŸi de regulă acestea sunt în engleză. Dacă folosiÅ£i MPlayer tradus în altă limbă, atunci trebuie să modificaÅ£i textul pe care SMPlayer îl monitorizează. (Tehnic vorbind ar trebui să introduceÅ£i expresii standard)<br><br> +ÃŽn caseta în care se înscriu expresiile se găsesc deja unele expresii standard în câteva limbi. + + + + Checking this option may reduce flickering, but it also might produce that the video won't be displayed properly. + Selectarea acestei opÅ£iuni va reduce tremurul imaginii, dar, totodată poate produce afiÅŸarea incorectă a fiÅŸierului video. + + + + If checked, smplayer will store the output of mplayer (you can see it in <b>Options->View logs->mplayer</b>). In case of problems this log can contain important information, so it's recommended to keep this option checked. + Dacă această opÅ£iune este selectată, mplayer va stoca mesajele de depanare furnizate de mplayer (pot fi consultate ulterior în <b>OpÅ£iuni->Vezi jurnale->mplayer</b>).Aceste informaÅ£ii pot fi utile dezvoltatorilor în cazul descoperirii unei probleme. + + + + If this option is checked, smplayer will store the debugging messages that smplayer outputs (you can see the log in <b>Options->View logs->smplayer</b>). This information can be very useful for the developer in case you find a bug. + Dacă această opÅ£iune este selectată, smplayer va stoca mesajele de depanare furnizate de smplayer (pot fi consultate ulterior în <b>OpÅ£iuni->Vezi jurnale->smplayer</b>).Aceste informaÅ£ii pot fi utile dezvoltatorilor în cazul descoperirii unei probleme. + + + + Filter for SMPlayer logs + Filtrare date înscrise în jurnalul SMPlayer + + + + This option allows to filter the smplayer messages that will be stored in the log. Here you can write any regular expression.<br>For instance: <i>^Core::.*</i> will display only the lines starting with <i>Core::</i> + Selectarea acestei opÅ£iuni permite filtrarea mesajelor smplayer care vor fi stocate în jurnal. Aici se pot scrie expresii standard.<br>De exemplu: <i>^Core::.*</i> va afiÅŸa doar liniile care încep cu <i>Core::</i> + + + + &Monitor aspect: + Aspect &monitor: + + + + &Run MPlayer in its own window + &Rulează MPlayer în fereastra proprie + + + + &Options: + &OpÅ£iuni: + + + + V&ideo filters: + Filtre V&ideo: + + + + Audio &filters: + &Filtre audio: + + + + &Colorkey: + &Cod_Culoare: + + + + &Don't repaint the background of the video window + &Fără modificarea culorii fundalului ferestrei video + + + + Log &MPlayer output + ÃŽnscrie în jurnal datele furnizate de &MPlayer + + + + Log &SMPlayer output + ÃŽnscrie în jurnal datele furnizate de &SMPlayer + + + + &Filter for SMPlayer logs: + &Filtrare date înscrise în jurnalul SMPlayer: + + + + &End of file: + &SfârÅŸit fiÅŸier: + + + + &No video: + &Fără video: + + + + C&hange... + M&odificare... + + + + PrefAssociations + + + Warning + AtenÅ£ionare + + + + Not all files could be associated. Please check your security permissions and retry. + Nu toate fiÅŸierele pot fi asociate. VerificaÅ£i permisiunile de securitate ÅŸi încercaÅ£i din nou. + + + + File Types + Tipuri FiÅŸiere + + + + Select all + Toate Selectate + + + + Check all file types in the list + Bifarea tuturor tipurilor de fiÅŸiere din listă + + + + Uncheck all file types in the list + Debifarea tuturor tipurilor de fiÅŸiere din listă + + + + List of file types + Lista tipurilor de fiÅŸiere + + + + File types + Tipuri fiÅŸiere + + + + Media files handled by SMPlayer: + FiÅŸiere media manipulate de SMPlayer: + + + + Select All + Toate Selectate + + + + Select None + Niciunul Selectat + + + + Check the media file extensions you would like SMPlayer to handle. When you click Apply, the checked files will be associated with SMPlayer. If you uncheck a media type, the file association will be restored. + BifaÅ£i fiÅŸierele media pe care doriÅ£i să le manipuleze SMPlayer. După ce apăsaÅ£i butonul Validare, fiÅŸierele bifate vor fi asociate cu SMPlayer. Dacă debifaÅ£i un tip de fiÅŸier media, se va reface asocierea implicită a fiÅŸierului. + + + + Select none + Niciunul Selectat + + + + PrefDrives + + + Drives + Drivere + + + + Currently SMPlayer does not autodetect cdrom or dvd devices. So in order to play cdroms or dvds you must first select here your cdrom and dvd drives (can be the same). + ÃŽn versiunea actuală SMPlayer nu detectează automat dispozitivele cdrom sau dvd.Pentru a putea reda cdromuri sau dvduri aici se pot selecta driverele pentru cdrom sau dvd (pot fi aceleaÅŸi). + + + + icon + Iconiţă + + + + Select your CD device: + Selectare dispozitiv redare CD: + + + + Select your DVD device: + Selectare dispozitiv redare DVD: + + + + CD device + Dispozitiv CD + + + + Choose your CDROM device. It will be used to play VCDs and Audio CDs. + AlegeÅ£i dispozitivul CDROM. Acesta va fi folosit pentru redarea VCD ÅŸi CD Audio. + + + + DVD device + Dispozitiv DVD + + + + Choose your DVD device. It will be used to play DVDs. + Alegere dispozitiv DVD. Acesta va fi folosit pentru redarea DVD. + + + + Select your &CD device: + Selectare dispozitiv redare &CD: + + + + Select your &DVD device: + Selectare dispozitiv redare &DVD: + + + + PrefGeneral + + + General + OpÅ£iuni_Generale + + + + &General + OpÅ£iuni_&Generale + + + + Paths + Selectare căi + + + + Select... + Selectare... + + + + Folder for storing screenshots: + Director pentru stocarea capturilor de ecran: + + + + Search... + Căutare... + + + + Select the MPlayer executable: + Selectarea executabilului MPlayer: + + + + Output drivers + Drivere ieÅŸire + + + + Video: + Video: + + + + Audio: + Audio: + + + + Media settings + Reglaje media + + + + Remember settings for all files (audio track, subtitles...) + Memorare reglaje pentru toate tipurile de fiÅŸiere (coloană sonoră, subtitrare...) + + + + Don't remember time position (files start playing from the beginning) + Nu se va reÅ£ine valoarea contorului de durată (fiÅŸierele vor fi redate de la început) + + + + Preferred audio and subtitles + OpÅ£iuni preferate pentru sonor ÅŸi subtitrări + + + + Subtitles: + Subtitrări: + + + + &Video and audio + &Video ÅŸi audio + + + + Video + Video + + + + Use software video equalizer + Folosire egalizor software pentru video + + + + Enable postprocessing for all videos + Activare postprocesare pentru toate tipurile de fiÅŸiere video + + + + Quality: + Calitatea: + + + + Start videos in fullscreen + Redare fiÅŸier video în mod fullscreen + + + + Disable screensaver + Dezactivare captură ecran + + + + Audio + Audio + + + + Use software volume control + Folosire control volum prin software + + + + Max. Amplification: + Valoare maximă amplificare: + + + + AC3/DTS pass-through S/PDIF + AC3/DTS direcÅ£ionat către S/PDIF + + + + Volume normalization + Normalizare video + + + + Select the mplayer executable + Selectare executabil mplayer + + + + Executables + Executabile + + + + All files + Toate fiÅŸierele + + + + Select a directory + Selectare director + + + + MPlayer executable + Executabil MPlayer + + + + Here you must specify the mplayer executable that smplayer will use.<br>smplayer requires at least mplayer 1.0rc1 (svn recommended).<br><b>If this setting is wrong, smplayer won't be able to play anything!</b> + Aici se poate specifica executabilul mplayer pe care îl va folosi smplayer.<br>smplayer necesită cel puÅ£in varianta mplayer 1.0rc1 (recomandare svn).<br><b>Dacă selecÅ£ia este grÅŸită, smplayer nu va putea reda nimic!</b> + + + + Screenshots folder + Director pentru stocarea capturilor de ecran + + + + Here you can specify a folder where the screenshots taken by smplayer will be stored. If this field is empty the screenshot feature will be disabled. + Aici se poate specifica directorul în care vor fi stocate instantaneele de ecran luate cu ajutorul lui smplayer.Dacă acest câmp este lăsat liber atunci opÅ£iunea de salvare va fi dezactivată. + + + + Video output driver + Driver ieÅŸire video + + + + Select the video output driver. Usually xv (linux) and directx (windows) provide the best performance. + Selectare driver ieÅŸire video.De regulă xv pentru linux ÅŸi directx pentru windows oferă cele mai bune rezultate. + + + + Audio output driver + Driver ieÅŸire audio + + + + Select the audio output driver. + Selectare driver ieÅŸire audio. + + + + Remember settings + Memorare reglaje + + + + Usually smplayer will remember the settings for each file you play (audio track selected, volume, filters...). Uncheck this option if you don't like this feature. + ÃŽn mod normal smplayer va reÅ£ine reglajele făcute pentru fiecare fiÅŸier redat (coloana sonoră - pista - selectată, nivelul volumului,filtrele aplicate...).Se poate deselecta aici această opÅ£iune dacă nu se doreÅŸte funcÅ£ia. + + + + Don't remember time position + Nu memora timpul scurs + + + + If you check this option, smplayer will play all files from the beginning. + Selectarea acestei opÅ£iuni va indica smplayer să redea toate fiÅŸierele de la începutul lor. + + + + Preferred audio language + Limbă preferată coloană sonoră + + + + Here you can type your preferred language for the audio streams. When a media with multiple audio streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the audio streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the audio track if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + Aici se poate selecta lima preferată pentru coloana sonoră.Când un fiÅŸier media cu multiple coloane sonore este găsit, smplayer va încerca să folosească limba preferată.<br>Această funcÅ£ie este valabilă doar pentru fiÅŸiere media care furnizează informaÅ£ii despre coloana sonoră, precum DVD-urile sau fiÅŸierele mkv.<br>Acest câmp acceptă expresii obiÅŸnuite. Exemplu: <b>es|esp|spa|</b> va selecta coloana sonoră identificată cu <i>es</i>, <i>esp</i> sau <i>spa</i>. + + + + Preferred subtitle language + Limbă preferată pentru subtitrări + + + + Here you can type your preferred language for the subtitle stream. When a media with multiple subtitle streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the subtitle streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the subtitle stream if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + Aici se poate selecta limba preferată pentru subtitrare.Când este găsit un fiÅŸier media ce conÅ£ine subtitrări în mai multe limbi, smplayer va încerca să folosească limbă selectată ca preferată.<br>Această opÅ£iune funcÅ£ionează doar pentru fiÅŸiere media care oferă informaÅ£ii despre limba folosită în subtitrare, precum DVD - urile sau fiÅŸierele mkv.<br>Acest câmp acceptă expresii standard. Exemplu: <b>es|esp|spa</b> va avea ca efect selectarea subtitrării identificate cu <i>es</i>, <i>esp</i> sau <i>spa</i>. + + + + Software video equalizer + Egalizor video software + + + + You can check this option if video equalizer is not supported by your graphic card or the selected video output driver.<br><b>Note:</b> this option can be incompatible with some video output drivers. + Se poate selecta această opÅ£iune dacă egalizorul video nu este suportat de placa grafică sau de driverul de ieÅŸire video.<br><b>AtenÅ£ie:</b> această opÅ£iune poate fi incompatibilă cu unele drivere de ieÅŸire video. + + + + If this option is checked, all videos will start to play in fullscreen mode. + Selectarea acestei opÅ£iuni va indica redarea fiÅŸierelor video în mod fullscreen. + + + + Check this option to disable the screensaver while playing.<br>The screensaver will enabled again when play finishes.<br><b>Note:</b> This option works only in X11 and Windows. + Se selectează această opÅ£iune pentru a dezactiva funcÅ£ia sistemului de protejare a monitorului (screensaver).<br>FuncÅ£ia va fi reactivată după ce se termină redarea fiÅŸierului.<br>,b>AtenÅ£ie:</b>Această opÅ£iune funcÅ£ionează numai pentru X11 ÅŸi Windows. + + + + Software volume control + Control volum software + + + + Check this option to use the software mixer, instead of using the sound card mixer. + SelectaÅ£i aceasta opÅ£iune pentru a folosi mixerul software, în locul mixerului plăcii de sunet. + + + + Postprocessing quality + Calitate posprocesare + + + + Dynamically changes the level of postprocessing depending on the available spare CPU time. The number you specify will be the maximum level used. Usually you can use some big number. + Modificarea dinamică a nivelului postprocesării funcÅ£ie de încărcarea CPU. Numărul specificat va reprezenta valoarea maximă a nivelului folosit. + + + + Change volume + Modificare volum + + + + If checked, SMPlayer will remember the volume for every file and will restore it when played again. For new files the default volume will be used. + Dacă este selectată această opÅ£iune atunci SMPlayer va memora nivelul volumului pentru toate fiÅŸierele redate ÅŸi va folosi aceste valori când fiÅŸierele respective vor fi redate din nou. Pentru fiÅŸiere noi se va utiliza valoarea implicită a volumului. + + + + Default volume: + Volum implicit: + + + + 0 + 0 + + + + &Change volume on every file + &Modifică volumul pentru fiecare fiÅŸier + + + + &Search... + &Căutare... + + + + S&elect... + S&electare... + + + + Select the &MPlayer executable: + Selectarea executabilului &MPlayer: + + + + &Folder for storing screenshots: + &Director pentru stocarea capturilor de ecran: + + + + V&ideo: + V&ideo: + + + + &Audio: + &Audio: + + + + &Don't remember time position (files start playing from the beginning) + &Nu se va reÅ£ine valoarea contorului de durată (fiÅŸierele vor fi redate de la început) + + + + &Remember settings for all files (audio track, subtitles...) + Memorare &reglaje pentru toate tipurile de fiÅŸiere (coloană sonoră, subtitrare...) + + + + A&udio: + A&udio: + + + + Su&btitles: + Su&btitrări: + + + + &Use software video equalizer + &Folosire egalizor software pentru video + + + + &Enable postprocessing for all videos + &Activare postprocesare pentru toate tipurile de fiÅŸiere video + + + + &Quality: + Ca&litatea: + + + + Start videos in &fullscreen + Redare video în mod &fullscreen + + + + Disable &screensaver + Dezactivare &captură ecran + + + + &Default volume: + &Volum implicit: + + + + Use s&oftware volume control + Folosire control volum prin s&oftware + + + + Ma&x. Amplification: + Valoare ma&ximă amplificare: + + + + &AC3/DTS pass-through S/PDIF + &AC3/DTS direcÅ£ionat către S/PDIF + + + + Volume &normalization + &Normalizare volum + + + + Direct rendering + Randare directă + + + + If checked, turns on direct rendering (not supported by all codecs and video outputs)<br><b>WARNING:</b> May cause OSD/SUB corruption! + Selectarea acestei opÅ£iuni va porni randarea directă (funcÅ£ia nu este suportată de toate codecurile ÅŸi ieÅŸirile video)<br><b>ATENÅ¢IONARE:</b>Această funcÅ£ie poate duce la coruperea OSD/SUB! + + + + Double buffering + Mărime dublă buffer + + + + D&irect rendering + Randare d&irectă + + + + Dou&ble buffering + Mărime du&blă buffer + + + + Double buffering fixes flicker by storing two frames in memory, and displaying one while decoding another. If disabled it can affect OSD negatively, but often removes OSD flickering. + Alocarea unei mărimi duble pentru buffer va înlătura efectul de clipire a imaginii prin stocarea a două cadre în memorie ÅŸi va afiÅŸa una în timp ce cealaltă este decodată. Dacă nu este selectată această opÅ£iune se poate înfluenÅ£a în mod negativ OSD (afiÅŸarea mesajelor pe imagine), dar de cele mai multe ori înlătură efectul de clipire a acestor mesaje. + + + + &Enable postprocessing by default + &Activare implicită postprocesare + + + + Volume &normalization by default + &Normalizare implicită volum + + + + Close when finished + ÃŽnchide după terminare + + + + If this option is checked, the main window will be automatically closed when the current file/playlist finishes. + Dacă această opÅ£iune este selectată, fereastra principală se va închide automat după redarea fiÅŸierului/listei de titluri. + + + + &Close when finished + ÃŽn&chide după terminare + + + + 2 (Stereo) + 2 (stereo) + + + + 4 (4.0 Surround) + 4 (4.0 Surround) + + + + 6 (5.1 Surround) + 6 (5.1 Surround) + + + + C&hannels by default: + C&anale implicite: + + + + &Pause when minimized + &Pauză la minimizare + + + + Pause when minimized + Pauză la minimizare + + + + If this option is enabled, the file will be paused when the main window is hidden. When the window is restored, play will be resumed. + Dacă opÅ£iunea aceasta este selectată, fiÅŸierul va fi oprit când fereastra principală este minimizată. După ce fereastra este restaurată, redarea fiÅŸierului va fi reluată. + + + + Enable postprocessing by default + Activare postprocesare implicită + + + + Max. Amplification + Amplificare maximă + + + + Volume normalization by default + Normalizare implicită volum + + + + Maximizes the volume without distorting the sound. + MăreÅŸte volumul fără a distorsiona sunetul. + + + + Default volume + Volum implicit + + + + Sets the initial volume that new files will use. + Stabilire volum iniÅ£ial folosit pentru noile fiÅŸiere. + + + + Channels by default + Canale implicite + + + + Sets the maximum amplification level in percent (default: 110). A value of 200 will allow you to adjust the volume up to a maximum of double the current level. With values below 100 the initial volume (which is 100%) will be above the maximum, which e.g. the OSD cannot display correctly. + Stabilirea nivelului maxim de amplificare în procente (implicit: 110). O valoare de 200 vă va permite ajustarea volumului până la o valoare maximă egală cu dublul valorii curente. Pentru o valoare sub 100 volumul initial (care este 100%) va fi peste valoarea maximă, iar în acest caz, de exemplu, OSD nu îl va afiÅŸa corect. + + + + Uses hardware AC3 passthrough + Utilizare procesare AC3 hardware + + + + Requests the number of playback channels. MPlayer asks the decoder to decode the audio into as many channels as specified. Then it is up to the decoder to fulfill the requirement. This is usually only important when playing videos with AC3 audio (like DVDs). In that case liba52 does the decoding by default and correctly downmixes the audio into the requested number of channels. NOTE: This option is honored by codecs (AC3 only), filters (surround) and audio output drivers (OSS at least). + Cererea număruli de canale de redare. MPlayer cere decodorului să decodeze coloana sonoră în numărul de canale specificat. Apoi este treaba decodorului să realezeze acest lucru. Acest lucru este, de regulă, important numai atunci când se redau fiÅŸiere video cu coloana sonoră codată cu AC3 (precum DVD). ÃŽn acst caz liba52 realizează implicit decodarea ÅŸi mixează corect sunetul în numărul de canale specificat. NOTÄ‚: Această opÅ£iune este îndeplinită de codecuri (doar AC3), filtre (surround) ÅŸi driverele audio de ieÅŸire (OSS cel puÅ£in). + + + + Postprocessing will be used by default on new opened files. + Postprocesarea va fi utilizată implicit pentru noile fiÅŸiere. + + + + PrefInput + + + Keyboard and mouse + Tastatură ÅŸi mouse + + + + &Keyboard + &Tastatură + + + + icon + Iconiţă + + + + Here you can change any key shortcut. To do it double click or start typing over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + Aici se pot modifica tastele pentru acces rapid.Pentru a face acest lucru executaÅ£i clic dublu sau tastaÅ£i peste celula în care se menÅ£ionează tipul de acces rapid.OpÅ£ional se poate salva lista pentru a o împărtăşi cu prietenii sau pentru folosirea în alt caculator. + + + + &Mouse + &Mouse + + + + Button functions: + FuncÅ£ii butoane: + + + + Media seeking + Căutare media + + + + Volume control + Control volum + + + + Zoom video + Zoom video + + + + None + Nimic + + + + Here you can change any key shortcut. To do it double click or press enter over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + Aici se pot modifica tastele pentru acces rapid.Pentru a face acest lucru executaÅ£i clic dublu sau tastaÅ£i peste celula în care se menÅ£ionează tipul de acces rapid.OpÅ£ional se poate salva lista pentru a o împărtăşi cu prietenii sau pentru folosirea în alt caculator. + + + + &Left click + Clic &stânga + + + + &Double click + &Dublu clic + + + + &Wheel function: + FuncÅ£ii &rotiţă: + + + + Shortcut editor + Editor acces rapid + + + + This table allows you to change the key shortcuts of most available actions. Double click or press enter on a item, or press the <b>Change shortcut</b> button to enter in the <i>Modify shortcut</i> dialog. There are two ways to change a shortcut: if the <b>Capture</b> button is on then just press the new key or combination of keys that you want to assign for the action (unfortunately this doesn't work for all keys). If the <b>Capture</b> button is off then you could enter the full name of the key. + Acest tabel vă permite modificarea tastelor de acces rapid pentru cele mai multe dintre acÅ£iunile disponibile. FaceÅ£i dublu clic sau apăsaÅ£i tasta Enter pe un articol, sau apăsaÅ£i butonul <b>Change shortcut</b> pentru a intra în meniul dialog <i>Modify shortcut</i>. Sunt două modalităţi de schimbare a tastelor de acces rapid: dacă butonul <b>Capture</b> este activ atunci apăsaÅ£i noua combinaÅ£ie de taste pe care doriÅ£i să o desemnati pentru acÅ£iunea selectată (din nefericire această posibilitate nu este funcÅ£ională pentru toate tastele). Dacă butonul <b>Capture </b> nu este activ atunci aÅ£i putea introduce numele întreg al tastei. + + + + Left click + Clic stânga + + + + Select the action for left click on the mouse. + Selectare acÅ£iune pentru clic stânga cu mouse. + + + + Double click + Dublu clic + + + + Select the action for double click on the mouse. + Selectare acÅ£iune pentru dublu clic cu mouse. + + + + Wheel function + FuncÅ£ie rotiţă + + + + Select the action for the mouse wheel. + Selectare acÅ£iune pentru rotiţă mouse. + + + + PrefInterface + + + Interface + Interfaţă + + + + Bulgarian + Bulgară + + + + Czech + Cehă + + + + German + Germană + + + + Greek + Greacă + + + + English + Engleză + + + + Spanish + Spaniolă + + + + Finnish + Finlandeză + + + + French + Franceză + + + + Hungarian + Maghiară + + + + Italian + Italiană + + + + Japanese + Japoneză + + + + Georgian + Georgiană + + + + Dutch + Olandeză + + + + Polish + Poloneză + + + + Portuguese - Brazil + Portugheză - Brazilia + + + + Portuguese - Portugal + Portugheză - Portugalia + + + + Romanian + Română + + + + Russian + Rusă + + + + Slovak + Slovacă + + + + Serbian + Sârbă + + + + Swedish + Suedeză + + + + Turkish + Turcă + + + + Ukrainian + Ucraineană + + + + Simplified-Chinese + Chineză Simplificată + + + + Traditional Chinese + Chineză TradiÅ£ională + + + + <Autodetect> + <Autodetectare> + + + + Default + Valori implicite + + + + &Interface + &Interfaţă + + + + Seeking + Căutare + + + + Never + Niciodată + + + + Whenever it's needed + Oricând este nevoie + + + + Only after loading a new video + Numai la încăcarea unui fiÅŸier video nou + + + + Recent files + FiÅŸiere recente + + + + Language + Limbă + + + + Here you can change the language of the application. + Aici puteÅ£i modifica limba pentru aplicaÅ£ie. + + + + Instances + Sesiuni + + + + Catalan + Catalană + + + + Basque + Bască + + + + Galician + GaliÅ£iană + + + + &Short jump + &Salt scurt + + + + &Medium jump + Salt &mediu + + + + &Long jump + Salt &lung + + + + Mouse &wheel jump + Salt cu &rotiţă mouse + + + + &Use only one running instance of SMPlayer + FoloseÅŸte o sing&ură sesiune pornită pentru SMPlayer + + + + SMPlayer will listen to this &port to receive commands from other instances: + SMPlayer va monitoriza acest &port pentru a primi comenzi de la alte sesiuni: + + + + Main window &resize method + Metoda &redimensionării ferestrei principale + + + + Ma&x. items + Ma&ximum de articole + + + + St&yle: + St&il: + + + + Ico&n set: + Set iconi&te: + + + + L&anguage: + Lim&bă: + + + + Main window + Fereastra principală + + + + Auto&resize: + &Redimensionare automată: + + + + R&emember position and size + M&emorare poziÅ£ie ÅŸi mărime + + + + Default font: + Caractere implicite: + + + + &Change... + &Modificare... + + + + PrefPerformance + + + Performance + Caracteristici + + + + &Performance + &Caracteristici + + + + Priority + Prioritate + + + + Select the priority for the MPlayer process. + Selectare priorităţi pentru procesele MPlayer. + + + + Priority: + Prioritate: + + + + realtime + timp_real + + + + high + înaltă + + + + abovenormal + peste_normal + + + + normal + normal + + + + belownormal + sub_normal + + + + idle + inactiv + + + + Cache + Cache + + + + Size: + Dimensiune: + + + + KB + KB + + + + Use cache + FoloseÅŸte cache + + + + Setting a cache may improve performance on slow media + Setarea cache-ului poate îmbunătăţii performanÅ£ele pentru fiÅŸiere media lente + + + + Allow frame drop + Permite programului să renunÅ£e la unele cadre + + + + Allow hard frame drop (can lead to image distortion) + Permite programului să renunÅ£e la mai multe cadre (poate duce la imagini distorsionate) + + + + Synchronization + Sincronizare + + + + Audio/video auto synchronization + Sincronizare automată Audio/Video + + + + Factor: + Factor: + + + + Fast audio track switching + Comutare rapidă a coloanei sonore + + + + Fast seek to chapters in dvds + Căutare rapidă a capitolelor în dvd + + + + Set process priority for mplayer according to the predefined priorities available under Windows.<br><b>WARNING:</b> Using realtime priority can cause system lockup. + Selectare priorităţi pentru procesele mplayer în concordanţă cu priorităţile implicite disponibile sub Windows.<br><b>ATENÅ¢IONARE:</b>Folosirea priorităţii "în timp real" poate duce la blocarea sistemului. + + + + <br><b>Note:</b> This option is for Windows only. + <br><b>AtenÅ£ie:</b> Această opÅ£iune este valabilă doar pentru Windows. + + + + This option specifies how much memory (in kBytes) to use when precaching a file or URL. Especially useful on slow media. + Selectarea acestei opÅ£iuni va specifica câtă memorie (în kBytes) se va folosi la pre-încărcarea unui fiÅŸier sau URL. Acest lucru se dovedeÅŸte util pentru suporturi media lente. + + + + Skip displaying some frames to maintain A/V sync on slow systems. + Se sare peste afiÅŸarea unor cadre pentru a menÅ£ine sincronizarea A/V pe sisteme lente. + + + + Allow hard frame drop + Permite programului să renunÅ£e la mai multe cadre + + + + More intense frame dropping (breaks decoding). Leads to image distortion! + Omiterea mai multor cadre (strică decodarea). Conduce la distorsionarea imaginii! + + + + Gradually adjusts the A/V sync based on audio delay measurements. + Ajustare graduală a sincronizării A/V prin măsurarea întârzierii audio. + + + + Priorit&y: + Pri&oritate: + + + + Si&ze: + &Dimensiune: + + + + &Use cache + &FoloseÅŸte cache + + + + &Allow frame drop + &Permite renunÅ£area la unele cadre + + + + Allow &hard frame drop (can lead to image distortion) + P&ermite renunÅ£area la mai multe cadre (poate duce la imagini distorsionate) + + + + Audio/&video auto synchronization + Sincronizare automată Audio/&Video + + + + Fact&or: + Fact&or: + + + + &Fast audio track switching + &Comutare rapidă a coloanei sonore + + + + Fast &seek to chapters in dvds + Cău&tare rapidă a capitolelor în dvd + + + + Create index if needed + Creare index dacă este necesar + + + + Rebuilds index of files if no index was found, allowing seeking. Useful with broken/incomplete downloads, or badly created files. This option only works if the underlying media supports seeking (i.e. not with stdin, pipe, etc).<br> Note: the creation of the index may take some time. + Refacerea indexului fiÅŸierelor dacă nu a fost găsit niciun index, pentru a permite căutarea. OpÅ£iune utilă pentru desărcări incomplete/cu_erori, sau cu fiÅŸiere create greÅŸit. Această opÅ£iune funcÅ£ionează doar dacă fiÅŸierul media vizat suportă căutare (nu va lucra cu stdin, pipe, etc.).</br> Notă: crearea indexului este o operaÅ£iune de durată. + + + + &Create index if needed + &Creare index dacă este necesar + + + + If checked, it will try the fastest method to switch audio tracks but might not work with some formats. + Dacă este selectată programul va încerca să aplice cea mai rapidă metodă de comutare a coloanelor sonore, dar este posibil să nu funcÅ£ioneze cu anumite formate. + + + + If checked, it will try the fastest method to seek to chapters but it might not work with some discs. + Dacă este selectată această opÅ£iune, programul va încerca să aplice cea mai rapidă metodă de căutare a capitolelor, dar pentru anumite discuri poate să nu functioneze. + + + + PrefSubtitles + + + Subtitles + Subtitrări + + + + Choose a ttf file + Alegere fiÅŸier ttf + + + + Truetype Fonts + Caractere Truetype + + + + &Subtitles + &Subtitrare + + + + Autoload + ÃŽncărcare automată + + + + Autoload subtitles files (*.srt, *.sub...): + ÃŽncărcare automată fiÅŸiere subtitrări (*.srt, *.sub...): + + + + Select first available subtitle + Selectarea primei subtitrări disponibile + + + + Same name as movie + AcelaÅŸi nume ca ÅŸi filmul + + + + All subs containing movie name + Subtitrările care conÅ£in numele filmului + + + + All subs in directory + Toate subtitrările din director + + + + Default subtitle encoding: + Codificarea implicită pentru subtitrare: + + + + Position + PoziÅ£ionare + + + + Default position of the subtitles on screen + PoziÅ£ionarea implicită a subtitrării pe ecran + + + + 0 + 0 + + + + Top + Sus + + + + Bottom + Jos + + + + Include subtitles on screenshots + Include subtitrarea în captura de ecran + + + + Use -subfont option (required by recent MPlayer releases) + A se folosi opÅ£iunea -subfont (cerinţă impusă de versiunile recente ale Mplayer) + + + + &Font + &Caractere + + + + Font + Caractere + + + + TTF font: + Caractere TTF: + + + + Search... + Căutare... + + + + System font: + Caractere implicite ale sistemului: + + + + Select the font which will be used for subtitles (and OSD): + Selectarea caracterelor ce vor fi folosite pentru subtitrări (ÅŸi OSD): + + + + Size + Dimensiune + + + + Autoscale: + Autoscalare: + + + + No autoscale + Fără autoscalare + + + + Proportional to movie height + ProporÅ£ională cu înălÅ£imea filmului + + + + Proportional to movie width + ProporÅ£ională cu lăţimea filmului + + + + Proportional to movie diagonal + ProporÅ£ională cu diagonala filmului + + + + Scale: + Dimensiune caracter: + + + + SSA/&ASS library + Bibliotecă SSA/&ASS + + + + The new SSA/ASS library will provide nice styled subtitles for external SSA/ASS subtitles files and Matroska tracks. But it will be used too for rendering other formats like SUB and SRT files. + Noua bibliotecă SSA/ASS va furniza stiluri mai frumoase pentru subtitrări pentru fiÅŸiere externe de subtitrări SSA/ASS ÅŸi Matroska. Dar va fi folosită de asemenea pentru randarea altor formate precum SUB ÅŸi SRT. + + + + Use SSA/ASS library for subtitle rendering + FoloseÅŸte biblioteca SSA/ASS pentru randarea subtitrării + + + + Text color: + Culoare text: + + + + Border color: + Culoare chenar: + + + + Here you can override styles for SSA/ASS subtitles. It can be also used for fine-tuning the rendering of SRT and SUB subtitles by the SSA/ASS library. Example: <b>Bold=1,Outline=2,Shadow=4</b> + Aici se poate shimba stilul pentru subtitrările de tip SSA/ASS. Folosind această bibliotecă se pot face retuşări ale subtitrărilor de tip SUB ÅŸi SRT. Exemplu: <b>Bold=1,Outline=2,Shadow=4</b> + + + + Styles: + Stil: + + + + Subtitle position + PoziÅ£ie subtitrare + + + + This option specifies the position of the subtitles over the video window. <i>100</i> means the bottom, while <i>0</i> means the top. + Această opÅ£iune specifică poziÅ£ia subtitrării pe ecran. <i>100</i> reprezintă partea de jos, în timp ce <i>0</i> reprezintă partea de sus a ecranului. + + + + SSA/ASS styles + Stil SSA/ASS + + + + Au&toload subtitles files (*.srt, *.sub...): + ÃŽncărcare au&tomată fiÅŸiere subtitrări (*.srt, *.sub...): + + + + S&elect first available subtitle + S&electează prima subtitrare disponibilă + + + + &Default subtitle encoding: + Co&dificarea implicită subtitrare: + + + + Default &position of the subtitles on screen + &PoziÅ£ionarea implicită a subtitrării pe ecran + + + + &Include subtitles on screenshots + &Include subtitrarea în captura de ecran + + + + &Use -subfont option (required by recent MPlayer releases) + FoloseÅŸte opÅ£i&unea -subfont (cerinţă impusă de versiunile recente ale Mplayer) + + + + &TTF font: + Caractere &TTF: + + + + Sea&rch... + Căuta&re... + + + + S&ystem font: + Caractere imp&licite ale sistemului: + + + + A&utoscale: + A&utoscalare: + + + + S&cale: + Di&mensiune: + + + + &Use SSA/ASS library for subtitle rendering + FoloseÅŸte biblioteca SSA/ASS pentru randarea s&ubtitrării + + + + &Text color: + Culoare &text: + + + + &Border color: + Culoare c&henar: + + + + St&yles: + St&il: + + + + PreferencesDialog + + + SMPlayer - Help + Ajutor - SMPlayer + + + + OK + OK + + + + Cancel + RenunÅ£are + + + + Apply + Validare + + + + Help + Ajutor + + + + SMPlayer - Preferences + SMPlayer - OpÅ£iuni_Preferate + + + + QObject + + + 1 second + 1 secundă + + + + %1 seconds + %1 secunde + + + + %1 minutes + %1 minute + + + + %1 minutes and %2 seconds + %1 minute ÅŸi %2 secunde + + + + 1 minute + 1 minut + + + + 1 minute and 1 second + 1 minut ÅŸi 1 secundă + + + + 1 minute and %1 seconds + 1 minut ÅŸi %1 secunde + + + + %1 minutes and 1 second + %1 minute ÅŸi 1 secundă + + + + Usage: %1 [-ini-path [directory]] [-action action_name] [-close-at-end] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + + Utilizare: %1 [-ini-path [director]] [-action numele_acÅ£iunii] [-close-at-end] [-help|--help|-h|-?] [[-playlist] tip_media] [[-playlist] tip_media]... + + + + + -ini-path: specifies the directory for the configuration file + (smplayer.ini). If directory is omitted, the application + directory will be used. + + (sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)-ini-path: indică directorul pentru fiÅŸierul de configurare +(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(smplayer.ini). Dacă directorul este omis, atunci va fi folosit +(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)directorul programului. + + + + + -action: tries to make a connection to another running instance + and send to it the specified action. Example: -action pause + The rest of options (if any) will be ignored and the + application will exit. It will return 0 on success or -1 + on failure. + + (sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)-action: încearcă să stabilească legătura cu altă sesiune care +(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)ÅŸi să trimită către aceasta comanda specificată. Exemplu: -action pause +(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)Restul opÅ£iunilor (dacă există) vor fi ignorate ÅŸi +(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)aplicaÅ£ia se va închide. Se va returna 0 în caz de reuÅŸită +(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)ÅŸi -1 în caz de eÅŸec. + + + + + -close-at-end: the main window will be closed when the file/playlist finish + + (sp)(sp)(sp)(sp)(sp)-close-at-end: fereastra principală se va închide când lista de titluri a ost epuizată + + + + + -help: will show this message and then will exit. + + (sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)-help: va afiÅŸa conÅ£inutul acestui mesaj. + + + + + media: 'media' is any kind of file that SMPlayer can open. It can + be a local file, a DVD (e.g. dvd://1), an Internet stream + (e.g. mms://....) or a local playlist in format m3u. + If the -playlist option is used, that means that SMPlayer + will pass the -playlist option to MPlayer, so MPlayer will + will handle the playlist, not SMPlayer. + + (sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)media: 'media' reprezintă orice tip de fiÅŸier pe SMPlayer îl poate reda. Acesta poate +(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)fi un fiÅŸier aflat pe hard disc, un DVD (ex.: dvd://1), un flux de date de pe internet +(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(ex.: mms://....) sau o listă de titluri în format m3u. +(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)Dacă este folosită opÅ£iunea -playlist, înseamnă că SMPlayer +(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)va transmite opÅ£iunea -playlist către MPlayer, astfel MPlayer va fi +(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)cel care manipulează lista de titluri ÅŸi nu SMPlayer. + + + + + This is SMPlayer v. %1 running on %2 + + Acesta este SMPlayer v. %1 rulând pe %2 + + + + + This is SMPlayer v. %1 running on %2 + Acesta este SMPlayer v. %1 rulând pe %2 + + + + Usage: %1 [-ini-path [directory]] [-action action_name] [-close-at-end] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + Utilizare: %1 [-ini-path [director]] [-action numele_acÅ£iunii] [-close-at-end] [-help|--help|-h|-?] [[-playlist] tip_media] [[-playlist] tip_media]... + + + + specifies the directory for the configuration file (smplayer.ini). If directory is omitted, the application directory will be used. + indică directorul pentru fiÅŸierul de configurare (smplayer.ini). Dacă directorul este omis, atunci va fi folosit directorul programului. + + + + tries to make a connection to another running instance and send to it the specified action. Example: -action pause The rest of options (if any) will be ignored and the application will exit. It will return 0 on success or -1 on failure. + încearcă să stabilească legătura cu altă sesiune care ÅŸi să trimită către aceasta comanda specificată. Exemplu: -action pause Restul opÅ£iunilor (dacă există) vor fi ignorate ÅŸi aplicaÅ£ia se va închide. Se va returna 0 în caz de reuÅŸită ÅŸi -1 în caz de eÅŸec. + + + + the main window will be closed when the file/playlist finishes. + fereastra principală se va închide când lista de titluri a ost epuizată. + + + + will show this message and then will exit. + va afiÅŸa conÅ£inutul acestui mesaj. + + + + 'media' is any kind of file that SMPlayer can open. It can be a local file, a DVD (e.g. dvd://1), an Internet stream (e.g. mms://....) or a local playlist in format m3u. If the -playlist option is used, that means that SMPlayer will pass the -playlist option to MPlayer, so MPlayer will handle the playlist, not SMPlayer. + 'media' reprezintă orice tip de fiÅŸier pe SMPlayer îl poate reda. Acesta poate fi un fiÅŸier aflat pe hard disc, un DVD (ex.: dvd://1), un flux de date de pe internet (ex.: mms://....) sau o listă de titluri în format m3u. Dacă este folosită opÅ£iunea -playlist, înseamnă că SMPlayer va transmite opÅ£iunea -playlist către MPlayer, astfel MPlayer va fi cel care manipulează lista de titluri ÅŸi nu SMPlayer. + + + + Usage: %1 [-ini-path [directory]] [-send-action action_name] [-actions action_list [-close-at-end] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + Utilizare: %1 [-ini-path [director]] [-action numele_acÅ£iunii] [-actions listă_acÅ£iuni [-close-at-end] [-help|--help|-h|-?] [[-playlist] tip_media] [[-playlist] tip_media]... + + + + tries to make a connection to another running instance and send to it the specified action. Example: -send-action pause The rest of options (if any) will be ignored and the application will exit. It will return 0 on success or -1 on failure. + încearcă să stabilească legătura cu altă sesiune care ÅŸi să trimită către aceasta comanda specificată. Exemplu: -action pause Restul opÅ£iunilor (dacă există) vor fi ignorate ÅŸi aplicaÅ£ia se va închide. Se va returna 0 în caz de reuÅŸită ÅŸi -1 în caz de eÅŸec. + + + + action_list is a list of actions separated by spaces. The actions will be executed just after loading the file (if any) in the same order you entered. For checkable actions you can pass true or false as parameter. Example: -actions "fullscreen compact true". Quotes are necessary in case you pass more than one action. + listă_acÅ£iuni este o enumerare de acÅ£iuni (comenzi) separate de spaÅ£ii. Comenzile vor fi executate imediat după încărcarea fiÅŸierului media (dacă există vreunul) în aceeaÅŸi ordine în care au fost scrise. Pentru comenzile ce pot fi bifate se pot pune ca parametrii true sau false. Exemplu: -actions "fullscreen compact true". Ghilimelele sunt necesare în cazul în care scrieÅ£i mai mult de o acÅ£iune (comandă). + + + + media + tip_media + + + + Usage: %1 [-ini-path [directory]] [-send-action action_name] [-actions action_list [-close-at-end] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + Utilizare: %1 [-ini-path [director]] [send-action numele_acÅ£iunii] [-actions listă_acÅ£iuni [-close-at-end] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] tip_media] [[-playlist] tip_media]... + + + + if there's another instance running, the media will be added to that instance's playlist. If there's no other instance, this option will be ignored and the files will be opened in a new instance. + dacă este o altă sesiune deschisă, fiÅŸierul media va fi adăugat la lista de titluri a acelei sesiuni. Dacă nu este altă sesiune deschisă această opÅ£iune va fi ignorată ÅŸi fiÅŸiele vor fi deschise într-o nouă sesiune. + + + + Usage: %1 [-ini-path directory] [-send-action action_name] [-actions action_list [-close-at-end] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + Utilizare: %1 [-ini-path [director]] [send-action numele_acÅ£iunii] [-actions listă_acÅ£iuni [-close-at-end] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] tip_media] [[-playlist] tip_media]... + + + + specifies the directory for the configuration file (smplayer.ini). + indică diretorul pentru fiÅŸierul de configurare (smplayer.ini). + + + + the main window won't be closed when the file/playlist finishes. + fereastra principală nu se va închide după ce fiÅŸierul sau lista se termină. + + + + Usage: %1 [-ini-path directory] [-send-action action_name] [-actions action_list [-close-at-end] [-no-close-at-end] [-fullscreen] [-no-fullscreen] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + Utilizare %1 [-ini-path director] [-send-action nume_acÅ£iune] [-actions listă_acÅ£iuni [-close-at-end] [-no-close-at-end] [-fullscreen] [-no-fullscreen] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + + + + the video will be played in fullscreen mode. + fiÅŸierul video va fi redat pe tot ecranul. + + + + the video will be played in window mode. + fiÅŸierul video va fi redat în fereastra principală. + + + + SeekWidget + + + icon + Iconiţă + + + + label + etichetă + + + + ShortcutGetter + + + Modify shortcut + Modificare acces rapid + + + + Clear + Åžtergere + + + + Press the key combination you want to assign + AcÅ£ionaÅ£i combinaÅ£ia de taste pe care doriÅ£i să o alocaÅ£i + + + + Capture + Captură + + + + Capture keystrokes + CombinaÅ£ie taste captură + + + + VideoEqualizer + + + Equalizer + Egalizor + + + + Contrast + Contrast + + + + Brightness + Strălucire + + + + Hue + Culoare + + + + Saturation + SaturaÅ£ie + + + + Gamma + Gamma + + + + &Reset + &Valori_implicite + + + + &Set as default values + &Selectează ca valoari implicite + + + + Use the current values as default values for new videos. + Folosire valori curente ca valori implicite pentru fiÅŸiere video noi. + + + + Set all controls to zero. + Selectează butoanele de control la zero. + + + diff --git a/retroshare-gui/src/apps/smplayer/translations/smplayer_ru_RU.qm b/retroshare-gui/src/apps/smplayer/translations/smplayer_ru_RU.qm new file mode 100644 index 000000000..de8bf617e Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/translations/smplayer_ru_RU.qm differ diff --git a/retroshare-gui/src/apps/smplayer/translations/smplayer_ru_RU.ts b/retroshare-gui/src/apps/smplayer/translations/smplayer_ru_RU.ts new file mode 100644 index 000000000..8355dc64c --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/translations/smplayer_ru_RU.ts @@ -0,0 +1,3637 @@ + + + + AboutDialog + + + Version: %1 + ВерÑиÑ: %1 + + + + 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. + Это Ñвободное программное обеÑпечение; Ð’Ñ‹ можете раÑпроÑтранÑÑ‚ÑŒ его и/или изменÑÑ‚ÑŒ руководÑтвуÑÑÑŒ 2 или (на ваше уÑмотрение) более поздней верÑией GNU General Public License опубликованной Free Software Foundation. + + + + Translators: + Переводчики: + + + + German + Ðемецкий + + + + Slovak + Словацкий + + + + Italian + ИтальÑнÑкий + + + + French + ФранцузÑкий + + + + Simplified-Chinese + Упрощенный китайÑкий + + + + Russian + РуÑÑкий + + + + Hungarian + ВенгерÑкий + + + + Japanese + ЯпонÑкий + + + + Dutch + Ðемецкий + + + + Ukrainian + УкраинÑкий + + + + Georgian + ГрузинÑкий + + + + Czech + ЧешÑкий + + + + Logo designed by %1 + Дизайн логотипа: %1 + + + + Get updates at: %1 + Получить Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð°: %1 + + + + About SMPlayer + О SMPlayer + + + + Polish + ПольÑкий + + + + Bulgarian + БолгарÑкий + + + + Turkish + ТюркÑÐºÐ°Ñ + + + + Swedish + ШведÑкий + + + + Serbian + СербÑкий + + + + Traditional Chinese + КитайÑкий традиционный + + + + Romanian + РумынÑкий + + + + Portuguese - Brazil + ПортугальÑкий - Ð‘Ñ€Ð°Ð·Ð¸Ð»Ð¸Ñ + + + + Portuguese - Portugal + ПортугальÑкий - ÐŸÐ¾Ñ€Ñ‚ÑƒÐ³Ð°Ð»Ð¸Ñ + + + + Compiled with Qt %1 + Скомпилированно Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Qt %1 + + + + %1, %2 and %3 + %1, %2 и %3 + + + + %1 and %2 + %1 и %2 + + + + http://smplayer.sourceforge.net/en/windows/download.php + If the web page is translated into your language you can change the URL so it points to the download page in the translation.Otherwise leave as is. + http://smplayer.sourceforge.net/ru/windows/download.php + + + + http://smplayer.sourceforge.net/en/linux/download.php + If the web page is translated into your language you can change the URL so it points to the download page in the translation.Otherwise leave as is. + http://smplayer.sourceforge.net/ru/linux/download.php + + + + <b>%1</b>: %2 + <b>%1</b>: %2 + + + + ActionsEditor + + + Name + Ð˜Ð¼Ñ + + + + Description + ОпиÑание + + + + Shortcut + ГорÑÑ‡Ð°Ñ ÐºÐ»Ð°Ð²Ð¸ÑˆÐ° + + + + &Save + &Сохранить + + + + &Load + &Загрузить + + + + Key files + ГорÑчие клавиши + + + + Choose a filename + Выберите Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° + + + + Confirm overwrite? + ПерезапиÑать? + + + + The file %1 already exists. +Do you want to overwrite? + Файл %1 ÑущеÑтвует. +ПерезапиÑать? + + + + Choose a file + Выбрать файл + + + + Error + Ошибка + + + + The file couldn't be saved + Файл не может быть Ñохранен + + + + The file couldn't be loaded + Файл не может быть загружен + + + + &Change shortcut... + Изменить &Ñрлык... + + + + BaseGui + + + &File... + &Файл... + + + + D&irectory... + &Каталог... + + + + &Playlist... + &СпиÑок... + + + + &DVD from drive + &DVD Ñ Ð¿Ñ€Ð¸Ð²Ð¾Ð´Ð° + + + + D&VD from folder... + D&VD из каталога... + + + + &URL... + &URL... + + + + P&lay + ВоÑпро&изведение + + + + &Pause + &Пауза + + + + &Stop + &Стоп + + + + &Frame step + &Шаг кадров + + + + &Repeat + Пов&торить + + + + &Normal speed + &ÐÐ¾Ñ€Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑкороÑÑ‚ÑŒ + + + + &Halve speed + &ÐŸÐ¾Ð»Ð¾Ð²Ð¸Ð½Ð½Ð°Ñ ÑкороÑÑ‚ÑŒ + + + + &Double speed + &Ð£Ð´Ð²Ð¾ÐµÐ½Ð½Ð°Ñ ÑкороÑÑ‚ÑŒ + + + + Speed &-10% + СкороÑÑ‚ÑŒ &-10% + + + + Speed &+10% + СкороÑÑ‚ÑŒ &+10% + + + + Sp&eed + Ск&ороÑÑ‚ÑŒ + + + + &Fullscreen + Ð&а веÑÑŒ Ñкран + + + + &Compact mode + &Компактный режим + + + + &Equalizer + &Эквалайзер + + + + &Screenshot + Снимок Ñк&рана + + + + S&tay on top + Повер&Ñ… других окон + + + + &Postprocessing + &ПоÑтпроцеÑÑинг + + + + &Autodetect phase + &Ðвтоопределение фазы + + + + &Deblock + &Deblock + + + + De&ring + De&ring + + + + Add n&oise + Добавить ш&ум + + + + F&ilters + Ф&ильтры + + + + &Mute + &Выключить звук + + + + Volume &- + ГромкоÑÑ‚ÑŒ &- + + + + Volume &+ + ГромкоÑÑ‚ÑŒ &+ + + + + &Delay - + &Задержка - + + + + D&elay + + З&адержка + + + + + &Extrastereo + &РаÑширенное Ñтерео + + + + &Karaoke + &Караоке + + + + &Filters + &Фильтры + + + + &Load... + &Открыть... + + + + Delay &- + Задержка &- + + + + Delay &+ + Задержка &+ + + + + &Up + Ð’&верх + + + + &Down + Ð’&низ + + + + &Playlist + &СпиÑок + + + + &Show frame counter + &Показать Ñчетчик кадров + + + + P&references + &ÐаÑтройки + + + + &View logs + Смотреть от&четы + + + + About &Qt + О &Qt + + + + About &SMPlayer + О &SMPlayer + + + + &Open + &Открыть + + + + &Play + ВоÑпро&изведение + + + + &Video + &Видео + + + + &Audio + Зв&ук + + + + &Subtitles + Су&бтитры + + + + &Browse + Об&зор + + + + Op&tions + &ÐаÑтройки + + + + &Help + Спр&авка + + + + &Recent files + ПоÑл&едние файлы + + + + &Clear + О&чиÑтить + + + + Si&ze + Ра&змер + + + + &Aspect ratio + &Соотношение Ñторон + + + + &Deinterlace + &Deinterlace + + + + &Autodetect + &Ðвтоопределение + + + + 4:3 &Letterbox + 4:3 &Letterbox + + + + 16:9 L&etterbox + 16:9 L&etterbox + + + + 4:3 &Panscan + 4:3 &Panscan + + + + 4:3 &to 16:9 + 4:3 &к 16:9 + + + + &None + &Ðичего + + + + &Lowpass5 + &Lowpass5 + + + + Linear &Blend + Linear &Blend + + + + &Track + &Дорожка + + + + &Channels + &Каналы + + + + &Stereo mode + &Стерео режим + + + + &Default + &По-умолчанию + + + + &Stereo + &Стерео + + + + &4.0 Surround + &4.0 окружение + + + + &5.1 Surround + &5.1 окружение + + + + &Left channel + &Левый канал + + + + &Right channel + &Правый канал + + + + &Select + &Выбрать + + + + &Title + &Заголовок + + + + &Chapter + &Глава + + + + &Angle + &Ð Ð°ÐºÑƒÑ€Ñ + + + + &OSD + &OSD + + + + &Disabled + Запре&щено + + + + &Seek bar + &ПрогреÑÑ + + + + &Time + &Ð’Ñ€ÐµÐ¼Ñ + + + + Time + T&otal time + Ð’Ñ€ÐµÐ¼Ñ + О&бщее Ð²Ñ€ÐµÐ¼Ñ + + + + SMPlayer - mplayer log + SMPlayer - отчеты mplayer + + + + SMPlayer - smplayer log + SMPlayer - отчеты smplayer + + + + <empty> + <ничего> + + + + Video + Видео + + + + Audio + Звук + + + + Playlists + СпиÑок + + + + All files + Ð’Ñе файлы + + + + Choose a file + Выбрать файл + + + + SMPlayer - Information + SMPlayer - Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ + + + + The CDROM / DVD drives are not configured yet. +The configuration dialog will be shown now, so you can do it. + Приводы CD/DVD еще не наÑтроены. +Ð’Ñ‹ Ñможете Ñделать Ñто в диалоге наÑтроек Ñтих уÑтройÑÑ‚. + + + + Choose a directory + Выбрать каталог + + + + Subtitles + Субтитры + + + + About Qt + О Qt + + + + Playing %1 + ВоÑпроизводитÑÑ %1 + + + + Pause + Пауза + + + + Stop + Стоп + + + + Play / Pause + ВоÑпроизведение / Пауза + + + + Pause / Frame step + Пауза / Покадровый проÑмотр + + + + U&nload + &Выгрузить + + + + V&CD + V&CD + + + + C&lose + &Закрыть + + + + View &info and properties... + Показать ин&формацию и параметры... + + + + Zoom &- + Зум &- + + + + Zoom &+ + Зум &+ + + + + &Reset + Сб&Ñ€Ð¾Ñ + + + + Move &left + ПеремеÑтить в&лево + + + + Move &right + ПеремеÑтить в&право + + + + Move &up + ПеремеÑтить в&верх + + + + Move &down + ПеремеÑтить в&низ + + + + &Pan && scan + &Панорама вручную + + + + &Previous line in subtitles + &ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Ñ„Ñ€Ð°Ð·Ð° Ñубтитров + + + + N&ext line in subtitles + &Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ñ„Ñ€Ð°Ð·Ð° Ñубтитров + + + + -%1 + -%1 + + + + +%1 + +%1 + + + + Dec volume (2) + Уменьшить громкоÑÑ‚ÑŒ (2) + + + + Inc volume (2) + Увеличить громкоÑÑ‚ÑŒ (2) + + + + Exit fullscreen + Выйти из поноÑкранного режима + + + + OSD - Next level + OSD - Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ñ„Ñ€Ð°Ð·Ð° + + + + Dec contrast + Уменьшить контраÑÑ‚ + + + + Inc contrast + ПовыÑить контраÑÑ‚ + + + + Dec brightness + Уменьшить ÑркоÑÑ‚ÑŒ + + + + Inc brightness + ПовыÑит ÑркоÑÑ‚ÑŒ + + + + Dec hue + Уменьшить цветноÑÑ‚ÑŒ + + + + Inc hue + ПовыÑить цветноÑÑ‚ÑŒ + + + + Dec saturation + Уменьшить наÑыщенноÑÑ‚ÑŒ + + + + Dec gamma + Уменьшить гамму + + + + Next audio + Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð·Ð²ÑƒÐºÐ¾Ð²Ð°Ñ Ð´Ð¾Ñ€Ð¾Ð¶ÐºÐ° + + + + Next subtitle + Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ñ„Ñ€Ð°Ð·Ð° + + + + Next chapter + Следующий раздел + + + + Previous chapter + Предыдущий раздел + + + + Inc saturation + ПовыÑить наÑыщенноÑÑ‚ÑŒ + + + + Inc gamma + ПовыÑить гамму + + + + Toggle double size + Двойной размер + + + + &Load external file... + &Загрузить внешний файл... + + + + &Kerndeint + &Kerndeint + + + + &Yadif (normal) + &Yadif (обычный) + + + + Y&adif (double framerate) + Y&adif (ÑƒÐ´Ð²Ð¾ÐµÐ½Ð½Ð°Ñ Ñ‡Ð°Ñтота кадров) + + + + &Next + С&ледующий + + + + Pre&vious + &Предыдущий + + + + Volume &normalization + &ÐÐ¾Ñ€Ð¼Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð·Ð²ÑƒÐºÐ° + + + + &Audio CD + &Ðудио CD + + + + Denoise nor&mal + Убрать Ð³Ð¾Ð»Ð¾Ñ - &обычный + + + + Denoise &soft + Убрать Ð³Ð¾Ð»Ð¾Ñ - &мÑгкий + + + + Denoise o&ff + Убрать Ð³Ð¾Ð»Ð¾Ñ - &выключено + + + + Use SSA/&ASS library + ИÑпол&ьзовать библиотеку SSA/ASS + + + + Flip i&mage + + + + + &Toggle double size + + + + + BaseGuiPlus + + + SMPlayer is still running here + SMPlayer запущен + + + + S&how icon in system tray + &Показать пиктограмму в ÑиÑтемном лотке + + + + &Hide + &Убрать + + + + &Restore + &ВоÑÑтановить + + + + &Quit + Ð’&ыход + + + + Playlist + СпиÑок + + + + Core + + + Brightness: %1 + ЯркоÑÑ‚ÑŒ: %1 + + + + Contrast: %1 + КонтраÑтноÑÑ‚ÑŒ: %1 + + + + Gamma: %1 + Гамма: %1 + + + + Hue: %1 + Цвет: %1 + + + + Saturation: %1 + ÐаÑыщенноÑÑ‚ÑŒ: %1 + + + + Volume: %1 + ГромкоÑÑ‚ÑŒ: %1 + + + + Zoom: %1 + Зум: %1 + + + + DefaultGui + + + Welcome to SMPlayer + Добро пожаловать в SMPlayer + + + + Volume + ГромкоÑÑ‚ÑŒ + + + + Audio + Звук + + + + Subtitle + Субтитры + + + + &Main toolbar + &Ð“Ð»Ð°Ð²Ð½Ð°Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ + + + + &Language toolbar + &Ð¯Ð·Ñ‹ÐºÐ¾Ð²Ð°Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ + + + + &Toolbars + &Панели + + + + Encodings + + + Western European Languages + ВоÑÑ‚Ð¾Ñ‡Ð½Ð°Ñ Ð•Ð²Ñ€Ð¾Ð¿Ð° + + + + Western European Languages with Euro + ВоÑÑ‚Ð¾Ñ‡Ð½Ð°Ñ Ð•Ð²Ñ€Ð¾Ð¿Ð° Ñ Ð•Ð²Ñ€Ð¾ + + + + Slavic/Central European Languages + Кириллица/Ð¦ÐµÐ½Ñ‚Ñ€Ð°Ð»ÑŒÐ½Ð°Ñ Ð•Ð²Ñ€Ð¾Ð¿Ð° + + + + Esperanto, Galician, Maltese, Turkish + ЭÑперанто, ГальÑкий, МальтийÑкий, ТюркÑкий + + + + Old Baltic charset + БалтийÑÐºÐ°Ñ ÑÑ‚Ð°Ñ€Ð°Ñ + + + + Cyrillic + Кириллица + + + + Arabic + ÐрабÑÐºÐ°Ñ + + + + Modern Greek + ГречеÑÐºÐ°Ñ Ð½Ð¾Ð²Ð°Ñ + + + + Turkish + ТюркÑÐºÐ°Ñ + + + + Baltic + БалтийÑÐºÐ°Ñ + + + + Celtic + КельтÑÐºÐ°Ñ + + + + Hebrew charsets + Иврит + + + + Russian + РуÑÑÐºÐ°Ñ + + + + Ukrainian, Belarusian + УкраинÑкаÑ, БелоруÑÑÐºÐ°Ñ + + + + Simplified Chinese charset + КитайÑÐºÐ°Ñ ÑƒÐ¿Ñ€Ð¾Ñ‰ÐµÐ½Ð½Ð°Ñ + + + + Traditional Chinese charset + КитайÑÐºÐ°Ñ Ñ‚Ñ€Ð°Ð´Ð¸Ñ†Ð¸Ð¾Ð½Ð½Ð°Ñ + + + + Japanese charsets + ЯпонÑÐºÐ°Ñ + + + + Korean charset + КорейÑÐºÐ°Ñ + + + + Thai charset + ТайÑÐºÐ°Ñ + + + + Cyrillic Windows + Кириллица Windows + + + + Slavic/Central European Windows + Кириллица/Ð¦ÐµÐ½Ñ‚Ñ€Ð°Ð»ÑŒÐ½Ð°Ñ Ð•Ð²Ñ€Ð¾Ð¿Ð° Windows + + + + Arabic Windows + + + + + EqSlider + + + icon + пиктограмма + + + + FilePropertiesDialog + + + SMPlayer - File properties + SMPlayer - Параметры файла + + + + &Information + &Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ + + + + &Demuxer + &Demuxer + + + + &Select the demuxer that will be used for this file: + Ð’&ыберите demuxer, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ñтого файла: + + + + &Reset + Сб&Ñ€Ð¾Ñ + + + + &Video codec + Ð’&идео кодек + + + + &Select the video codec: + Ð’Ñ‹&берите видео кодек: + + + + A&udio codec + Ð&удио кодек + + + + &Select the audio codec: + Выб&ерите аудио кодек: + + + + &MPlayer options + ÐаÑтройки &MPlayer + + + + Additional Options for MPlayer + Дополнительные параметры Mplayer + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + ЗдеÑÑŒ можно указать дополнительные параметры Ð´Ð»Ñ MPlayer. +Указывайте их разделÑÑ Ð¿Ñ€Ð¾Ð±ÐµÐ»Ð°Ð¼Ð¸. +Ðапример: -flip -nosound + + + + &Options: + &ÐаÑтройки: + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + Также Ð’Ñ‹ можете передать дополнительные фильтры видео. +РазделÑÑ‚ÑŒ запÑтой. Ðе иÑпользовать пробелы! +Пример: scale=512:-2,eq2=1.1 + + + + V&ideo filters: + &Видео фильтры: + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + Фильтры звука. ИÑпользуютÑÑ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸Ñ‡Ð½Ð¾ фильтрам видео. +Пример: resample=44100:0:0,volnorm + + + + Audio &filters: + Ðудио &фильтры: + + + + OK + OK + + + + Cancel + Отмена + + + + Apply + Применить + + + + InfoFile + + + General + Главное + + + + Size + Размер + + + + %1 KB (%2 MB) + %1 КБ (%2 МБ) + + + + URL + URL + + + + Length + ПродолжительноÑÑ‚ÑŒ + + + + Demuxer + Demuxer + + + + Name + Ð˜Ð¼Ñ + + + + Artist + ИÑполнитель + + + + Author + Ðвтор + + + + Album + Ðльбом + + + + Genre + Жанр + + + + Date + Дата + + + + Track + Дорожка + + + + Copyright + ÐвторÑкое право + + + + Comment + Примечание + + + + Software + Программа + + + + Clip info + Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ клипе + + + + Video + Видео + + + + Resolution + Разрешение Ñкрана + + + + Aspect ratio + Соотношение Ñторон + + + + Format + Формат + + + + Bitrate + БитрÑйт + + + + %1 kbps + %1 кб/Ñ + + + + Frames per second + Кадров в Ñекунду + + + + Selected codec + Выбранный кодек + + + + Initial Audio Stream + Ð—Ð²ÑƒÐºÐ¾Ð²Ð°Ñ Ð´Ð¾Ñ€Ð¾Ð¶ÐºÐ° по-умолчанию + + + + Rate + ЧаÑтота + + + + %1 Hz + %1 Гц + + + + Channels + Каналы + + + + Audio Streams + Звуковые дорожки + + + + Language + Язык + + + + empty + ничего + + + + Subtitles + Субтитры + + + + Type + Тип + + + + ID + Info for translators: this is a identification code + ID + + + + # + Info for translators: this is a abbreviation for number + # + + + + Stream title + Ðазвание потока + + + + Stream URL + ÐÐ´Ñ€ÐµÑ Ð¿Ð¾Ñ‚Ð¾ÐºÐ° + + + + File + Файл + + + + InputDVDDirectory + + + Choose a directory + Выбрать каталог + + + + SMPlayer - Play a DVD from a folder + SMPlayer - ВоÑпроизвеÑти DVD из каталога + + + + You can play a dvd from your hard disc. Just select the folder which contains the VIDEO_TS and AUDIO_TS directories. + Ð’Ñ‹ можете открыть DVD Ñ Ð¶ÐµÑткого диÑка. Выберите каталог, Ñодержащий VIDEO_TS и AUDIO_TS. + + + + Choose a directory... + Выберите каталог... + + + + InputURL + + + SMPlayer - Enter URL + SMPlayer - укажите URL + + + + &URL: + &URL: + + + + It's a &playlist + &CпиÑок воÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ + + + + If this option is checked, the URL will be treated as a playlist: it will be opened as text and will play the URLs in it. + + + + + LogWindow + + + Choose a filename to save under + Выберите Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Ð´Ð»Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ + + + + Confirm overwrite? + ПерезапиÑать? + + + + The file already exists. +Do you want to overwrite? + Файл ÑущеÑтвует. +ПерезапиÑать? + + + + Error saving file + Ошибка ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° + + + + The log couldn't be saved + Ðевозможно Ñохранить отчет + + + + Logs + Отчеты + + + + LogWindowBase + + + Log Window + Окно отчета + + + + Save + Сохранить + + + + Copy to clipboard + Копировать в буфер обмена + + + + Close + Закрыть + + + + &Close + &Закрыть + + + + Playlist + + + Name + Ð˜Ð¼Ñ + + + + Length + ПродолжительноÑÑ‚ÑŒ + + + + &Play + ВоÑпро&изведение + + + + &Edit + &Редактировать + + + + Playlists + СпиÑок + + + + Choose a file + Выбрать файл + + + + Choose a filename + Выберите Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° + + + + Confirm overwrite? + ПерезапиÑать? + + + + The file %1 already exists. +Do you want to overwrite? + Файл %1 ÑущеÑтвует. +ПерезапиÑать? + + + + All files + Ð’Ñе файлы + + + + Select one or more files to open + Выберите один или более файлов + + + + Choose a directory + Выбрать каталог + + + + Edit name + Изменить Ð¸Ð¼Ñ + + + + Type the name that will be displayed in the playlist for this file: + Введите имÑ, которое будет ÑоответÑтвовать в ÑпиÑке Ñтому файлу: + + + + &Load + &Загрузить + + + + &Save + &Сохранить + + + + &Next + С&ледующий + + + + Pre&vious + &Предыдущий + + + + Move &up + ПеремеÑтить в&верх + + + + Move &down + ПеремеÑтить в&низ + + + + &Repeat + Пов&торить + + + + S&huffle + Пере&таÑовать + + + + Add &current file + Добавить &текущий файл + + + + Add &file(s) + Добавить &файл(Ñ‹) + + + + Add &directory + Добавить &каталог + + + + Remove &selected + Убрать в&ыбранные + + + + Remove &all + Убрать в&Ñе + + + + SMPlayer - Playlist + SMPlayer - СпиÑок + + + + Add... + Добавить... + + + + Remove... + Убрать... + + + + Playlist modified + СпиÑок воÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½ + + + + There are unsaved changes, do you want to save the playlist? + Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ðµ Ñохраенены, желаете Ñохранить ÑпиÑок воÑпроизведениÑ? + + + + PrefAdvanced + + + Advanced + Дополнительно + + + + Auto + Ðвто + + + + Form + Форма + + + + &Advanced + &Дополнительно + + + + icon + пиктограмма + + + + Additional Options for MPlayer + Дополнительные параметры MPlayer + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + ЗдеÑÑŒ можно указать дополнительные параметры Ð´Ð»Ñ MPlayer. +Указывайте их разделÑÑ Ð¿Ñ€Ð¾Ð±ÐµÐ»Ð°Ð¼Ð¸. +Ðапример: -flip -nosound + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + Также Ð’Ñ‹ можете передать дополнительные фильтры видео. +РазделÑÑ‚ÑŒ запÑтой. Ðе иÑпользовать пробелы! +Пример: scale=512:-2,eq2=1.1 + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + Фильтры звука. ИÑпользуютÑÑ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸Ñ‡Ð½Ð¾ фильтрам видео. +Пример: resample=44100:0:0,volnorm + + + + Don't repaint the background of the video window + Ðе перериÑовывать фон облаÑти воÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ + + + + &Logs + От&четы + + + + Log MPlayer output + Отчет вывода MPlayer + + + + Log SMPlayer output + Отчет вывода SMPlayer + + + + This option is mainly intended for debugging the application. + Эти наÑтройки воÑновном необходимы Ð´Ð»Ñ Ð¾Ñ‚Ð»Ð°Ð´ÐºÐ¸ приложениÑ. + + + + &MPlayer language + &Язык MPlayer + + + + SMPlayer needs to read and parse the output of MPlayer and sometimes it relies on English text. If you are using a MPlayer translated into another language, then you need to change the texts that SMPlayer looks for. (Technically you should enter regular expressions)<br><br> +The drop-down lists may provide already made regular expression for several languages. + SMPlayer необходимо получать и обрабатывать вывод MPlayer, который иногда Ñодержит английÑкий текÑÑ‚. ЕÑли вы иÑпользуете MPlayer переведенный на другой Ñзык, то вам необходимо указать какой текÑÑ‚ в переведенной верÑии ÑоответÑтвует оригиналу (Ð´Ð»Ñ Ñтого вы должны запиÑать ÑоответÑтвующие регулÑрные выражениÑ).<br><br> +Ðижеприведенный уже Ñодержит регулÑрные Ð´Ð»Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… Ñзыков. + + + + Checking this option may reduce flickering, but it also might produce that the video won't be displayed properly. + ИÑпользование Ñтого параметра может убрать моргание изображениÑ, однако возможно, что видео при Ñтом будет отображатьÑÑ Ð½ÐµÐ²ÐµÑ€Ð½Ð¾. + + + + If checked, smplayer will store the output of mplayer (you can see it in <b>Options->View logs->mplayer</b>). In case of problems this log can contain important information, so it's recommended to keep this option checked. + ЕÑли выбранно, то smplayer будет ÑохранÑÑ‚ÑŒ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ mplayer (вы можете проÑмотреть их в <b>ÐаÑтройки->Смотреть отчеты->mplayer</b>).Отчеты могут Ñодержать важную информацию возникших проблемах. + + + + If this option is checked, smplayer will store the debugging messages that smplayer outputs (you can see the log in <b>Options->View logs->smplayer</b>). This information can be very useful for the developer in case you find a bug. + ЕÑли выбранно, smplayer ÑохранÑет ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹ (их можно проÑмотреть в <b>ÐаÑтройки->Смотреть отчеты->smplayer</b>). Эта Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть очень полезна разработчику в Ñлучае, еÑли будет найдена ошибка. + + + + Filter for SMPlayer logs + Фильтр Ð´Ð»Ñ Ð¾Ñ‚Ñ‡ÐµÑ‚Ð¾Ð² SMPlayer + + + + This option allows to filter the smplayer messages that will be stored in the log. Here you can write any regular expression.<br>For instance: <i>^Core::.*</i> will display only the lines starting with <i>Core::</i> + Эта Ð¾Ð¿Ñ†Ð¸Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»Ñет фильтровать ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ ÑохранÑемые в отчете Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ регулÑрных выражений.<br>Ðапример: <i>^Core::.*</i> будут отображатьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ñтроки Ñ <i>Core::</i> + + + + &Monitor aspect: + &Разрешение монитора: + + + + &Run MPlayer in its own window + &ЗапуÑкать MPlyare в отдельном окне + + + + &Options: + &ÐаÑтройки: + + + + V&ideo filters: + &Видео фильтры: + + + + Audio &filters: + Ðудио &фильтры: + + + + &Colorkey: + &Код цвета: + + + + &Don't repaint the background of the video window + Ðе пере&риÑовывать фон окна воÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ + + + + Log &MPlayer output + Отчет &MPlayer вывода + + + + Log &SMPlayer output + Отчет &SNPlayer вывода + + + + &Filter for SMPlayer logs: + &Фильтры отчетов SMPlayer: + + + + &End of file: + Коне&ц файла: + + + + &No video: + &Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð½ÐµÑ‚: + + + + C&hange... + Из&менить... + + + + PrefAssociations + + + Warning + + + + + Not all files could be associated. Please check your security permissions and retry. + + + + + File Types + + + + + Select all + + + + + Check all file types in the list + + + + + Uncheck all file types in the list + + + + + List of file types + + + + + File types + + + + + Media files handled by SMPlayer: + + + + + Select All + + + + + Select None + + + + + Check the media file extensions you would like SMPlayer to handle. When you click Apply, the checked files will be associated with SMPlayer. If you uncheck a media type, the file association will be restored. + + + + + Select none + + + + + PrefDrives + + + Drives + УÑтройÑтва + + + + Currently SMPlayer does not autodetect cdrom or dvd devices. So in order to play cdroms or dvds you must first select here your cdrom and dvd drives (can be the same). + SMPlayer не определил cd или dvd приводов. Ð”Ð»Ñ Ð¿Ñ€Ð¾Ð¸Ð³Ñ€Ñ‹Ð²Ð°Ð½Ð¸Ñ cd или dvd вы должны указать путь к ÑоответÑтвующим приводам. + + + + icon + пиктограмма + + + + CD device + CD уÑтройÑтво + + + + Choose your CDROM device. It will be used to play VCDs and Audio CDs. + Выберите CD привод. Он будет иÑпользоватьÑÑ Ð´Ð»Ñ Ð²Ð¾ÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð²Ð¸Ð´ÐµÐ¾ и аудио CD. + + + + DVD device + DVD уÑтройÑтво + + + + Choose your DVD device. It will be used to play DVDs. + Выберите ваш DVD привод. Он будет иÑпользоватьÑÑ Ð´Ð»Ñ Ð²Ð¾ÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ DVD. + + + + Select your &CD device: + Выберите ваш CD &привод: + + + + Select your &DVD device: + Выберите ваш DVD п&ривод: + + + + PrefGeneral + + + General + ОÑновное + + + + &General + &ОÑновное + + + + Paths + Пути + + + + Output drivers + УÑтройÑтво вывода + + + + Media settings + ÐаÑтройки медиа + + + + Preferred audio and subtitles + Предпочитаемые Ð·Ð²ÑƒÐºÐ¾Ð²Ð°Ñ Ð´Ð¾Ñ€Ð¾Ð¶ÐºÐ° и Ñубтитры + + + + &Video and audio + &Видео и аудио + + + + Video + Видео + + + + Start videos in fullscreen + Открывать видео на веÑÑŒ Ñкран + + + + Disable screensaver + Подавить ÑкринÑÑйвер + + + + Audio + Звук + + + + Select the mplayer executable + Выбрать иÑполнÑемый файл mplayer + + + + Executables + Пути + + + + All files + Ð’Ñе файлы + + + + Select a directory + Выбрать каталог + + + + MPlayer executable + ИÑполнÑемый файл MPlayer + + + + Here you must specify the mplayer executable that smplayer will use.<br>smplayer requires at least mplayer 1.0rc1 (svn recommended).<br><b>If this setting is wrong, smplayer won't be able to play anything!</b> + ЗдеÑÑŒ можно указать иÑполнÑемый файл mplayer, который будет иÑпользовать smplayer.<br>Ð´Ð»Ñ smplayer необходим mplayer 1.0rc1 (рекомендуетÑÑ svn).<br><br>еÑли Ñтот параметр задан неверно, то smplayer не Ñможет воÑпроизвеÑти что-либо!</br> + + + + Screenshots folder + Каталог Ñнимков + + + + Here you can specify a folder where the screenshots taken by smplayer will be stored. If this field is empty the screenshot feature will be disabled. + ЗдеÑÑŒ вы можете указать каталог, куда smplayer будет ÑохранÑÑ‚ÑŒ Ñнимки Ñкрана. ЕÑли каталог не указан, Ñоздание Ñнимков будет запрещено. + + + + Video output driver + Драйвер видео-вывода + + + + Select the video output driver. Usually xv (linux) and directx (windows) provide the best performance. + Выберите драйвер вывода Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð½Ð° Ñкран. Обычно xv (Ð´Ð»Ñ linux) и directx (Ð´Ð»Ñ windows) обеÑпечивают наибольшую производительноÑÑ‚ÑŒ. + + + + Audio output driver + Драйвер аудио-вывода + + + + Select the audio output driver. + Выберите драйвер вывода Ð´Ð»Ñ Ð·Ð²ÑƒÐºÐ°. + + + + Remember settings + Запомнить наÑтройки + + + + Usually smplayer will remember the settings for each file you play (audio track selected, volume, filters...). Uncheck this option if you don't like this feature. + По-умолчанию smplayer запоминает наÑтройки каждого файла, кторый проигрываетÑÑ (Ð·Ð²ÑƒÐºÐ¾Ð²Ð°Ñ Ð´Ð¾Ñ€Ð¾Ð¶ÐºÐ°, громкоÑÑ‚ÑŒ, фильтры...). ЕÑли вам не нравитÑÑ Ñта оÑобенноÑÑ‚ÑŒ, вы можете ее отключить. + + + + Don't remember time position + Ðе запоминать позицию + + + + If you check this option, smplayer will play all files from the beginning. + ЕÑли вы выберите Ñту опцию, smplaer будет проигрывать вÑе файлы Ñ Ð½Ð°Ñ‡Ð°Ð»Ð°. + + + + Preferred audio language + Предпочитаемый Ñзык звуковой дорожки + + + + Here you can type your preferred language for the audio streams. When a media with multiple audio streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the audio streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the audio track if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + ЗдеÑÑŒ вы можете указать предпочитаемый Ñзык Ð´Ð»Ñ Ð·Ð²ÑƒÐºÐ¾Ð²Ñ‹Ñ… дорожек. ЕÑли проигрываемый фильм Ñодержит неÑколько звуковых дорожек, то smplayer будет иÑпользовать ту, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ ÑоответÑтвует вашим предпочтениÑм.<br>Ð’Ñе Ñказанное верно Ð´Ð»Ñ Ñ‚ÐµÑ… типов мультимедиÑ, которые Ñодержат информацию о Ñзыке звуковых дорожек, таких как DVD или mkv.<br>Также можно иÑпользовать регулÑрные выражениÑ. Ðапример: <b>es|esp|spa</b> означает, что будет выбрана Ð·Ð²ÑƒÐºÐ¾Ð²Ð°Ñ Ð´Ð¾Ñ€Ð¾Ð¶ÐºÐ° ÑÐ¾Ð´ÐµÑ€Ð¶Ð°Ñ‰Ð°Ñ Ð² названии Ñзыка <i>es</i>, <i>esp</i> or <i>spa</i>. + + + + Preferred subtitle language + Предпочитаемый Ñзык Ñубтитров + + + + Here you can type your preferred language for the subtitle stream. When a media with multiple subtitle streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the subtitle streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the subtitle stream if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + ЗдеÑÑŒ вы можете указать предпочитаемый Ñзык Ð´Ð»Ñ Ñубтитров. ЕÑли проигрываемый фильм Ñодержит Ñубтитры на разных Ñзыках, то smplayer будет иÑпользовать те, которые ÑоответÑтвуют вашим предпочтениÑм.<br>Ð’Ñе Ñказанное верно Ð´Ð»Ñ Ñ‚ÐµÑ… типов мультимедиÑ, которые Ñодержат информацию о Ñзыке Ñубтитров, таких как DVD или mkv.<br>Также можно иÑпользовать регулÑрные выражениÑ. Ðапример: <b>es|esp|spa</b> означает, что будут выбраны Ñубтитры Ñодержащие в названии Ñзыка <i>es</i>, <i>esp</i> or <i>spa</i>. + + + + Software video equalizer + Программный видео-Ñквалайзер + + + + You can check this option if video equalizer is not supported by your graphic card or the selected video output driver.<br><b>Note:</b> this option can be incompatible with some video output drivers. + Ð’Ñ‹ можете поробывать Ñту опцию, еÑли Ñквалайзер не поддерживаетÑÑ Ð²Ð°ÑˆÐµÐ¹ видео-картой, или выбранным драйвером вывода видео.<br><b>Обратите внимание:</b>Ñта Ð¾Ð¿Ñ†Ð¸Ñ Ð½ÐµÑовмеÑтима Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼Ð¸ драйверами вывода видео. + + + + If this option is checked, all videos will start to play in fullscreen mode. + ЕÑли Ñта Ð¾Ð¿Ñ†Ð¸Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð°, вÑе видео будет воÑпроизводитьÑÑ "Ðа веÑÑŒ Ñкран" Ñ Ñамого начала. + + + + Check this option to disable the screensaver while playing.<br>The screensaver will enabled again when play finishes.<br><b>Note:</b> This option works only in X11 and Windows. + Выберите Ñту опцию, чтобы запретить хранитель Ñкрана во Ð²Ñ€ÐµÐ¼Ñ Ð²Ð¾ÑпроизведениÑ.<br>Как только воÑпроизведение будет закончено, хранитель Ñкрана Ñнова может быть запущен.<br><b>Обратите внимание:</b>Это возможно только в X11 и Windows. + + + + Software volume control + Програмное управление громкоÑтью + + + + Check this option to use the software mixer, instead of using the sound card mixer. + Попробуйте Ñту опцию Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð½Ð¾Ð³Ð¾ микшера вмеÑто аппаратного. + + + + Postprocessing quality + КачеÑтво поÑтобработки + + + + Dynamically changes the level of postprocessing depending on the available spare CPU time. The number you specify will be the maximum level used. Usually you can use some big number. + ДинамичеÑкое изменение Ñтепени поÑтпроцеÑÑинга в завиÑимоÑти от количеÑтва Ñвободного процеÑÑорного времени. Указанное вами чиÑло будет ÑоответÑтвовать макÑимальному уровню. + + + + Change volume + Управление громкоÑтью + + + + If checked, SMPlayer will remember the volume for every file and will restore it when played again. For new files the default volume will be used. + ЕÑли выбрано, то SMPlayer будет запоминать громкоÑÑ‚ÑŒ каждого воÑпроизводимого файла и воÑÑтанавливать ее при повторном воÑпроизведении. Ð”Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… файлов будет иÑпользоватьÑÑ ÑƒÑ€Ð¾Ð²ÐµÐ½ÑŒ громкоÑти, принÑтый по-умолчанию. + + + + 0 + 0 + + + + &Change volume on every file + &ИзменÑÑ‚ÑŒ громкоÑÑ‚ÑŒ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ файла + + + + &Search... + По&иÑк... + + + + S&elect... + Ð’Ñ‹&бор... + + + + Select the &MPlayer executable: + Укажите иÑполнÑемый &файл MPlayer: + + + + &Folder for storing screenshots: + Каталог Ð´Ð»Ñ &Ñимков: + + + + V&ideo: + &Видео: + + + + &Audio: + &Звук: + + + + &Don't remember time position (files start playing from the beginning) + Ð&е запоминать позицию (каждый файл воÑпроизводитÑÑ Ñ Ð½Ð°Ñ‡Ð°Ð»Ð°) + + + + &Remember settings for all files (audio track, subtitles...) + &Запоминать наÑтройки вÑех файлов (звук, Ñубтитры...) + + + + A&udio: + З&вук: + + + + Su&btitles: + Суб&титры: + + + + &Use software video equalizer + ИÑпользовать &программный Ñквалайзер видео + + + + &Quality: + Ка&чеÑтво: + + + + Start videos in &fullscreen + ЗапуÑкать видео на веÑÑŒ &Ñкран + + + + Disable &screensaver + Подавить &хранитель Ñкрана + + + + &Default volume: + &ГромкоÑÑ‚ÑŒ по-умолчанию: + + + + Use s&oftware volume control + ИÑпользовать программное &управление громкоÑтью + + + + Ma&x. Amplification: + Ма&кÑ. увеличение: + + + + &AC3/DTS pass-through S/PDIF + &AC3/DTS через S/PDIF + + + + Direct rendering + ПрÑмой рендеринг + + + + If checked, turns on direct rendering (not supported by all codecs and video outputs)<br><b>WARNING:</b> May cause OSD/SUB corruption! + ЕÑли выбрано - включен прÑмой рендеринг (поддерживаетÑÑ Ð½Ðµ вÑеми кодеками и модулÑми видео вывода)<br><b>Ð’ÐИМÐÐИЕ:</b> Могут возникнуть проблемы Ñ OSD/SUB! + + + + Double buffering + Ð”Ð²Ð¾Ð¹Ð½Ð°Ñ Ð±ÑƒÑ„ÐµÑ€Ð¸Ð·Ð°Ñ†Ð¸Ñ + + + + D&irect rendering + ПрÑмой рен&деринг + + + + Dou&ble buffering + Ð”Ð²Ð¾Ð¹Ð½Ð°Ñ &Ð±ÑƒÑ„ÐµÑ€Ð¸Ð·Ð°Ñ†Ð¸Ñ + + + + Double buffering fixes flicker by storing two frames in memory, and displaying one while decoding another. If disabled it can affect OSD negatively, but often removes OSD flickering. + Ð”Ð²Ð¾Ð¹Ð½Ð°Ñ Ð±ÑƒÑ„ÐµÑ€Ð¸Ð·Ð°Ñ†Ð¸Ñ ÑƒÐ±Ð¸Ñ€Ð°ÐµÑ‚ мерцание кадров Ð±Ð»Ð°Ð³Ð¾Ð´Ð°Ñ€Ñ Ñ‚Ð¾Ð¼Ñƒ, что загружает в памÑÑ‚ÑŒ два кадра и одновременно Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶Ð°Ñ Ð¾Ð´Ð¸Ð½ обрабатывает Ñледующий. Выключение Ñтого параметра может негативно ÑказатьÑÑ Ð½Ð° OSD. + + + + &Enable postprocessing by default + Разрешить &поÑтобработку по-умолчанию + + + + Volume &normalization by default + Разрешить &нормализацию громкоÑти по-умолчанию + + + + Close when finished + Закрыть по окончанию воÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ + + + + If this option is checked, the main window will be automatically closed when the current file/playlist finishes. + ЕÑли выбрано, то главное окно будет автоматичеÑки закрыто по окончанию воÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° или ÑпиÑка. + + + + &Close when finished + &Закрыть по окончанию воÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ + + + + 2 (Stereo) + + + + + 4 (4.0 Surround) + + + + + 6 (5.1 Surround) + + + + + C&hannels by default: + + + + + &Pause when minimized + + + + + Pause when minimized + + + + + If this option is enabled, the file will be paused when the main window is hidden. When the window is restored, play will be resumed. + + + + + Enable postprocessing by default + + + + + Max. Amplification + + + + + AC3/DTS pass-through S/PDIF + + + + + Volume normalization by default + + + + + Maximizes the volume without distorting the sound. + + + + + Default volume + + + + + Sets the initial volume that new files will use. + + + + + Channels by default + + + + + Sets the maximum amplification level in percent (default: 110). A value of 200 will allow you to adjust the volume up to a maximum of double the current level. With values below 100 the initial volume (which is 100%) will be above the maximum, which e.g. the OSD cannot display correctly. + + + + + Uses hardware AC3 passthrough + + + + + Requests the number of playback channels. MPlayer asks the decoder to decode the audio into as many channels as specified. Then it is up to the decoder to fulfill the requirement. This is usually only important when playing videos with AC3 audio (like DVDs). In that case liba52 does the decoding by default and correctly downmixes the audio into the requested number of channels. NOTE: This option is honored by codecs (AC3 only), filters (surround) and audio output drivers (OSS at least). + + + + + Postprocessing will be used by default on new opened files. + + + + + PrefInput + + + Keyboard and mouse + Клавиатура и мышь + + + + &Keyboard + &Клавиатура + + + + icon + пиктограмма + + + + Here you can change any key shortcut. To do it double click or start typing over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + ЗдеÑÑŒ можно изменить горÑчие клавиши. Чтобы Ñделать Ñто дважды кликнув мышкой, или, нажав клавишу в необходимой Ñчейке. Ð’Ñ‹ можете Ñохранить ÑпиÑок горÑчих клавишь, чтобы им могли пользоватьÑÑ Ð´Ñ€ÑƒÐ³Ð¸Ðµ или иÑпользовать его на другом компьютере. + + + + &Mouse + &Мышь + + + + Button functions: + Функции кнопки: + + + + Media seeking + Прокрутка + + + + Volume control + РегулÑтор громкоÑти + + + + Zoom video + Зум + + + + None + Ðичего + + + + Here you can change any key shortcut. To do it double click or press enter over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + ЗдеÑÑŒ можно изменить горÑчие клавиши. Чтобы Ñделать Ñто дважды кликнув мышкой, или, нажав клавишу Enter. Ð’Ñ‹ можете Ñохранить ÑпиÑок горÑчих клавишь, чтобы им могли пользоватьÑÑ Ð´Ñ€ÑƒÐ³Ð¸Ðµ или иÑпользовать его на другом компьютере. + + + + &Left click + Щелчок &левой кнопкой мыши + + + + &Double click + &Двойной щелчок + + + + &Wheel function: + Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ &колеÑа: + + + + Shortcut editor + + + + + This table allows you to change the key shortcuts of most available actions. Double click or press enter on a item, or press the <b>Change shortcut</b> button to enter in the <i>Modify shortcut</i> dialog. There are two ways to change a shortcut: if the <b>Capture</b> button is on then just press the new key or combination of keys that you want to assign for the action (unfortunately this doesn't work for all keys). If the <b>Capture</b> button is off then you could enter the full name of the key. + + + + + Left click + + + + + Select the action for left click on the mouse. + + + + + Double click + + + + + Select the action for double click on the mouse. + + + + + Wheel function + + + + + Select the action for the mouse wheel. + + + + + PrefInterface + + + Interface + Внешний вид + + + + Bulgarian + БолгарÑкий + + + + Czech + ЧешÑкий + + + + German + Ðемецкий + + + + Greek + ГречеÑкий + + + + English + ÐнглийÑкий + + + + Spanish + ИÑпанÑкий + + + + Finnish + ФинÑкий + + + + French + ФранцузÑкий + + + + Hungarian + ВенгерÑкий + + + + Italian + ИтальÑнÑкий + + + + Japanese + ЯпонÑкий + + + + Georgian + ГрузинÑкий + + + + Dutch + Ðемецкий + + + + Polish + ПольÑкий + + + + Portuguese - Brazil + ПортугальÑкий - Ð‘Ñ€Ð°Ð·Ð¸Ð»Ð¸Ñ + + + + Portuguese - Portugal + ПортугальÑкий - ÐŸÐ¾Ñ€Ñ‚ÑƒÐ³Ð°Ð»Ð¸Ñ + + + + Romanian + РумынÑкий + + + + Russian + РуÑÑкий + + + + Slovak + Словацкий + + + + Serbian + СербÑкий + + + + Swedish + ШведÑкий + + + + Turkish + ТюркÑÐºÐ°Ñ + + + + Ukrainian + УкраинÑкий + + + + Simplified-Chinese + Упрощенный китайÑкий + + + + Traditional Chinese + КитайÑкий традиционный + + + + <Autodetect> + <Ðвтоопределение> + + + + Default + По-умолчанию + + + + &Interface + Интерфе&Ð¹Ñ + + + + Seeking + ПоиÑк + + + + Recent files + ПоÑледние файлы + + + + Never + Ðикогда + + + + Whenever it's needed + Когда Ñто нужно + + + + Only after loading a new video + Только поÑле Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ видео + + + + Language + Язык + + + + Here you can change the language of the application. + ЗдеÑÑŒ можно изменить Ñзык приложениÑ. + + + + Instances + Пути + + + + Catalan + КаталонÑкий + + + + Basque + БаÑкÑкий + + + + Galician + ГальÑкий + + + + &Short jump + &Маленький интервал + + + + &Medium jump + &Средний интервал + + + + &Long jump + &Длинный интервал + + + + Mouse &wheel jump + Интервал &промотки колеÑом мыши + + + + &Use only one running instance of SMPlayer + ЗапуÑкать только о&дну копию SMPlayer + + + + SMPlayer will listen to this &port to receive commands from other instances: + SMPlayer будет ожидать &внешние комманды Ñ Ñтого порта: + + + + Ma&x. items + Ма&кÑ. пунктов + + + + St&yle: + Ст&иль: + + + + Ico&n set: + Ðабор &пикограмм: + + + + L&anguage: + &Язык: + + + + Main window + Главное окно + + + + Auto&resize: + ÐвтоматичеÑки изменÑÑ‚ÑŒ &размер: + + + + R&emember position and size + Запоминать пози&цию и размер + + + + Default font: + + + + + &Change... + + + + + PrefPerformance + + + Performance + ПроизводительноÑÑ‚ÑŒ + + + + &Performance + &ПроизводительноÑÑ‚ÑŒ + + + + Priority + Приоритет + + + + Select the priority for the MPlayer process. + Укажите приоритет процеÑÑа Ð´Ð»Ñ MPlayer. + + + + realtime + реальное Ð²Ñ€ÐµÐ¼Ñ + + + + high + выÑокий + + + + abovenormal + выше обычного + + + + normal + обычный + + + + belownormal + ниже обычного + + + + idle + низкий + + + + Cache + Кеш + + + + KB + Кб + + + + Setting a cache may improve performance on slow media + УÑтановки кÑша могут улучшить или ухудшить быÑтродейÑтвие + + + + Allow frame drop + ДопуÑкать выпадение кадров + + + + Synchronization + Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ + + + + Audio/video auto synchronization + ÐвтоÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð·Ð²ÑƒÐºÐ°/видео + + + + Set process priority for mplayer according to the predefined priorities available under Windows.<br><b>WARNING:</b> Using realtime priority can cause system lockup. + УтÑновите приоритет mplayer как Ñтандартный Ð´Ð»Ñ Windows..<br><b>ОСТОРОЖÐО:</b> ИÑпользование приоритета реального времени может заблокировать ÑиÑтему. + + + + <br><b>Note:</b> This option is for Windows only. + <br><b>Обратите внимание:</b> Эти наÑтройки только Windows. + + + + This option specifies how much memory (in kBytes) to use when precaching a file or URL. Especially useful on slow media. + Изменить размер буфера (в килобайтах). ОÑобенно полезно Ð´Ð»Ñ Ñ‚Ñ€ÐµÐ±Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ñ… к реÑурÑам компьютера фильмов. + + + + Skip displaying some frames to maintain A/V sync on slow systems. + ПропуÑкать кадры Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¸ аудио/видео Ñинхронизации. + + + + Allow hard frame drop + ДопуÑкать жеÑткое выпадение кадров + + + + More intense frame dropping (breaks decoding). Leads to image distortion! + Более жеÑткое пропуÑкание кадров (рваное воÑпроизведение). Приводит к иÑкажению картинки! + + + + Gradually adjusts the A/V sync based on audio delay measurements. + ÐŸÐ»Ð°Ð²Ð½Ð°Ñ Ð°ÑƒÐ´Ð¸Ð¾/видео ÑинхронизациÑ, оÑÐ½Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð½Ð° изменении длинны звуковой дорожки. + + + + Priorit&y: + П&риоритет: + + + + Si&ze: + Ра&змер: + + + + &Use cache + &ИÑпользовать кеш + + + + &Allow frame drop + &ДопуÑкать выпадение кадров + + + + Allow &hard frame drop (can lead to image distortion) + ДопуÑкать &жеÑткое выпадение кадров (изображение может иÑкатьÑÑ) + + + + Audio/&video auto synchronization + ÐвтоматичеÑÐºÐ°Ñ Ñин&Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¸ звука + + + + Fact&or: + По&казатель: + + + + &Fast audio track switching + &БыÑтрое переключение звуковых дорожек + + + + Fast &seek to chapters in dvds + БыÑтрый &поиÑк по главам на dvd + + + + Create index if needed + + + + + Rebuilds index of files if no index was found, allowing seeking. Useful with broken/incomplete downloads, or badly created files. This option only works if the underlying media supports seeking (i.e. not with stdin, pipe, etc).<br> Note: the creation of the index may take some time. + + + + + &Create index if needed + + + + + Fast audio track switching + + + + + If checked, it will try the fastest method to switch audio tracks but might not work with some formats. + + + + + Fast seek to chapters in dvds + + + + + If checked, it will try the fastest method to seek to chapters but it might not work with some discs. + + + + + PrefSubtitles + + + Subtitles + Субтитры + + + + Choose a ttf file + Выбрать ttf файл + + + + Truetype Fonts + Шрифты Truetype + + + + &Subtitles + Су&бтитры + + + + Autoload + Ðвтооткрытие + + + + Same name as movie + Такое же название как и у фильма + + + + All subs containing movie name + Подключать Ñубтитры Ñодержащие название фильма + + + + All subs in directory + Ð’Ñе Ñубтитры каталога + + + + Position + ÐŸÐ¾Ð·Ð¸Ñ†Ð¸Ñ + + + + 0 + 0 + + + + Top + Верх + + + + Bottom + Ðиз + + + + &Font + &Шрифт + + + + Font + Шрифт + + + + Select the font which will be used for subtitles (and OSD): + Выберите шрифт Ð´Ð»Ñ Ñубтитров (и OSD): + + + + Size + Размер + + + + No autoscale + Без автомаÑÑˆÑ‚Ð°Ð±Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ + + + + Proportional to movie height + Пропорциональко к выÑоте клипа + + + + Proportional to movie width + Пропорционально к ширине клипа + + + + Proportional to movie diagonal + Пропорционально к диагонали клипа + + + + SSA/&ASS library + SSA/ASS &библиотека + + + + The new SSA/ASS library will provide nice styled subtitles for external SSA/ASS subtitles files and Matroska tracks. But it will be used too for rendering other formats like SUB and SRT files. + Библиотека SSA/ASS позволÑет отображать SSA/ASS Ñубтитры и дорожки Matroska. Также она может быть иÑпользована Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ñовки других типов (srt, sub) ÑуÑбтитров. + + + + Here you can override styles for SSA/ASS subtitles. It can be also used for fine-tuning the rendering of SRT and SUB subtitles by the SSA/ASS library. Example: <b>Bold=1,Outline=2,Shadow=4</b> + ЗдеÑÑŒ можно указать Ñтиль SSA/ASS Ñубтитров. Также можно наÑтроить отриÑовку srt и sub Ñубтитров Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ библиотеки SSA/ASS.<br>Example: <b>Bold=1,Outline=2,Shadow=4</b> {2 or 4?} + + + + Subtitle position + РаÑположение Ñубтитров + + + + This option specifies the position of the subtitles over the video window. <i>100</i> means the bottom, while <i>0</i> means the top. + Этот параметр определÑет положение Ñубтитров отноÑительно окна. <i>100</i> означает низ, <i>0</i> - верх. + + + + SSA/ASS styles + + + + + Au&toload subtitles files (*.srt, *.sub...): + &Ðвтозагрузка Ñубтитров (*.srt, *.sub...): + + + + S&elect first available subtitle + Загружать &первый доÑтупный файл Ñубтитров + + + + &Default subtitle encoding: + &Кодировка Ñубтитров по-умолчанию: + + + + Default &position of the subtitles on screen + По&ложение Ñубтитров на Ñкране по-умолчанию + + + + &Include subtitles on screenshots + &СохранÑÑ‚ÑŒ Ñубтиры на Ñнимках + + + + &Use -subfont option (required by recent MPlayer releases) + &ИÑпользовать параметр -subfont (требуетÑÑ Ð¿Ð¾Ñледними верÑиÑми MPlayer) + + + + &TTF font: + TTF &шрифт: + + + + Sea&rch... + &ПоиÑк... + + + + S&ystem font: + &СиÑтемный шрифт: + + + + A&utoscale: + Ð&втомаÑштабирование: + + + + S&cale: + &МаÑштаб: + + + + &Use SSA/ASS library for subtitle rendering + &ИÑпользовать Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ñовки Ñубтитров библиотеку SSA/ASS + + + + &Text color: + Цвет &текÑта: + + + + &Border color: + Цвет &кромки: + + + + St&yles: + &Стиль: + + + + PreferencesDialog + + + SMPlayer - Help + SMPlayer - Помощь + + + + OK + OK + + + + Cancel + Отмена + + + + Apply + Применить + + + + Help + Помощь + + + + SMPlayer - Preferences + SMPlayer - ÐŸÑ€ÐµÐ´Ð¿Ð¾Ñ‡Ñ‚ÐµÐ½Ð¸Ñ + + + + QObject + + + 1 second + 1 Ñекунда + + + + %1 seconds + %1 Ñекунд + + + + %1 minutes + %1 минут + + + + %1 minutes and %2 seconds + %1 минут и %2 Ñекунд + + + + 1 minute + 1 минута + + + + 1 minute and 1 second + 1 минута и 1 Ñекунда + + + + 1 minute and %1 seconds + 1 минута и %1 Ñекунд + + + + %1 minutes and 1 second + %1 минут и 1 Ñекунда + + + + specifies the directory for the configuration file (smplayer.ini). If directory is omitted, the application directory will be used. + определÑет каталог Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð¼ конфигурации (smplayer.ini). ЕÑли путь не указан, то будет будет производитьÑÑ Ð¿Ð¾Ð¸Ñк в каталоге программы. + + + + the main window will be closed when the file/playlist finishes. + главное окно будет закрыто поÑле Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð²Ð¾ÑпроизведениÑ. + + + + will show this message and then will exit. + будет показанно Ñто Ñообщение, поÑле чего приложение закроетÑÑ. + + + + 'media' is any kind of file that SMPlayer can open. It can be a local file, a DVD (e.g. dvd://1), an Internet stream (e.g. mms://....) or a local playlist in format m3u. If the -playlist option is used, that means that SMPlayer will pass the -playlist option to MPlayer, so MPlayer will handle the playlist, not SMPlayer. + 'media' - Ñто любой файл, который SMPlayer может открыть. Это может быть локальный файл, DVD (Ñ‚.е. dvd://1), видео в интернет (Ñ‚.е. mms://....) или ÑпиÑок воÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð² формате m3u. ЕÑли иÑпользуетÑÑ Ð¾Ð¿Ñ†Ð¸Ñ -playlist, то SMPlayer передаÑÑ‚ параметр -playlist MPlayer, так что MPlayer должен иÑпользовать +функцию ÑпиÑок воÑпроизведениÑ, а не SMPlayer. + + + + This is SMPlayer v. %1 running on %2 + SMPlayer v. %1 запущен в %2 + + + + Usage: %1 [-ini-path [directory]] [-send-action action_name] [-actions action_list [-close-at-end] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + ИÑпользование: %1 [-ini-path [directory]] [-send-action action_name] [-actions action_list [-close-at-end] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + + + + tries to make a connection to another running instance and send to it the specified action. Example: -send-action pause The rest of options (if any) will be ignored and the application will exit. It will return 0 on success or -1 on failure. + Попытка ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð½Ð¾Ð¹ машиной и выполнение заданного дейÑтвиÑ. Пример: -send-action pause ОÑтальные параметры (еÑли еÑÑ‚ÑŒ) будут игнорироватьÑÑ Ð¸ приложение будет закрыто. При уÑпешном выполнении задачи вывод - 0, или 1 в обратном Ñлучае. + + + + action_list is a list of actions separated by spaces. The actions will be executed just after loading the file (if any) in the same order you entered. For checkable actions you can pass true or false as parameter. Example: -actions "fullscreen compact true". Quotes are necessary in case you pass more than one action. + action_list - Ñто ÑпиÑок дейÑтвий разделенный пробелами. Эти дейÑÑ‚Ð²Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ выполнÑÑ‚ÑŒÑÑ Ð¿Ð¾Ñле загрузки файла в заданной вами поÑледовательноÑти. Ð”Ð»Ñ Ð´ÐµÐ¹Ñтвий Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ñ‹Ð¼Ð¸ значениÑми можно иÑпользовать true или false в качеÑтве параметров. Ðапример: -actions "fullscreen compact true". Кавычки необходимы в Ñлучае, еÑли иÑпользуетÑÑ Ð±Ð¾Ð»ÐµÐµ одного дейÑтвиÑ. + + + + media + Ð¼ÐµÐ´Ð¸Ñ + + + + if there's another instance running, the media will be added to that instance's playlist. If there's no other instance, this option will be ignored and the files will be opened in a new instance. + + + + + specifies the directory for the configuration file (smplayer.ini). + + + + + the main window won't be closed when the file/playlist finishes. + + + + + Usage: %1 [-ini-path directory] [-send-action action_name] [-actions action_list [-close-at-end] [-no-close-at-end] [-fullscreen] [-no-fullscreen] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + + + + + the video will be played in fullscreen mode. + + + + + the video will be played in window mode. + + + + + SeekWidget + + + icon + пиктограмма + + + + label + метка + + + + ShortcutGetter + + + Modify shortcut + Изменить горÑчую клавишу + + + + Press the key combination you want to assign + Ðажмити клавиши, Ñочетание которых вы хотите иÑпользовать + + + + Clear + ОчиÑтить + + + + Capture + Снимок Ñкрана + + + + Capture keystrokes + ГорÑÑ‡Ð°Ñ ÐºÐ»Ð°Ð²Ð¸ÑˆÐ° Ñнимка Ñ Ñкрана + + + + VideoEqualizer + + + Equalizer + Эквалайзер + + + + Contrast + КонтраÑтноÑÑ‚ÑŒ + + + + Brightness + ЯркоÑÑ‚ÑŒ + + + + Hue + Цвет + + + + Saturation + ÐаÑыщенноÑÑ‚ÑŒ + + + + Gamma + Гамма + + + + &Reset + Сб&Ñ€Ð¾Ñ + + + + &Set as default values + &УÑтановки по-умолчанию + + + + Use the current values as default values for new videos. + ИÑпользовать данные наÑтройки по-умолчанию Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… файлов. + + + + Set all controls to zero. + УÑтановить вÑе Ð·Ð½Ð°Ñ‡Ð°ÐµÐ½Ð¸Ñ Ð½Ð° ноль. + + + diff --git a/retroshare-gui/src/apps/smplayer/translations/smplayer_sk.qm b/retroshare-gui/src/apps/smplayer/translations/smplayer_sk.qm new file mode 100644 index 000000000..4a7e6bda4 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/translations/smplayer_sk.qm differ diff --git a/retroshare-gui/src/apps/smplayer/translations/smplayer_sk.ts b/retroshare-gui/src/apps/smplayer/translations/smplayer_sk.ts new file mode 100644 index 000000000..79f1a4334 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/translations/smplayer_sk.ts @@ -0,0 +1,3866 @@ + + + + AboutDialog + + + Version: %1 + Verzia: %1 + + + + 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. + Tento program je slobodný software: možete ho redistribuovaÅ¥ a/alebo modifikovaÅ¥ za podmienok licencie GPL verzia 2. + + + + Translators: + Prekladatelia: + + + + German + Nemecky + + + + Slovak + Slovensky + + + + Italian + Taliansky + + + + French + Francúzsky + + + + Simplified-Chinese + ZjednoduÅ¡ená ÄínÅ¡tina + + + + Russian + Rusky + + + + Hungarian + MaÄarsky + + + + Japanese + Japonsky + + + + Dutch + Holandsky + + + + Ukrainian + Ukrainsky + + + + Georgian + + + + + Czech + ÄŒesky + + + + Logo designed by %1 + Logo vytvoril %1 + + + + Get updates at: %1 + Aktuálna verzia na: %1 + + + + About SMPlayer + O SMPlayer + + + + Polish + Poľsky + + + + Bulgarian + Bulharsky + + + + Turkish + Turecky + + + + Swedish + Å védsky + + + + Serbian + Srbsky + + + + Traditional Chinese + TradiÄná ČínÅ¡tina + + + + Romanian + Rumunsky + + + + Portuguese - Brazil + + + + + Portuguese - Portugal + + + + + Compiled with Qt %1 + + + + + %1, %2 and %3 + + + + + %1 and %2 + + + + + http://smplayer.sourceforge.net/en/windows/download.php + If the web page is translated into your language you can change the URL so it points to the download page in the translation.Otherwise leave as is. + + + + + http://smplayer.sourceforge.net/en/linux/download.php + If the web page is translated into your language you can change the URL so it points to the download page in the translation.Otherwise leave as is. + + + + + <b>%1</b>: %2 + + + + + ActionsEditor + + + Name + Meno + + + + Description + Popis + + + + Shortcut + Skratka + + + + &Save + &UložiÅ¥ + + + + &Load + &NaÄítaÅ¥ + + + + Key files + + + + + Choose a filename + VybraÅ¥ názov súboru + + + + Confirm overwrite? + PotvrdiÅ¥ prepísanie? + + + + The file %1 already exists. +Do you want to overwrite? + Súbor %1 už existuje. +Chcete ho prepísaÅ¥? + + + + Choose a file + VybraÅ¥ súbor + + + + Error + Chyba + + + + The file couldn't be saved + Súbor nemôže byÅ¥ uložený + + + + The file couldn't be loaded + Súbor nemože byÅ¥ naÄítaný + + + + &Change shortcut... + + + + + BaseGui + + + SMPlayer - mplayer log + SMPlayer - mplayer log + + + + SMPlayer - smplayer log + SMPlayer - smplayer log + + + + &Open + &OtvoriÅ¥ + + + + &Play + &PrehraÅ¥ + + + + &Video + &Video + + + + &Audio + &Zvuk + + + + &Subtitles + &Titulky + + + + &Browse + &Navigácia + + + + Op&tions + &Možnosti + + + + &Help + &Pomoc + + + + &File... + &Súbor... + + + + D&irectory... + &Adresár... + + + + &Playlist... + &Playlist... + + + + &DVD from drive + &DVD z disku + + + + D&VD from folder... + D&VD z adresáru na disku... + + + + &URL... + &URL... + + + + &Clear + &VyÄistiÅ¥ zoznam + + + + &Recent files + &Naposledy otvorené súbory + + + + P&lay + &Prehraj + + + + &Pause + &Pauza + + + + &Stop + &Zastav + + + + &Frame step + &Krokovanie obrazu + + + + &Normal speed + &Normálna rýchlosÅ¥ + + + + &Halve speed + &PoloviÄná rýchlosÅ¥ + + + + &Double speed + &Dvojnásobná rýchlosÅ¥ + + + + Speed &-10% + RýchlosÅ¥ &-10% + + + + Speed &+10% + RýchlosÅ¥ &+10% + + + + Sp&eed + &RýchlosÅ¥ + + + + &Repeat + &OpakovaÅ¥ + + + + &Fullscreen + &Celá obrazovka + + + + &Compact mode + &Kompaktný mód + + + + Si&ze + Veľ&kosÅ¥ + + + + &Autodetect + &Autodetekcia + + + + &4:3 + &4:3 + + + + &5:4 + &5:4 + + + + &14:9 + &14:9 + + + + 16:&9 + 16:&9 + + + + 1&6:10 + 1&6:10 + + + + &2.35:1 + &2.35:1 + + + + 4:3 &Letterbox + 4:3 &Letterbox + + + + 16:9 L&etterbox + 16:9 L&etterbox + + + + 4:3 &Panscan + 4:3 &Pan Scan + + + + 4:3 &to 16:9 + 4:3 &na 16:9 + + + + &Aspect ratio + &Pomer strán + + + + &None + &Žiadne + + + + &Lowpass5 + &Lowpass5 + + + + Linear &Blend + Linear &Blend + + + + &Deinterlace + &Deinterlace + + + + &Postprocessing + &Postprocessing + + + + &Autodetect phase + &Autodetekcia fázy + + + + &Deblock + &Deblocking + + + + De&ring + De&ringing + + + + Add n&oise + &PridaÅ¥ Å¡um + + + + F&ilters + &Filtre + + + + &Equalizer + &Ekvalizér + + + + &Screenshot + &Snímok obrazovky + + + + S&tay on top + U&držiavaÅ¥ navrchu + + + + &Track + &Stopa + + + + &Extrastereo + &Extra stereo + + + + &Karaoke + &Karaoke + + + + &Filters + &Filtre + + + + &Default + Å &tandard + + + + &Stereo + &Stereo + + + + &4.0 Surround + &4.0 Surround + + + + &5.1 Surround + &5.1 Surround + + + + &Channels + &Kanály + + + + &Left channel + &Ľavý kanál + + + + &Right channel + &Pravý kanál + + + + &Stereo mode + S&tereo mód + + + + &Mute + &StíšiÅ¥ + + + + Volume &- + HlasitosÅ¥ &- + + + + Volume &+ + HlasitosÅ¥ &+ + + + + &Delay - + &Oneskorenie - + + + + D&elay + + O&neskorenie + + + + + &Select + &Výber + + + + &Load... + &NaÄítaÅ¥... + + + + Delay &- + Oneskorenie &- + + + + Delay &+ + Oneskorenie &+ + + + + &Up + Posunúť &vyÅ¡Å¡ie + + + + &Down + Posunúť &nižsie + + + + &Title + &Titul + + + + &Chapter + &Kapitola + + + + &Angle + &Uhol pohľadu + + + + &Playlist + Play&list + + + + &Show frame counter + ZobraziÅ¥ &poÄítadlo obrázkov + + + + &Disabled + &ZakázaÅ¥ + + + + &Seek bar + &Posuvník + + + + &Time + &ÄŒas + + + + Time + T&otal time + ÄŒas + c&elkový Äas + + + + &OSD + &OSD + + + + &View logs + &ZobraziÅ¥ logy + + + + P&references + &Nastavenia + + + + About &Qt + O &Qt + + + + About &SMPlayer + O &SMPlayer + + + + <empty> + <prázdny> + + + + Video + Video + + + + Audio + Zvuk + + + + Playlists + Playlist + + + + All files + VÅ¡etky súbory + + + + Choose a file + VybraÅ¥ súbor 1 + + + + SMPlayer - Information + SMPlayer - Informácie + + + + The CDROM / DVD drives are not configured yet. +The configuration dialog will be shown now, so you can do it. + Zariadenie CD / DVD eÅ¡te nebolo nakonfigurované. +Môžete to urobiÅ¥ teraz v nasledujúcom dialógu. + + + + Choose a directory + VybraÅ¥ adresár 2 + + + + Subtitles + Titulky + + + + About Qt + O Qt + + + + Playing %1 + Prehrávam %1 + + + + Pause + Pauza + + + + Stop + Zastav + + + + De&noise + &Odstránenie Å¡umu + + + + N&ormal + &Normálne + + + + &Soft + &Jemné + + + + Play / Pause + PrehraÅ¥ / Pauza + + + + Pause / Frame step + Pauza / Krokovanie obrazu + + + + U&nload + U&nload 1 + + + + V&CD + V&CD + + + + C&lose + Z&atvoriÅ¥ + + + + View &info and properties... + ZobraziÅ¥ &informácie a vlastnosti... + + + + Zoom &- + Zoom &- + + + + Zoom &+ + Zoom &+ + + + + &Reset + &Reset + + + + Move &left + Posunúť vľ&avo + + + + Move &right + Posunúť v&pravo + + + + Move &up + Posunúť &vyÅ¡Å¡ie + + + + Move &down + Posunúť &nižšie + + + + &Pan && scan + & Pan && scan + + + + &Previous line in subtitles + &Predchádzajúci riadok titulkov + + + + N&ext line in subtitles + &Nasledujúci riadok titulkov + + + + -%1 + -%1 + + + + +%1 + +%1 + + + + Dec volume (2) + ZnížiÅ¥ hlasitosÅ¥ (2) + + + + Inc volume (2) + ZvýšiÅ¥ hlasitosÅ¥ (2) + + + + Exit fullscreen + UkonÄiÅ¥ režim celej obrazovky + + + + OSD - Next level + OSD - ÄalÅ¡ia úroveň + + + + Dec contrast + ZnížiÅ¥ kontrast + + + + Inc contrast + ZvýšiÅ¥ kontrast + + + + Dec brightness + ZnínžiÅ¥ jas + + + + Inc brightness + ZvýšiÅ¥ jas + + + + Dec hue + ZnížiÅ¥ odtieÅ¥ + + + + Inc hue + ZvýšiÅ¥ odtieň + + + + Dec saturation + ZnížiÅ¥ saturáciu + + + + Dec gamma + ZnížiÅ¥ gammu + + + + Next audio + ÄŽalÅ¡ia zvuková stopa + + + + Next subtitle + ÄŽalÅ¡ie titulky + + + + Next chapter + ÄŽalÅ¡ia kapitola + + + + Previous chapter + Predchádzajúca kapitola + + + + Inc saturation + ZvýšiÅ¥ saturáciu + + + + Inc gamma + ZvýšiÅ¥ gammu + + + + Toggle double size + Dvojnásobná veľkosÅ¥ + + + + &Load external file... + &NaÄitaÅ¥ externý súbor... + + + + &Kerndeint + &Kerndeint + + + + &Yadif (normal) + &Yadif (normálne) + + + + Y&adif (double framerate) + Y&adif (dvojnásobný framerate) + + + + &Next + ÄŽa&lší + + + + Pre&vious + Pre&dchádzajúci + + + + Volume &normalization + &Normalizácia hlasitosti + + + + &Audio CD + + + + + Denoise nor&mal + + + + + Denoise &soft + + + + + Denoise o&ff + + + + + Use SSA/&ASS library + + + + + Flip i&mage + + + + + &Toggle double size + + + + + BaseGuiPlus + + + SMPlayer is still running here + SMPlayer je stále spustený + + + + S&how icon in system tray + ZobraziÅ¥ ikonu v &systémovej liÅ¡te + + + + &Hide + &SkryÅ¥ + + + + &Restore + &ObnoviÅ¥ + + + + &Recent files + &Naposledy otvorené súbory + + + + &Quit + &Koniec + + + + Playlist + Playlist + + + + Core + + + Brightness: %1 + Jas: %1 + + + + Contrast: %1 + Kontrast: %1 + + + + Gamma: %1 + Gamma: %1 + + + + Hue: %1 + Odtieň: %1 + + + + Saturation: %1 + Saturácia: %1 + + + + Volume: %1 + HlasitosÅ¥: %1 + + + + Zoom: %1 + Zoom: %1 + + + + DefaultGui + + + Welcome to SMPlayer + Vitajte v programe SMPlayer + + + + Volume + HlasitosÅ¥ + + + + Audio + Zvuk + + + + Subtitle + Titulky + + + + Playlist + Playlist + + + + &Main toolbar + &Hlavný panel + + + + &Language toolbar + Panel &jazykov + + + + &Toolbars + &Panely + + + + Encodings + + + Western European Languages + Západné Európske jazyky + + + + Western European Languages with Euro + Západné Európske jazyky s Euro + + + + Slavic/Central European Languages + Slovanské/Stredo-Európske jazyky + + + + Esperanto, Galician, Maltese, Turkish + Esperanto, Galicisch, Maltesisch, Turecky + + + + Old Baltic charset + Staré Baltické kódovanie + + + + Cyrillic + Cyrilika + + + + Arabic + Arabsky + + + + Modern Greek + Moderná GréÄtina + + + + Turkish + Turecky + + + + Baltic + Baltic + + + + Celtic + Celtic + + + + Hebrew charsets + Hebrejsky + + + + Russian + Rusky + + + + Ukrainian, Belarusian + Ukrajina, Bielorusko + + + + Simplified Chinese charset + ZjednoduÅ¡ená ČínÅ¡tina + + + + Traditional Chinese charset + TradiÄná ČínÅ¡tina + + + + Japanese charsets + Japonsky + + + + Korean charset + Kórejsky + + + + Thai charset + Thajsky + + + + Cyrillic Windows + Cyrilika - windows + + + + Slavic/Central European Windows + Slovanské/Stredo-Európske jazyky - windows + + + + Arabic Windows + + + + + EqSlider + + + icon + ikona + + + + FilePropertiesDialog + + + SMPlayer - File properties + SMPlyer - vlastnosti súboru + + + + &Information + &Informácie + + + + &Demuxer + &Demuxer + + + + &Select the demuxer that will be used for this file: + Vyberte &demuxer, ktorý bude použitý pre tento súbor: + + + + &Reset + &Reset + + + + &Video codec + &Video kódek + + + + &Select the video codec: + &Vyberte video kódek: + + + + A&udio codec + &Audio kódek + + + + &Select the audio codec: + &Vyberte audio kódek: + + + + &MPlayer options + &MPlayer možnosti + + + + Additional Options for MPlayer + + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + + + + + &Options: + &Možnosti: + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + + + + + V&ideo filters: + V&ideo filtre: + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + + + + + Audio &filters: + Audio &filtre: + + + + OK + + + + + Cancel + + + + + Apply + + + + + InfoFile + + + General + Hlavné + + + + Size + VeľkosÅ¥ + + + + %1 KB (%2 MB) + %1 KB (%2 MB) + + + + URL + URL + + + + Length + Dĺžka + + + + Demuxer + Demuxer + + + + Name + Meno + + + + Artist + Umelec + + + + Author + Autor + + + + Album + Album + + + + Genre + Typ + + + + Date + Dátum + + + + Track + Stopa + + + + Copyright + Copyright + + + + Comment + Komentár + + + + Software + Software + + + + Clip info + Informácie o klipe + + + + Video + Video + + + + Resolution + Rozlíšenie + + + + Aspect ratio + Pomer strán + + + + Format + Formát + + + + Bitrate + Bitový tok + + + + %1 kbps + %1 kbps + + + + Frames per second + Obrázkov za sekundu + + + + Selected codec + Použitý kódek + + + + Initial Audio Stream + Zvuková stopa + + + + Rate + Frekvencia + + + + %1 Hz + %1 Hz + + + + Channels + Kanály + + + + Audio Streams + Zvukové stopy + + + + Language + Jazyk + + + + empty + prázdny + + + + Subtitles + Titulky + + + + Type + Typ + + + + ID + Info for translators: this is a identification code + ID + + + + # + Info for translators: this is a abbreviation for number + # + + + + Stream title + Názov streamu + + + + Stream URL + URL streamu + + + + File + + + + + InputDVDDirectory + + + Choose a directory + VybraÅ¥ adresár + + + + SMPlayer - Play a DVD from a folder + SMPlayer - PrehraÅ¥ DVD z adresáru + + + + You can play a dvd from your hard disc. Just select the folder which contains the VIDEO_TS and AUDIO_TS directories. + Môžete prehrávaÅ¥ DVD uložené vo vaÅ¡om poÄítaÄi. StaÄí vybraÅ¥ adresár obsahujúci adresáre VIDEO_TS a AUDIO_TS. + + + + Choose a directory... + VybraÅ¥ adresár... + + + + InputURL + + + SMPlayer - Enter URL + + + + + &URL: + + + + + It's a &playlist + + + + + If this option is checked, the URL will be treated as a playlist: it will be opened as text and will play the URLs in it. + + + + + LogWindow + + + Choose a filename to save under + Vyberte súbor, do ktorého sa uloží log + + + + Confirm overwrite? + PotvrdiÅ¥ prepísanie? + + + + The file already exists. +Do you want to overwrite? + Súbor už existuje +Chcete ho prepísaÅ¥? + + + + Error saving file + Chyba pri ukladaní súboru + + + + The log couldn't be saved + Log nemôže byÅ¥ uložený + + + + Logs + Logy + + + + LogWindowBase + + + Log Window + Logovacie okno + + + + Save + UložiÅ¥ + + + + Copy to clipboard + SkopírovaÅ¥ do schránky + + + + Close + ZatvoriÅ¥ + + + + &Close + &ZatvoriÅ¥ + + + + Playlist + + + Name + Názov + + + + Length + Dĺžka + + + + Choose a file + VybraÅ¥ súbor + + + + Choose a filename + VybraÅ¥ názov súboru + + + + Confirm overwrite? + PotvrdiÅ¥ prepísanie? + + + + Select one or more files to open + Vyberte jeden alebo viac súborov na otvorenie + + + + Choose a directory + VybraÅ¥ adresár + + + + The file %1 already exists. +Do you want to overwrite? + Súbor %1 už existuje. +Chcete ho prepísaÅ¥? + + + + Edit name + ZmeniÅ¥ názov + + + + Type the name that will be displayed in the playlist for this file: + Napíšte názov, ktorý bude zobrazený v zozname pre tento súbor: + + + + &Play + &PrehraÅ¥ + + + + &Edit + &UpraviÅ¥ + + + + Playlists + Zoznam + + + + All files + VÅ¡etky súbory + + + + &Load + &NaÄítaÅ¥ + + + + &Save + &UložiÅ¥ + + + + &Next + ÄŽa&lší + + + + Pre&vious + Pre&dchádzajúci + + + + Move &up + Posunúť &vyÅ¡Å¡ie + + + + Move &down + Posunúť &nižšie + + + + &Repeat + &OpakovaÅ¥ + + + + S&huffle + &Náhodný výber + + + + Add &current file + &PridaÅ¥ aktuálny súbor + + + + Add &file(s) + PridaÅ¥ &súbor(y) + + + + Add &directory + PridaÅ¥ &adresár + + + + Remove &selected + &OdstrániÅ¥ vybrané + + + + Remove &all + OdstrániÅ¥ &vÅ¡etky + + + + SMPlayer - Playlist + SMPlayer - Playlist + + + + Add... + PridaÅ¥... + + + + Remove... + OdstrániÅ¥... + + + + Playlist modified + Playlist zmenený + + + + There are unsaved changes, do you want to save the playlist? + Vykonané zmeny v playliste, chcete uložiÅ¥ playlist? + + + + PrefAdvanced + + + Advanced + Rozšírené + + + + Auto + + + + + &Advanced + &Rozšírené + + + + icon + ikona + + + + Additional Options for MPlayer + ÄŽalÅ¡ie nastavenia pre MPlayer + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + ÄŽalÅ¡ie možnosÅ¥i pre MPlayer. +Píšte ich oddelené medzerou +Príklad: -flip -nosound + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + ÄŽalÅ¡ie video filtre. +Oddeľujte ich Äiarkami ",". Nepoužívajte medzery +Príklad: scale=512:-2,eq2=1.1 + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + Zvukové filtre. Rovnaké pravidlá ako video filtre. +Príklad: resample=44100:0:0,volnorm + + + + Don't repaint the background of the video window + Neprekresľuj pozadie okna s videom + + + + &Logs + &Logy + + + + Log MPlayer output + LogovaÅ¥ výstup programu MPlayer + + + + Log SMPlayer output + LogovaÅ¥ výstup programu SMPlayer + + + + This option is mainly intended for debugging the application. + Táto možnosÅ¥ je používaná pre odhaľovanie chýb v aplikácií. + + + + &MPlayer language + &Jazyk programu MPlayer + + + + SMPlayer needs to read and parse the output of MPlayer and sometimes it relies on English text. If you are using a MPlayer translated into another language, then you need to change the texts that SMPlayer looks for. (Technically you should enter regular expressions)<br><br> +The drop-down lists may provide already made regular expression for several languages. + SMPlayer potrebuje ÄítaÅ¥ a parsovaÅ¥ výžstup programu MPlayer. Niekedy je výstup závislý na anglickom texte. Ak používate lokalizovanú verziu programu MPlayer (iný jazyk ako angliÄtina), musíte zmeniÅ¥ text, podľa ktorého SMPlayer vyhľadáva. (Technicky povedané, musíte zadaÅ¥ regulárny výraz).<br><br> +Rozbaľovací zoznam môže obsahovaÅ¥ výrazy pre niektoré jazyky. + + + + Checking this option may reduce flickering, but it also might produce that the video won't be displayed properly. + ZaÅ¡krtnutím tejto možnosti môžete znížiÅ¥ blikanie obrazu, ale môže to spôsobiÅ¥, že video nebude zobrazené správne. + + + + If checked, smplayer will store the output of mplayer (you can see it in <b>Options->View logs->mplayer</b>). In case of problems this log can contain important information, so it's recommended to keep this option checked. + Ak použijete túto možnosÅ¥, smplayer bude uchovávaÅ¥ výstup programu mplayer (môžete ho vidieÅ¥ v <b>Možnosti -> ZobraziÅ¥ logy -> mplayer</b>). V prípade problému, tento log obsahuje dôležité informácie, preto je potrebné nechaÅ¥ túto možnosÅ¥ zaÅ¡krtnutú. + + + + If this option is checked, smplayer will store the debugging messages that smplayer outputs (you can see the log in <b>Options->View logs->smplayer</b>). This information can be very useful for the developer in case you find a bug. + Ak použijete túto možnosÅ¥, smplayer bude uchovávaÅ¥ výstup programu smmplayer (môžete ho vidieÅ¥ v <b>Možnosti -> ZobraziÅ¥ logy -> smplayer</b>). Tieto informácie môžu byÅ¥ veľmi užitoÄné pre vývojárov pri hlľadaní chýb. + + + + Filter for SMPlayer logs + + + + + This option allows to filter the smplayer messages that will be stored in the log. Here you can write any regular expression.<br>For instance: <i>^Core::.*</i> will display only the lines starting with <i>Core::</i> + Ak použijete túto možnosÅ¥, smplayer bude filtrovaÅ¥ hlášky, ktoré budú uložené do logu. Môžete použiÅ¥ akýkoľvek regulérny výraz.<br>Napríklad: <i>^Core::.*</i> bude ukladaÅ¥ iba riadky zaÄínajúce s <i>Core::</i> + + + + &Monitor aspect: + + + + + &Run MPlayer in its own window + + + + + &Options: + &Možnosti: + + + + V&ideo filters: + V&ideo filtre: + + + + Audio &filters: + Audio &filtre: + + + + &Colorkey: + + + + + &Don't repaint the background of the video window + + + + + Log &MPlayer output + + + + + Log &SMPlayer output + + + + + &Filter for SMPlayer logs: + + + + + &End of file: + + + + + &No video: + + + + + C&hange... + + + + + PrefAssociations + + + Warning + + + + + Not all files could be associated. Please check your security permissions and retry. + + + + + File Types + + + + + Select all + + + + + Check all file types in the list + + + + + Uncheck all file types in the list + + + + + List of file types + + + + + File types + + + + + Media files handled by SMPlayer: + + + + + Select All + + + + + Select None + + + + + Check the media file extensions you would like SMPlayer to handle. When you click Apply, the checked files will be associated with SMPlayer. If you uncheck a media type, the file association will be restored. + + + + + Select none + + + + + PrefDrives + + + Drives + Zariadenia + + + + Currently SMPlayer does not autodetect cdrom or dvd devices. So in order to play cdroms or dvds you must first select here your cdrom and dvd drives (can be the same). + SMPlayer momentálne nerobí autodetekciu CD alebo DVD zariadení. Ak chcete prehrávaÅ¥ CD alebo DVD disky, musíte najprv vybraÅ¥ vaÅ¡e zariadenia (môžu byÅ¥ použité tie isté). + + + + icon + ikona + + + + Select your CD device: + CD zariadenie: + + + + Select your DVD device: + DVD zariadenie: + + + + CD device + + + + + Choose your CDROM device. It will be used to play VCDs and Audio CDs. + + + + + DVD device + + + + + Choose your DVD device. It will be used to play DVDs. + + + + + Select your &CD device: + + + + + Select your &DVD device: + + + + + PrefGeneral + + + General + Hlavné + + + + &General + + + + + Paths + Umiestnenia + + + + Select... + VybraÅ¥... + + + + Folder for storing screenshots: + Adresár pre uloženie snímkov videa: + + + + Search... + HľadaÅ¥... + + + + Select the MPlayer executable: + umiestnenie programu MPlayer: + + + + Output drivers + Výstupné zariadenie + + + + Video: + Video: + + + + Audio: + Zvuk: + + + + Media settings + Nastavenia médií + + + + Remember settings for all files (audio track, subtitles...) + ZapamätaÅ¥ nastavenia pre vÅ¡etky súbor (zvuková stopa, titulky, ...) + + + + Don't remember time position (files start playing from the beginning) + NepamätaÅ¥ pozíciu Äasu vo filme (súbory prehrávaÅ¥ vždy od zaÄiatku) + + + + Preferred audio and subtitles + Preferovaná zvuková stopa a titulky + + + + Subtitles: + Titulky: + + + + &Video and audio + + + + + Video + Video + + + + Use software video equalizer + Použi softwarový video ekvalizér + + + + Enable postprocessing for all videos + PovoliÅ¥ postprocessing pre vÅ¡etky videá + + + + Quality: + Kvalita: + + + + Start videos in fullscreen + PrehrávaÅ¥ video v režime celej obrazovky + + + + Disable screensaver + ZakázaÅ¥ Å¡etriÄ obrazovky + + + + Audio + Zvuk + + + + Use software volume control + Použi softwarové ovládanie hlasitosti + + + + Max. Amplification: + Max. amplifikácia: + + + + AC3/DTS pass-through S/PDIF + AC3/DTS pass-through S/PDIF + + + + Volume normalization + Normalizácia hlasitosti + + + + Select the mplayer executable + Umiestnenie programu mplayer + + + + Executables + Súbory + + + + All files + VÅ¡etky súbory + + + + Select a directory + VybraÅ¥ adresár + + + + MPlayer executable + + + + + Here you must specify the mplayer executable that smplayer will use.<br>smplayer requires at least mplayer 1.0rc1 (svn recommended).<br><b>If this setting is wrong, smplayer won't be able to play anything!</b> + Tu urÄujete umiestnenie programu mplayer, ktorý SMPlayer používa.<br>SMPlayer potrebuje minimálne mplayer 1.0rc1.<br><b>Ak táto možnosÅ¥ nie je dobre nastavená, smplayer nebude schopný prehraÅ¥ akýkoľvek súbor!</b> + + + + Screenshots folder + + + + + Here you can specify a folder where the screenshots taken by smplayer will be stored. If this field is empty the screenshot feature will be disabled. + Adresár, kam budú ukladnané vytvorené snímky. Pokiaľ adresár nie je urÄený, snímky nebude možné ukladaÅ¥. + + + + Video output driver + + + + + Select the video output driver. Usually xv (linux) and directx (windows) provide the best performance. + Výstupné video zariadenie. Najvyšší výkon dosahuje výstup xv (linux) a directx (windows).<br>Viacej možností získate príkazom <code>mplayer -vo help</code>. + + + + Audio output driver + + + + + Select the audio output driver. + Výstupné audio zariadenie (alsa, oss, nas).<br>Viacej možností získate príkazom <code>mplayer -ao help</code>. + + + + Remember settings + + + + + Usually smplayer will remember the settings for each file you play (audio track selected, volume, filters...). Uncheck this option if you don't like this feature. + SMPlayer si Å¡tandardne pamätá nastavenia pre každý prehrávaný súbor (vybraná zvuková stopa, hlasitosÅ¥, nastavené filtre...). ZruÅ¡ením tejto možnosti SMPlayer nebude používaÅ¥ toto nastavenie. + + + + Don't remember time position + + + + + If you check this option, smplayer will play all files from the beginning. + Ak použijete túto možnosÅ¥, smplayer bude prehrávaÅ¥ súbory vždy od zaÄiatku. + + + + Preferred audio language + + + + + Here you can type your preferred language for the audio streams. When a media with multiple audio streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the audio streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the audio track if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + Nastavenie preferovaného jazyka pre zvukové stopy. Ak je vybrané médium s viacerými zvukovými stopami, SMPlayer bude používaÅ¥ nastavený jazyk.<br>Toto nastavenie bude fungovaÅ¥ iba s médiami, ktoré majú informácie o zvukových stopách, ako napr. DVD alebo mkv súbory.<br>Akceptované sú regulárne výrazy.<br>Príklad: <b>sk|cs|en</b> použije slovenskú zvukovú stopu. Ak nebude nájdená, použije sa Äeská zvuková stopa. Ak nebude nájdená ani Äeská, použije sa anglická zvuková stopa. Ak nebude nájdená ani anglická zvuková stopa, použije sa prvá zvuková stopa na médiu. + + + + Preferred subtitle language + + + + + Here you can type your preferred language for the subtitle stream. When a media with multiple subtitle streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the subtitle streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the subtitle stream if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + Nastavenie preferovaného jazyka pre titulky. Ak je vybrané médium s viacerými titulkami, SMPlayer bude používaÅ¥ nastavený jazyk.<br>Toto nastavenie bude fungovaÅ¥ iba s médiami, ktoré majú informácie o zvukových stopách, ako napr. DVD alebo mkv súbory.<br>Akceptované sú regulárne výrazy.<br>Príklad: <b>sk|cs|en</b> použije slovenské titulky. Ak nebudú nájdené, použijú sa Äeské titulky. Ak nebudú nájdené ani Äeské, použijú sa anglické titulky. Ak nebudú nájdené ani anglické titulky, použijú sa prvé titulky na médiu. + + + + Software video equalizer + + + + + You can check this option if video equalizer is not supported by your graphic card or the selected video output driver.<br><b>Note:</b> this option can be incompatible with some video output drivers. + Použite túto možnosÅ¥, ak video ekvalizér nie je podporovaný vaÅ¡ou grafickou kartou, alebo výstupným video zariadením.<br><b>Poznámka</b> táto možnosÅ¥ može byÅ¥ nekompatibilná s niektorými výstupnými video zariadeniami. + + + + If this option is checked, all videos will start to play in fullscreen mode. + Ak použijete túto možnosÅ¥, vÅ¡etky videá budú spúšťané v režime celej obrazovky. + + + + Check this option to disable the screensaver while playing.<br>The screensaver will enabled again when play finishes.<br><b>Note:</b> This option works only in X11 and Windows. + Použite túto možnosÅ¥ ak chcete zakázaÅ¥ Å¡etriÄ obrazovky poÄas prehrávania.<br>Å etriÄ obrazovky bude obnovený po skonÄení prehrávania.<br><b>Poznámka:</b> Táto možnosÅ¥ funguje iba v X11 a Windows. + + + + Software volume control + + + + + Check this option to use the software mixer, instead of using the sound card mixer. + Použi softwarový mixér miesto mixéru zvukovej karty. + + + + Postprocessing quality + + + + + Dynamically changes the level of postprocessing depending on the available spare CPU time. The number you specify will be the maximum level used. Usually you can use some big number. + Dynamická zmena úrovne postprocessingu závislá na vyÅ¥ažení procesoru. VeľkosÅ¥ ktorú urÄíte bude maximálna veľkosÅ¥. Bežne môžete použiÅ¥ vysoké nastavenie. + + + + Change volume + + + + + If checked, SMPlayer will remember the volume for every file and will restore it when played again. For new files the default volume will be used. + + + + + Default volume: + Å tandardná hlasitosÅ¥: + + + + 0 + 0 + + + + &Change volume on every file + + + + + &Search... + + + + + S&elect... + + + + + Select the &MPlayer executable: + + + + + &Folder for storing screenshots: + + + + + V&ideo: + + + + + &Audio: + + + + + &Don't remember time position (files start playing from the beginning) + + + + + &Remember settings for all files (audio track, subtitles...) + + + + + A&udio: + + + + + Su&btitles: + + + + + &Use software video equalizer + + + + + &Quality: + + + + + Start videos in &fullscreen + + + + + Disable &screensaver + + + + + &Default volume: + + + + + Use s&oftware volume control + + + + + Ma&x. Amplification: + + + + + &AC3/DTS pass-through S/PDIF + + + + + Volume &normalization + &Normalizácia hlasitosti + + + + Direct rendering + + + + + If checked, turns on direct rendering (not supported by all codecs and video outputs)<br><b>WARNING:</b> May cause OSD/SUB corruption! + + + + + Double buffering + + + + + D&irect rendering + + + + + Dou&ble buffering + + + + + Double buffering fixes flicker by storing two frames in memory, and displaying one while decoding another. If disabled it can affect OSD negatively, but often removes OSD flickering. + + + + + &Enable postprocessing by default + + + + + Volume &normalization by default + + + + + Close when finished + + + + + If this option is checked, the main window will be automatically closed when the current file/playlist finishes. + + + + + &Close when finished + + + + + 2 (Stereo) + + + + + 4 (4.0 Surround) + + + + + 6 (5.1 Surround) + + + + + C&hannels by default: + + + + + &Pause when minimized + + + + + Pause when minimized + + + + + If this option is enabled, the file will be paused when the main window is hidden. When the window is restored, play will be resumed. + + + + + Enable postprocessing by default + + + + + Max. Amplification + + + + + Volume normalization by default + + + + + Maximizes the volume without distorting the sound. + + + + + Default volume + + + + + Sets the initial volume that new files will use. + + + + + Channels by default + + + + + Sets the maximum amplification level in percent (default: 110). A value of 200 will allow you to adjust the volume up to a maximum of double the current level. With values below 100 the initial volume (which is 100%) will be above the maximum, which e.g. the OSD cannot display correctly. + + + + + Uses hardware AC3 passthrough + + + + + Requests the number of playback channels. MPlayer asks the decoder to decode the audio into as many channels as specified. Then it is up to the decoder to fulfill the requirement. This is usually only important when playing videos with AC3 audio (like DVDs). In that case liba52 does the decoding by default and correctly downmixes the audio into the requested number of channels. NOTE: This option is honored by codecs (AC3 only), filters (surround) and audio output drivers (OSS at least). + + + + + Postprocessing will be used by default on new opened files. + + + + + PrefInput + + + Keyboard and mouse + Klávesnica a myÅ¡ + + + + &Keyboard + &Klávesnica + + + + icon + ikona + + + + Here you can change any key shortcut. To do it double click or start typing over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + Zmena klávesových skratiek. V stĺpci skratky dopíšte do vybranej bunky skratku. Môžete uložiÅ¥ zoznam skratiek do súboru a poslaÅ¥ svojim známym, alebo použiÅ¥ tento súbor na inom poÄítaÄi. + + + + &Mouse + &MyÅ¡ + + + + Button functions: + Funkcie tlaÄítok: + + + + Media seeking + Stredný posuv + + + + Volume control + Ovládanie hlasitosti + + + + Zoom video + + + + + None + Žiadny + + + + Here you can change any key shortcut. To do it double click or press enter over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + + + + + &Left click + + + + + &Double click + + + + + &Wheel function: + + + + + Shortcut editor + + + + + This table allows you to change the key shortcuts of most available actions. Double click or press enter on a item, or press the <b>Change shortcut</b> button to enter in the <i>Modify shortcut</i> dialog. There are two ways to change a shortcut: if the <b>Capture</b> button is on then just press the new key or combination of keys that you want to assign for the action (unfortunately this doesn't work for all keys). If the <b>Capture</b> button is off then you could enter the full name of the key. + + + + + Left click + + + + + Select the action for left click on the mouse. + + + + + Double click + + + + + Select the action for double click on the mouse. + + + + + Wheel function + + + + + Select the action for the mouse wheel. + + + + + PrefInterface + + + Interface + Rozhranie + + + + Bulgarian + Bulharsky + + + + Czech + ÄŒesky + + + + German + Nemecky + + + + Greek + Grécky + + + + English + Anglicky + + + + Spanish + Å panielsky + + + + Finnish + Fínsky + + + + French + Francúzsky + + + + Hungarian + MaÄarsky + + + + Italian + Taliansky + + + + Japanese + Japonsky + + + + Georgian + + + + + Dutch + Holandsky + + + + Polish + Poľsky + + + + Portuguese - Brazil + + + + + Portuguese - Portugal + + + + + Romanian + Rumunsky + + + + Russian + Rusky + + + + Slovak + Slovensky + + + + Serbian + Srbsky + + + + Swedish + Å védsky + + + + Turkish + Turecky + + + + Ukrainian + Ukrainsky + + + + Simplified-Chinese + ZjednoduÅ¡ená ÄínÅ¡tina + + + + Traditional Chinese + TradiÄná ČínÅ¡tina + + + + <Autodetect> + <Automatická detekcia> + + + + Default + Å tandardné + + + + &Interface + + + + + Seeking + Posuv + + + + Never + Nikdy + + + + Whenever it's needed + Kedykoľvek to bude nutné + + + + Only after loading a new video + Iba pri naÄítaní videa + + + + Recent files + Posledné použité súbory + + + + Language + Jazyk + + + + Here you can change the language of the application. + + + + + Instances + + + + + Catalan + + + + + Basque + + + + + Galician + + + + + &Short jump + + + + + &Medium jump + + + + + &Long jump + + + + + Mouse &wheel jump + + + + + &Use only one running instance of SMPlayer + + + + + SMPlayer will listen to this &port to receive commands from other instances: + + + + + Ma&x. items + + + + + St&yle: + + + + + Ico&n set: + + + + + L&anguage: + + + + + Main window + + + + + Auto&resize: + + + + + R&emember position and size + + + + + Default font: + + + + + &Change... + + + + + PrefPerformance + + + Performance + Výkon + + + + &Performance + + + + + Priority + Priorita + + + + Select the priority for the MPlayer process. + Priorita procesu MPlayer. + + + + Priority: + Priorita: + + + + realtime + najvyÅ¡Å¡ia + + + + high + vysoká + + + + abovenormal + viac ako normálna + + + + normal + normálna + + + + belownormal + nižšia ako normálna + + + + idle + nízka + + + + Cache + Cache + + + + Size: + VeľkosÅ¥: + + + + KB + KB + + + + Use cache + PoužiÅ¥ cache + + + + Setting a cache may improve performance on slow media + Cache zvýši výkon na pomalých médiách + + + + Allow frame drop + Preskakovanie snímkov + + + + Allow hard frame drop (can lead to image distortion) + ÄŒasté preskakovanie snímkov (môže spôsobiÅ¥ poÅ¡kodenie výstupného obrazu) + + + + Synchronization + Synchronizácia + + + + Audio/video auto synchronization + Automatická synchronizácia obrazu a zvuku + + + + Factor: + Faktor: + + + + Fast audio track switching + Rýchle prepínanie zvukových stôp + + + + Fast seek to chapters in dvds + Rýchly posuv v kapitolách na DVD + + + + Set process priority for mplayer according to the predefined priorities available under Windows.<br><b>WARNING:</b> Using realtime priority can cause system lockup. + Nastavuje prioritu programu mplayer podobne ako sú preddefinované priority vo Windowse.<br><b>Upozornenie:</b> použite najvyÅ¡Å¡ej priority môže spôsobiÅ¥ zablokovanie systému. + + + + <br><b>Note:</b> This option is for Windows only. + <br><b>Poznámka:</b> Táto možnosÅ¥ je iba pre Windows. + + + + This option specifies how much memory (in kBytes) to use when precaching a file or URL. Especially useful on slow media. + Nastavenie veľkosti pamäti (v kBytoch), ktorá bude použitá ako cache pre súbory alebo URL. VäÄÅ¡ia pamäť je vhodná pri pomalých médiach. + + + + Skip displaying some frames to maintain A/V sync on slow systems. + Preskakovanie niektorých snímkov na pomalých systémoch pre udržanie synchronizáciu obrazu a zvuku. + + + + Allow hard frame drop + + + + + More intense frame dropping (breaks decoding). Leads to image distortion! + IntenzívnejÅ¡ie preskakovanie snímkov. Spôsobuje nesprávne dekódovanie a výstupný obraz môže byÅ¥ deformovaný! + + + + Gradually adjusts the A/V sync based on audio delay measurements. + Postupné prispôsobenie synchronizácie obrazu a zvuku založené na meraní zvukovej odchýlky. + + + + Priorit&y: + + + + + Si&ze: + + + + + &Use cache + + + + + &Allow frame drop + + + + + Allow &hard frame drop (can lead to image distortion) + + + + + Audio/&video auto synchronization + + + + + Fact&or: + + + + + &Fast audio track switching + + + + + Fast &seek to chapters in dvds + + + + + Create index if needed + + + + + Rebuilds index of files if no index was found, allowing seeking. Useful with broken/incomplete downloads, or badly created files. This option only works if the underlying media supports seeking (i.e. not with stdin, pipe, etc).<br> Note: the creation of the index may take some time. + + + + + &Create index if needed + + + + + If checked, it will try the fastest method to switch audio tracks but might not work with some formats. + + + + + If checked, it will try the fastest method to seek to chapters but it might not work with some discs. + + + + + PrefSubtitles + + + Subtitles + Titulky + + + + Choose a ttf file + VybraÅ¥ TTF súbor + + + + Truetype Fonts + Truetype fonty (*.ttf) + + + + &Subtitles + &Titulky + + + + Autoload + Automatické naÄítanie + + + + Autoload subtitles files (*.srt, *.sub...): + Automatické naÄítanie titulkov (*.srt,*.sub...): + + + + Select first available subtitle + VybraÅ¥ prvé možné titulky + + + + Same name as movie + Rovnaké ako názov filmu + + + + All subs containing movie name + VÅ¡etky titulky obsahujúce názov filmu + + + + All subs in directory + VÅ¡etky titulky v adresári + + + + Default subtitle encoding: + Å tandardné kódovanie titulkov: + + + + Position + Pozícia + + + + Default position of the subtitles on screen + Å tandardná pozícia titulikov na obrazovke + + + + 0 + 0 + + + + Top + Navrchu + + + + Bottom + Naspodu + + + + Include subtitles on screenshots + ZobraziÅ¥ titulky na snímkoch obrazovky + + + + Use -subfont option (required by recent MPlayer releases) + PoužiÅ¥ možnosÅ¥ <i>-subfont</i> (vyžadované urÄitými verziami programu MPlayer) + + + + &Font + + + + + Font + Font + + + + TTF font: + TTF font: + + + + Search... + HľadaÅ¥... + + + + System font: + Systémový font: + + + + Select the font which will be used for subtitles (and OSD): + Font, ktorý bude použitý pre titulky (a OSD): + + + + Size + VeľkosÅ¥ + + + + Autoscale: + Automatické Å¡kálovanie: + + + + No autoscale + Žiadne automatické Å¡kálovanie + + + + Proportional to movie height + Proporcionálne k výške videa + + + + Proportional to movie width + Proporcionálne k šírke videa + + + + Proportional to movie diagonal + Proporcionálne k diagonále videa + + + + Scale: + Å kálovnie: + + + + SSA/&ASS library + SSA/&ASS knižnica + + + + The new SSA/ASS library will provide nice styled subtitles for external SSA/ASS subtitles files and Matroska tracks. But it will be used too for rendering other formats like SUB and SRT files. + Nová SSA/ASS knižnica umožňuje krajÅ¡ie zobrazenie titulkov pre externé titulky a Matroska stopy. Môže byÅ¥ vÅ¡ak použitá aj pre renderovanie iných formátov, ako napríklad .sub a .srt súbory. + + + + Use SSA/ASS library for subtitle rendering + PoužiÅ¥ SSA/ASS knižnicu pre renderovanie titulkov + + + + Text color: + Farba textu: + + + + Border color: + Farba orámovania: + + + + Here you can override styles for SSA/ASS subtitles. It can be also used for fine-tuning the rendering of SRT and SUB subtitles by the SSA/ASS library. Example: <b>Bold=1,Outline=2,Shadow=4</b> + Nastavenie Å¡týlo pre SSA/ASS titulky. Môže byÅ¥ použité pre jemné ladenie zobrazenia srt a sub titulkov pomocou SSA/ASS knižnice.<br>Príklad:<b>Bold=1,Outline=2,Shadow=2</b> + + + + Styles: + Å týly: + + + + Subtitle position + + + + + This option specifies the position of the subtitles over the video window. <i>100</i> means the bottom, while <i>0</i> means the top. + Toto nastavenie Å¡pcifikuje pozíciu titulkov v okne s videom. <i>100</i> znamená úplne naspodu, <i>0</i> úplne navrchu. + + + + SSA/ASS styles + + + + + Au&toload subtitles files (*.srt, *.sub...): + + + + + S&elect first available subtitle + + + + + &Default subtitle encoding: + + + + + Default &position of the subtitles on screen + + + + + &Include subtitles on screenshots + + + + + &Use -subfont option (required by recent MPlayer releases) + + + + + &TTF font: + + + + + Sea&rch... + + + + + S&ystem font: + + + + + A&utoscale: + + + + + S&cale: + + + + + &Use SSA/ASS library for subtitle rendering + + + + + &Text color: + + + + + &Border color: + + + + + St&yles: + + + + + PreferencesDialog + + + SMPlayer - Help + + + + + OK + + + + + Cancel + + + + + Apply + + + + + Help + + + + + SMPlayer - Preferences + SMPlayer - Nastavenia + + + + QObject + + + 1 second + 1 sekunda + + + + %1 seconds + %1 sekúnd + + + + %1 minutes + %1 minút + + + + %1 minutes and %2 seconds + %1 minút a %2 sekúnd + + + + 1 minute + 1 minúta + + + + 1 minute and 1 second + 1 minúta a 1 sekunda + + + + 1 minute and %1 seconds + 1 minúta a %1 sekúnd + + + + %1 minutes and 1 second + %1 minút a 1 sekunda + + + + will show this message and then will exit. + + + + + 'media' is any kind of file that SMPlayer can open. It can be a local file, a DVD (e.g. dvd://1), an Internet stream (e.g. mms://....) or a local playlist in format m3u. If the -playlist option is used, that means that SMPlayer will pass the -playlist option to MPlayer, so MPlayer will handle the playlist, not SMPlayer. + + + + + the main window will be closed when the file/playlist finishes. + + + + + This is SMPlayer v. %1 running on %2 + + + + + tries to make a connection to another running instance and send to it the specified action. Example: -send-action pause The rest of options (if any) will be ignored and the application will exit. It will return 0 on success or -1 on failure. + + + + + action_list is a list of actions separated by spaces. The actions will be executed just after loading the file (if any) in the same order you entered. For checkable actions you can pass true or false as parameter. Example: -actions "fullscreen compact true". Quotes are necessary in case you pass more than one action. + + + + + media + + + + + if there's another instance running, the media will be added to that instance's playlist. If there's no other instance, this option will be ignored and the files will be opened in a new instance. + + + + + specifies the directory for the configuration file (smplayer.ini). + + + + + the main window won't be closed when the file/playlist finishes. + + + + + Usage: %1 [-ini-path directory] [-send-action action_name] [-actions action_list [-close-at-end] [-no-close-at-end] [-fullscreen] [-no-fullscreen] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + + + + + the video will be played in fullscreen mode. + + + + + the video will be played in window mode. + + + + + SeekWidget + + + icon + ikona + + + + label + popis + + + + ShortcutGetter + + + Modify shortcut + + + + + Clear + + + + + Press the key combination you want to assign + + + + + Capture + + + + + Capture keystrokes + + + + + VideoEqualizer + + + Contrast + Kontrast + + + + Brightness + Jas + + + + Hue + Odtieň + + + + Saturation + Saturácia + + + + Gamma + Gamma + + + + Equalizer + Ekvalizér + + + + &Reset + &Reset + + + + &Set as default values + &NastaviÅ¥ ako Å¡tandardnú hodnotu + + + + Use the current values as default values for new videos. + Použije aktuálne nastavenie ako Å¡tandardné hodnoty pre nové videá. + + + + Set all controls to zero. + VynulovaÅ¥ vÅ¡etky nastavenia ekvalizéru. + + + diff --git a/retroshare-gui/src/apps/smplayer/translations/smplayer_sr.qm b/retroshare-gui/src/apps/smplayer/translations/smplayer_sr.qm new file mode 100644 index 000000000..ace91f0cf Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/translations/smplayer_sr.qm differ diff --git a/retroshare-gui/src/apps/smplayer/translations/smplayer_sr.ts b/retroshare-gui/src/apps/smplayer/translations/smplayer_sr.ts new file mode 100644 index 000000000..d95f8be3d --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/translations/smplayer_sr.ts @@ -0,0 +1,3821 @@ + + + + AboutDialog + + + Version: %1 + Верзија %1 + + + + 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. + Овај програм је беÑплатан Ñофтвер; можете га редиÑтрибуирати и/или модификовати под уÑловима GNU GPL лиценце објављене од Ñтране Фондације Слободног Софтвера, било да је верзија 2 лиценце или било која наредна верзија. + + + + Translators: + Преводиоци: + + + + German + Ðемачки + + + + Slovak + Словачки + + + + Italian + ИталијанÑки + + + + French + ФранцуÑки + + + + Simplified-Chinese + Упрошћени-КинеÑки + + + + Russian + РуÑки + + + + Hungarian + МађарÑки + + + + Japanese + ЈапанÑки + + + + Dutch + ХоландÑки + + + + Ukrainian + УкраинÑки + + + + Georgian + ГрузијÑки + + + + Czech + Чешки + + + + Logo designed by %1 + Лого дизајнирао: %1 + + + + Get updates at: %1 + Скини нову верзију Ñа: %1 + + + + About SMPlayer + О SMPlayer-у + + + + Polish + ПољÑки + + + + Bulgarian + БугарÑки + + + + Turkish + ТурÑки + + + + Swedish + ШведÑки + + + + Serbian + СрпÑки + + + + Traditional Chinese + + + + + Romanian + + + + + Portuguese - Brazil + + + + + Portuguese - Portugal + + + + + Compiled with Qt %1 + + + + + %1, %2 and %3 + + + + + %1 and %2 + + + + + http://smplayer.sourceforge.net/en/windows/download.php + If the web page is translated into your language you can change the URL so it points to the download page in the translation.Otherwise leave as is. + + + + + http://smplayer.sourceforge.net/en/linux/download.php + If the web page is translated into your language you can change the URL so it points to the download page in the translation.Otherwise leave as is. + + + + + <b>%1</b>: %2 + + + + + ActionsEditor + + + Name + Име + + + + Description + ÐžÐ¿Ð¸Ñ + + + + Shortcut + Пречица + + + + &Save + &Save + + + + &Load + &Load + + + + Key files + Кључни фајлови + + + + Choose a filename + Изабери име фајла + + + + Confirm overwrite? + Потврди препиÑивање? + + + + The file %1 already exists. +Do you want to overwrite? + Фајл %1 већ поÑтоји +Да ли желите да га препишеш? + + + + Choose a file + Изабери фајл + + + + Error + Грешка + + + + The file couldn't be saved + Фајл не може да Ñе Ñачува + + + + The file couldn't be loaded + Фајл не може да Ñе учита + + + + &Change shortcut... + + + + + BaseGui + + + SMPlayer - mplayer log + SMPlayer - mplayer лог + + + + SMPlayer - smplayer log + SMPlayer - smplayer лог + + + + &Open + &Отвори + + + + &Play + &ПуÑти + + + + &Video + &Видео + + + + &Audio + &Ðудио + + + + &Subtitles + &Превод + + + + &Browse + &Изабери + + + + Op&tions + Оп&ције + + + + &Help + &Помоћ + + + + &File... + &Фајл... + + + + D&irectory... + Д&иректоријум... + + + + &Playlist... + &ПлејлиÑта... + + + + &DVD from drive + &DVD Ñа уређаја + + + + D&VD from folder... + D&VD из фолдера... + + + + &URL... + &Интернет адреÑа... + + + + &Clear + &Обриши + + + + &Recent files + &Отварани фајлови + + + + P&lay + П&уÑти + + + + &Pause + &Пауза + + + + &Stop + &ЗауÑтави + + + + &Frame step + &Фрејм по фрејм + + + + &Normal speed + &Ðормална брзина + + + + &Halve speed + &Дупло Ñпорије + + + + &Double speed + &Дупло брже + + + + Speed &-10% + Брзина &-10% + + + + Speed &+10% + Брзина &+10% + + + + Sp&eed + Бр&зина + + + + &Repeat + &Понављај + + + + &Fullscreen + &Цео екран + + + + &Compact mode + &Компактан облик + + + + Si&ze + Ве&личина + + + + &Autodetect + &Ðутодетектовање + + + + &4:3 + &4:3 + + + + &5:4 + &5:4 + + + + &14:9 + &14:9 + + + + 16:&9 + 16:&9 + + + + 1&6:10 + 1&6:10 + + + + &2.35:1 + &2.35:1 + + + + 4:3 &Letterbox + 4:3 &Коверат + + + + 16:9 L&etterbox + 16:9 К&оверат + + + + 4:3 &Panscan + 4:3 &ПанÑкен + + + + 4:3 &to 16:9 + 4:3 &to 16:9 + + + + &Aspect ratio + &Задржи Ð¾Ð´Ð½Ð¾Ñ + + + + &None + &ИÑкључено + + + + &Lowpass5 + &ÐиÑкопропуÑни5 + + + + Linear &Blend + ЛинеарноÑÑ‚ &Мешање + + + + &Deinterlace + &Уклони линије + + + + &Postprocessing + &ПоÑÑ‚Ð¿Ñ€Ð¾Ñ†ÐµÑ + + + + &Autodetect phase + &Ðутодетектовање фазе + + + + &Deblock + &Деблокирање + + + + De&ring + Де&прÑтеновање + + + + Add n&oise + Додај ш&ум + + + + F&ilters + Ф&илтри + + + + &Equalizer + &Еквилајзер + + + + &Screenshot + &Сликај екран + + + + S&tay on top + О&Ñтани на врху + + + + &Track + &Изабери аудио + + + + &Extrastereo + &ЕÑктраÑтерео + + + + &Karaoke + &Караоке + + + + &Filters + &Филтри + + + + &Default + &Стандардно + + + + &Stereo + &Стерео + + + + &4.0 Surround + &4,0 Тоне + + + + &5.1 Surround + &5,1 Tone + + + + &Channels + &Канали + + + + &Left channel + &Леви канал + + + + &Right channel + &ДеÑни канал + + + + &Stereo mode + &Ð’Ñ€Ñта Ñтереа + + + + &Mute + &ИÑкључи тон + + + + Volume &- + Јачина &- + + + + Volume &+ + Јачина &+ + + + + &Delay - + &Кашњење + + + + D&elay + + П&редњачење + + + + &Select + &Изабери + + + + &Load... + &Учитај... + + + + Delay &- + Кашњење & + + + + Delay &+ + Предњачење & + + + + &Up + &Горе + + + + &Down + &Доле + + + + &Title + &Језик + + + + &Chapter + &Поглавље + + + + &Angle + &Угао + + + + &Playlist + &ПлејлиÑта + + + + &Show frame counter + &Прикажи бројач фрејмова + + + + &Disabled + &ИÑкључено + + + + &Seek bar + &Бар за тражење + + + + &Time + &Време + + + + Time + T&otal time + Време + У&купно време + + + + &OSD + &OSD + + + + &View logs + &Види логове + + + + P&references + П&одешавања + + + + About &Qt + О &Qt + + + + About &SMPlayer + О &SMPlayer-у + + + + <empty> + + + + + Video + Видео + + + + Audio + Ðудио + + + + Playlists + ПлејлиÑта + + + + All files + Сви фајлови + + + + Choose a file + Изабери фајл + + + + SMPlayer - Information + SMPlayer - информација + + + + The CDROM / DVD drives are not configured yet. +The configuration dialog will be shown now, so you can do it. + CDROM / DVD ниÑу конфигуриÑани +Дијалог за конфигуриÑање ће Ñада бити приказан, +па можеш Ñада да конфигуришеш уређаје. + + + + Choose a directory + Изабери директоријум + + + + Subtitles + Превод + + + + About Qt + О Qt-у + + + + Playing %1 + Тренутно пушта %1 + + + + Pause + Паузирај + + + + Stop + ЗауÑтави + + + + De&noise + Ук&лони шум + + + + N&ormal + Ð&ормалан + + + + &Soft + &Слаб + + + + Play / Pause + ПуÑти / Паузирај + + + + Pause / Frame step + Пауза / Фрејм по фрејм + + + + U&nload + Од&читај + + + + V&CD + V&CD + + + + C&lose + З&атвори + + + + View &info and properties... + Погледај &инфо и карактериÑтике... + + + + Zoom &- + Зум &- + + + + Zoom &+ + Зум &+ + + + + &Reset + &РеÑетуј + + + + Move &left + Помери &лево + + + + Move &right + Помери &деÑно + + + + Move &up + Помери &горе + + + + Move &down + Помери &доле + + + + &Pan && scan + &Пан && Ñкен + + + + &Previous line in subtitles + &Претходна линије у преводу + + + + N&ext line in subtitles + С&ледећа линија у преводу + + + + -%1 + -%1 + + + + +%1 + +%1 + + + + Dec volume (2) + Смањи тон (2) + + + + Inc volume (2) + Појачај тон (2) + + + + Exit fullscreen + ИÑкључи опцију Цео Екран + + + + OSD - Next level + OSD - Следећи ниво + + + + Dec contrast + Смањи контраÑÑ‚ + + + + Inc contrast + Повећај КонтраÑÑ‚ + + + + Dec brightness + Смањи оÑветљај + + + + Inc brightness + Повећај оÑветљај + + + + Dec hue + Смањи боју + + + + Inc hue + Појачај боју + + + + Dec saturation + Смањи заÑићење + + + + Inc saturation + Повећај заÑићење + + + + Dec gamma + Смањи гама + + + + Inc gamma + Повећај гама + + + + Next audio + Следећи аудио фајл + + + + Next subtitle + Следећи превод + + + + Next chapter + Следеће поглавље + + + + Previous chapter + Претходно поглавље + + + + &Load external file... + + + + + &Kerndeint + + + + + &Yadif (normal) + + + + + Y&adif (double framerate) + + + + + &Next + &Следећа + + + + Pre&vious + Прет&ходна + + + + Volume &normalization + + + + + &Audio CD + + + + + Denoise nor&mal + + + + + Denoise &soft + + + + + Denoise o&ff + + + + + Use SSA/&ASS library + + + + + Flip i&mage + + + + + &Toggle double size + + + + + BaseGuiPlus + + + SMPlayer is still running here + SMPlayer овде и даље ради + + + + S&how icon in system tray + П&рикажи икону у ÑиÑтем треју + + + + &Hide + &Сакри + + + + &Restore + &Покажи + + + + &Recent files + &Отварани фајлови + + + + &Quit + &ИÑкључи + + + + Playlist + ПлејлиÑта + + + + Core + + + Brightness: %1 + ОÑветљај: %1 + + + + Contrast: %1 + КонтраÑÑ‚: %1 + + + + Gamma: %1 + Гама: %1 + + + + Hue: %1 + Боја: %1 + + + + Saturation: %1 + ЗаÑићеноÑÑ‚: %1 + + + + Volume: %1 + Јачина тона: %1 + + + + Zoom: %1 + Зум: %1 + + + + DefaultGui + + + Welcome to SMPlayer + Добродошли у SMPlayer + + + + Volume + Јачина тона + + + + Audio + Ðудио + + + + Subtitle + Превод + + + + Playlist + ПлејлиÑта + + + + &Main toolbar + &Главни алатке + + + + &Language toolbar + &Ðлатке за језик + + + + &Toolbars + &Ðлатке + + + + Encodings + + + Western European Languages + Западно ЕвропÑки Језици + + + + Western European Languages with Euro + Западно ЕвропÑки Језици Ñа Евро Знаком + + + + Slavic/Central European Languages + СловенÑки/Централно ЕвропÑки Језици + + + + Esperanto, Galician, Maltese, Turkish + ЕÑперанто, ГалÑки, Малтезе, ТурÑки + + + + Old Baltic charset + Стари Балтички Ñет карактера + + + + Cyrillic + Ћирилица + + + + Arabic + ÐрапÑки + + + + Modern Greek + Модерни Грчки + + + + Turkish + ТурÑки + + + + Baltic + Балтички + + + + Celtic + КелтÑки + + + + Hebrew charsets + ХебрејÑки Ñет карактера + + + + Russian + РуÑки + + + + Ukrainian, Belarusian + УкраинÑки, БелоруÑки + + + + Simplified Chinese charset + Упрошћени КинеÑки Ñет карактера + + + + Traditional Chinese charset + Традиционални КинеÑки Ñет карактера + + + + Japanese charsets + ЈапанÑки Ñет карактера + + + + Korean charset + КорејÑки Ñет карактера + + + + Thai charset + ТајландÑки Ñет карактера + + + + Cyrillic Windows + Ћирилица Windows + + + + Slavic/Central European Windows + СловенÑки/Централно ЕвропÑки Windows + + + + Arabic Windows + + + + + EqSlider + + + icon + икона + + + + FilePropertiesDialog + + + SMPlayer - File properties + SMPlayer - КарактериÑтике фајла + + + + &Information + &Информација + + + + &Demuxer + &ДемултиплекÑер + + + + &Select the demuxer that will be used for this file: + &Изабери демултиплекÑер за овај фајл: + + + + &Reset + &РеÑетуј + + + + &Video codec + &Видео кодек + + + + &Select the video codec: + &Изабери видео кодек: + + + + A&udio codec + Ð&удио кодек + + + + &Select the audio codec: + &Изабери аудио кодек: + + + + &MPlayer options + &Опције MPlayer-а + + + + Additional Options for MPlayer + + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + + + + + &Options: + &Опције: + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + + + + + V&ideo filters: + Ð’&идео филтри: + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + + + + + Audio &filters: + Ðудио &филтри: + + + + OK + + + + + Cancel + + + + + Apply + + + + + InfoFile + + + General + Опште + + + + Size + Величина + + + + %1 KB (%2 MB) + %1 KB (%2 MB) + + + + URL + Интернет адреÑа + + + + Length + Дужина + + + + Demuxer + ДемултиплекÑер + + + + Name + Име + + + + Artist + Уметник + + + + Author + Ðутор + + + + Album + Ðлбум + + + + Genre + Жанр + + + + Date + Датум + + + + Track + Снимак + + + + Copyright + Права копирања + + + + Comment + Коментар + + + + Software + Софтвер + + + + Clip info + Информација о Ñнимку + + + + Video + Видео + + + + Resolution + Резолуција + + + + Aspect ratio + Пропорција + + + + Format + Формат + + + + Bitrate + Брзина протока + + + + %1 kbps + %1 kbps + + + + Frames per second + Фрејмова по Ñекунди + + + + Selected codec + Изабран кодек + + + + Initial Audio Stream + Почетни аудио Ñтрим + + + + Rate + ÐžÐ´Ð½Ð¾Ñ + + + + %1 Hz + %1 Hz + + + + Channels + Канали + + + + Audio Streams + Ðудио Ñтримови + + + + Language + Језик + + + + empty + празно + + + + Subtitles + Превод + + + + Type + Тип + + + + ID + Info for translators: this is a identification code + 891983 + + + + # + Info for translators: this is a abbreviation for number + 1 + + + + Stream title + Име Ñтрима + + + + Stream URL + Интернет адреÑа Ñтрима + + + + File + + + + + InputDVDDirectory + + + Choose a directory + Изабери директоријум + + + + SMPlayer - Play a DVD from a folder + SMPlayer - ПуÑти DVD из фолдера + + + + You can play a dvd from your hard disc. Just select the folder which contains the VIDEO_TS and AUDIO_TS directories. + Можеш да пушташ DVD из фолдера. Само изабери фолдер у коме Ñу VIDEO_TS и AUDIO_TS фолдери. + + + + Choose a directory... + Изабери фолдер... + + + + InputURL + + + SMPlayer - Enter URL + + + + + &URL: + + + + + It's a &playlist + + + + + If this option is checked, the URL will be treated as a playlist: it will be opened as text and will play the URLs in it. + + + + + LogWindow + + + Choose a filename to save under + Изабери има под којим ћеш да Ñачуваш + + + + Confirm overwrite? + Потврди препиÑивање? + + + + The file already exists. +Do you want to overwrite? + Фајл поÑтоји +Да ли желиш да га препишеш? + + + + Error saving file + Грешка при чувању фајла + + + + The log couldn't be saved + Лог не може да Ñе Ñачува + + + + Logs + Логови + + + + LogWindowBase + + + Log Window + Прозор за логове + + + + Save + Сачувај + + + + Copy to clipboard + Копирај у клипборд + + + + Close + Затвори + + + + &Close + &Затвори + + + + Playlist + + + Name + Име + + + + Length + Дужина + + + + &Play + &ПуÑти + + + + &Edit + &Едитуј + + + + Playlists + ПлејлиÑта + + + + Choose a file + Изабери фајл + + + + Choose a filename + Изабери име фајла + + + + Confirm overwrite? + Потврди препиÑивање? + + + + The file %1 already exists. +Do you want to overwrite? + Фајл %1 поÑтоји. +Да ли желиш да га препишеш? + + + + All files + Сви фајлови + + + + Select one or more files to open + Изабери један или више фајлова да отвориш + + + + Choose a directory + Изабери фолдер + + + + Edit name + Едитуј име + + + + Type the name that will be displayed in the playlist for this file: + Откуцај име које ће бити приказано у плејлиÑти за овај фајл: + + + + &Load + &Учитај + + + + &Save + &Сачувај + + + + &Next + &Следећа + + + + Pre&vious + Прет&ходна + + + + Move &up + Помери &горе + + + + Move &down + Помери &доле + + + + &Repeat + &Понављај + + + + S&huffle + Ð&аÑумично + + + + Add &current file + Додај &тренутни фајл + + + + Add &file(s) + Додај &фајл(ове) + + + + Add &directory + Додај &фолдер + + + + Remove &selected + Уклони &Ñелектоване + + + + Remove &all + Уклони &Ñве + + + + SMPlayer - Playlist + SMPlayer - ПлејлиÑта + + + + Add... + Додај... + + + + Remove... + Уклони... + + + + Playlist modified + ПлејлиÑта је модификована + + + + There are unsaved changes, do you want to save the playlist? + ÐеÑачуване промене, да ли желиш да Ñачуваш плејлиÑту? + + + + PrefAdvanced + + + Advanced + Ðапредне опције + + + + Auto + + + + + &Advanced + + + + + icon + икона + + + + Additional Options for MPlayer + Додатне опције за MPLayer + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + Овде можеш да Ñтавиш додатне опције за MPlayer. +Пиши их Ñа размаком. +Пример: -flip -nosound + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + Можеш такође да Ñтавиш додатне филтре +Раздвоји их Ñа ",". Ðе кориÑти размак! +Пример: scale=512:-2,eq2=1.1 + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + И коначно аудио филтри. ИÑто важи као и за видео филтре +Пример: resample=44100:0:0,volnorm + + + + Don't repaint the background of the video window + Ðе иÑцртавај поново позадину видео прозора + + + + &Logs + + + + + Log MPlayer output + Логуј излаз MPlayer-a + + + + Log SMPlayer output + Логуј излаз SMplayer-a + + + + This option is mainly intended for debugging the application. + Ова опција Ñлужи Ñа дебаговање апликације. + + + + &MPlayer language + + + + + SMPlayer needs to read and parse the output of MPlayer and sometimes it relies on English text. If you are using a MPlayer translated into another language, then you need to change the texts that SMPlayer looks for. (Technically you should enter regular expressions)<br><br> +The drop-down lists may provide already made regular expression for several languages. + + + + + Checking this option may reduce flickering, but it also might produce that the video won't be displayed properly. + Штиклирање ове опције може да Ñе редукује треперење, али такође може да Ñе деÑи да Ñе видео не прикаже ваљано. + + + + If checked, smplayer will store the output of mplayer (you can see it in <b>Options->View logs->mplayer</b>). In case of problems this log can contain important information, so it's recommended to keep this option checked. + Ðко је ово штиклирано, smplayer ће чувати излаз mplayer-а (а можеш га видети у <b>Опције->Види логове->mplayer</b>). У Ñлучају проблема овај лог може да Ñадржи важне информације, зато је препоручљиво да ова опција буде штиклирана. + + + + If this option is checked, smplayer will store the debugging messages that smplayer outputs (you can see the log in <b>Options->View logs->smplayer</b>). This information can be very useful for the developer in case you find a bug. + Ðко је ова опвија штиклирана, smplayer ће чувати поруке за дебаговање које smplayer даје за излаз (можеш их видети у <b>Опције->Види логове->smplayer</b>). Ове информације могу да буду кориÑне за програмере уколико Ñе појавио баг. + + + + Filter for SMPlayer logs + + + + + This option allows to filter the smplayer messages that will be stored in the log. Here you can write any regular expression.<br>For instance: <i>^Core::.*</i> will display only the lines starting with <i>Core::</i> + Ова опција Ñлужи за филтрирање порука smplayer-а које Ñе чувају у логовима. Овде можеш да пишеш било које правилно изражавање..<br>Ðа пример: <i>^Core::.*</i> ће приказати Ñамо линије које почињу Ñа <i>Core::</i> + + + + &Monitor aspect: + + + + + &Run MPlayer in its own window + + + + + &Options: + &Опције: + + + + V&ideo filters: + Ð’&идео филтри: + + + + Audio &filters: + Ðудио &филтри: + + + + &Colorkey: + + + + + &Don't repaint the background of the video window + + + + + Log &MPlayer output + + + + + Log &SMPlayer output + + + + + &Filter for SMPlayer logs: + + + + + &End of file: + + + + + &No video: + + + + + C&hange... + + + + + PrefAssociations + + + Warning + + + + + Not all files could be associated. Please check your security permissions and retry. + + + + + File Types + + + + + Select all + + + + + Check all file types in the list + + + + + Uncheck all file types in the list + + + + + List of file types + + + + + File types + + + + + Media files handled by SMPlayer: + + + + + Select All + + + + + Select None + + + + + Check the media file extensions you would like SMPlayer to handle. When you click Apply, the checked files will be associated with SMPlayer. If you uncheck a media type, the file association will be restored. + + + + + Select none + + + + + PrefDrives + + + Drives + Уређаји + + + + Currently SMPlayer does not autodetect cdrom or dvd devices. So in order to play cdroms or dvds you must first select here your cdrom and dvd drives (can be the same). + Тренутно SMPLayer не може аутоматÑки да детектује DVD или CD уређаје. Да би пуштали Ñа DVD или CD морате изабрати уређаје (нема разлике дал је CD или DVD). + + + + icon + икона + + + + Select your CD device: + Изабери CD уређај: + + + + Select your DVD device: + Изабери DVD уређај: + + + + CD device + + + + + Choose your CDROM device. It will be used to play VCDs and Audio CDs. + + + + + DVD device + + + + + Choose your DVD device. It will be used to play DVDs. + + + + + Select your &CD device: + + + + + Select your &DVD device: + + + + + PrefGeneral + + + General + Опште + + + + &General + + + + + Paths + Путање + + + + Select... + Изабери... + + + + Folder for storing screenshots: + Фолдер за чување Ñлика екрана: + + + + Search... + Тражи... + + + + Select the MPlayer executable: + Изабери извршну датотеку за MPlayer: + + + + Output drivers + Излазни драјвери + + + + Video: + Видео: + + + + Audio: + Ðудио: + + + + Media settings + Опције медија + + + + Remember settings for all files (audio track, subtitles...) + Запамти подешавања за Ñве фајлове (аудио, превод...) + + + + Don't remember time position (files start playing from the beginning) + Ðе памти позицију времена (фајлови Ñе пуштају од почетка) + + + + Preferred audio and subtitles + Жељени аудио Ñтрим и превод + + + + Subtitles: + Превод: + + + + &Video and audio + + + + + Video + Видео + + + + Use software video equalizer + КориÑти ÑофтверÑки видео еквилајзер + + + + Start videos in fullscreen + Стартуј видео на целом екрану + + + + Disable screensaver + Онемогући чувара екрана + + + + Audio + Ðудио + + + + Use software volume control + КориÑти ÑофтверÑку контролу јачине тона + + + + Select the mplayer executable + Изабери извршну датотеку за MPlayer + + + + Executables + Извршне датотеке + + + + All files + Сви фајлови + + + + Select a directory + Изабери фолдер + + + + MPlayer executable + + + + + Here you must specify the mplayer executable that smplayer will use.<br>smplayer requires at least mplayer 1.0rc1 (svn recommended).<br><b>If this setting is wrong, smplayer won't be able to play anything!</b> + Овде мораш да Ñтавиш извршну mplayer датотеку за smplayer.<br>smplayer захтева најмање mplayer 1.0rc1 (препоручује Ñе svn).<br><b>Ðко је ово подешавање погрешно, smplayer неће моћи ништа да пушта!</b> + + + + Screenshots folder + + + + + Here you can specify a folder where the screenshots taken by smplayer will be stored. If this field is empty the screenshot feature will be disabled. + Овде можеш да изабереш фолдер у који ће бити Ñмештени Ñлике екрана. Ðко је ово поље празно Ñликање екрана ће бити онемогућено. + + + + Video output driver + + + + + Select the video output driver. Usually xv (linux) and directx (windows) provide the best performance. + Изабери излазни видео драјвер. Обично xv (linux) и directx (windows) дају најбоље перформанÑе. + + + + Audio output driver + + + + + Select the audio output driver. + Изабери излазни аудио драјвер. + + + + Remember settings + + + + + Usually smplayer will remember the settings for each file you play (audio track selected, volume, filters...). Uncheck this option if you don't like this feature. + Обично smplayer ће запамтити подешавања за Ñваки фајл који пушташ (изабран аудио фајл, јачина тона, филтри...). Одштиклирај ову опцију ако не желиш да smplayer памти подешавања. + + + + Don't remember time position + + + + + If you check this option, smplayer will play all files from the beginning. + Ðко штиклираш ову опцију, smplayer ће пуштати Ñве фајлове од почетка. + + + + Preferred audio language + + + + + Here you can type your preferred language for the audio streams. When a media with multiple audio streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the audio streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the audio track if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + Овде можеш да упишеш Ñвој жељени језик за аудио Ñтрим. Када убациш медиј Ñа вишеÑтруким аудио Ñтримовима, smplayer ће покушати да кориÑти твој жељени језик.<br>Ово Ñамо ради Ñа медијима коју имају информацију о аудио Ñтриму, ако што Ñу DVD или mkv фајлови.<br>Ово поље прихвата правилно изражавање. Пример: <b>es|esp|spa</b>ће Ñелектовати аудио који Ñе поклапа Ñа <i>es</i>, <i>esp</i> or <i>spa</i>. + + + + Preferred subtitle language + + + + + Here you can type your preferred language for the subtitle stream. When a media with multiple subtitle streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the subtitle streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the subtitle stream if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + Овде можеш да упишеш Ñвој жељени језик за превод. Када убациш медиј Ñа вишеÑтруким аудио Ñтримовима, smplayer ће покушати да кориÑти твој жељени језик.<br>Ово Ñамо ради Ñа медијима коју имају информацију о аудио Ñтриму, ако што Ñу DVD или mkv фајлови.<br>Ово поље прихвата правилно изражавање. Пример: <b>es|esp|spa</b>ће Ñелектовати аудио који Ñе поклапа Ñа <i>es</i>, <i>esp</i> or <i>spa</i>. + + + + Software video equalizer + + + + + You can check this option if video equalizer is not supported by your graphic card or the selected video output driver.<br><b>Note:</b> this option can be incompatible with some video output drivers. + Штиклирај ову опцију ако видео еквилајзер није подржан твојом графичком картицом или изабраним излазним видео драјвером <br><b>Упозорење:</b> ова опција може бити некомпатибилна Ñа неким графичким картицама. + + + + If this option is checked, all videos will start to play in fullscreen mode. + Ðко је ова опција штиклирана, Ñве ће бити пуштано на целом екрану. + + + + Check this option to disable the screensaver while playing.<br>The screensaver will enabled again when play finishes.<br><b>Note:</b> This option works only in X11 and Windows. + Штиклирај ову опцију да би онмогућио чувара екрана док Ñе пушта видео. <br>Чувар екрана ће опет радити када Ñе видео зауÑтави.<br><b>Note:</b>. Ова опција ради Ñамо на X11 и на Windows-у. + + + + Software volume control + + + + + Check this option to use the software mixer, instead of using the sound card mixer. + Штиклирај ову опцију да би кориÑтио ÑофтверÑки микÑер, умеÑто микÑера звучне картице. + + + + Postprocessing quality + + + + + Dynamically changes the level of postprocessing depending on the available spare CPU time. The number you specify will be the maximum level used. Usually you can use some big number. + Динамички мења ниво поÑтпроцеÑирања у завиÑноÑти од Ñлободног времена процеÑора. Број који Ñтавиш ће бити највећи могући који ће Ñе кориÑтити. Обично можеш да Ñе кориÑти неки велики број. + + + + Change volume + + + + + If checked, SMPlayer will remember the volume for every file and will restore it when played again. For new files the default volume will be used. + + + + + Default volume: + ОÑновна јачина: + + + + 0 + 0 + + + + &Change volume on every file + + + + + &Search... + + + + + S&elect... + + + + + Select the &MPlayer executable: + + + + + &Folder for storing screenshots: + + + + + V&ideo: + + + + + &Audio: + + + + + &Don't remember time position (files start playing from the beginning) + + + + + &Remember settings for all files (audio track, subtitles...) + + + + + A&udio: + + + + + Su&btitles: + + + + + &Use software video equalizer + + + + + &Quality: + + + + + Start videos in &fullscreen + + + + + Disable &screensaver + + + + + &Default volume: + + + + + Use s&oftware volume control + + + + + Ma&x. Amplification: + + + + + &AC3/DTS pass-through S/PDIF + + + + + Direct rendering + + + + + If checked, turns on direct rendering (not supported by all codecs and video outputs)<br><b>WARNING:</b> May cause OSD/SUB corruption! + + + + + Double buffering + + + + + D&irect rendering + + + + + Dou&ble buffering + + + + + Double buffering fixes flicker by storing two frames in memory, and displaying one while decoding another. If disabled it can affect OSD negatively, but often removes OSD flickering. + + + + + &Enable postprocessing by default + + + + + Volume &normalization by default + + + + + Close when finished + + + + + If this option is checked, the main window will be automatically closed when the current file/playlist finishes. + + + + + &Close when finished + + + + + 2 (Stereo) + + + + + 4 (4.0 Surround) + + + + + 6 (5.1 Surround) + + + + + C&hannels by default: + + + + + &Pause when minimized + + + + + Pause when minimized + + + + + If this option is enabled, the file will be paused when the main window is hidden. When the window is restored, play will be resumed. + + + + + Enable postprocessing by default + + + + + Max. Amplification + + + + + AC3/DTS pass-through S/PDIF + + + + + Volume normalization by default + + + + + Maximizes the volume without distorting the sound. + + + + + Default volume + + + + + Sets the initial volume that new files will use. + + + + + Channels by default + + + + + Sets the maximum amplification level in percent (default: 110). A value of 200 will allow you to adjust the volume up to a maximum of double the current level. With values below 100 the initial volume (which is 100%) will be above the maximum, which e.g. the OSD cannot display correctly. + + + + + Uses hardware AC3 passthrough + + + + + Requests the number of playback channels. MPlayer asks the decoder to decode the audio into as many channels as specified. Then it is up to the decoder to fulfill the requirement. This is usually only important when playing videos with AC3 audio (like DVDs). In that case liba52 does the decoding by default and correctly downmixes the audio into the requested number of channels. NOTE: This option is honored by codecs (AC3 only), filters (surround) and audio output drivers (OSS at least). + + + + + Postprocessing will be used by default on new opened files. + + + + + PrefInput + + + Keyboard and mouse + + + + + &Keyboard + + + + + icon + икона + + + + Here you can change any key shortcut. To do it double click or start typing over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + Овде можеш да промениш било коју пречицу на таÑтатури. Можеш дуплим кликом или куцањем преко ћелије пречице. Опционо можеш да Ñачуваш лиÑту и да је учиташ на другом неком рачунару. + + + + &Mouse + + + + + Button functions: + Функције дугмета: + + + + Media seeking + Тражење кроз медијум + + + + Volume control + Контрола тона + + + + Zoom video + + + + + None + Ðишта + + + + Here you can change any key shortcut. To do it double click or press enter over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + + + + + &Left click + + + + + &Double click + + + + + &Wheel function: + + + + + Shortcut editor + + + + + This table allows you to change the key shortcuts of most available actions. Double click or press enter on a item, or press the <b>Change shortcut</b> button to enter in the <i>Modify shortcut</i> dialog. There are two ways to change a shortcut: if the <b>Capture</b> button is on then just press the new key or combination of keys that you want to assign for the action (unfortunately this doesn't work for all keys). If the <b>Capture</b> button is off then you could enter the full name of the key. + + + + + Left click + + + + + Select the action for left click on the mouse. + + + + + Double click + + + + + Select the action for double click on the mouse. + + + + + Wheel function + + + + + Select the action for the mouse wheel. + + + + + PrefInterface + + + Interface + Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÑ˜Ñ + + + + Bulgarian + БугарÑки + + + + Czech + Чешки + + + + German + Ðемачки + + + + Greek + Грчки + + + + English + ЕнглеÑки + + + + Spanish + ШпанÑки + + + + Finnish + ФинÑки + + + + French + ФранцуÑки + + + + Hungarian + МађарÑки + + + + Italian + ИталијанÑки + + + + Japanese + ЈапанÑки + + + + Georgian + ГрузијÑки + + + + Dutch + ХоландÑки + + + + Polish + ПољÑки + + + + Portuguese - Brazil + + + + + Portuguese - Portugal + + + + + Romanian + + + + + Russian + РуÑки + + + + Slovak + Словачки + + + + Serbian + СрпÑки + + + + Swedish + ШведÑки + + + + Turkish + ТурÑки + + + + Ukrainian + УкраинÑки + + + + Simplified-Chinese + Упрошћени-КинеÑки + + + + Traditional Chinese + + + + + <Autodetect> + <Autodetect> + + + + Default + ОÑновно + + + + &Interface + + + + + Seeking + Тражење + + + + Never + Ðикад + + + + Whenever it's needed + Кад год је потребно + + + + Only after loading a new video + Само поÑле учитавања новог видеа + + + + Recent files + Отварани фајлови + + + + Language + Језик + + + + Here you can change the language of the application. + + + + + Instances + + + + + Catalan + + + + + Basque + + + + + Galician + + + + + &Short jump + + + + + &Medium jump + + + + + &Long jump + + + + + Mouse &wheel jump + + + + + &Use only one running instance of SMPlayer + + + + + SMPlayer will listen to this &port to receive commands from other instances: + + + + + Ma&x. items + + + + + St&yle: + + + + + Ico&n set: + + + + + L&anguage: + + + + + Main window + + + + + Auto&resize: + + + + + R&emember position and size + + + + + Default font: + + + + + &Change... + + + + + PrefPerformance + + + Performance + ПерформанÑе + + + + &Performance + + + + + Priority + Приоритет + + + + Select the priority for the MPlayer process. + Изабери приоритет за MPlayer процеÑ. + + + + Priority: + Приоритет: + + + + realtime + реално време + + + + high + виÑоко + + + + abovenormal + изнаднормале + + + + normal + нормално + + + + belownormal + иÑподнормале + + + + idle + Ñлободно време + + + + Cache + + + + + KB + KB + + + + Setting a cache may improve performance on slow media + Подешавање кеша може да побпљша перформаÑе на Ñпорим мидијима + + + + Allow frame drop + ДопуÑти иÑпадање фрејмова + + + + Allow hard frame drop (can lead to image distortion) + ДопуÑти велико иÑпадање фрејмова (може да доведе до изобличења Ñлике) + + + + Synchronization + Синхронизација + + + + Audio/video auto synchronization + Ðудио/Видео аутоматÑка Ñинхронизација + + + + Factor: + Фактор: + + + + Fast audio track switching + Брза промена аудиа + + + + Fast seek to chapters in dvds + Брзо тражење поглавља у dvd-јевима + + + + Set process priority for mplayer according to the predefined priorities available under Windows.<br><b>WARNING:</b> Using realtime priority can cause system lockup. + ПоÑтави приоритет процеÑа за mplayer према предефиниÑаним приоритетима у Windows-u.<br><b>ПÐЖЊÐ:</b> Употреба realtime приорите може да заглави ÑиÑтем. + + + + <br><b>Note:</b> This option is for Windows only. + <br><b>Упозорење:</b> Ова опција је Ñамо за Windows. + + + + This option specifies how much memory (in kBytes) to use when precaching a file or URL. Especially useful on slow media. + Овом опцијом Ñе наводи колико меморије (у килобајтима) може да Ñе кориÑти за прекеширање фајла или интернет адреÑе. ПоÑебно је кориÑтно за Ñпоре медијуме. + + + + Skip displaying some frames to maintain A/V sync on slow systems. + ПрекÑочи приказивање неких фрејмова да би задржао Ðудио/Видео Ñинхронизацију на Ñпорим ÑиÑтемима. + + + + Allow hard frame drop + + + + + More intense frame dropping (breaks decoding). Leads to image distortion! + Интензивније иÑпадање фрејмова (прекида/квари декодовање). Доводи до изобличења Ñлике! + + + + Gradually adjusts the A/V sync based on audio delay measurements. + ПоÑтепено подешавање Ðудио/Видео Ñинхронизације базирано на мерењу аудио кашњења. + + + + Priorit&y: + + + + + Si&ze: + + + + + &Use cache + + + + + &Allow frame drop + + + + + Allow &hard frame drop (can lead to image distortion) + + + + + Audio/&video auto synchronization + + + + + Fact&or: + + + + + &Fast audio track switching + + + + + Fast &seek to chapters in dvds + + + + + Create index if needed + + + + + Rebuilds index of files if no index was found, allowing seeking. Useful with broken/incomplete downloads, or badly created files. This option only works if the underlying media supports seeking (i.e. not with stdin, pipe, etc).<br> Note: the creation of the index may take some time. + + + + + &Create index if needed + + + + + If checked, it will try the fastest method to switch audio tracks but might not work with some formats. + + + + + If checked, it will try the fastest method to seek to chapters but it might not work with some discs. + + + + + PrefSubtitles + + + Subtitles + Превод + + + + Choose a ttf file + Изабери ttf фајл + + + + Truetype Fonts + Truetype фонтови + + + + &Subtitles + &Превод + + + + Autoload + ÐутоматÑко учитавање + + + + Autoload subtitles files (*.srt, *.sub...): + ÐутоматÑки учитај фајлове превода (*.srt, *.sub...): + + + + Select first available subtitle + Изабери први доÑтупан превод + + + + Same name as movie + ИÑто име као и видео фајл + + + + All subs containing movie name + Сви преводи Ñадрже име видео фајла + + + + All subs in directory + Сви преводи у фолдеру + + + + Default subtitle encoding: + ОÑновни енкодинг за превод: + + + + Position + Позиција + + + + Default position of the subtitles on screen + ОÑновна позиција превода на екрану + + + + 0 + 0 + + + + Top + Врх + + + + Bottom + Дно + + + + Include subtitles on screenshots + Превод видљив на Ñликама екрана + + + + &Font + + + + + Font + Фонт + + + + TTF font: + TTF фонт: + + + + Search... + Тражи... + + + + System font: + СиÑтемÑки фонт: + + + + Select the font which will be used for subtitles (and OSD): + Изабери фонт који ће бити коришћен за превод (и OSD): + + + + Size + Величина + + + + Autoscale: + ÐутоматÑка величина: + + + + No autoscale + Без аутоматÑке величине + + + + Proportional to movie height + Пропорционално Ñа виÑином видеа + + + + Proportional to movie width + Пропорционално Ñа ширином видеа + + + + Proportional to movie diagonal + Пропорционално Ñа дијагоналом видеа + + + + Scale: + Величина: + + + + SSA/&ASS library + + + + + The new SSA/ASS library will provide nice styled subtitles for external SSA/ASS subtitles files and Matroska tracks. But it will be used too for rendering other formats like SUB and SRT files. + + + + + Use SSA/ASS library for subtitle rendering + КориÑти SSA/ASS библиотеку за иÑцртавање превода + + + + Text color: + Боја текÑта: + + + + Border color: + Боја ивице: + + + + Here you can override styles for SSA/ASS subtitles. It can be also used for fine-tuning the rendering of SRT and SUB subtitles by the SSA/ASS library. Example: <b>Bold=1,Outline=2,Shadow=4</b> + + + + + Styles: + Стилови: + + + + Subtitle position + + + + + This option specifies the position of the subtitles over the video window. <i>100</i> means the bottom, while <i>0</i> means the top. + Ова опција одређује меÑто превода на екрану. <i>100</i> значи на дну, док <i>0</i> значи на врху. + + + + SSA/ASS styles + + + + + Au&toload subtitles files (*.srt, *.sub...): + + + + + S&elect first available subtitle + + + + + &Default subtitle encoding: + + + + + Default &position of the subtitles on screen + + + + + &Include subtitles on screenshots + + + + + &Use -subfont option (required by recent MPlayer releases) + + + + + &TTF font: + + + + + Sea&rch... + + + + + S&ystem font: + + + + + A&utoscale: + + + + + S&cale: + + + + + &Use SSA/ASS library for subtitle rendering + + + + + &Text color: + + + + + &Border color: + + + + + St&yles: + + + + + PreferencesDialog + + + SMPlayer - Help + + + + + OK + + + + + Cancel + + + + + Apply + + + + + Help + + + + + SMPlayer - Preferences + SMPlayer - Опције + + + + QObject + + + 1 second + 1 Ñекунда + + + + %1 seconds + %1 Ñекунди + + + + %1 minutes + %1 минута + + + + %1 minutes and %2 seconds + %1 минута и %2 Ñекунди + + + + 1 minute + 1 минут + + + + 1 minute and 1 second + 1 минут и 1 Ñекунда + + + + 1 minute and %1 seconds + 1 минут и %1 Ñекунди + + + + %1 minutes and 1 second + %1 минута и 1 Ñекунда + + + + will show this message and then will exit. + + + + + 'media' is any kind of file that SMPlayer can open. It can be a local file, a DVD (e.g. dvd://1), an Internet stream (e.g. mms://....) or a local playlist in format m3u. If the -playlist option is used, that means that SMPlayer will pass the -playlist option to MPlayer, so MPlayer will handle the playlist, not SMPlayer. + + + + + the main window will be closed when the file/playlist finishes. + + + + + This is SMPlayer v. %1 running on %2 + + + + + tries to make a connection to another running instance and send to it the specified action. Example: -send-action pause The rest of options (if any) will be ignored and the application will exit. It will return 0 on success or -1 on failure. + + + + + action_list is a list of actions separated by spaces. The actions will be executed just after loading the file (if any) in the same order you entered. For checkable actions you can pass true or false as parameter. Example: -actions "fullscreen compact true". Quotes are necessary in case you pass more than one action. + + + + + media + + + + + if there's another instance running, the media will be added to that instance's playlist. If there's no other instance, this option will be ignored and the files will be opened in a new instance. + + + + + specifies the directory for the configuration file (smplayer.ini). + + + + + the main window won't be closed when the file/playlist finishes. + + + + + Usage: %1 [-ini-path directory] [-send-action action_name] [-actions action_list [-close-at-end] [-no-close-at-end] [-fullscreen] [-no-fullscreen] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + + + + + the video will be played in fullscreen mode. + + + + + the video will be played in window mode. + + + + + SeekWidget + + + icon + икона + + + + label + назив + + + + ShortcutGetter + + + Modify shortcut + + + + + Clear + + + + + Press the key combination you want to assign + + + + + Capture + + + + + Capture keystrokes + + + + + VideoEqualizer + + + Equalizer + Еквилајзер + + + + Contrast + КонтраÑÑ‚ + + + + Brightness + ОÑветљај + + + + Hue + Боја + + + + Saturation + ЗаÑићеноÑÑ‚ + + + + Gamma + Гама + + + + &Reset + &РеÑетуј + + + + &Set as default values + &ПоÑтави оÑновне вредноÑти + + + + Use the current values as default values for new videos. + КориÑти тренутно вредноÑти као оÑновне за нове видео фајлове. + + + + Set all controls to zero. + ПоÑтави Ñве контроле на нула. + + + diff --git a/retroshare-gui/src/apps/smplayer/translations/smplayer_sv.qm b/retroshare-gui/src/apps/smplayer/translations/smplayer_sv.qm new file mode 100644 index 000000000..f2dae5ea6 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/translations/smplayer_sv.qm differ diff --git a/retroshare-gui/src/apps/smplayer/translations/smplayer_sv.ts b/retroshare-gui/src/apps/smplayer/translations/smplayer_sv.ts new file mode 100644 index 000000000..4d3aea60f --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/translations/smplayer_sv.ts @@ -0,0 +1,3842 @@ + + + + AboutDialog + + + Version: %1 + Version: %1 + + + + 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. + Detta program är gratis. Du fÃ¥r sprida det och/eller ändra det enligt GNU General Public License utgiven av Free Software Foundation; antingen version tvÃ¥ av licensen eller (om du sÃ¥ vill) en senare version. + + + + Translators: + Översättare: + + + + German + tyska + + + + Slovak + slovakiska + + + + Italian + italienska + + + + French + franska + + + + Simplified-Chinese + Förenklad kinesiska + + + + Russian + ryska + + + + Hungarian + ungerska + + + + Japanese + japanska + + + + Dutch + holländska + + + + Ukrainian + ukrainska + + + + Georgian + georgiska + + + + Czech + tjeckiska + + + + Logo designed by %1 + Logga designad av %1 + + + + Get updates at: %1 + Hämta uppdateringar frÃ¥n: %1 + + + + About SMPlayer + Om SMPlayer + + + + Polish + polska + + + + Bulgarian + bulgariska + + + + Turkish + turkiska + + + + Swedish + svenska + + + + Serbian + serbiska + + + + Traditional Chinese + traditionell kinesiska + + + + Romanian + + + + + Portuguese - Brazil + + + + + Portuguese - Portugal + + + + + Compiled with Qt %1 + + + + + %1, %2 and %3 + + + + + %1 and %2 + + + + + http://smplayer.sourceforge.net/en/windows/download.php + If the web page is translated into your language you can change the URL so it points to the download page in the translation.Otherwise leave as is. + http://smplayer.sourceforge.net/sv/windows/download.php + + + + http://smplayer.sourceforge.net/en/linux/download.php + If the web page is translated into your language you can change the URL so it points to the download page in the translation.Otherwise leave as is. + http://smplayer.sourceforge.net/sv/linux/download.php + + + + <b>%1</b>: %2 + + + + + ActionsEditor + + + Name + Namn + + + + Description + Beskrivning + + + + Shortcut + Kortkommando + + + + &Save + &Spara + + + + &Load + &Öppna + + + + Key files + Nyckelfiler + + + + Choose a filename + Välj ett filnamn + + + + Confirm overwrite? + Bekräfta överskrivning? + + + + The file %1 already exists. +Do you want to overwrite? + Filen %1 finns redan. +Vill du skriva över den? + + + + Choose a file + Välj en fil + + + + Error + Fel + + + + The file couldn't be saved + Filen kunde inte sparas + + + + The file couldn't be loaded + Filen kunde inte öppnas + + + + &Change shortcut... + + + + + BaseGui + + + SMPlayer - mplayer log + SMPlayer - mplayer-logg + + + + SMPlayer - smplayer log + SMPlayer - smplayer-logg + + + + &Open + &Öppna + + + + &Play + &Spela upp + + + + &Video + &Video + + + + &Audio + &Ljud + + + + &Subtitles + &Undertexter + + + + &Browse + &Bläddra + + + + Op&tions + &Inställningar + + + + &Help + &Hjälp + + + + &File... + &Filer ... + + + + D&irectory... + &Mapp ... + + + + &Playlist... + &Spellista ... + + + + &DVD from drive + &DVD frÃ¥n enhet + + + + D&VD from folder... + D&VD frÃ¥n mapp ... + + + + &URL... + &Webbadress ... + + + + &Clear + &Töm + + + + &Recent files + &Tidigare filer + + + + P&lay + &Spela upp + + + + &Pause + &Paus + + + + &Stop + S&topp + + + + &Frame step + St&ega + + + + &Normal speed + &Normal hastighet + + + + &Halve speed + &Halv hastighet + + + + &Double speed + &Dubbel hastighet + + + + Speed &-10% + Hastighet &-10% + + + + Speed &+10% + Hastighet &+10% + + + + Sp&eed + &Hastighet + + + + &Repeat + &Upprepa + + + + &Fullscreen + &Helskärm + + + + &Compact mode + &Kompakt läge + + + + Si&ze + S&torlek + + + + &Autodetect + &Autodetektera + + + + &4:3 + &4:3 + + + + &5:4 + &5:4 + + + + &14:9 + &14:9 + + + + 16:&9 + 16:&9 + + + + 1&6:10 + 1&6:10 + + + + &2.35:1 + &2.35:1 + + + + 4:3 &Letterbox + 4:3 &BrevlÃ¥da + + + + 16:9 L&etterbox + 16:9 B&revlÃ¥da + + + + 4:3 &Panscan + 4:3 &Panscan + + + + 4:3 &to 16:9 + 4:3 &till 16:9 + + + + &Aspect ratio + &Bildformat + + + + &None + &Ingen + + + + &Lowpass5 + &LÃ¥gpass5 + + + + Linear &Blend + Linear &Blend + + + + &Deinterlace + &Deinterlace + + + + &Postprocessing + &Efterbehandling + + + + &Autodetect phase + &Autodetektera phase + + + + &Deblock + &Deblock + + + + De&ring + De&ring + + + + Add n&oise + Lägg till n&oise + + + + F&ilters + F&ilter + + + + &Equalizer + &Equalizer + + + + &Screenshot + &Skärmdump + + + + S&tay on top + &Alltid överst + + + + &Track + &SpÃ¥r + + + + &Extrastereo + &Extrastereo + + + + &Karaoke + &Karaoke + + + + &Filters + &Filter + + + + &Default + &Standard + + + + &Stereo + &Stereo + + + + &4.0 Surround + &4.0 Surround + + + + &5.1 Surround + &5.1 Surround + + + + &Channels + &Kanaler + + + + &Left channel + &Vänster kanal + + + + &Right channel + &Höger kanal + + + + &Stereo mode + S&tereoläge + + + + &Mute + &Ljud av + + + + Volume &- + Volym &- + + + + Volume &+ + Volym &+ + + + + &Delay - + &Fördröjning - + + + + D&elay + + F&ördröjning + + + + + &Select + &Välj + + + + &Load... + &Öppna ... + + + + Delay &- + Fördröjning &- + + + + Delay &+ + Fördröjning &+ + + + + &Up + &Upp + + + + &Down + &Ner + + + + &Title + &Titel + + + + &Chapter + &Kapitel + + + + &Angle + &Vinkel + + + + &Playlist + &Spellista + + + + &Show frame counter + Visa &bildräknare + + + + &Disabled + &Inaktiverad + + + + &Seek bar + &Förloppsindikator + + + + &Time + &Tid + + + + Time + T&otal time + Tid + T&otal tid + + + + &OSD + Vis&a pÃ¥ skärmen (OSD) + + + + &View logs + Visa &loggar + + + + P&references + &Inställningar + + + + About &Qt + Om &Qt + + + + About &SMPlayer + Om &SMPlayer + + + + <empty> + <tom> + + + + Video + Video + + + + Audio + Ljud + + + + Playlists + Spellistor + + + + All files + Alla filer + + + + Choose a file + Välj en fil + + + + SMPlayer - Information + SMPlayer - Information + + + + The CDROM / DVD drives are not configured yet. +The configuration dialog will be shown now, so you can do it. + Enheterna för cdrom/dvd är inte konfigurerade än. +Nu visas konfigurationsdialogen sÃ¥ att du kan göra detta. + + + + Choose a directory + Välj en mapp + + + + Subtitles + Undertexter + + + + About Qt + Om Qt + + + + Playing %1 + Spelar upp %1 + + + + Pause + Paus + + + + Stop + Stopp + + + + De&noise + De&noise + + + + N&ormal + N&ormal + + + + &Soft + &Soft + + + + Play / Pause + Spela upp/Paus + + + + Pause / Frame step + Paus/Stegning + + + + U&nload + &Stäng + + + + V&CD + V&CD + + + + C&lose + &Stäng + + + + View &info and properties... + Visa i&nfo och egenskaper ... + + + + Zoom &- + Zoom &- + + + + Zoom &+ + Zoom &+ + + + + &Reset + &Ã…terställ + + + + Move &left + Flytta till &vänster + + + + Move &right + Flytta till &höger + + + + Move &up + Flytta &uppÃ¥t + + + + Move &down + Flytta &nedÃ¥t + + + + &Pan && scan + &Pan && scan + + + + &Previous line in subtitles + &FöregÃ¥ende rad + + + + N&ext line in subtitles + N&ästa rad + + + + -%1 + -%1 + + + + +%1 + +%1 + + + + Dec volume (2) + Sänk vol (2) + + + + Inc volume (2) + Höj vol (2) + + + + Exit fullscreen + Avsluta helskärm + + + + OSD - Next level + OSD - nästa nivÃ¥ + + + + Dec contrast + Minska kontrast + + + + Inc contrast + Öka kontrast + + + + Dec brightness + Minska ljusstyrka + + + + Inc brightness + Öka ljusstyrka + + + + Dec hue + Minska nyans + + + + Inc hue + Öka nyans + + + + Dec saturation + Minska färgmättnad + + + + Dec gamma + Minska gamma + + + + Next audio + Nästa ljudfil + + + + Next subtitle + Nästa undertext + + + + Next chapter + Nästa kapitel + + + + Previous chapter + FöregÃ¥ende kapitel + + + + Inc saturation + Öka färgmättnad + + + + Inc gamma + Öka gamma + + + + Toggle double size + Skifta dubbel storlek + + + + &Load external file... + &Öppna extern fil... + + + + &Kerndeint + &Kerndeint + + + + &Yadif (normal) + &Yadif (normal) + + + + Y&adif (double framerate) + Y&adif (dubbel framerate) + + + + &Next + &Nästa + + + + Pre&vious + &FöregÃ¥ende + + + + Volume &normalization + + + + + &Audio CD + + + + + Denoise nor&mal + + + + + Denoise &soft + + + + + Denoise o&ff + + + + + Use SSA/&ASS library + + + + + Flip i&mage + + + + + &Toggle double size + + + + + BaseGuiPlus + + + SMPlayer is still running here + SMPlayer är fortfarande i gÃ¥ng + + + + S&how icon in system tray + Visa i&kon i Meddelandefältet + + + + &Hide + &Dölj + + + + &Restore + &Ã…terställ + + + + &Recent files + &Tidigare + + + + &Quit + &Avsluta + + + + Playlist + Spellista + + + + Core + + + Brightness: %1 + Ljusstyrka: %1 + + + + Contrast: %1 + Kontrast: %1 + + + + Gamma: %1 + Gamma: %1 + + + + Hue: %1 + Nyans: %1 + + + + Saturation: %1 + Färgmättnad: %1 + + + + Volume: %1 + Volym: %1 + + + + Zoom: %1 + Zoom: %1 + + + + DefaultGui + + + Welcome to SMPlayer + Välkommen till SMPlayer + + + + Volume + Volym + + + + Audio + Ljud + + + + Subtitle + Undertext + + + + Playlist + Spellista + + + + &Main toolbar + &Huvudverktygsfält + + + + &Language toolbar + &SprÃ¥kverktygsfält + + + + &Toolbars + &Verktygsfält + + + + Encodings + + + Western European Languages + Västeuropeiska sprÃ¥k + + + + Western European Languages with Euro + Västeuropeiska sprÃ¥k med euro + + + + Slavic/Central European Languages + Slaviska/Centraleuropeiska sprÃ¥k + + + + Esperanto, Galician, Maltese, Turkish + Esperanto, galiciska, maltesiska, turkiska + + + + Old Baltic charset + Gammal baltisk teckenuppsättning + + + + Cyrillic + Kyrilliska + + + + Arabic + Arabiska + + + + Modern Greek + Modern grekiska + + + + Turkish + Turkiska + + + + Baltic + Baltiska + + + + Celtic + Keltiska + + + + Hebrew charsets + Hebreisk teckenuppsättning + + + + Russian + Ryska + + + + Ukrainian, Belarusian + Ukrainska, vitryska + + + + Simplified Chinese charset + Förenklad kinesiska + + + + Traditional Chinese charset + Traditionell kinesiska + + + + Japanese charsets + Japansk teckenuppsättning + + + + Korean charset + Koreansk teckenuppsättning + + + + Thai charset + Thailändsk teckenuppsättning + + + + Cyrillic Windows + Kyrillisk Windows + + + + Slavic/Central European Windows + Slavisk/Centraleuropeisk Windows + + + + Arabic Windows + + + + + EqSlider + + + icon + ikon + + + + FilePropertiesDialog + + + SMPlayer - File properties + SMPlayer - Filegenskaper + + + + &Information + &Information + + + + &Demuxer + &Demuxer + + + + &Select the demuxer that will be used for this file: + Välj &demuxer för denna fil: + + + + &Reset + &Ã…terställ + + + + &Video codec + Video&codec + + + + &Select the video codec: + Välj v&ideocodec: + + + + A&udio codec + &Ljudcodec + + + + &Select the audio codec: + Välj lj&udcodec: + + + + &MPlayer options + Alternativ för &SMPlayer + + + + Additional Options for MPlayer + Ytterligare alternativ för MPlayer + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + + + + + &Options: + &Alternativ: + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + + + + + V&ideo filters: + V&ideofilter: + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + Och slutligen ljudfilter. Samma regel som för videofilter. +Exempel: resample=44100:0:0,volnorm + + + + Audio &filters: + Ljud&filter: + + + + OK + + + + + Cancel + + + + + Apply + + + + + InfoFile + + + General + Allmänt + + + + Size + Storlek + + + + %1 KB (%2 MB) + %1 kB (%2 MB) + + + + URL + Webbadress + + + + Length + Längd + + + + Demuxer + Demuxer + + + + Name + Namn + + + + Artist + Artist + + + + Author + Skapare + + + + Album + Album + + + + Genre + Genre + + + + Date + Datum + + + + Track + SpÃ¥r + + + + Copyright + Copyright + + + + Comment + Kommentar + + + + Software + Mjukvara + + + + Clip info + Klippinfo + + + + Video + Video + + + + Resolution + Upplösning + + + + Aspect ratio + Bildformat + + + + Format + Format + + + + Bitrate + Bitar/sek + + + + %1 kbps + %1 kbps + + + + Frames per second + Bildrutor/sekund + + + + Selected codec + Vald codec + + + + Initial Audio Stream + Initialljudström + + + + Rate + Frekvens + + + + %1 Hz + %1 Hz + + + + Channels + Kanaler + + + + Audio Streams + Ljudströmmar + + + + Language + SprÃ¥k (Language) + + + + empty + tom + + + + Subtitles + Undertext + + + + Type + Typ + + + + ID + Info for translators: this is a identification code + ID + + + + # + Info for translators: this is a abbreviation for number + Nr + + + + Stream title + Strömtitel + + + + Stream URL + Ström-URL + + + + File + + + + + InputDVDDirectory + + + Choose a directory + Välj en mapp + + + + SMPlayer - Play a DVD from a folder + SMPlayer - Spela upp en DVD frÃ¥n en mapp + + + + You can play a dvd from your hard disc. Just select the folder which contains the VIDEO_TS and AUDIO_TS directories. + Du kan spela upp en dvd frÃ¥n din hÃ¥rddisk. Välj bara den mapp som innehÃ¥ller mapparna VIDEO_TS och AUDIO_TS. + + + + Choose a directory... + Välj en mapp ... + + + + InputURL + + + SMPlayer - Enter URL + + + + + &URL: + + + + + It's a &playlist + + + + + If this option is checked, the URL will be treated as a playlist: it will be opened as text and will play the URLs in it. + + + + + LogWindow + + + Choose a filename to save under + Välj filnamn att spara som + + + + Confirm overwrite? + Bekräfta ersättning? + + + + The file already exists. +Do you want to overwrite? + Filen finns redan. +Vill du skriva över den? + + + + Error saving file + Fel vid sparande av fil + + + + The log couldn't be saved + Loggen kunde inte sparas + + + + Logs + Loggar + + + + LogWindowBase + + + Log Window + Loggfönster + + + + Save + Spara + + + + Copy to clipboard + Kopiera till Urklipp + + + + Close + Stäng + + + + &Close + &Stäng + + + + Playlist + + + Name + Namn + + + + Length + Längd + + + + &Play + &Spela upp + + + + &Edit + &Redigera + + + + Playlists + Spellistor + + + + Choose a file + Välj en fil + + + + Choose a filename + Välj ett filnamn + + + + Confirm overwrite? + Bekräfta ersättning? + + + + The file %1 already exists. +Do you want to overwrite? + Filen %1 finns redan. +Vill du skriva över den? + + + + All files + Alla filer + + + + Select one or more files to open + Markera en eller flera filer att öppna + + + + Choose a directory + Välj en mapp + + + + Edit name + Redigera namn + + + + Type the name that will be displayed in the playlist for this file: + Skriv in det namn som ska visas i spellistan för denna fil: + + + + &Load + &Öppna + + + + &Save + &Spara + + + + &Next + &Nästa + + + + Pre&vious + &FöregÃ¥ende + + + + Move &up + Flytta &upp + + + + Move &down + Flytta &ner + + + + &Repeat + &Upprepa + + + + S&huffle + &Blanda + + + + Add &current file + Lägg till &aktuell fil + + + + Add &file(s) + Lägg till &fil(er) + + + + Add &directory + Lägg till &mapp + + + + Remove &selected + Ta bort &markerade + + + + Remove &all + Ta bort &alla + + + + SMPlayer - Playlist + SMPlayer - Spellista + + + + Add... + Lägg till ... + + + + Remove... + Ta bort ... + + + + Playlist modified + Spellistan ändrad + + + + There are unsaved changes, do you want to save the playlist? + Det finns ändringar som inte sparats. Vill du spara spellistan? + + + + PrefAdvanced + + + Advanced + Avancerat + + + + Auto + + + + + &Advanced + &Avancerat + + + + icon + ikon + + + + Additional Options for MPlayer + Ytterligare alternativ för MPlayer + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + Här kan du ange extra alternativ för MPlayer. +Skilj dem Ã¥t med mellanslag. +Exempel: -flip -nosound + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + Du kan ocksÃ¥ ange ytterligare videofilter. +Skilj dem med ",". Använd inte mellanslag! +Exempel: scale=512:-2,eq2=1.1 + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + Och slutligen ljudfilter. Samma regel som för videofilter. +Exempel: resample=44100:0:0,volnorm + + + + Don't repaint the background of the video window + MÃ¥la inte om bakgrunden pÃ¥ videofönster + + + + &Logs + &Loggar + + + + Log MPlayer output + Logga output frÃ¥n MPLayer + + + + Log SMPlayer output + Logga output frÃ¥n SMPlayer + + + + This option is mainly intended for debugging the application. + Detta alternativ är huvudsakligen tänkt för att avbuggning av programmet. + + + + &MPlayer language + SprÃ¥k för &MPlayer + + + + SMPlayer needs to read and parse the output of MPlayer and sometimes it relies on English text. If you are using a MPlayer translated into another language, then you need to change the texts that SMPlayer looks for. (Technically you should enter regular expressions)<br><br> +The drop-down lists may provide already made regular expression for several languages. + SMPlayer behöver läsa och tolka output frÃ¥n MPlayer och ibland krävs engelsk text. Om du använder en MPlayer som är översatt till ett annat sprÃ¥k sÃ¥ behöver du ändra de texter som SMPlayer letar efter. (Tekniskt sett bör du använda reguljära uttryck)<br><br> +Rullgardinslistorna kan erbjuda färdiggjorda reguljära uttryck pÃ¥ flera sprÃ¥k. + + + + Checking this option may reduce flickering, but it also might produce that the video won't be displayed properly. + Detta alternativ kan minska flimmer, but det skulle ocksÃ¥ kunna göra sÃ¥ att videon inte visas pÃ¥ rätt sätt. + + + + If checked, smplayer will store the output of mplayer (you can see it in <b>Options->View logs->mplayer</b>). In case of problems this log can contain important information, so it's recommended to keep this option checked. + SMPlayer sparar output frÃ¥n MPlayer (se <b>Inställningar -> Visa loggar -> mplayer</b>). Vid eventuella problem kan denna logg innehÃ¥lla viktig information, sÃ¥ se till att detta alternativ är förbockat. + + + + If this option is checked, smplayer will store the debugging messages that smplayer outputs (you can see the log in <b>Options->View logs->smplayer</b>). This information can be very useful for the developer in case you find a bug. + Om detta alternativ är förbockat sÃ¥ sparar SMPlayer debug-meddelanden frÃ¥n SMPlayer (loggen nÃ¥s under <b>Inställningar -> Visa loggar -> smplayer</b>. Denna information kan vara väldigt användbar för utveckaren om du stöter pÃ¥ en bugg. + + + + Filter for SMPlayer logs + + + + + This option allows to filter the smplayer messages that will be stored in the log. Here you can write any regular expression.<br>For instance: <i>^Core::.*</i> will display only the lines starting with <i>Core::</i> + Detta alternativ lÃ¥ter dig filtrera meddelanden frÃ¥n SMPlayer som sparas i loggfilen. Här kan du använda reguljära uttryck.<br>Exempel: <i>^Core::.*</i> visar bara rader som börjar med texten <i>Core::</i> + + + + &Monitor aspect: + + + + + &Run MPlayer in its own window + + + + + &Options: + &Alternativ: + + + + V&ideo filters: + V&ideofilter: + + + + Audio &filters: + Ljud&filter: + + + + &Colorkey: + + + + + &Don't repaint the background of the video window + + + + + Log &MPlayer output + + + + + Log &SMPlayer output + + + + + &Filter for SMPlayer logs: + + + + + &End of file: + + + + + &No video: + + + + + C&hange... + + + + + PrefAssociations + + + Warning + + + + + Not all files could be associated. Please check your security permissions and retry. + + + + + File Types + + + + + Select all + + + + + Check all file types in the list + + + + + Uncheck all file types in the list + + + + + List of file types + + + + + File types + + + + + Media files handled by SMPlayer: + + + + + Select All + + + + + Select None + + + + + Check the media file extensions you would like SMPlayer to handle. When you click Apply, the checked files will be associated with SMPlayer. If you uncheck a media type, the file association will be restored. + + + + + Select none + + + + + PrefDrives + + + Drives + Enheter + + + + Currently SMPlayer does not autodetect cdrom or dvd devices. So in order to play cdroms or dvds you must first select here your cdrom and dvd drives (can be the same). + För tillfället autodetekterar SMPlayer inte cdrom- eller dvd-enheter. SÃ¥ för att kunna spela upp cdrom och dvd mÃ¥ste du först ange dina enheter för cdrom och dvd (kan vara samma). + + + + icon + ikon + + + + Select your CD device: + Ange CD-enhet: + + + + Select your DVD device: + Ange DVD-enhet: + + + + CD device + + + + + Choose your CDROM device. It will be used to play VCDs and Audio CDs. + + + + + DVD device + + + + + Choose your DVD device. It will be used to play DVDs. + + + + + Select your &CD device: + + + + + Select your &DVD device: + + + + + PrefGeneral + + + General + Allmänt + + + + &General + + + + + Paths + Sökvägar + + + + Select... + Välj ... + + + + Folder for storing screenshots: + Mapp för skärmdumpar: + + + + Search... + Sök ... + + + + Select the MPlayer executable: + Ange EXE-filen för MPlayer: + + + + Output drivers + Drivrutiner för output + + + + Video: + Video: + + + + Audio: + Tal: + + + + Media settings + Inställningar för media + + + + Remember settings for all files (audio track, subtitles...) + Kom ihÃ¥g inställningarna för alla filer (ljudspÃ¥r, undertexter ...) + + + + Don't remember time position (files start playing from the beginning) + Kom inte ihÃ¥g tidsposition (filerna spelas upp frÃ¥n början) + + + + Preferred audio and subtitles + StandardsprÃ¥k - tal och undertexter + + + + Subtitles: + Undertexter: + + + + &Video and audio + + + + + Video + Video + + + + Use software video equalizer + Använd mjukvarubaserad videoequalizer + + + + Start videos in fullscreen + Starta video i helskärmsläge + + + + Disable screensaver + Inaktivera skärmsläckare + + + + Audio + Ljud + + + + Use software volume control + Använd mjukvarubaserad volymkontroll + + + + AC3/DTS pass-through S/PDIF + AC3/DTS pass-through S/PDIF + + + + Select the mplayer executable + Markera mplayers programfil + + + + Executables + Program + + + + All files + Alla filer + + + + Select a directory + Välj en mapp + + + + MPlayer executable + + + + + Here you must specify the mplayer executable that smplayer will use.<br>smplayer requires at least mplayer 1.0rc1 (svn recommended).<br><b>If this setting is wrong, smplayer won't be able to play anything!</b> + Här mÃ¥ste du ange EXE-filen till den MPlayer som SMPlayer ska använda.<br>SMPlayer kräver minst MPlayer 1.0rc1 (svn rekommenderas).<br><b>Om denna sökväg är felaktig sÃ¥ kommer inte SMPlayer att spela nÃ¥gonting alls!</b> + + + + Screenshots folder + + + + + Here you can specify a folder where the screenshots taken by smplayer will be stored. If this field is empty the screenshot feature will be disabled. + Här kan du ange den mapp där skärmdumpar frÃ¥n SMPlayer ska sparas. Om detta fält är tomt sÃ¥ kan du inte ta nÃ¥gra skärmdumpar. + + + + Video output driver + + + + + Select the video output driver. Usually xv (linux) and directx (windows) provide the best performance. + Välj drivrutiner för video output. Vanligtvis ger xv (Linux) och DirectX (Windows) bäst resultat. + + + + Audio output driver + + + + + Select the audio output driver. + Välj drivrutin för ljudoutput. + + + + Remember settings + + + + + Usually smplayer will remember the settings for each file you play (audio track selected, volume, filters...). Uncheck this option if you don't like this feature. + Vanligtvis kommer SMPlayer ihÃ¥g inställningarna för varje fil du spelar upp (valt ljudspÃ¥r, volym, filter, ...) Avmarkera detta alternativ om du inte vill ha denna funktion. + + + + Don't remember time position + + + + + If you check this option, smplayer will play all files from the beginning. + Om du markerar detta alternativ sÃ¥ spelar SMPlayer alla filer frÃ¥n början. + + + + Preferred audio language + + + + + Here you can type your preferred language for the audio streams. When a media with multiple audio streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the audio streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the audio track if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + Här kan du skriva in det sprÃ¥k du föredrar i frÃ¥ga om ljudströmmar. När media med flera ljudströmmar öppnas, sÃ¥ försöker SMPlayer använda det sprÃ¥k du föredrar.<br>Detta fungerar endast med media som innehÃ¥ller information om sprÃ¥ket i ljudströmmen, som t.ex. DVD eller MKV-filer.<br>Detta fält accepterar reguljära uttryck. Exempel: <b>es|esp|spa</b> om det matchar med <i>es</i>, <i>esp</i> eller <i>spa</i>. + + + + Preferred subtitle language + + + + + Here you can type your preferred language for the subtitle stream. When a media with multiple subtitle streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the subtitle streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the subtitle stream if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + Här kan du skriva in det sprÃ¥k du föredrar i frÃ¥ga om undertexter. När media med flera undertextströmmar öppnas, sÃ¥ försöker SMPlayer använda det sprÃ¥k du föredrar.<br>Detta fungerar endast med media som innehÃ¥ller information om sprÃ¥ket i undertextströmmen, som t.ex. DVD eller MKV-filer.<br>Detta fält accepterar reguljära uttryck. Exempel: <b>es|esp|spa</b> om det matchar med <i>es</i>, <i>esp</i> eller <i>spa</i>. + + + + Software video equalizer + + + + + You can check this option if video equalizer is not supported by your graphic card or the selected video output driver.<br><b>Note:</b> this option can be incompatible with some video output drivers. + Välj detta alternativ om ditt grafikkort inte stöder equalizer för video eller den valda drivrutinen för video. <br><b>OBS:</b> Detta alternativ kan vara inkompatibelt med vissa drivrutiner för video-output. + + + + If this option is checked, all videos will start to play in fullscreen mode. + Om du markerar detta alternativ sÃ¥ spelas all video upp i helskärmsläge. + + + + Check this option to disable the screensaver while playing.<br>The screensaver will enabled again when play finishes.<br><b>Note:</b> This option works only in X11 and Windows. + Välj detta alternativ för att inaktivera skärmsläckaren under uppspelning.<br>Skärmsläckaren aktiveras igen efterÃ¥t.<br><b>OBS:</b> Detta fungerar endast i X11 och Windows. + + + + Software volume control + + + + + Check this option to use the software mixer, instead of using the sound card mixer. + Använd detta alternativ om du vill använda ett mjukvarubasat mixerbord i stället för det i ljudkortet. + + + + Postprocessing quality + + + + + Dynamically changes the level of postprocessing depending on the available spare CPU time. The number you specify will be the maximum level used. Usually you can use some big number. + Ändrar dynamiskt nivÃ¥n pÃ¥ efterbehandlingen beroende pÃ¥ tillgänglig CPU-tid. Den siffra du anger bestämmer den maximala nivÃ¥n. Vanligen kan du använda nÃ¥got högt tal. + + + + Change volume + + + + + If checked, SMPlayer will remember the volume for every file and will restore it when played again. For new files the default volume will be used. + + + + + Default volume: + Normalvolym: + + + + 0 + 0 + + + + &Change volume on every file + + + + + &Search... + + + + + S&elect... + + + + + Select the &MPlayer executable: + + + + + &Folder for storing screenshots: + + + + + V&ideo: + + + + + &Audio: + + + + + &Don't remember time position (files start playing from the beginning) + + + + + &Remember settings for all files (audio track, subtitles...) + + + + + A&udio: + + + + + Su&btitles: + + + + + &Use software video equalizer + + + + + &Quality: + + + + + Start videos in &fullscreen + + + + + Disable &screensaver + + + + + &Default volume: + + + + + Use s&oftware volume control + + + + + Ma&x. Amplification: + + + + + &AC3/DTS pass-through S/PDIF + + + + + Direct rendering + + + + + If checked, turns on direct rendering (not supported by all codecs and video outputs)<br><b>WARNING:</b> May cause OSD/SUB corruption! + + + + + Double buffering + + + + + D&irect rendering + + + + + Dou&ble buffering + + + + + Double buffering fixes flicker by storing two frames in memory, and displaying one while decoding another. If disabled it can affect OSD negatively, but often removes OSD flickering. + + + + + &Enable postprocessing by default + + + + + Volume &normalization by default + + + + + Close when finished + + + + + If this option is checked, the main window will be automatically closed when the current file/playlist finishes. + + + + + &Close when finished + + + + + 2 (Stereo) + + + + + 4 (4.0 Surround) + + + + + 6 (5.1 Surround) + + + + + C&hannels by default: + + + + + &Pause when minimized + + + + + Pause when minimized + + + + + If this option is enabled, the file will be paused when the main window is hidden. When the window is restored, play will be resumed. + + + + + Enable postprocessing by default + + + + + Max. Amplification + + + + + Volume normalization by default + + + + + Maximizes the volume without distorting the sound. + + + + + Default volume + + + + + Sets the initial volume that new files will use. + + + + + Channels by default + + + + + Sets the maximum amplification level in percent (default: 110). A value of 200 will allow you to adjust the volume up to a maximum of double the current level. With values below 100 the initial volume (which is 100%) will be above the maximum, which e.g. the OSD cannot display correctly. + + + + + Uses hardware AC3 passthrough + + + + + Requests the number of playback channels. MPlayer asks the decoder to decode the audio into as many channels as specified. Then it is up to the decoder to fulfill the requirement. This is usually only important when playing videos with AC3 audio (like DVDs). In that case liba52 does the decoding by default and correctly downmixes the audio into the requested number of channels. NOTE: This option is honored by codecs (AC3 only), filters (surround) and audio output drivers (OSS at least). + + + + + Postprocessing will be used by default on new opened files. + + + + + PrefInput + + + Keyboard and mouse + Tangentbord och mus + + + + &Keyboard + &Tangentbord + + + + icon + ikon + + + + Here you can change any key shortcut. To do it double click or start typing over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + Här kan du ändra kortkommandon. Dubbelklicka eller börja skriva över ett kortkommandofält. Du kan ocksÃ¥ spara listan och dela med dig av den till andra användare eller datorer. + + + + &Mouse + &Mus + + + + Button functions: + Knappfunktioner: + + + + Media seeking + Snabbspolning + + + + Volume control + Volymkontroll + + + + Zoom video + Zooma video + + + + None + Ingen + + + + Here you can change any key shortcut. To do it double click or press enter over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + + + + + &Left click + + + + + &Double click + + + + + &Wheel function: + + + + + Shortcut editor + + + + + This table allows you to change the key shortcuts of most available actions. Double click or press enter on a item, or press the <b>Change shortcut</b> button to enter in the <i>Modify shortcut</i> dialog. There are two ways to change a shortcut: if the <b>Capture</b> button is on then just press the new key or combination of keys that you want to assign for the action (unfortunately this doesn't work for all keys). If the <b>Capture</b> button is off then you could enter the full name of the key. + + + + + Left click + + + + + Select the action for left click on the mouse. + + + + + Double click + + + + + Select the action for double click on the mouse. + + + + + Wheel function + + + + + Select the action for the mouse wheel. + + + + + PrefInterface + + + Interface + Gränssnitt + + + + Bulgarian + bulgariska + + + + Czech + tjeckiska + + + + German + tyska + + + + Greek + grekiska + + + + English + Engelska + + + + Spanish + Spanska + + + + Finnish + finska + + + + French + franska + + + + Hungarian + ungerska + + + + Italian + italienska + + + + Japanese + japanska + + + + Georgian + georgiska + + + + Dutch + holländska + + + + Polish + polska + + + + Portuguese - Brazil + + + + + Portuguese - Portugal + + + + + Romanian + + + + + Russian + + + + + Slovak + slovakiska + + + + Serbian + serbiska + + + + Swedish + svenska + + + + Turkish + + + + + Ukrainian + ukrainska + + + + Simplified-Chinese + Förenklad kinesiska + + + + Traditional Chinese + traditionell kinesiska + + + + <Autodetect> + <Autodetektera> + + + + Default + Standard + + + + &Interface + + + + + Seeking + Sökning + + + + Never + Aldrig + + + + Whenever it's needed + När det behövs + + + + Only after loading a new video + Endast när ny video öppnats + + + + Recent files + Tidigare + + + + Language + SprÃ¥k (Language) + + + + Here you can change the language of the application. + + + + + Instances + + + + + Catalan + + + + + Basque + + + + + Galician + + + + + &Short jump + + + + + &Medium jump + + + + + &Long jump + + + + + Mouse &wheel jump + + + + + &Use only one running instance of SMPlayer + + + + + SMPlayer will listen to this &port to receive commands from other instances: + + + + + Ma&x. items + + + + + St&yle: + + + + + Ico&n set: + + + + + L&anguage: + + + + + Main window + + + + + Auto&resize: + + + + + R&emember position and size + + + + + Default font: + + + + + &Change... + + + + + PrefPerformance + + + Performance + Prestanda + + + + &Performance + + + + + Priority + Prioritering + + + + Select the priority for the MPlayer process. + Ange prioritet för MPlayer-processen. + + + + Priority: + Prioritet: + + + + realtime + realtid + + + + high + hög + + + + abovenormal + över normal + + + + normal + normal + + + + belownormal + under normal + + + + idle + inaktiv + + + + Cache + Cache + + + + Size: + Storlek: + + + + KB + kB + + + + Use cache + Använd cache + + + + Setting a cache may improve performance on slow media + En cache kan förbättra prestanda för lÃ¥ngsamma media. + + + + Allow frame drop + TillÃ¥t 'frame drop' + + + + Allow hard frame drop (can lead to image distortion) + TillÃ¥t 'hard frame drop' (kan leda till distortion i bilden) + + + + Synchronization + Synkronisering + + + + Audio/video auto synchronization + Autosynkronisering av ljud/video + + + + Factor: + Faktor: + + + + Fast audio track switching + Snabbt byte av ljudspÃ¥r + + + + Fast seek to chapters in dvds + Snabbsökning till kapitel pÃ¥ DVD + + + + Set process priority for mplayer according to the predefined priorities available under Windows.<br><b>WARNING:</b> Using realtime priority can cause system lockup. + Ange processprioritering för MPlayer enligt de fördefinierade prioriteter tillgängliga under Windows.<br><b>VARNING:</b> Realtidsprioritet kan lÃ¥sa systemet helt. + + + + <br><b>Note:</b> This option is for Windows only. + <br><b>OBS:</b> Detta alternativ gäller endast Windows. + + + + This option specifies how much memory (in kBytes) to use when precaching a file or URL. Especially useful on slow media. + Detta alternativ anger hur mycket minne (i kB) som ska användas när en fil eller URL cachas i förväg. Speciellt användbart vid lÃ¥ngsamma media. + + + + Skip displaying some frames to maintain A/V sync on slow systems. + Strunta i att visa vissa bildrutor för att bibehÃ¥lla bild-ljudsynkroniseringen pÃ¥ lÃ¥ngsamma system. + + + + Allow hard frame drop + + + + + More intense frame dropping (breaks decoding). Leads to image distortion! + Hoppar över ännu fler bildrutor. Leder till distortion av bilden! + + + + Gradually adjusts the A/V sync based on audio delay measurements. + Anpassar gradvis ljud-bildsynkroniseringen baserat pÃ¥ mätningar av ljudfördröjning. + + + + Priorit&y: + + + + + Si&ze: + + + + + &Use cache + + + + + &Allow frame drop + + + + + Allow &hard frame drop (can lead to image distortion) + + + + + Audio/&video auto synchronization + + + + + Fact&or: + + + + + &Fast audio track switching + + + + + Fast &seek to chapters in dvds + + + + + Create index if needed + + + + + Rebuilds index of files if no index was found, allowing seeking. Useful with broken/incomplete downloads, or badly created files. This option only works if the underlying media supports seeking (i.e. not with stdin, pipe, etc).<br> Note: the creation of the index may take some time. + + + + + &Create index if needed + + + + + If checked, it will try the fastest method to switch audio tracks but might not work with some formats. + + + + + If checked, it will try the fastest method to seek to chapters but it might not work with some discs. + + + + + PrefSubtitles + + + Subtitles + + + + + Choose a ttf file + Välj en TTF-fil + + + + Truetype Fonts + TrueType-teckensnitt + + + + &Subtitles + &Undertexter + + + + Autoload + Autoöppna + + + + Autoload subtitles files (*.srt, *.sub...): + Autoöppna textfiler (*.srt, *.sub...): + + + + Select first available subtitle + Välj första tillgängliga undertext + + + + Same name as movie + Samma namn som filmen + + + + All subs containing movie name + Alla texter som innehÃ¥ller filmnamnet + + + + All subs in directory + Alla undertexter i mappen + + + + Default subtitle encoding: + Standardkodning för undertexter: + + + + Position + Position + + + + Default position of the subtitles on screen + Standardposition för undertexterna + + + + 0 + 0 + + + + Top + Uppe + + + + Bottom + Nere + + + + Include subtitles on screenshots + Inkludera undertext i skärmdump + + + + Use -subfont option (required by recent MPlayer releases) + Använd alternativet -subfont (krävs av senare utgÃ¥vor av MPlayer) + + + + &Font + + + + + Font + Teckensnitt + + + + TTF font: + TTF-font: + + + + Search... + Sök ... + + + + System font: + Systemfont: + + + + Select the font which will be used for subtitles (and OSD): + Välj teckensnitt för undertexter (och meddelanden pÃ¥ skärmen): + + + + Size + Storlek + + + + Autoscale: + Autoskala: + + + + No autoscale + Ej autoskala + + + + Proportional to movie height + Proportionell mot filmhöjd + + + + Proportional to movie width + Proportionell mot filmbredd + + + + Proportional to movie diagonal + Proportionell mot diagonalen + + + + Scale: + Skala: + + + + SSA/&ASS library + SSA/&ASS-library + + + + The new SSA/ASS library will provide nice styled subtitles for external SSA/ASS subtitles files and Matroska tracks. But it will be used too for rendering other formats like SUB and SRT files. + Det nya SSA/ASS-libraryt erbjuder snygga undertexter för externa SSA/ASS-undertexter och MatroskaspÃ¥r. Men det kommer ocksÃ¥ att användas för andra format som SUB- och SRT-filer. + + + + Use SSA/ASS library for subtitle rendering + Använd SSA/ASS för undertexter + + + + Text color: + Textfärg: + + + + Border color: + Ramfärg: + + + + Here you can override styles for SSA/ASS subtitles. It can be also used for fine-tuning the rendering of SRT and SUB subtitles by the SSA/ASS library. Example: <b>Bold=1,Outline=2,Shadow=4</b> + Här kan du Ã¥sidosätta format för SSA/ASS-undertexter. Du kan ocksÃ¥ finjustera Ã¥tergivningen av srt- och sub-undertexter med SSA/ASS-library. Exempel: <b>Bold=1,Outline=2,Shadow=2</b> {1,?} {2,?} {4<?} + + + + Styles: + Format: + + + + Subtitle position + + + + + This option specifies the position of the subtitles over the video window. <i>100</i> means the bottom, while <i>0</i> means the top. + Detta alternativ anger position för undertexterna i videofönstret. <i>100</i> betyder längst ner, medan <i>0</i> betyder längst upp. + + + + SSA/ASS styles + + + + + Au&toload subtitles files (*.srt, *.sub...): + + + + + S&elect first available subtitle + + + + + &Default subtitle encoding: + + + + + Default &position of the subtitles on screen + + + + + &Include subtitles on screenshots + + + + + &Use -subfont option (required by recent MPlayer releases) + + + + + &TTF font: + + + + + Sea&rch... + + + + + S&ystem font: + + + + + A&utoscale: + + + + + S&cale: + + + + + &Use SSA/ASS library for subtitle rendering + + + + + &Text color: + + + + + &Border color: + + + + + St&yles: + + + + + PreferencesDialog + + + SMPlayer - Help + + + + + OK + + + + + Cancel + + + + + Apply + + + + + Help + + + + + SMPlayer - Preferences + SMPlayer - Inställningar + + + + QObject + + + 1 second + 1 sekund + + + + %1 seconds + %1 sekunder + + + + 1 minute + 1 minut + + + + 1 minute and 1 second + 1 minut och 1 sekund + + + + 1 minute and %1 seconds + 1 minut och %1 sekunder + + + + %1 minutes + %1 minuter + + + + %1 minutes and 1 second + %1 minuter och 1 sekund + + + + %1 minutes and %2 seconds + %1 minuter och %2 sekunder + + + + will show this message and then will exit. + + + + + 'media' is any kind of file that SMPlayer can open. It can be a local file, a DVD (e.g. dvd://1), an Internet stream (e.g. mms://....) or a local playlist in format m3u. If the -playlist option is used, that means that SMPlayer will pass the -playlist option to MPlayer, so MPlayer will handle the playlist, not SMPlayer. + + + + + the main window will be closed when the file/playlist finishes. + + + + + This is SMPlayer v. %1 running on %2 + + + + + tries to make a connection to another running instance and send to it the specified action. Example: -send-action pause The rest of options (if any) will be ignored and the application will exit. It will return 0 on success or -1 on failure. + + + + + action_list is a list of actions separated by spaces. The actions will be executed just after loading the file (if any) in the same order you entered. For checkable actions you can pass true or false as parameter. Example: -actions "fullscreen compact true". Quotes are necessary in case you pass more than one action. + + + + + media + + + + + if there's another instance running, the media will be added to that instance's playlist. If there's no other instance, this option will be ignored and the files will be opened in a new instance. + + + + + specifies the directory for the configuration file (smplayer.ini). + + + + + the main window won't be closed when the file/playlist finishes. + + + + + Usage: %1 [-ini-path directory] [-send-action action_name] [-actions action_list [-close-at-end] [-no-close-at-end] [-fullscreen] [-no-fullscreen] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + + + + + the video will be played in fullscreen mode. + + + + + the video will be played in window mode. + + + + + SeekWidget + + + icon + ikon + + + + label + etikett + + + + ShortcutGetter + + + Modify shortcut + + + + + Clear + + + + + Press the key combination you want to assign + + + + + Capture + + + + + Capture keystrokes + + + + + VideoEqualizer + + + Equalizer + Equalizer + + + + Contrast + Kontrast + + + + Brightness + Ljusstyrka + + + + Hue + Nyans + + + + Saturation + Färgmättnad + + + + Gamma + Gamma + + + + &Reset + &Ã…terställ + + + + &Set as default values + &Ange som standardvärden + + + + Use the current values as default values for new videos. + Använd aktuella värden som standardvärden för nya videor. + + + + Set all controls to zero. + Nollställ alla kontroller. + + + diff --git a/retroshare-gui/src/apps/smplayer/translations/smplayer_tr.qm b/retroshare-gui/src/apps/smplayer/translations/smplayer_tr.qm new file mode 100644 index 000000000..520f902d7 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/translations/smplayer_tr.qm differ diff --git a/retroshare-gui/src/apps/smplayer/translations/smplayer_tr.ts b/retroshare-gui/src/apps/smplayer/translations/smplayer_tr.ts new file mode 100644 index 000000000..7d134d3a4 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/translations/smplayer_tr.ts @@ -0,0 +1,3872 @@ + + + + AboutDialog + + + About SMPlayer + SMPlayer hakkında + + + + Version: %1 + Sürüm: %1 + + + + 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. + Bu ücretsiz bir yazılımdır; "Free Software Foundation" tarafından yayınlanan GNU lisansının -isteÄŸinize baÄŸlı olarak- 2. veya daha ileriki bir sürümünün koÅŸullarını gözeterek çoÄŸaltabilir ve/veya deÄŸiÅŸtirebilirsiniz. + + + + Translators: + Çevirenler: + + + + German + Almanca + + + + Slovak + Slovakça + + + + Italian + Ä°talyanca + + + + French + Fransızca + + + + Simplified-Chinese + BasitleÅŸtirilmiÅŸ Çince + + + + Russian + Rusça + + + + Hungarian + Macarca + + + + Polish + Lehçe + + + + Japanese + Japonca + + + + Dutch + Felemenkçe + + + + Ukrainian + Ukraynaca + + + + Georgian + Gürcüce + + + + Czech + Çekçe + + + + Bulgarian + Bulgarca + + + + Logo designed by %1 + Logo %1 tarafından tasarlanmıştır + + + + Get updates at: %1 + Güncellemeleri edinin: %1 + + + + Turkish + Türkçe + + + + Swedish + Ä°sveççe + + + + Serbian + Sırpça + + + + Traditional Chinese + Geleneksel Çince + + + + Romanian + Romence + + + + Portuguese - Brazil + Brezilya Portegizcesi + + + + Portuguese - Portugal + Portekiz Portegizcesi + + + + Compiled with Qt %1 + + + + + %1, %2 and %3 + + + + + %1 and %2 + + + + + http://smplayer.sourceforge.net/en/windows/download.php + If the web page is translated into your language you can change the URL so it points to the download page in the translation.Otherwise leave as is. + + + + + http://smplayer.sourceforge.net/en/linux/download.php + If the web page is translated into your language you can change the URL so it points to the download page in the translation.Otherwise leave as is. + + + + + <b>%1</b>: %2 + + + + + ActionsEditor + + + Name + Ä°sim + + + + Description + Tanım + + + + Shortcut + Kısayol + + + + &Save + &Kaydet + + + + &Load + &Yükle + + + + Key files + Anahtar dosyaları + + + + Choose a filename + Bir dosya ismi seçin + + + + Confirm overwrite? + Ãœstüne yazmayı onaylıyor musunuz? + + + + The file %1 already exists. +Do you want to overwrite? + %1 dosyası zaten var. +Ãœstüne yazmak istiyor musunuz? + + + + Error + Hata + + + + The file couldn't be saved + Dosya kaydedilemedi + + + + Choose a file + Bir dosya seçin + + + + The file couldn't be loaded + Dosya yüklenemedi + + + + &Change shortcut... + + + + + BaseGui + + + &File... + Dosy&a... + + + + D&irectory... + &Klasör... + + + + &Playlist... + Oynatma &Listesi... + + + + V&CD + V&CD + + + + &DVD from drive + Sabit diskteki &DVD + + + + D&VD from folder... + D&VD'yi klasörden aç... + + + + &URL... + &URL... + + + + C&lose + &Kapat + + + + P&lay + &Oynat + + + + &Pause + Du&raklat + + + + &Stop + &Durdur + + + + &Frame step + &Bir kare ilerle + + + + Play / Pause + Oynat / Duraklat + + + + Pause / Frame step + Duraklat / Bir kare ilerle + + + + &Repeat + &Tekrarla + + + + &Normal speed + &Normal Hızda + + + + &Halve speed + &Yarı Hızda + + + + &Double speed + Ä°ki ka&t hızlı + + + + Speed &-10% + %10 Yava&ÅŸlat + + + + Speed &+10% + %10 Hı&zlandır + + + + Sp&eed + &Hız + + + + &Fullscreen + Tam &ekran + + + + &Compact mode + &Büyük ekran + + + + &Equalizer + &EÅŸitleyici + + + + &Screenshot + Ekran görüntü&sü + + + + S&tay on top + Her zaman &üstte + + + + Zoom &- + UzaklaÅŸtır &- + + + + Zoom &+ + YakınlaÅŸtır &+ + + + + &Reset + &Sıfırla + + + + Move &left + Sol&a taşı + + + + Move &right + &SaÄŸa taşı + + + + Move &up + &Yukarı taşı + + + + Move &down + &AÅŸağı taşı + + + + &Postprocessing + &Postprocessing + + + + &Autodetect phase + &Autodetect phase + + + + &Deblock + &Deblock + + + + De&ring + De&ring + + + + Add n&oise + N&oise ekle + + + + F&ilters + F&iltreler + + + + &Mute + &Sessiz + + + + Volume &- + Ses &- + + + + Volume &+ + Ses &+ + + + + &Delay - + Ä°ler&i al - + + + + D&elay + + &Geri al + + + + + &Extrastereo + &Extrastereo + + + + &Karaoke + &Karaoke + + + + &Filters + &Filtreler + + + + &Load... + &Yükle... + + + + U&nload + &Kaldır + + + + Delay &- + Ä°ler&i al - + + + + Delay &+ + &Geri al + + + + + &Up + Y&ukarı + + + + &Down + A&ÅŸağı + + + + &Playlist + &Oynatma listesi + + + + View &info and properties... + &Bilgi ve özelliklere bak... + + + + &Show frame counter + Kare &sayacını göster + + + + P&references + &Özellikler + + + + &View logs + Kay&ıtlara bak + + + + About &Qt + &Qt Hakkında + + + + About &SMPlayer + &SMPlayer Hakkında + + + + &Open + &Aç + + + + &Play + &Oynat + + + + &Video + V&ideo + + + + &Audio + &Ses + + + + &Subtitles + Alt &yazı + + + + &Browse + &Gezin + + + + Op&tions + S&eçenekler + + + + &Help + &Yardım + + + + &Recent files + &Son dosyalar + + + + &Clear + &Temizle + + + + Si&ze + &Boyut + + + + &Aspect ratio + En/boy or&anı + + + + &Deinterlace + &Deinterlace + + + + De&noise + De&noise + + + + &Pan && scan + &Pan && scan + + + + &Autodetect + &Otomatik + + + + &4:3 + &4:3 + + + + &5:4 + &5:4 + + + + &14:9 + &14:9 + + + + 16:&9 + 16:&9 + + + + 1&6:10 + 1&6:10 + + + + &2.35:1 + &2.35:1 + + + + 4:3 &Letterbox + 4:3 &Letterbox + + + + 16:9 L&etterbox + 16:9 L&etterbox + + + + 4:3 &Panscan + 4:3 &Panscan + + + + 4:3 &to 16:9 + 4:3 &to 16:9 + + + + &None + &Hiçbiri + + + + &Lowpass5 + &Lowpass5 + + + + Linear &Blend + Linear &Blend + + + + N&ormal + N&ormal + + + + &Soft + &Hafif + + + + &Track + &Ä°z + + + + &Channels + &Kanallar + + + + &Stereo mode + &Stereo mode + + + + &Default + &Varsayılan + + + + &Stereo + &Steryo + + + + &4.0 Surround + &4.0 Surround + + + + &5.1 Surround + &5.1 Surround + + + + &Left channel + &Sol kanal + + + + &Right channel + &SaÄŸ kanal + + + + &Select + &Seç + + + + &Title + &BaÅŸlık + + + + &Chapter + &Bölüm + + + + &Angle + &Açı + + + + &OSD + &OSD + + + + &Disabled + &Devredışı + + + + &Seek bar + G&ezinme çubuÄŸu + + + + &Time + &Süre + + + + Time + T&otal time + Süre + T&oplam süre + + + + SMPlayer - mplayer log + SMPlayer - mplayer kaydı + + + + SMPlayer - smplayer log + SMPlayer - smplayer kaydı + + + + <empty> + <boÅŸ> + + + + Video + Video + + + + Audio + Ses + + + + Playlists + Oynatma listesi + + + + All files + Tüm dosyalar + + + + Choose a file + Bir dosya seçin + + + + SMPlayer - Information + SMPlayer - Bilgi + + + + The CDROM / DVD drives are not configured yet. +The configuration dialog will be shown now, so you can do it. + CDROM / DVD cihazları henüz yapılandırılmadı. +Tamama bastığınızda ayarları yapabileceÄŸiniz ekran açılacak. + + + + Choose a directory + Bir klasör seçin + + + + Subtitles + Alt yazılar + + + + About Qt + Qt Hakkında + + + + Playing %1 + %1'i oynatıyor + + + + Pause + Duraklat + + + + Stop + Durdur + + + + &Previous line in subtitles + Bir &önceki satır + + + + N&ext line in subtitles + Bir &sonraki satır + + + + -%1 + -%1 + + + + +%1 + +%1 + + + + Dec volume (2) + Sesi kıs (2) + + + + Inc volume (2) + Sesi yükselt (2) + + + + Exit fullscreen + Tam ekrandan çık + + + + OSD - Next level + OSD - Sonraki seviye + + + + Dec contrast + Zıtlığı azalt + + + + Inc contrast + Zıtlığı arttır + + + + Dec brightness + Parlaklığı azalt + + + + Inc brightness + Barlaklığı arttır + + + + Dec hue + Renk tonunu azalt + + + + Inc hue + Renk tonunu arttır + + + + Dec saturation + DoygunluÄŸu azalt + + + + Dec gamma + Gamayı azalt + + + + Next audio + Bir sonraki ses + + + + Next subtitle + Bir sonraki alt yazı + + + + Next chapter + Bir sonraki bölüm + + + + Previous chapter + Bir önceki bölüm + + + + Inc saturation + DoygunluÄŸu arttır + + + + Inc gamma + Gamayı arttır + + + + Toggle double size + Boyutu iki katına çıkar + + + + &Load external file... + Harici dosya yük&le... + + + + &Kerndeint + &Kerndeint + + + + &Yadif (normal) + &Yadif (normal) + + + + Y&adif (double framerate) + &Yadif (kare sayısını ikiye katla) + + + + &Next + &Sonraki + + + + Pre&vious + &Önceki + + + + Volume &normalization + Ses &normalleÅŸtirme + + + + &Audio CD + &Müzik CD'si + + + + Denoise nor&mal + + + + + Denoise &soft + + + + + Denoise o&ff + + + + + Use SSA/&ASS library + + + + + Flip i&mage + + + + + &Toggle double size + + + + + BaseGuiPlus + + + SMPlayer is still running here + SMPlayer zaten çalışıyor + + + + S&how icon in system tray + Ä°konu system tray'de &göster + + + + &Recent files + &Son açılan dosyalar + + + + &Hide + &Gizle + + + + &Restore + Ge&ri yükle + + + + &Quit + &Çıkış + + + + Playlist + Oynatma listesi + + + + Core + + + Brightness: %1 + Parlaklık: %1 + + + + Contrast: %1 + Zıtlık: %1 + + + + Gamma: %1 + Gama: %1 + + + + Hue: %1 + Renk tonu: %1 + + + + Saturation: %1 + Doygunluk: %1 + + + + Volume: %1 + Ses: %1 + + + + Zoom: %1 + Yakınlık: %1 + + + + DefaultGui + + + Welcome to SMPlayer + SMPlayer'a HoÅŸ Geldiniz + + + + &Main toolbar + &Ana araç çubuÄŸu + + + + &Language toolbar + &Dil araç çubuÄŸu + + + + &Toolbars + &Araç çubukları + + + + Volume + Ses + + + + Audio + Ses + + + + Subtitle + Alt yazı + + + + Playlist + Oynatma listesi + + + + Encodings + + + Western European Languages + Batı Avrupa Dilleri + + + + Western European Languages with Euro + Batı Avrupa Dilleri (€ içeren) + + + + Slavic/Central European Languages + Slav/Orta Avrupa Dilleri + + + + Esperanto, Galician, Maltese, Turkish + Esperanto, Galiçyaca, Maltaca, Türkçe + + + + Old Baltic charset + Eski Baltık Alfabesi + + + + Cyrillic + Kiril Alfabesi + + + + Arabic + Arapça + + + + Modern Greek + ÇaÄŸdaÅŸ Yunanca + + + + Turkish + Türkçe + + + + Baltic + Baltık Alfabesi + + + + Celtic + Keltçe + + + + Hebrew charsets + Ä°branice + + + + Russian + Rusça + + + + Ukrainian, Belarusian + Ukraynaca, Beyaz Rusça + + + + Simplified Chinese charset + BasitleÅŸtirilmiÅŸ Çin Alfabesi + + + + Traditional Chinese charset + Geleneksel Çin Alfabesi + + + + Japanese charsets + Japon Alfabesi + + + + Korean charset + Kore Alfabesi + + + + Thai charset + Tay Alfabesi + + + + Cyrillic Windows + Kiril Alfabesi Windows + + + + Slavic/Central European Windows + Slav/Orta Avrupa Windows + + + + Arabic Windows + + + + + EqSlider + + + icon + ikon + + + + FilePropertiesDialog + + + OK + + + + + Cancel + + + + + Apply + + + + + SMPlayer - File properties + SMPlayer - Dosya özellikleri + + + + &Information + &Bilgi + + + + &Demuxer + &Demuxer + + + + &Select the demuxer that will be used for this file: + Bu do&sya için kullanılacak demuxer'ı seçin: + + + + &Reset + &Sıfırla + + + + &Video codec + &Video kodlayıcı + + + + &Select the video codec: + Video kodlayıcısını &seçin: + + + + A&udio codec + &Ses kodlayıcısı + + + + &Select the audio codec: + &Ses kodlayıcısını seçin: + + + + &MPlayer options + &MPlayer seçenekleri + + + + Additional Options for MPlayer + + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + Burada mplayer'a fazladan özellikler ekleyebilirsiniz. +Özellikler arasında boÅŸluk bırakmayı unutmayın. +Örnek: -flip -nosound + + + + &Options: + &Seçenekler: + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + Ä°lave video filtreleri de ekleyebilirsiniz. +Filtreleri "," ile ayırın. BoÅŸluk kullanmayın! +Örnek: scale=512:-2,eq2=1 + + + + V&ideo filters: + V&ideo filtreleri: + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + Ve son olarak ses filtreleri. Video filtrelerinde geçerli olan kurallar burada da geçerli. +Örnek: resample=44100:0:0,volnorm + + + + Audio &filters: + Ses &filtreleri: + + + + InfoFile + + + General + Genel + + + + Size + Boyut + + + + %1 KB (%2 MB) + %1 KB (%2 MB) + + + + URL + URL + + + + Length + Süre + + + + Demuxer + Demuxer + + + + Name + Ä°sim + + + + Artist + Oyuncu + + + + Author + Yazar + + + + Album + Albüm + + + + Genre + Tür + + + + Date + Tarih + + + + Track + Parça + + + + Copyright + Telif Hakkı + + + + Comment + Yorum + + + + Software + Yazılım + + + + Clip info + Parça hakkında bilgi + + + + Video + Video + + + + Resolution + Çözünürlük + + + + Aspect ratio + En/Boy Oranı + + + + Format + Biçim + + + + Bitrate + Bitrate + + + + %1 kbps + Saniyede %1 kb + + + + Frames per second + Kare/saniye + + + + Selected codec + Seçilen kodlayıcı + + + + Initial Audio Stream + Ä°lk Ses Akımı + + + + Rate + Oran + + + + %1 Hz + %1 Hz + + + + Channels + Kanallar + + + + Audio Streams + Ses Akımları + + + + # + Info for translators: this is a abbreviation for number + # + + + + Language + Dil + + + + ID + Info for translators: this is a identification code + ID + + + + empty + boÅŸ + + + + Subtitles + Alt yazılar + + + + Type + Tür + + + + Stream title + Yayının baÅŸlığı + + + + Stream URL + Yayının URL'si + + + + File + + + + + InputDVDDirectory + + + Choose a directory + Bir klasör seçin + + + + SMPlayer - Play a DVD from a folder + SMPlayer - Sabit diskteki DVD'yi oynat + + + + You can play a dvd from your hard disc. Just select the folder which contains the VIDEO_TS and AUDIO_TS directories. + Sabit diskinizde bulunan bir DVD'yi oynatabilirsiniz. VIDEO_TS ve AUDIO_TS klasörlerini içeren klasörü seçmeniz yeterli. + + + + Choose a directory... + Bir klasör seçin... + + + + InputURL + + + SMPlayer - Enter URL + + + + + &URL: + + + + + It's a &playlist + + + + + If this option is checked, the URL will be treated as a playlist: it will be opened as text and will play the URLs in it. + + + + + LogWindow + + + Choose a filename to save under + Kayıt dosyası için bir isim seçin + + + + Confirm overwrite? + Ãœstüne yazmayı onaylıyor musunuz? + + + + The file already exists. +Do you want to overwrite? + Dosya zaten var. +Ãœstüne yazmak istiyor musunuz? + + + + Error saving file + Dosyayı kaydederken hata oluÅŸtu + + + + The log couldn't be saved + Kayıt bilgisi kaydedilemedi + + + + Logs + Kayıtlar + + + + LogWindowBase + + + Log Window + Kayıt Penceresi + + + + Save + Kaydet + + + + Copy to clipboard + Panoya kopyala + + + + Close + Kapat + + + + &Close + &Kapat + + + + Playlist + + + Name + Ä°sim + + + + Length + Süre + + + + &Play + &Oynat + + + + &Edit + &Düzelt + + + + Playlists + Oynatma Listeleri + + + + Choose a file + Bir dosya seçin + + + + Choose a filename + Bir dosya ismi seçin + + + + Confirm overwrite? + Ãœstüne yazmayı onaylıyor musunuz? + + + + The file %1 already exists. +Do you want to overwrite? + %1 dosyası zaten var. +Ãœstüne yazmak istiyor musunuz? + + + + All files + Tüm dosyalar + + + + Select one or more files to open + Açmak üzere bir veya daha fazla dosya seçin + + + + Choose a directory + Bir klasör seçin + + + + Edit name + Ä°smi deÄŸiÅŸtirin + + + + Type the name that will be displayed in the playlist for this file: + Bu dosyanın oynatma listesinde gösterileceÄŸi ismi yazın: + + + + &Load + &Yükle + + + + &Save + &Kaydet + + + + &Next + &Sonraki + + + + Pre&vious + &Önceki + + + + Move &up + &Yukarı taşı + + + + Move &down + &AÅŸağı taşı + + + + &Repeat + &Tekrarla + + + + S&huffle + &Karışık + + + + Add &current file + &Hâlihazır dosyayı ekle + + + + Add &file(s) + &Dosya(ları) ekle + + + + Add &directory + &Klasör ekle + + + + Remove &selected + &Seçileni kaldır + + + + Remove &all + &Hepsini kaldır + + + + Add... + Ekle... + + + + Remove... + Kaldır... + + + + SMPlayer - Playlist + SMPlayer - Oynatma listesi + + + + Playlist modified + Oynatma listesi deÄŸiÅŸtirildi + + + + There are unsaved changes, do you want to save the playlist? + KaydedilmemiÅŸ deÄŸiÅŸiklikler var. Oynatma listesini kaydetmek ister misiniz? + + + + PrefAdvanced + + + Advanced + GeliÅŸmiÅŸ + + + + Auto + + + + + Don't repaint the background of the video window + Video penceresinin arka planını yeniden oluÅŸturma + + + + Checking this option may reduce flickering, but it also might produce that the video won't be displayed properly. + Bu seçeneÄŸi iÅŸaretlemek görüntüdeki titremeyi azaltabilir, fakat videonun bozuk görüntülenmesine de yol açabilir. + + + + Log MPlayer output + MPlayer çıktısının kaydını tut + + + + If checked, smplayer will store the output of mplayer (you can see it in <b>Options->View logs->mplayer</b>). In case of problems this log can contain important information, so it's recommended to keep this option checked. + Bu seçeneÄŸi iÅŸaretlerseniz, smplayer mplayer'ın çıktısını kaydedecek (kayıta <b>Seçenekler->Kayıtlara bak->mplayer</b>'dan bakabilirsiniz). Bir sorunla karşılaÅŸtığınızda kayıtlardaki bilgiler iÅŸinize yarayabilir. Bu yüzden seçeneÄŸin iÅŸaretli olması tavsiye edilir. + + + + Log SMPlayer output + SMPlayer çıktısının kaydını tut + + + + If this option is checked, smplayer will store the debugging messages that smplayer outputs (you can see the log in <b>Options->View logs->smplayer</b>). This information can be very useful for the developer in case you find a bug. + Bu seçeneÄŸi iÅŸaretlerseniz, smplayer debugging mesajlarını kaydedecek (kayıta <b>Seçenekler->Kayıtlara bak->smplayer</b>'dan bakabilirsiniz). Bu kayıttaki bilgiler bir bug bulmanız halinde smplayer'ı geliÅŸtirenlerin iÅŸine yarayacaktır. + + + + Filter for SMPlayer logs + + + + + This option allows to filter the smplayer messages that will be stored in the log. Here you can write any regular expression.<br>For instance: <i>^Core::.*</i> will display only the lines starting with <i>Core::</i> + Bu seçenek kaydedilecek smplayer mesajlarının filtrelenmesini saÄŸlar. <br>Örnek: <i>^Core::.*</i> sadece <i>Core::</i> ile baÅŸlayan satırları gösterecektir + + + + &Advanced + &GeliÅŸmiÅŸ + + + + icon + ikon + + + + &Monitor aspect: + + + + + &Run MPlayer in its own window + + + + + Additional Options for MPlayer + + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + Burada mplayer'a fazladan özellikler ekleyebilirsiniz. +Özellikler arasında boÅŸluk bırakmayı unutmayın. +Örnek: -flip -nosound + + + + &Options: + &Seçenekler: + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + Ä°lave video filtreleri de ekleyebilirsiniz. +Filtreleri "," ile ayırın. BoÅŸluk kullanmayın! +Örnek: scale=512:-2,eq2=1 + + + + V&ideo filters: + V&ideo filtreleri: + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + Ve son olarak ses filtreleri. Video filtrelerinde geçerli olan kurallar burada da geçerli. +Örnek: resample=44100:0:0,volnorm + + + + Audio &filters: + Ses &filtreleri: + + + + &Colorkey: + + + + + C&hange... + + + + + &Don't repaint the background of the video window + + + + + &Logs + &Kayıtlar + + + + Log &MPlayer output + + + + + Log &SMPlayer output + + + + + This option is mainly intended for debugging the application. + Bu seçenek esas olarak debugging amaçlıdır. + + + + &Filter for SMPlayer logs: + + + + + &MPlayer language + &MPlayer'ın dili + + + + SMPlayer needs to read and parse the output of MPlayer and sometimes it relies on English text. If you are using a MPlayer translated into another language, then you need to change the texts that SMPlayer looks for. (Technically you should enter regular expressions)<br><br> +The drop-down lists may provide already made regular expression for several languages. + SMplayer, MPlayer çıktılarını okumak ve ayrıştırmak zorundadır. EÄŸer MPlayer'ın Ä°ngilizce olmayan bir sürümünü kullanıyorsanız, SMPlayer'ın aradığı dosyaları deÄŸiÅŸtirmelisiniz. (Teknik olarak olaÄŸan ifadeler kullanmalısınız)<br><br> +Liste birçok dilde kullanılan olaÄŸan ifadeleri saÄŸlamaktadır. + + + + &End of file: + + + + + &No video: + + + + + PrefAssociations + + + Warning + + + + + Not all files could be associated. Please check your security permissions and retry. + + + + + File Types + + + + + Select all + + + + + Check all file types in the list + + + + + Uncheck all file types in the list + + + + + List of file types + + + + + File types + + + + + Media files handled by SMPlayer: + + + + + Select All + + + + + Select None + + + + + Check the media file extensions you would like SMPlayer to handle. When you click Apply, the checked files will be associated with SMPlayer. If you uncheck a media type, the file association will be restored. + + + + + Select none + + + + + PrefDrives + + + Drives + Sürücüler + + + + CD device + + + + + Choose your CDROM device. It will be used to play VCDs and Audio CDs. + + + + + DVD device + + + + + Choose your DVD device. It will be used to play DVDs. + + + + + Currently SMPlayer does not autodetect cdrom or dvd devices. So in order to play cdroms or dvds you must first select here your cdrom and dvd drives (can be the same). + SMPlayer CDROM ve DVD cihazlarınızı henüz otomatik olarak bulamamaktadır. CD veya DVD'lerinizi oynatabilmek için önce buradan bir cihaz seçmeniz gerekmektedir (ikisi için aynı cihaz olabilir). + + + + icon + ikon + + + + Select your CD device: + CD çalarınızı seçin: + + + + Select your DVD device: + DVD çalarınızı seçin: + + + + Select your &CD device: + + + + + Select your &DVD device: + + + + + PrefGeneral + + + General + Genel + + + + Select the mplayer executable + Çalıştırılabilir mplayer dosyasını seçin + + + + Executables + Çalıştırılabilirler + + + + All files + Tüm dosyalar + + + + Select a directory + Bir klasör seçin + + + + MPlayer executable + + + + + Here you must specify the mplayer executable that smplayer will use.<br>smplayer requires at least mplayer 1.0rc1 (svn recommended).<br><b>If this setting is wrong, smplayer won't be able to play anything!</b> + Burada smplayer'ın kullanacağı çalıştırılabilir mplayer dosyasını seçmelisiniz.<br>smplayer en azından mplayer 1.0rc1'e gerek duymaktadır (svn tavsiye edilir).<br><b>EÄŸer bu ayar yanlışsa, smplayer hiçbir dosyayı çalıştıramaz!</b> + + + + Screenshots folder + + + + + Here you can specify a folder where the screenshots taken by smplayer will be stored. If this field is empty the screenshot feature will be disabled. + Burada yakaladığınız ekran görüntülerinin tutulacağı klasörü belirleyebilirsiniz. EÄŸer bir klasör seçmezseniz görüntü yakalama özelliÄŸi devredışı bırakılacak. + + + + Video output driver + + + + + Select the video output driver. Usually xv (linux) and directx (windows) provide the best performance. + Video çıktısı için sürücü seçin. Genellikle xv (linux) ve directx (windows) en iyi baÅŸarımı saÄŸlayacaklardır. + + + + Audio output driver + + + + + Select the audio output driver. + Ses çıktısı içim sürücü seçin. + + + + Remember settings + + + + + Usually smplayer will remember the settings for each file you play (audio track selected, volume, filters...). Uncheck this option if you don't like this feature. + Smplayer çoÄŸu dosya için belirlediÄŸiniz ayarları (seçilen ses izi, ses, filtreler...) hatırlayacaktır. EÄŸer bu özelliÄŸi istemiyorsanız iÅŸareti kaldırın. + + + + Don't remember time position + + + + + If you check this option, smplayer will play all files from the beginning. + Bu seçeneÄŸi iÅŸaretlerseniz, dosyalar son kaldıkları yerden deÄŸil en baÅŸtan itibaren oynatılacak. + + + + Preferred audio language + + + + + Here you can type your preferred language for the audio streams. When a media with multiple audio streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the audio streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the audio track if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + Burada ses akımları için tercih ettiÄŸiniz dili seçebilirsiniz. Birden fazla ses akımı içeren bir ortam bulunduÄŸunda, smplayer tercih edilen dildekini kullanmaya çalışacaktır.<br>Bu özellik sadece ses akımlarının dili hakkında bilgi içeren, DVDler, mkv dosyaları gibi ortamlar için geçerlidir.<br>Diller için alışılagelmiÅŸ kısaltmaları kullanabilirsiniz. Örnek: <b>es|esp|spa</b> yazdığınızda smplayer mümkünse <i>es</i>, <i>esp</i> veya <i>spa</i> içeren ses izlerini kullanacaktır. + + + + Preferred subtitle language + + + + + Here you can type your preferred language for the subtitle stream. When a media with multiple subtitle streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the subtitle streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the subtitle stream if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + Burada alt yazılar için tercih ettiÄŸiniz dili seçebilirsiniz. Birden fazla alt yazı içeren bir ortam bulunduÄŸunda, smplayer tercih edilen dildekini kullanmaya çalışacaktır.<br>Bu özellik sadece alt yazıların dili hakkında bilgi içeren, DVDler, mkv dosyaları gibi ortamlar için geçerlidir.<br>Diller için alışılagelmiÅŸ kısaltmaları kullanabilirsiniz. Örnek: <b>es|esp|spa</b> yazdığınızda smplayer mümkünse <i>es</i>, <i>esp</i> veya <i>spa</i> içeren alt yazıları kullanacaktır. + + + + Software video equalizer + + + + + You can check this option if video equalizer is not supported by your graphic card or the selected video output driver.<br><b>Note:</b> this option can be incompatible with some video output drivers. + EÄŸer video eÅŸitleyici özelliÄŸi ekran kartınız veya seçtiÄŸiniz video çıktısı sürücüsü tarafından desteklenmiyorsa bu seçeneÄŸi iÅŸaretleyin.<br><b>Not:</b> Bu seçenek bazı video çıktısı sürücüleri ile uyumsuzluk gösterebilir. + + + + Postprocessing quality + + + + + Dynamically changes the level of postprocessing depending on the available spare CPU time. The number you specify will be the maximum level used. Usually you can use some big number. + Atıl iÅŸlemci gücüne baÄŸlı olarak öniÅŸlem seviyesini deÄŸiÅŸtir. BelirlediÄŸiniz sayı en yüksek seviye kabul edilecektir. Genellikle büyük bir sayı seçebilirsiniz. + + + + Start videos in fullscreen + Videoları tam ekran baÅŸlat + + + + If this option is checked, all videos will start to play in fullscreen mode. + Bu seçeneÄŸi iÅŸaretlerseniz, videolar tam ekran kipinde açılacak. + + + + Disable screensaver + Ekran koruyucuyu devredışı bırak + + + + Check this option to disable the screensaver while playing.<br>The screensaver will enabled again when play finishes.<br><b>Note:</b> This option works only in X11 and Windows. + Herhangi bir dosya oynatılırken ekran koruyucuyu devredışı bırakmak için bu seçeneÄŸi iÅŸaretleyin.<br>Oynatma iÅŸlemi bittiÄŸinde ekran koruyucu tekrar çalıştırılacak.<br><b>Not:</b> Bu seçenek sadece X11 ve Windows'ta çalışır. + + + + Software volume control + + + + + Check this option to use the software mixer, instead of using the sound card mixer. + EÄŸer ses kartı tabanlı deÄŸil yazılım tabanlı mixer kullanıyorsanız bu seçeneÄŸi iÅŸaretleyin. + + + + &General + &Genel + + + + Paths + Yollar + + + + Search... + Ara... + + + + Select... + Seç... + + + + Select the MPlayer executable: + Çalıştırılabilir mplayer dosyasını seçin: + + + + Folder for storing screenshots: + Yakalanan ekran görüntülerinin tutulacağı klasör: + + + + Output drivers + Çıktı sürücüleri + + + + Video: + Video: + + + + Audio: + Ses: + + + + Media settings + Ortam ayarları + + + + Don't remember time position (files start playing from the beginning) + Konumu hatırlama (dosyaları oynatmaya son kaldıkları yerden deÄŸil sıfırdan baÅŸlar) + + + + Remember settings for all files (audio track, subtitles...) + Tüm dosyalar için ayarları hatırla (alt yazılar, ses izi...) + + + + Preferred audio and subtitles + Tercih edilen ses ve alt yazılar + + + + Subtitles: + Alt yazılar: + + + + &Video and audio + &Video ve ses + + + + Video + Video + + + + Use software video equalizer + Yazılım tabanlı video eÅŸitleyici kullan + + + + Enable postprocessing for all videos + Tüm videolar için postprocessing etkinleÅŸtir + + + + Quality: + Kalite: + + + + Audio + Ses + + + + Use software volume control + Yazılım tabanlı ses eÅŸitleyici kullan + + + + Max. Amplification: + Maksimum Yükseltme (ses): + + + + AC3/DTS pass-through S/PDIF + AC3/DTS'yi S/PDIF'den geçir + + + + Volume normalization + Ses normalleÅŸtirme + + + + Change volume + + + + + If checked, SMPlayer will remember the volume for every file and will restore it when played again. For new files the default volume will be used. + + + + + Default volume: + Geçerli ses: + + + + 0 + 0 + + + + &Change volume on every file + + + + + &Search... + + + + + S&elect... + + + + + Select the &MPlayer executable: + + + + + &Folder for storing screenshots: + + + + + V&ideo: + + + + + &Audio: + + + + + &Don't remember time position (files start playing from the beginning) + + + + + &Remember settings for all files (audio track, subtitles...) + + + + + A&udio: + + + + + Su&btitles: + + + + + &Use software video equalizer + + + + + &Quality: + + + + + Start videos in &fullscreen + + + + + Disable &screensaver + + + + + &Default volume: + + + + + Use s&oftware volume control + + + + + Ma&x. Amplification: + + + + + &AC3/DTS pass-through S/PDIF + + + + + Volume &normalization + Ses &normalleÅŸtirme + + + + Direct rendering + + + + + If checked, turns on direct rendering (not supported by all codecs and video outputs)<br><b>WARNING:</b> May cause OSD/SUB corruption! + + + + + Double buffering + + + + + D&irect rendering + + + + + Dou&ble buffering + + + + + Double buffering fixes flicker by storing two frames in memory, and displaying one while decoding another. If disabled it can affect OSD negatively, but often removes OSD flickering. + + + + + &Enable postprocessing by default + + + + + Volume &normalization by default + + + + + Close when finished + + + + + If this option is checked, the main window will be automatically closed when the current file/playlist finishes. + + + + + &Close when finished + + + + + 2 (Stereo) + + + + + 4 (4.0 Surround) + + + + + 6 (5.1 Surround) + + + + + C&hannels by default: + + + + + &Pause when minimized + + + + + Pause when minimized + + + + + If this option is enabled, the file will be paused when the main window is hidden. When the window is restored, play will be resumed. + + + + + Enable postprocessing by default + + + + + Max. Amplification + + + + + Volume normalization by default + + + + + Maximizes the volume without distorting the sound. + + + + + Default volume + + + + + Sets the initial volume that new files will use. + + + + + Channels by default + + + + + Sets the maximum amplification level in percent (default: 110). A value of 200 will allow you to adjust the volume up to a maximum of double the current level. With values below 100 the initial volume (which is 100%) will be above the maximum, which e.g. the OSD cannot display correctly. + + + + + Uses hardware AC3 passthrough + + + + + Requests the number of playback channels. MPlayer asks the decoder to decode the audio into as many channels as specified. Then it is up to the decoder to fulfill the requirement. This is usually only important when playing videos with AC3 audio (like DVDs). In that case liba52 does the decoding by default and correctly downmixes the audio into the requested number of channels. NOTE: This option is honored by codecs (AC3 only), filters (surround) and audio output drivers (OSS at least). + + + + + Postprocessing will be used by default on new opened files. + + + + + PrefInput + + + Keyboard and mouse + Klavye ve fare + + + + None + Hiçbiri + + + + &Keyboard + &Klavye + + + + icon + ikon + + + + Here you can change any key shortcut. To do it double click or start typing over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + Burada, deÄŸiÅŸtirmek istediÄŸiniz kısayola çift tıklayarak veya üzerine gelip yazmaya baÅŸlayarak, tüm kısayolları deÄŸiÅŸtirebilirsiniz. Ayrıca, hazırladığınız listeyi kaydedip insanlarla paylaÅŸabilir veya baÅŸka bir bilgisayarda kullanabilirsiniz. + + + + &Mouse + &Fare + + + + Button functions: + Buton özellikleri: + + + + Media seeking + Gezinme + + + + Volume control + Ses kontrolü + + + + Zoom video + Videoyu yakınlaÅŸtır + + + + Here you can change any key shortcut. To do it double click or press enter over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + + + + + &Left click + + + + + &Double click + + + + + &Wheel function: + + + + + Shortcut editor + + + + + This table allows you to change the key shortcuts of most available actions. Double click or press enter on a item, or press the <b>Change shortcut</b> button to enter in the <i>Modify shortcut</i> dialog. There are two ways to change a shortcut: if the <b>Capture</b> button is on then just press the new key or combination of keys that you want to assign for the action (unfortunately this doesn't work for all keys). If the <b>Capture</b> button is off then you could enter the full name of the key. + + + + + Left click + + + + + Select the action for left click on the mouse. + + + + + Double click + + + + + Select the action for double click on the mouse. + + + + + Wheel function + + + + + Select the action for the mouse wheel. + + + + + PrefInterface + + + Interface + Arayüz + + + + Bulgarian + Bulgarca + + + + Czech + Çekçe + + + + German + Almanca + + + + Greek + Yunanca + + + + English + Ä°ngilizce + + + + Spanish + Ä°spanyolca + + + + Finnish + Fince + + + + French + Fransızca + + + + Hungarian + Macarca + + + + Italian + Ä°talyanca + + + + Japanese + Japonca + + + + Georgian + Gürcüce + + + + Dutch + Felemenkçe + + + + Polish + Lehçe + + + + Portuguese - Brazil + Brezilya Portegizcesi + + + + Portuguese - Portugal + Portekiz Portegizcesi + + + + Romanian + Romence + + + + Russian + Rusça + + + + Slovak + Slovakça + + + + Serbian + Sırpça + + + + Swedish + Ä°sveççe + + + + Turkish + Türkçe + + + + Ukrainian + Ukraynaca + + + + Simplified-Chinese + BasitleÅŸtirilmiÅŸ Çince + + + + Traditional Chinese + Geleneksel Çince + + + + <Autodetect> + <Otomatik> + + + + Default + Geçerli + + + + Language + Dil + + + + &Interface + + + + + Seeking + Gezinme + + + + Recent files + Son dosyalar + + + + Never + Asla + + + + Whenever it's needed + GerektiÄŸinde + + + + Only after loading a new video + Sadece yeni bir video yüklendiÄŸinde + + + + Here you can change the language of the application. + + + + + Instances + + + + + Catalan + + + + + Basque + + + + + Galician + + + + + &Short jump + + + + + &Medium jump + + + + + &Long jump + + + + + Mouse &wheel jump + + + + + &Use only one running instance of SMPlayer + + + + + SMPlayer will listen to this &port to receive commands from other instances: + + + + + Ma&x. items + + + + + St&yle: + + + + + Ico&n set: + + + + + L&anguage: + + + + + Main window + + + + + Auto&resize: + + + + + R&emember position and size + + + + + Default font: + + + + + &Change... + + + + + PrefPerformance + + + Performance + BaÅŸarım + + + + Priority + Öncelik + + + + Set process priority for mplayer according to the predefined priorities available under Windows.<br><b>WARNING:</b> Using realtime priority can cause system lockup. + Windows'da öntanımlı önceliklere göre Mplayer için geçerli olacak iÅŸlem önceliÄŸini seçin. +<br><b>Uyarı:<b> Gerçek zamanlı öncelik sisteminizin kitlenmesine yol açabilir. + + + + <br><b>Note:</b> This option is for Windows only. + <br><b>Not:</b>Bu seçenek sadece Windows için geçerlidir. + + + + Cache + Ön bellek + + + + This option specifies how much memory (in kBytes) to use when precaching a file or URL. Especially useful on slow media. + Bu seçenek bir dosya veya URL önbelleÄŸe atılırken ne kadar bellek (kByte) kullanılacağını belirler. Özellikle yavaÅŸ çalışan ortamlar için seçilmelidir. + + + + Allow frame drop + Frame drop'a izin ver + + + + Skip displaying some frames to maintain A/V sync on slow systems. + YavaÅŸ sistemlerde ses/görüntü uyumunu saÄŸlamak için bazı kareleri atla. + + + + Allow hard frame drop + + + + + More intense frame dropping (breaks decoding). Leads to image distortion! + Daha yoÄŸun kare es geçme. Görüntünün bozulmasına yol açar! + + + + Audio/video auto synchronization + Otomatik ses/görüntü uyumu + + + + Gradually adjusts the A/V sync based on audio delay measurements. + Ses gecikmesi hesaplamalarına dayanarak, ses/görüntü uyumunu aÅŸama aÅŸama gerçekleÅŸtir. + + + + &Performance + + + + + Select the priority for the MPlayer process. + Mplayer için geçerli olacak önceliÄŸi seçin. + + + + Priority: + Öncelik: + + + + realtime + gerçek zamanlı + + + + high + yüksek + + + + abovenormal + normal üstü + + + + normal + normal + + + + belownormal + normal altı + + + + idle + âtıl + + + + Size: + Boyut: + + + + KB + KB + + + + Use cache + Ön belleÄŸi kullan + + + + Setting a cache may improve performance on slow media + Ön belleÄŸi kullanmak baÅŸarımı arttırabilir + + + + Allow hard frame drop (can lead to image distortion) + Hard frame drop'a izin ver (görüntünün bozulmasına yol açabilir) + + + + Synchronization + Uyum + + + + Factor: + Çarpan: + + + + Fast audio track switching + Ses izini hızlı deÄŸiÅŸtirebilme + + + + Fast seek to chapters in dvds + DVD bölümlerini hızlı gezinebilme + + + + Priorit&y: + + + + + Si&ze: + + + + + &Use cache + + + + + &Allow frame drop + + + + + Allow &hard frame drop (can lead to image distortion) + + + + + Audio/&video auto synchronization + + + + + Fact&or: + + + + + &Fast audio track switching + + + + + Fast &seek to chapters in dvds + + + + + Create index if needed + + + + + Rebuilds index of files if no index was found, allowing seeking. Useful with broken/incomplete downloads, or badly created files. This option only works if the underlying media supports seeking (i.e. not with stdin, pipe, etc).<br> Note: the creation of the index may take some time. + + + + + &Create index if needed + + + + + If checked, it will try the fastest method to switch audio tracks but might not work with some formats. + + + + + If checked, it will try the fastest method to seek to chapters but it might not work with some discs. + + + + + PrefSubtitles + + + Subtitles + Alt yazılar + + + + Choose a ttf file + Bir ttf dosyası seçin + + + + Truetype Fonts + Truetype Fontlar + + + + Subtitle position + + + + + This option specifies the position of the subtitles over the video window. <i>100</i> means the bottom, while <i>0</i> means the top. + Bu seçenek alt yazıların ekranda bulunacağı yeri belirlemenizi saÄŸlar. En alt için <i>100</i> , en üst için <i>0</i>'ı seçin. + + + + SSA/ASS styles + + + + + &Subtitles + Alt &yazı + + + + Autoload + Otomatik yükle + + + + Autoload subtitles files (*.srt, *.sub...): + Alt yazıları kendiliÄŸinden yükle (*.srt, *.sub...): + + + + Select first available subtitle + SeçeneÄŸe uyan ilk yazıyı kendiliÄŸinden seç + + + + Same name as movie + Film ismiyle aynı isimde + + + + All subs containing movie name + Filmin ismini içeren tüm alt yazılar + + + + All subs in directory + Klasördeki tüm alt yazılar + + + + Default subtitle encoding: + Geçerli alt yazı kodlaması: + + + + Position + Konum + + + + Default position of the subtitles on screen + Alt yazıların konumu + + + + 0 + 0 + + + + Top + En üst + + + + Bottom + En alt + + + + Include subtitles on screenshots + Alt yazılar yakalanan ekranlarda gözüksün + + + + Use -subfont option (required by recent MPlayer releases) + -subfont seçeneÄŸini kullan (yeni MPlayer sürümleri gerek duymaktadır) + + + + &Font + &Yazıtipi (Font) + + + + Font + Font + + + + TTF font: + TTF fontu: + + + + Search... + Ara... + + + + System font: + Sistem fontu: + + + + Select the font which will be used for subtitles (and OSD): + Alt yazılar (ve OSD) için kullanılacak fontu seçin: + + + + Size + Boyut + + + + Autoscale: + Orantılama: + + + + No autoscale + Orantılama yok + + + + Proportional to movie height + Filmin yüksekliÄŸiyle orantılı + + + + Proportional to movie width + Filmin geniÅŸliÄŸiyle orantılı + + + + Proportional to movie diagonal + Filmin köşegen uzunluÄŸuyla orantılı + + + + Scale: + Orantı: + + + + SSA/&ASS library + SSA/&ASS kütüphanesi + + + + The new SSA/ASS library will provide nice styled subtitles for external SSA/ASS subtitles files and Matroska tracks. But it will be used too for rendering other formats like SUB and SRT files. + Yeni SSA/ASS kütüphanesi harici SSA/ASS alt yazı dosyaları ve Matroska dosyalarındaki alt yazılar için hoÅŸ bir görünüm saÄŸlayacaktır. SUB ve SRT dosyalarının taranmasında da bu kütüphane kullanılacaktır. + + + + Use SSA/ASS library for subtitle rendering + Alt yazı dönüştürmesi için SSA/ASS kütüphanesini kullan + + + + Text color: + Yazı rengi: + + + + Border color: + Çerçeve rengi: + + + + Here you can override styles for SSA/ASS subtitles. It can be also used for fine-tuning the rendering of SRT and SUB subtitles by the SSA/ASS library. Example: <b>Bold=1,Outline=2,Shadow=4</b> + Burada SSA/ASS alt yazılarının stillerini geçersiz kılabilirsiniz. Ayrıca SSA/ASS kütüphanesi aracılığıyla srt ve sub türü alt yazıların nasıl taranacağını belirleyebilirsiniz. <br>Örnek: <b>Bold=1,Outline=2,Shadow=4</b> + + + + Styles: + Stiller: + + + + Au&toload subtitles files (*.srt, *.sub...): + + + + + S&elect first available subtitle + + + + + &Default subtitle encoding: + + + + + Default &position of the subtitles on screen + + + + + &Include subtitles on screenshots + + + + + &Use -subfont option (required by recent MPlayer releases) + + + + + &TTF font: + + + + + Sea&rch... + + + + + S&ystem font: + + + + + A&utoscale: + + + + + S&cale: + + + + + &Use SSA/ASS library for subtitle rendering + + + + + &Text color: + + + + + &Border color: + + + + + St&yles: + + + + + PreferencesDialog + + + SMPlayer - Help + + + + + OK + + + + + Cancel + + + + + Apply + + + + + Help + + + + + SMPlayer - Preferences + SMPlayer - Özellikler + + + + QObject + + + 1 second + 1 saniye + + + + %1 seconds + %1 saniye + + + + 1 minute + 1 dakika + + + + 1 minute and 1 second + 1 dakika ve 1 saniye + + + + 1 minute and %1 seconds + 1 dakika ve %1 saniye + + + + %1 minutes + %1 dakika + + + + %1 minutes and 1 second + %1 dakika ve 1 saniye + + + + %1 minutes and %2 seconds + %1 dakika ve %2 saniye + + + + will show this message and then will exit. + + + + + 'media' is any kind of file that SMPlayer can open. It can be a local file, a DVD (e.g. dvd://1), an Internet stream (e.g. mms://....) or a local playlist in format m3u. If the -playlist option is used, that means that SMPlayer will pass the -playlist option to MPlayer, so MPlayer will handle the playlist, not SMPlayer. + + + + + the main window will be closed when the file/playlist finishes. + + + + + This is SMPlayer v. %1 running on %2 + + + + + tries to make a connection to another running instance and send to it the specified action. Example: -send-action pause The rest of options (if any) will be ignored and the application will exit. It will return 0 on success or -1 on failure. + + + + + action_list is a list of actions separated by spaces. The actions will be executed just after loading the file (if any) in the same order you entered. For checkable actions you can pass true or false as parameter. Example: -actions "fullscreen compact true". Quotes are necessary in case you pass more than one action. + + + + + media + + + + + if there's another instance running, the media will be added to that instance's playlist. If there's no other instance, this option will be ignored and the files will be opened in a new instance. + + + + + specifies the directory for the configuration file (smplayer.ini). + + + + + the main window won't be closed when the file/playlist finishes. + + + + + Usage: %1 [-ini-path directory] [-send-action action_name] [-actions action_list [-close-at-end] [-no-close-at-end] [-fullscreen] [-no-fullscreen] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + + + + + the video will be played in fullscreen mode. + + + + + the video will be played in window mode. + + + + + SeekWidget + + + icon + ikon + + + + label + etiket + + + + ShortcutGetter + + + Modify shortcut + + + + + Clear + + + + + Press the key combination you want to assign + + + + + Capture + + + + + Capture keystrokes + + + + + VideoEqualizer + + + Equalizer + EÅŸitleyici + + + + Contrast + Zıtlık + + + + Brightness + Parlaklık + + + + Hue + Renk tonu + + + + Saturation + Doygunluk + + + + Gamma + Gama + + + + &Reset + &Sıfırla + + + + &Set as default values + &Varsayılan yap + + + + Use the current values as default values for new videos. + Bu deÄŸerleri tüm yeni videolar için kullan. + + + + Set all controls to zero. + Tüm kontrolleri sıfırla. + + + diff --git a/retroshare-gui/src/apps/smplayer/translations/smplayer_uk_UA.qm b/retroshare-gui/src/apps/smplayer/translations/smplayer_uk_UA.qm new file mode 100644 index 000000000..2176f6d50 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/translations/smplayer_uk_UA.qm differ diff --git a/retroshare-gui/src/apps/smplayer/translations/smplayer_uk_UA.ts b/retroshare-gui/src/apps/smplayer/translations/smplayer_uk_UA.ts new file mode 100644 index 000000000..1835424bb --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/translations/smplayer_uk_UA.ts @@ -0,0 +1,3626 @@ + + + + AboutDialog + + + Version: %1 + ВерÑÑ–Ñ: %1 + + + + 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. + Це вільне програмне забезпеченнÑ; Ви можете поширювати його Ñ–/чи модифікувати, керуючиÑÑŒ 2 чи (на Ваш розÑуд) більш пізньою верÑією GNU General Public License, опібліковану Free Software Foundation. + + + + Translators: + Перекладачі: + + + + German + Ðімецька + + + + Slovak + Словацька + + + + Italian + ІталійÑька + + + + French + Французька + + + + Simplified-Chinese + Спрощена китайÑька + + + + Russian + РоÑійÑька + + + + Hungarian + УгорÑька + + + + Japanese + ЯпонÑька + + + + Dutch + ГолландÑька + + + + Ukrainian + УкраїнÑька + + + + Georgian + ГрузинÑька + + + + Czech + ЧеÑька + + + + Logo designed by %1 + Логотип розроблено %1 + + + + Get updates at: %1 + Ðові верÑÑ–Ñ— шукайте на: %1 + + + + About SMPlayer + Про SMPlayer + + + + Polish + ПольÑька + + + + Bulgarian + БолгарÑька + + + + Turkish + Турецька + + + + Swedish + ШведÑька + + + + Serbian + СербÑька + + + + Traditional Chinese + Традиційна китайÑька + + + + Romanian + РумунÑька + + + + Portuguese - Brazil + ПортугальÑька (БразиліÑ) + + + + Portuguese - Portugal + ПортугальÑька (ПортугаліÑ) + + + + Compiled with Qt %1 + Зкомпільовано з Qt %1 + + + + %1, %2 and %3 + %1, %2 та %3 + + + + %1 and %2 + %1 та %2 + + + + http://smplayer.sourceforge.net/en/windows/download.php + If the web page is translated into your language you can change the URL so it points to the download page in the translation.Otherwise leave as is. + http://smplayer.sourceforge.net/uk/windows/download.php + + + + http://smplayer.sourceforge.net/en/linux/download.php + If the web page is translated into your language you can change the URL so it points to the download page in the translation.Otherwise leave as is. + http://smplayer.sourceforge.net/uk/linux/download.php + + + + <b>%1</b>: %2 + <b>%1</b>: %2 + + + + ActionsEditor + + + Name + Ðазва + + + + Description + ÐžÐ¿Ð¸Ñ + + + + Shortcut + ÐšÐ¾Ð¼Ð±Ñ–Ð½Ð°Ñ†Ñ–Ñ + + + + &Save + &Зберегти + + + + &Load + &Зчитати + + + + Key files + Файли клавіш + + + + Choose a filename + Виберіть ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ + + + + Confirm overwrite? + ПерезапиÑати? + + + + The file %1 already exists. +Do you want to overwrite? + Файл %1 вже Ñ–Ñнує. +ПерезапиÑати? + + + + Choose a file + Виберіть файл + + + + Error + Помилка + + + + The file couldn't be saved + Ðе можна зберегти файл + + + + The file couldn't be loaded + Ðе можу відкрити файл + + + + &Change shortcut... + &Змінити комбінації клавіш... + + + + BaseGui + + + SMPlayer - mplayer log + SMPlayer - звіти mplayer + + + + SMPlayer - smplayer log + SMPlayer - звіти smplayer + + + + &Open + &Відкрити + + + + &Play + Від&Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ + + + + &Video + &Відео + + + + &Audio + Зв&ук + + + + &Subtitles + Су&бтитри + + + + &Browse + Ог&лÑд + + + + Op&tions + &ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ + + + + &Help + До&відка + + + + &File... + &Файл... + + + + D&irectory... + &Тека... + + + + &Playlist... + &СпиÑок... + + + + &DVD from drive + &DVD з диÑку + + + + D&VD from folder... + D&VD з теки... + + + + &URL... + Ш&лÑÑ…... + + + + &Clear + &ОчиÑтити + + + + &Recent files + ОÑ&танні файли + + + + P&lay + Від&Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ + + + + &Pause + &Пауза + + + + &Stop + &Стоп + + + + &Frame step + &Крок фрейма + + + + &Normal speed + &Ðормальна швидкіÑÑ‚ÑŒ + + + + &Halve speed + &Половинна швидкіÑÑ‚ÑŒ + + + + &Double speed + &Подвійна швидкіÑÑ‚ÑŒ + + + + Speed &-10% + ШвидкіÑÑ‚ÑŒ &-10% + + + + Speed &+10% + ШвидкіÑÑ‚ÑŒ &+10% + + + + Sp&eed + Шв&идкіÑÑ‚ÑŒ + + + + &Repeat + &Повторити + + + + &Fullscreen + Ð&а веÑÑŒ екран + + + + &Compact mode + &Компактний режим + + + + Si&ze + Ро&змір + + + + &Autodetect + &ÐÐ²Ñ‚Ð¾Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ + + + + 4:3 &Letterbox + + + + + 16:9 L&etterbox + + + + + 4:3 &Panscan + + + + + 4:3 &to 16:9 + + + + + &Aspect ratio + &Ð¡Ð¿Ñ–Ð²Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ñторін + + + + &None + &Ðічого + + + + &Lowpass5 + + + + + Linear &Blend + + + + + &Deinterlace + &ДеінтерлейÑинг + + + + &Postprocessing + &ПіÑлÑобробка + + + + &Autodetect phase + &ÐÐ²Ñ‚Ð¾Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ„Ð°Ð·Ð¸ + + + + &Deblock + + + + + De&ring + + + + + Add n&oise + Додати ш&ум + + + + F&ilters + Ф&ільтри + + + + &Equalizer + &Еквалайзер + + + + &Screenshot + Знімок &екрану + + + + S&tay on top + З&алишатиÑÑŒ зверху + + + + &Track + &Доріжка + + + + &Extrastereo + &Розширене Ñтерео + + + + &Karaoke + &Караоке + + + + &Filters + &Фільтри + + + + &Default + &За умовчаннÑм + + + + &Stereo + &Стерео + + + + &4.0 Surround + &4.0 Ð¾Ñ‚Ð¾Ñ‡ÐµÐ½Ð½Ñ + + + + &5.1 Surround + &5.1 Ð¾Ñ‚Ð¾Ñ‡ÐµÐ½Ð½Ñ + + + + &Channels + &Канали + + + + &Left channel + &Лівий канал + + + + &Right channel + &Правий канал + + + + &Stereo mode + &Стерео режим + + + + &Mute + &Вимкнути звук + + + + Volume &- + ГучніÑÑ‚ÑŒ &- + + + + Volume &+ + ГучніÑÑ‚ÑŒ &+ + + + + &Delay - + &Затримка - + + + + D&elay + + З&атримка + + + + + &Select + &Вибрати + + + + &Load... + &Відкрити... + + + + Delay &- + Затримка &- + + + + Delay &+ + Затримка &+ + + + + &Up + Ð’&гору + + + + &Down + Ð’&низ + + + + &Title + &Заголовок + + + + &Chapter + &Глава + + + + &Angle + &Ð Ð°ÐºÑƒÑ€Ñ + + + + &Playlist + &СпиÑок + + + + &Show frame counter + &Показати лічильник фреймів + + + + &Disabled + &Вимкнено + + + + &Seek bar + &ÐŸÑ€Ð¾Ð³Ñ€ÐµÑ + + + + &Time + &Ð§Ð°Ñ + + + + Time + T&otal time + Ð§Ð°Ñ + З&агальний Ñ‡Ð°Ñ + + + + &OSD + Екранна &Ñ–Ð½Ð´Ñ–ÐºÐ°Ñ†Ñ–Ñ + + + + &View logs + &ДивитиÑÑŒ звіти + + + + P&references + &ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ + + + + About &Qt + Про &Qt + + + + About &SMPlayer + Про &SMPlayer + + + + <empty> + <нічого> + + + + Video + Відео + + + + Audio + Звук + + + + Playlists + СпиÑок + + + + All files + Ð’ÑÑ– файли + + + + Choose a file + Вибрати файл + + + + SMPlayer - Information + SMPlayer - Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ + + + + The CDROM / DVD drives are not configured yet. +The configuration dialog will be shown now, so you can do it. + Приводи CD/DVD еще не налаштовані. +Ви зможете зробити це у діалозі налаштувань цих приÑтроїв. + + + + Choose a directory + Вибрати теку + + + + Subtitles + Субтитри + + + + About Qt + Про Qt + + + + Playing %1 + ВідтворюєтьÑÑ %1 + + + + Pause + Пауза + + + + Stop + Стоп + + + + Play / Pause + Грати / Пауза + + + + Pause / Frame step + Пауза / Крок фрейму + + + + U&nload + Ð’&ивантажено + + + + V&CD + V&CD + + + + C&lose + З&акрити + + + + View &info and properties... + ДивитÑÑŒ &інфо та влаÑтивоÑÑ‚Ñ–... + + + + Zoom &- + МаÑштаб &- + + + + Zoom &+ + МаÑштаб &+ + + + + &Reset + &Скинути + + + + Move &left + ЗміÑтити &вліво + + + + Move &right + ЗміÑтити &вправо + + + + Move &up + ЗміÑтити &вгору + + + + Move &down + ЗміÑтити &вниз + + + + &Pan && scan + &ÐŸÐ°Ð½Ð¾Ñ€Ð°Ð¼ÑƒÐ²Ð°Ð½Ð½Ñ + + + + &Previous line in subtitles + &Попередний Ñ€Ñдок в Ñубтитрах + + + + N&ext line in subtitles + Ð&аÑтупний Ñ€Ñдок в Ñубтитрах + + + + -%1 + -%1 + + + + +%1 + +%1 + + + + Dec volume (2) + Ð—Ð¼ÐµÐ½ÑˆÐµÐ½Ð½Ñ Ð³ÑƒÑ‡Ð½Ð¾ÑÑ‚Ñ– (2) + + + + Inc volume (2) + Ð—Ð±Ñ–Ð»ÑŒÑˆÐµÐ½Ð½Ñ Ð³ÑƒÑ‡Ð½Ð¾ÑÑ‚Ñ– (2) + + + + Exit fullscreen + Повноекранний вихід + + + + OSD - Next level + Екранна Ñ–Ð½Ð´Ñ–ÐºÐ°Ñ†Ñ–Ñ - наÑтупний рівень + + + + Dec contrast + Ð—Ð¼ÐµÐ½ÑˆÐµÐ½Ð½Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð°Ñту + + + + Inc contrast + Ð—Ð±Ñ–Ð»ÑŒÑˆÐµÐ½Ð½Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð°Ñту + + + + Dec brightness + Ð—Ð¼ÐµÐ½ÑˆÐµÐ½Ð½Ñ ÑÑкравоÑÑ‚Ñ– + + + + Inc brightness + Ð—Ð±Ñ–Ð»ÑŒÑˆÐµÐ½Ð½Ñ ÑÑкравоÑÑ‚Ñ– + + + + Dec hue + Ð—Ð¼ÐµÐ½ÑˆÐµÐ½Ð½Ñ ÐºÐ¾Ð»ÑŒÐ¾Ñ€Ñƒ + + + + Inc hue + Ð—Ð±Ñ–Ð»ÑŒÑˆÐµÐ½Ð½Ñ ÐºÐ¾Ð»ÑŒÐ¾Ñ€Ñƒ + + + + Dec saturation + Ð—Ð¼ÐµÐ½ÑˆÐµÐ½Ð½Ñ Ð½Ð°ÑиченоÑÑ‚Ñ– + + + + Dec gamma + Ð—Ð¼ÐµÐ½ÑˆÐµÐ½Ð½Ñ Ð³Ð°Ð¼Ð¸ + + + + Next audio + ÐаÑтупне аудіо + + + + Next subtitle + ÐаÑтупні Ñубтитри + + + + Next chapter + ÐаÑтупна глава + + + + Previous chapter + ÐŸÐ¾Ð¿ÐµÑ€ÐµÐ´Ð½Ñ Ð³Ð»Ð°Ð²Ð° + + + + Inc saturation + Ð—Ð±Ñ–Ð»ÑŒÑˆÐµÐ½Ð½Ñ Ð½Ð°ÑиченоÑÑ‚Ñ– + + + + Inc gamma + Ð—Ð±Ñ–Ð»ÑŒÑˆÐµÐ½Ð½Ñ Ð³Ð°Ð¼Ð¸ + + + + &Load external file... + &Завантажити зовнішній файл... + + + + &Kerndeint + &Ядерний деінтерлейÑер + + + + &Yadif (normal) + &Yadif (проÑтий) + + + + Y&adif (double framerate) + Y&adif (подвійна чаÑтота кадрів) + + + + &Next + &ÐаÑтупний + + + + Pre&vious + Поп&ередній + + + + Volume &normalization + ÐÐ¾Ñ€Ð¼Ð°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ &гучноÑÑ‚Ñ– + + + + &Audio CD + &Музичний CD + + + + Denoise nor&mal + Denoise зви&чайний + + + + Denoise &soft + Denoise &програмний + + + + Denoise o&ff + Б&ез Denoise + + + + Use SSA/&ASS library + ВикориÑтовувати бібліотеку SSA/&ASS + + + + Flip i&mage + Повернути з&Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ + + + + &Toggle double size + Увімкнути по&двійний розмір + + + + BaseGuiPlus + + + SMPlayer is still running here + SMPlayer вÑе ще працює тут + + + + S&how icon in system tray + Ð’&ідображати іконку в ÑиÑтемному треї + + + + &Hide + &Сховати + + + + &Restore + &Відновити + + + + &Quit + &Вихід + + + + Playlist + СпиÑок + + + + Core + + + Brightness: %1 + ЯÑкравіÑÑ‚ÑŒ: %1 + + + + Contrast: %1 + КонтраÑÑ‚Ñ–ÑÑ‚ÑŒ: %1 + + + + Gamma: %1 + Гама: %1 + + + + Hue: %1 + Колір: %1 + + + + Saturation: %1 + ÐаÑиченіÑÑ‚ÑŒ: %1 + + + + Volume: %1 + ГучніÑÑ‚ÑŒ: %1 + + + + Zoom: %1 + МаÑштаб: %1 + + + + DefaultGui + + + Welcome to SMPlayer + ЛаÑкаво проÑимо до SMPlayer + + + + Volume + ГучніÑÑ‚ÑŒ + + + + Audio + Звук + + + + Subtitle + Субтитри + + + + &Main toolbar + &Головна панель + + + + &Language toolbar + &Панель мов + + + + &Toolbars + &Панелі + + + + Encodings + + + Western European Languages + Східна Європа + + + + Western European Languages with Euro + Східна Європа з Євро + + + + Slavic/Central European Languages + КирилицÑ/Центральна Європа + + + + Esperanto, Galician, Maltese, Turkish + ЕÑперанто, ГальÑький, МальтійÑький, ТюркÑький + + + + Old Baltic charset + БалтійÑька Ñтара + + + + Cyrillic + ÐšÐ¸Ñ€Ð¸Ð»Ð¸Ñ†Ñ + + + + Arabic + ÐрабÑька + + + + Modern Greek + Грецька нова + + + + Turkish + ТюркÑька + + + + Baltic + БалтійÑька + + + + Celtic + КельтÑька + + + + Hebrew charsets + Іврит + + + + Russian + РоÑійÑька + + + + Ukrainian, Belarusian + УкраїнÑька, БілоруÑька + + + + Simplified Chinese charset + КитайÑька Ñпрощена + + + + Traditional Chinese charset + КитайÑька традиційна + + + + Japanese charsets + ЯпонÑька + + + + Korean charset + КорейÑька + + + + Thai charset + ТайÑька + + + + Cyrillic Windows + ÐšÐ¸Ñ€Ð¸Ð»Ð¸Ñ†Ñ Windows + + + + Slavic/Central European Windows + КирилицÑ/Центральна Європа Windows + + + + Arabic Windows + + + + + EqSlider + + + icon + піктограма + + + + FilePropertiesDialog + + + SMPlayer - File properties + SMPlayer - ВлаÑтивоÑÑ‚Ñ– файлу + + + + &Information + &Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ + + + + &Demuxer + &ДемультиплекÑор + + + + &Select the demuxer that will be used for this file: + &Виберіть демультиплекÑор Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ файлу: + + + + &Reset + Ск&Ð¸Ð´Ð°Ð½Ð½Ñ + + + + &Video codec + &Відео кодек + + + + &Select the video codec: + &Виберіть відео кодек: + + + + A&udio codec + З&вуковий кодек + + + + &Select the audio codec: + &Виберіть звуковий кодек: + + + + &MPlayer options + Опції &MPlayer + + + + Additional Options for MPlayer + Додаткові опції Ð´Ð»Ñ MPlayer + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + Тут Ви можете передати додаткові опції в MPlayer. +ЗапиÑуютьÑÑ Ñ‡ÐµÑ€ÐµÐ· пробіли. +Приклад: -flip -nosound + + + + &Options: + &Опції: + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + Ви можете також передати додаткові фильтри відео. +РазділÑйте Ñ—Ñ… комою. Ðе викориÑтовуйте пробіли! +Приклад: scale=512:-2,eq2=1.1 + + + + V&ideo filters: + Фільтри в&ідео: + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + Фільтри звука. ВикориÑтовуютьÑÑ Ð°Ð½Ð°Ð»Ð¾Ð³Ñ–Ñ‡Ð½Ð¾ фільтрам відео. +Приклад: resample=44100:0:0,volnorm + + + + Audio &filters: + Фильтри &звуку: + + + + OK + Готово + + + + Cancel + Відмінити + + + + Apply + ЗаÑтоÑувати + + + + InfoFile + + + General + Головне + + + + Size + Розмір + + + + %1 KB (%2 MB) + %1 КБ (%2 МБ) + + + + URL + ÐдреÑа + + + + Length + ТриваліÑÑ‚ÑŒ + + + + Demuxer + ДемультиплекÑор + + + + Name + Ім'Ñ + + + + Artist + Виконавець + + + + Author + Ðвтор + + + + Album + Ðльбом + + + + Genre + Жанр + + + + Date + Дата + + + + Track + Доріжка + + + + Copyright + ÐвторÑьке право + + + + Comment + Примітка + + + + Software + Програма + + + + Clip info + Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ кліп + + + + Video + Відео + + + + Resolution + РоздільніÑÑ‚ÑŒ екрану + + + + Aspect ratio + Ð¡Ð¿Ñ–Ð²Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ñторін + + + + Format + Формат + + + + Bitrate + Бітрейт + + + + %1 kbps + %1 кб/Ñ + + + + Frames per second + Фреймів за Ñекунду + + + + Selected codec + Вибраний кодек + + + + Initial Audio Stream + Початковий звуковий потік + + + + Rate + ЧаÑтота + + + + %1 Hz + %1 Гц + + + + Channels + Канали + + + + Audio Streams + Звукові потоки + + + + Language + Мова + + + + empty + нічого + + + + Subtitles + Субтитри + + + + Type + Тип + + + + ID + Info for translators: this is a identification code + + + + + # + Info for translators: this is a abbreviation for number + + + + + Stream title + Заголовок потоку + + + + Stream URL + ÐдреÑа потоку + + + + File + Файл + + + + InputDVDDirectory + + + Choose a directory + Вибрати теку + + + + SMPlayer - Play a DVD from a folder + SMPlayer - Відтворити DVD з теки + + + + You can play a dvd from your hard disc. Just select the folder which contains the VIDEO_TS and AUDIO_TS directories. + Ви можете відкрити DVD з жорÑткого диÑку. Виберіть теку, Ñка міÑтить VIDEO_TS та AUDIO_TS. + + + + Choose a directory... + Виберіть теку... + + + + InputURL + + + SMPlayer - Enter URL + SMPlayer - Введіть URL + + + + &URL: + &ÐдреÑа: + + + + It's a &playlist + &СпиÑок + + + + If this option is checked, the URL will be treated as a playlist: it will be opened as text and will play the URLs in it. + Якщо Ñ†Ñ Ð¾Ð¿Ñ†Ñ–Ñ ÑƒÐ²Ñ–Ð¼ÐºÐ½ÐµÐ½ - URL ÑприймаєтьÑÑ Ñк ÑпиÑок: буде відкрито Ñк текÑÑ‚ та відтворено. + + + + LogWindow + + + Choose a filename to save under + Виберіть ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ Ð´Ð»Ñ Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ + + + + Confirm overwrite? + ПерезапиÑати? + + + + The file already exists. +Do you want to overwrite? + Файл Ñ–Ñнує. +ПерезапиÑати? + + + + Error saving file + Помилка Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ + + + + The log couldn't be saved + Ðеможливо зберегти звіт + + + + Logs + Звіти + + + + LogWindowBase + + + Log Window + Вікно звіту + + + + Save + Зберегти + + + + Copy to clipboard + Копіювати до буферу обміну + + + + Close + Закрити + + + + &Close + &Закрити + + + + Playlist + + + Name + Ім'Ñ + + + + Length + ТриваліÑÑ‚ÑŒ + + + + &Play + Від&Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ + + + + &Edit + &Редагувати + + + + Playlists + СпиÑок + + + + Choose a file + Вибрати файл + + + + Choose a filename + Виберіть ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ + + + + Confirm overwrite? + ПерезапиÑати? + + + + The file %1 already exists. +Do you want to overwrite? + Файл %1 Ñ–Ñнує. +ПерезапиÑати? + + + + All files + Ð’ÑÑ– файли + + + + Select one or more files to open + Виберіть один чи більше файлів + + + + Choose a directory + Вибрати теку + + + + Edit name + Змінити ім'Ñ + + + + Type the name that will be displayed in the playlist for this file: + Введіть ім'Ñ, котре буде відповідати у ÑпиÑку цьому файлу: + + + + &Load + &Загрузити + + + + &Save + &Зберегти + + + + &Next + &ÐаÑтупний + + + + Pre&vious + По&передній + + + + Move &up + ЗміÑтити &вгору + + + + Move &down + ЗміÑтити &вниз + + + + &Repeat + &Повторювати + + + + S&huffle + П&еремішати + + + + Add &current file + Додати &поточний файл + + + + Add &file(s) + Додати &файл(и) + + + + Add &directory + Додати &теку + + + + Remove &selected + Видалити &вибране + + + + Remove &all + Видалити &вÑе + + + + SMPlayer - Playlist + SMPlayer - СпиÑок + + + + Add... + Додати... + + + + Remove... + Видалити... + + + + Playlist modified + СпиÑок змінено + + + + There are unsaved changes, do you want to save the playlist? + Зміни в ÑпиÑку не збережено! Ви бажаєте зберегти? + + + + PrefAdvanced + + + Advanced + Додатково + + + + Auto + Ðвто + + + + &Advanced + &Додатково + + + + icon + піктограма + + + + Additional Options for MPlayer + Додаткові опції Ð´Ð»Ñ MPlayer + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + Тут Ви можете передати додаткові опції Ð´Ð»Ñ MPlayer. +РозділÑÑŽÑ‚ÑŒÑÑ Ð¿Ñ€Ð¾Ð±Ñ–Ð»Ð°Ð¼Ð¸. +Приклад: -flip -nosound + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + Тут Ви можете передати додаткові фільтри відео. +РазділÑти комою. Ðе викориÑтовувати пробіли! +Приклад: scale=512:-2,eq2=1.1 + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + Фільтри звуку. ВикориÑтовуютьÑÑ Ð°Ð½Ð°Ð»Ð¾Ð³Ñ–Ñ‡Ð½Ð¾ фільтрам відео. +Приклад: resample=44100:0:0,volnorm + + + + Don't repaint the background of the video window + Ðе перемальовувати фон вікна відео + + + + &Logs + &Звіти + + + + Log MPlayer output + Вихідний звіт MPlayer + + + + Log SMPlayer output + Вихідний звіт SMPlayer + + + + This option is mainly intended for debugging the application. + Ці опції, головним чином, потрібні щоб відладити програму. + + + + &MPlayer language + Мова &MPlayer + + + + SMPlayer needs to read and parse the output of MPlayer and sometimes it relies on English text. If you are using a MPlayer translated into another language, then you need to change the texts that SMPlayer looks for. (Technically you should enter regular expressions)<br><br> +The drop-down lists may provide already made regular expression for several languages. + SMPlayer повинен зчитати та розібрати вивід MPlayer, Ñкий Ñк правило англійÑькою мовою. Якщо у Ð’Ð°Ñ MPlayer перекладений іншою мовою - Ви повинні змінити Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ñ‚ÐµÐºÑту Ð´Ð»Ñ SMPlayer. (Технічно Ви повинні вказати регулÑрний вираз)<br><br> +Випадаючі ÑпиÑки можуть надавати готові регулÑрні вирази Ð´Ð»Ñ Ñ€Ñ–Ð·Ð½Ð¸Ñ… мов. + + + + Checking this option may reduce flickering, but it also might produce that the video won't be displayed properly. + Ð¦Ñ Ð¾Ð¿Ñ†Ñ–Ñ Ð¼Ð¾Ð¶Ðµ зменшити мерехтіннÑ, але може призвеÑти до того, що Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð±ÑƒÐ´Ðµ показане не відповідним чином. + + + + If checked, smplayer will store the output of mplayer (you can see it in <b>Options->View logs->mplayer</b>). In case of problems this log can contain important information, so it's recommended to keep this option checked. + Якщо увімкнено - SMPlayer буде зберігати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ mplayer (Ñ—Ñ… можна побачити у <b>ÐалаштуваннÑ->ДивитиÑÑŒ звіти->mplayer</b>). У випадку проблем ці звіти можут міÑтити важливу інформацію, так що рекомендуєтьÑÑ ÑƒÐ²Ñ–Ð¼ÐºÐ½ÑƒÑ‚Ð¸. + + + + If this option is checked, smplayer will store the debugging messages that smplayer outputs (you can see the log in <b>Options->View logs->smplayer</b>). This information can be very useful for the developer in case you find a bug. + Якщо увімкнено - SMPlayer буде зберігати Ñвої налагоджувальні Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ (Ñ—Ñ… можна побачити у <b>ÐалаштуваннÑ->ДивитиÑÑŒ звіти->smplayer</b>). Ð¦Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¼Ð¾Ð¶Ðµ бути кориÑною Ð´Ð»Ñ Ñ€Ð¾Ð·Ñ€Ð¾Ð±Ð½Ð¸ÐºÐ°, Ñкщо Ви знайдете помилку. + + + + Filter for SMPlayer logs + Фильтр Ð´Ð»Ñ Ð·Ð²Ñ–Ñ‚Ñ–Ð² SMPlayer + + + + This option allows to filter the smplayer messages that will be stored in the log. Here you can write any regular expression.<br>For instance: <i>^Core::.*</i> will display only the lines starting with <i>Core::</i> + Ð¦Ñ Ð¾Ð¿Ñ†Ñ–Ñ Ð´Ð¾Ð·Ð²Ð¾Ð»ÑÑ” фільтрувати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ smplayer, Ñкі будуть збережені у звіті. Тут Ви можете напиÑати будь-Ñкий регулÑрний вираз.<br>Ðаприклад: <i>^Core::.*</i> відобразить лише Ñтроки, що починаютьÑÑ Ð· <i>Core::</i> + + + + &Monitor aspect: + &ÐÑпект монітора: + + + + &Run MPlayer in its own window + &ЗапуÑкати MPlayer у влаÑному вікні + + + + &Options: + &ÐалаштуваннÑ: + + + + V&ideo filters: + Фільтри в&ідео: + + + + Audio &filters: + Фільтри &звуку: + + + + &Colorkey: + &Код кольору: + + + + &Don't repaint the background of the video window + &Ðе перемальовувати фон вікна відео + + + + Log &MPlayer output + Ð’Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð²Ñ–Ñ‚Ñƒ &MPlayer + + + + Log &SMPlayer output + Ð’Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð²Ñ–Ñ‚Ñƒ &SMPlayer + + + + &Filter for SMPlayer logs: + &Фільтр Ð´Ð»Ñ Ð·Ð²Ñ–Ñ‚Ñ–Ð² SMPlayer: + + + + &End of file: + &Кінець файлу: + + + + &No video: + &Ðе відео: + + + + C&hange... + З&мінити... + + + + PrefAssociations + + + Warning + + + + + Not all files could be associated. Please check your security permissions and retry. + + + + + File Types + + + + + Select all + + + + + Check all file types in the list + + + + + Uncheck all file types in the list + + + + + List of file types + + + + + File types + + + + + Media files handled by SMPlayer: + + + + + Select All + + + + + Select None + + + + + Check the media file extensions you would like SMPlayer to handle. When you click Apply, the checked files will be associated with SMPlayer. If you uncheck a media type, the file association will be restored. + + + + + Select none + + + + + PrefDrives + + + Drives + ДиÑки + + + + Currently SMPlayer does not autodetect cdrom or dvd devices. So in order to play cdroms or dvds you must first select here your cdrom and dvd drives (can be the same). + Ðа даний Ñ‡Ð°Ñ SMPlayer не вміє ÑамоÑтійно знаходити CD чи DVD приÑтрої. Ð”Ð»Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð²Ð°Ð½Ð½Ñ CD чи DVD вкажіть відповідні приÑтрої (може бути те ж Ñаме). + + + + icon + піктограма + + + + CD device + ПриÑтрій CD + + + + Choose your CDROM device. It will be used to play VCDs and Audio CDs. + Вкажіть Ваш приÑтрій CDROM. Це потрібно Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð²Ð°Ð½Ð½Ñ Ð·Ð²ÑƒÐºÐ¾Ð²Ð¸Ñ… та VCD диÑків. + + + + DVD device + ПриÑтрій DVD + + + + Choose your DVD device. It will be used to play DVDs. + Вкажіть Ваш приÑтрій DVD. Це потрібно Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð²Ð°Ð½Ð½Ñ DVD. + + + + Select your &CD device: + Виберіть Ваш &CD-приÑтрій: + + + + Select your &DVD device: + Виберіть Ваш &DVD-приÑтрій: + + + + PrefGeneral + + + General + Головне + + + + &General + &Головне + + + + Paths + ШлÑхи + + + + Output drivers + ПриÑтрої виводу + + + + Media settings + ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼ÐµÐ´Ñ–Ð° + + + + Preferred audio and subtitles + Переважні аудіо та Ñубтитри + + + + &Video and audio + &Відео та звук + + + + Video + Відео + + + + Start videos in fullscreen + Стартувати відео на повний екран + + + + Disable screensaver + Придушити ÑкринÑейвер + + + + Audio + Звук + + + + Select the mplayer executable + Вкажіть виконуваний файл MPlayer + + + + Executables + Виконувані файли + + + + All files + Ð’ÑÑ– файли + + + + Select a directory + Виберіть каталог + + + + MPlayer executable + Виконуваний файл MPlayer + + + + Here you must specify the mplayer executable that smplayer will use.<br>smplayer requires at least mplayer 1.0rc1 (svn recommended).<br><b>If this setting is wrong, smplayer won't be able to play anything!</b> + Тут Вам потрібно вказати виконуваний файл mplayer, Ñкий SMPlayer буде викориÑтовувати.<br>SMPlayer потрібна верÑÑ–Ñ mplayer щонайменше 1.0rc1 (рекомендуєтьÑÑ Ð· svn).<br><b>Якщо ці Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð½ÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ñ– - SMPlayer не зможе нічого відкрити!</b> + + + + Screenshots folder + Каталог Ñкріншотів + + + + Here you can specify a folder where the screenshots taken by smplayer will be stored. If this field is empty the screenshot feature will be disabled. + Тут Ви можете вказати теку, куди будуть зберігатиÑÑ Ñкріншоти, зроблені SMPlayer. Якщо це поле буде пуÑтим - Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð±ÑƒÐ´Ðµ вимкнута. + + + + Video output driver + ПриÑтрій Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ÐµÐ¾ + + + + Select the video output driver. Usually xv (linux) and directx (windows) provide the best performance. + Виберіть драйвер Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ÐµÐ¾. ВикориÑÑ‚Ð°Ð½Ð½Ñ xv (linux) та directx (windows) забезпечує найкращу швидкодію. + + + + Audio output driver + ПриÑтрій Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð·Ð²ÑƒÐºÑƒ + + + + Select the audio output driver. + Виберіть драйвер Ð²Ð¸Ð²Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð·Ð²ÑƒÐºÑƒ. + + + + Remember settings + Запам'Ñтати Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ + + + + Usually smplayer will remember the settings for each file you play (audio track selected, volume, filters...). Uncheck this option if you don't like this feature. + Звичайно SMPlayer запам'Ñтовує Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ файлу, Ñкий ви відкриваєте (вибрана звукова доріжка, гучніÑÑ‚ÑŒ, фільтри Ñ– Ñ‚.п.). Вимкніть це, Ñкщо Вам таке не потрібно. + + + + Don't remember time position + Ðе запам'Ñтовувати позицію чаÑу + + + + If you check this option, smplayer will play all files from the beginning. + Якщо ви виберете цю опцію - SMPlayer буде відтворювати вÑÑ– файли з початку. + + + + Preferred audio language + Переважаюча мова аудіо + + + + Here you can type your preferred language for the audio streams. When a media with multiple audio streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the audio streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the audio track if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + Тут Ви можете вказати мову Ð´Ð»Ñ Ð·Ð²ÑƒÐºÐ¾Ð²Ð¸Ñ… доріжок. При знаходженні звукових доріжок SMPlayer буде намагатиÑÑ Ð²Ð¸ÐºÐ¾Ñ€Ð¸Ñтовувати вказану Вами мову.<br>Це працює тільки Ð´Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ñ–Ð², Ñкі надають інформацію про мови Ð´Ð»Ñ Ð·Ð²ÑƒÐºÐ¾Ð²Ð¸Ñ… доріжок, такі Ñк DVD чи mkv файли.<br>ПриймаютьÑÑ Ñ€ÐµÐ³ÑƒÐ»Ñрні вирази. Приклад: <b>es|esp|spa</b> призначить звукову доріжку, Ñка відповідатиме <i>es</i>, <i>esp</i> чи <i>spa</i>. + + + + Preferred subtitle language + Переважаюча мова Ñубтитрів + + + + Here you can type your preferred language for the subtitle stream. When a media with multiple subtitle streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the subtitle streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the subtitle stream if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + Тут Ви можете вказати мову Ð´Ð»Ñ Ð·Ð²ÑƒÐºÐ¾Ð²Ð¸Ñ… Ñубтитрів. При знаходженні Ñубтитрів Ð´Ð»Ñ SMPlayer привілейованою буде вказана Вами мова.<br>Це працює тільки Ð´Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ñ–Ð², Ñкі надають інформацію про мови Ð´Ð»Ñ Ñубтитрів, такі Ñк DVD чи mkv файли.<br>ПриймаютьÑÑ Ñ€ÐµÐ³ÑƒÐ»Ñрні вирази. Приклад: <b>es|esp|spa</b> призначить звукову доріжку, Ñка відповідатиме <i>es</i>, <i>esp</i> чи <i>spa</i>. + + + + Software video equalizer + Програмний еквалайзер відео + + + + You can check this option if video equalizer is not supported by your graphic card or the selected video output driver.<br><b>Note:</b> this option can be incompatible with some video output drivers. + Ви можете Ñпробувати ці опції, Ñкщо відеоеквалайзер не підтримуєтьÑÑ Ð’Ð°ÑˆÐ¾ÑŽ відеокартою чи вибраним драйвером Ð²Ð¸Ð²Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ÐµÐ¾.<br><b>Пам'Ñтайте:</b> ці опції можуть бути неÑуміÑними з деÑкими драйверами Ð²Ð¸Ð²Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ÐµÐ¾. + + + + If this option is checked, all videos will start to play in fullscreen mode. + Якщо Ви виберете цю опцію - вÑÑ– відеофайли будуть Ñтартувати на веÑÑŒ екран. + + + + Check this option to disable the screensaver while playing.<br>The screensaver will enabled again when play finishes.<br><b>Note:</b> This option works only in X11 and Windows. + Виберіть цю опцію Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð´ÑƒÑˆÐµÐ½Ð½Ñ ÑкрінÑейверу при відтворенні.<br>СкрінÑейвер буде ініційовано знову піÑÐ»Ñ Ð·ÑƒÐ¿Ð¸Ð½ÐºÐ¸.<br><b>Пам'Ñтайте:</b> Ð¦Ñ Ð¾Ð¿Ñ†Ñ–Ñ Ð¿Ñ€Ð°Ñ†ÑŽÑ” тільки Ð´Ð»Ñ X11 та Windows. + + + + Software volume control + Програмний контроль гучноÑÑ‚Ñ– + + + + Check this option to use the software mixer, instead of using the sound card mixer. + Перевірте ці опції Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð½Ð¾Ð³Ð¾ мікшера заміÑÑ‚ÑŒ апаратного мікшера звукової карти. + + + + Postprocessing quality + ЯкіÑÑ‚ÑŒ піÑлÑобробки + + + + Dynamically changes the level of postprocessing depending on the available spare CPU time. The number you specify will be the maximum level used. Usually you can use some big number. + Динамічна зміна Ñ€Ñ–Ð²Ð½Ñ Ð¿Ñ–ÑлÑобробки в залежноÑÑ‚Ñ– від вільного процеÑорного чаÑу. ЧиÑло, Ñке Ви вкажете. буде викориÑтано Ñк макÑимальний рівень. Звичайно можка вказати доÑить велике значеннÑ. + + + + Change volume + Змінити гучніÑÑ‚ÑŒ + + + + If checked, SMPlayer will remember the volume for every file and will restore it when played again. For new files the default volume will be used. + Якщо увімнено, SMPlayer буде запам'Ñтовувати гучніÑÑ‚ÑŒ Ð´Ð»Ñ ÑƒÑÑ–Ñ… файлів Ñ– відновлюватиме при наÑтупному Ñ—Ñ… відкритті. Ð”Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ… файлів буде викориÑтана гучніть за замовчаннÑм. + + + + 0 + + + + + &Change volume on every file + &Змінити гучніÑÑ‚ÑŒ Ð´Ð»Ñ Ð²ÑÑ–Ñ… файлів + + + + &Search... + &Пошук... + + + + S&elect... + Ð’&ибір... + + + + Select the &MPlayer executable: + Виберіть виконуваний файл &MPlayer: + + + + &Folder for storing screenshots: + &Тека Ð´Ð»Ñ Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ñкріншотів: + + + + V&ideo: + Ð’&ідео: + + + + &Audio: + &Звук: + + + + &Don't remember time position (files start playing from the beginning) + &Ðе запам'Ñтовувати позицію чаÑу (файли відтворюютьÑÑ Ð· початку) + + + + &Remember settings for all files (audio track, subtitles...) + Запам'Ñтовувати Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ &вÑÑ–Ñ… файлів (звукові доріжки, Ñубтитри...) + + + + A&udio: + З&вук: + + + + Su&btitles: + Су&бтитри: + + + + &Use software video equalizer + ВикориÑтовувати &програмний еквалайзер відео + + + + &Quality: + &ЯкіÑÑ‚ÑŒ: + + + + Start videos in &fullscreen + Стартувати відео на повний &екран + + + + Disable &screensaver + Придушити &ÑкринÑейвер + + + + &Default volume: + &ГучніÑÑ‚ÑŒ за умовчаннÑм: + + + + Use s&oftware volume control + ВикориÑтовувати програмний &контроль гучноÑÑ‚Ñ– + + + + Ma&x. Amplification: + Мак&Ñимальна амплітуда: + + + + &AC3/DTS pass-through S/PDIF + Передача &AC3/DTS на S/PDIF + + + + Direct rendering + ПрÑмий рендерінг + + + + If checked, turns on direct rendering (not supported by all codecs and video outputs)<br><b>WARNING:</b> May cause OSD/SUB corruption! + Якщо увімкнено - активуєтьÑÑ Ð¿Ñ€Ñмий рендерінг (підтримуєтьÑÑ Ð½Ðµ вÑіми кодеками та приÑтроÑми відеовиводу)<br><b>УВÐГÐ:</b> Може пошкодити екранну індикацію та Ñубтитри! + + + + Double buffering + Подвійна Ð±ÑƒÑ„ÐµÑ€Ð¸Ð·Ð°Ñ†Ñ–Ñ + + + + D&irect rendering + П&Ñ€Ñмий рендерінг + + + + Dou&ble buffering + Под&війна Ð±ÑƒÑ„ÐµÑ€Ð¸Ð·Ð°Ñ†Ñ–Ñ + + + + Double buffering fixes flicker by storing two frames in memory, and displaying one while decoding another. If disabled it can affect OSD negatively, but often removes OSD flickering. + Подвійна Ð±ÑƒÑ„ÐµÑ€Ð¸Ð·Ð°Ñ†Ñ–Ñ Ð²Ð¸Ð¿Ñ€Ð°Ð²Ð»ÑÑ” Ð¼ÐµÑ€ÐµÑ…Ñ‚Ñ–Ð½Ð½Ñ Ñ‚Ñ€Ð¸Ð¼Ð°ÑŽÑ‡Ð¸ два фрейми в пам'ÑÑ‚Ñ– - відображаючи один, декодує інший. Якщо вимкнено - може негативно вплинути на екранну індикацію, але Ñк правило припинÑÑ” Ñ—Ñ— мерехтіннÑ. + + + + &Enable postprocessing by default + &Ðктивувати піÑлÑобробку за умовчаннÑм + + + + Volume &normalization by default + ÐÐ¾Ñ€Ð¼Ð°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ &гучноÑÑ‚Ñ– за умовчаннÑм + + + + Close when finished + Вийти по закінченню + + + + If this option is checked, the main window will be automatically closed when the current file/playlist finishes. + Ð¦Ñ Ð¾Ð¿Ñ†Ñ–Ñ Ð°ÐºÑ‚Ð¸Ð²ÑƒÑ” автоматичний вихід з програми по закінченню Ð²Ñ–Ð´Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ чи ÑпиÑку. + + + + &Close when finished + Вийти по &закінченню + + + + 2 (Stereo) + 2 (Стерео) + + + + 4 (4.0 Surround) + 4 (4.0 оточеннÑ) + + + + 6 (5.1 Surround) + 6 (5.1 оточеннÑ) + + + + C&hannels by default: + К&анали за умовчаннÑм: + + + + &Pause when minimized + &Пауза при мінімізації + + + + Pause when minimized + + + + + If this option is enabled, the file will be paused when the main window is hidden. When the window is restored, play will be resumed. + + + + + Enable postprocessing by default + + + + + Max. Amplification + + + + + AC3/DTS pass-through S/PDIF + + + + + Volume normalization by default + + + + + Maximizes the volume without distorting the sound. + + + + + Default volume + + + + + Sets the initial volume that new files will use. + + + + + Channels by default + + + + + Sets the maximum amplification level in percent (default: 110). A value of 200 will allow you to adjust the volume up to a maximum of double the current level. With values below 100 the initial volume (which is 100%) will be above the maximum, which e.g. the OSD cannot display correctly. + + + + + Uses hardware AC3 passthrough + + + + + Requests the number of playback channels. MPlayer asks the decoder to decode the audio into as many channels as specified. Then it is up to the decoder to fulfill the requirement. This is usually only important when playing videos with AC3 audio (like DVDs). In that case liba52 does the decoding by default and correctly downmixes the audio into the requested number of channels. NOTE: This option is honored by codecs (AC3 only), filters (surround) and audio output drivers (OSS at least). + + + + + Postprocessing will be used by default on new opened files. + + + + + PrefInput + + + Keyboard and mouse + Клавіатура та миша + + + + &Keyboard + &Клавіатура + + + + icon + піктограма + + + + &Mouse + &Миша + + + + Button functions: + Функції кнопок: + + + + Media seeking + Прокрутка + + + + Volume control + ГучніÑÑ‚ÑŒ + + + + Zoom video + МаÑштаб відео + + + + None + Ðічого + + + + Here you can change any key shortcut. To do it double click or press enter over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + Тут Ви можете змінити будь-Ñку комбінацію клавіш. Двічі клацніть або натиÑніть ENTER на чарунку комбінації. Додатково Ви можете зберегти ÑпиÑок комбінацій Ð´Ð»Ñ Ñ€Ð¾Ð·Ð¿Ð¾Ð²ÑÑŽÐ´Ð¶ÐµÐ½Ð½Ñ Ñ–Ð½ÑˆÐ¸Ð¼ або Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð½Ð° іншому комп'ютері. + + + + Here you can change any key shortcut. To do it double click or start typing over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + Тут Ви можете вказати будь-Ñкі комбінації клавіш. Двічі клікніть Ð´Ð»Ñ Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð°Ð±Ð¾ почніть вводити комбінацію на чарунку. Також Ви можете зберегти перелік комбінацій Ð´Ð»Ñ Ñ–Ð½ÑˆÐ¸Ñ… або Ð´Ð»Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð½Ð° іншому комп'ютері. + + + + &Left click + &Клік лівою + + + + &Double click + &Подвійний клік + + + + &Wheel function: + &Ð¤ÑƒÐ½ÐºÑ†Ñ–Ñ ÐºÐ¾Ð»ÐµÑа: + + + + Shortcut editor + + + + + This table allows you to change the key shortcuts of most available actions. Double click or press enter on a item, or press the <b>Change shortcut</b> button to enter in the <i>Modify shortcut</i> dialog. There are two ways to change a shortcut: if the <b>Capture</b> button is on then just press the new key or combination of keys that you want to assign for the action (unfortunately this doesn't work for all keys). If the <b>Capture</b> button is off then you could enter the full name of the key. + + + + + Left click + + + + + Select the action for left click on the mouse. + + + + + Double click + + + + + Select the action for double click on the mouse. + + + + + Wheel function + + + + + Select the action for the mouse wheel. + + + + + PrefInterface + + + Interface + Ð†Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ + + + + Bulgarian + БолгарÑька + + + + Czech + ЧеÑька + + + + German + Ðімецька + + + + Greek + Грецька + + + + English + ÐнглійÑька + + + + Spanish + ІÑпанÑька + + + + Finnish + ФінÑька + + + + French + Французька + + + + Hungarian + УгорÑька + + + + Italian + ІталійÑька + + + + Japanese + ЯпонÑька + + + + Georgian + ГрузинÑька + + + + Dutch + ГолландÑька + + + + Polish + ПольÑька + + + + Portuguese - Brazil + ПортугальÑька (БразиліÑ) + + + + Portuguese - Portugal + ПортугальÑька (ПортугаліÑ) + + + + Romanian + РумунÑька + + + + Russian + РоÑійÑька + + + + Slovak + Словацька + + + + Serbian + СербÑька + + + + Swedish + ШведÑька + + + + Turkish + Турецька + + + + Ukrainian + УкраїнÑька + + + + Simplified-Chinese + Спрощена китайÑька + + + + Traditional Chinese + Традиційна КитайÑька + + + + <Autodetect> + <Ðвто> + + + + Default + За умовчаннÑм + + + + &Interface + &Ð†Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ + + + + Seeking + Пошук + + + + Recent files + ОÑтанні файли + + + + Never + Ðіколи + + + + Whenever it's needed + Коли це потрібно + + + + Only after loading a new video + Тільки піÑÐ»Ñ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ відео + + + + Language + Мова + + + + Here you can change the language of the application. + Тут Ви можете змінити мову програми. + + + + Instances + Приклади + + + + Catalan + КаталонÑька + + + + Basque + БаÑкÑька + + + + Galician + ГалиÑійÑька + + + + &Short jump + &Короткий крок + + + + &Medium jump + &Середній крок + + + + &Long jump + &Довгий крок + + + + Mouse &wheel jump + Крок &колеÑа миші + + + + &Use only one running instance of SMPlayer + &Ðктивувати віддалене ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ SMPlayer + + + + SMPlayer will listen to this &port to receive commands from other instances: + SMPlayer буде очікувати звонішні запити Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ Ð· цього &порта: + + + + Ma&x. items + Мак&Ñимальний показник + + + + St&yle: + Ст&иль: + + + + Ico&n set: + Ð’Ñтановити іко&нки: + + + + L&anguage: + Ðœ&ова: + + + + Main window + Головне вікно + + + + Auto&resize: + &Розмір автоматично: + + + + R&emember position and size + З&апам'Ñтовувати Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ Ñ‚Ð° розмір + + + + Default font: + Шрифт за умовчаннÑм: + + + + &Change... + &Змінити... + + + + PrefPerformance + + + Performance + Ð¨Ð²Ð¸Ð´ÐºÐ¾Ð´Ñ–Ñ + + + + &Performance + &Ð¨Ð²Ð¸Ð´ÐºÐ¾Ð´Ñ–Ñ + + + + Priority + Пріоритет + + + + Select the priority for the MPlayer process. + Вкажіть пріоритет процеÑу MPlayer. + + + + realtime + реальний Ñ‡Ð°Ñ + + + + high + виÑокий + + + + abovenormal + вище звичайного + + + + normal + звичайний + + + + belownormal + нижче звичайного + + + + idle + низький + + + + Cache + Кеш + + + + KB + Кб + + + + Setting a cache may improve performance on slow media + УÑтановки кешу можуть поліпшити чи погіршити швидкодію + + + + Allow frame drop + ДопуÑкати Ð²Ð¸Ð¿Ð°Ð´Ð°Ð½Ð½Ñ Ñ„Ñ€ÐµÐ¹Ð¼Ñ–Ð² + + + + Synchronization + Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ + + + + Audio/video auto synchronization + ÐвтоÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð·Ð²ÑƒÐºÐ°/відео + + + + Set process priority for mplayer according to the predefined priorities available under Windows.<br><b>WARNING:</b> Using realtime priority can cause system lockup. + Вкажіть пріоритет Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑу mplayer, доÑтупний Ð´Ð»Ñ Windows.<br><b>УВÐГÐ:</b> ВикориÑÑ‚Ð°Ð½Ð½Ñ Ð¿Ñ€Ñ–Ð¾Ñ€Ð¸Ñ‚ÐµÑ‚Ñƒ реального чаÑу може заморозити ÑиÑтему. + + + + <br><b>Note:</b> This option is for Windows only. + <br><b>Примітка:</b> Ці опції тільки Ð´Ð»Ñ Windows. + + + + This option specifies how much memory (in kBytes) to use when precaching a file or URL. Especially useful on slow media. + Ð¦Ñ Ð¾Ð¿Ñ†Ñ–Ñ Ð²ÐºÐ°Ð·ÑƒÑ” розмір (в кілобайтах) пам'ÑÑ‚Ñ–, що відводитьÑÑ Ð´Ð»Ñ ÐºÐµÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² чи URL. КориÑно Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ–Ð»ÑŒÐ½Ð¸Ñ… медіа. + + + + Skip displaying some frames to maintain A/V sync on slow systems. + ПропуÑкати деÑкі фрейми Ð´Ð»Ñ Ð·Ð°Ð±ÐµÐ·Ð¿ÐµÑ‡ÐµÐ½Ð½Ñ A/V Ñинхронізації на повільних ÑиÑтемах. + + + + Allow hard frame drop + ДопуÑкати жорÑтке Ð²Ð¸Ð¿Ð°Ð´Ð°Ð½Ð½Ñ Ñ„Ñ€ÐµÐ¹Ð¼Ñ–Ð² + + + + More intense frame dropping (breaks decoding). Leads to image distortion! + Збільшене Ð²Ð¸Ð¿Ð°Ð´Ð°Ð½Ð½Ñ Ñ„Ñ€ÐµÐ¹Ð¼Ñ–Ð² (декодуваннÑз переривами). Призводить до ÑÐ¿Ð¾Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ°Ñ€Ñ‚Ð¸Ð½ÐºÐ¸! + + + + Gradually adjusts the A/V sync based on audio delay measurements. + ПоÑтупове Ñ€ÐµÐ³ÑƒÐ»ÑŽÐ²Ð°Ð½Ð½Ñ A/V Ñинхронізації, оÑноване на розмірах звукових затримок. + + + + Priorit&y: + Пріори&тет: + + + + Si&ze: + Ро&змір: + + + + &Use cache + ВикориÑтовувати &кеш + + + + &Allow frame drop + &ДопуÑкати Ð²Ð¸Ð¿Ð°Ð´Ð°Ð½Ð½Ñ Ñ„Ñ€ÐµÐ¹Ð¼Ñ–Ð² + + + + Allow &hard frame drop (can lead to image distortion) + ДопуÑкати &жорÑтке Ð²Ð¸Ð¿Ð°Ð´Ð°Ð½Ð½Ñ Ñ„Ñ€ÐµÐ¹Ð¼Ñ–Ð² (може Ñпотворити картинку) + + + + Audio/&video auto synchronization + ÐвтоÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð·Ð²ÑƒÐºÐ°/&відео + + + + Fact&or: + Пок&азник: + + + + &Fast audio track switching + &Швидке Ð¿ÐµÑ€ÐµÐ¼Ð¸ÐºÐ°Ð½Ð½Ñ Ð·Ð²ÑƒÐºÐ¾Ð²Ð¸Ñ… доріжок + + + + Fast &seek to chapters in dvds + Швидкий &пошук звукових доріжок + + + + Create index if needed + Створити Ñ–Ð½Ð´ÐµÐºÑ Ð¿Ñ€Ð¸ потребі + + + + Rebuilds index of files if no index was found, allowing seeking. Useful with broken/incomplete downloads, or badly created files. This option only works if the underlying media supports seeking (i.e. not with stdin, pipe, etc).<br> Note: the creation of the index may take some time. + Відновлювати Ñ–Ð½Ð´ÐµÐºÑ Ñ„Ð°Ð¹Ð»Ñ–Ð² Ñкщо не знайдено, дозволÑючи прокрутку. КориÑно при неповно/помилково завантажених чи Ñтворених з помилками файлах. Ð¦Ñ Ð¾Ð¿Ñ†Ñ–Ñ Ð¿Ñ€Ð°Ñ†ÑŽÑ” тільки Ñкщо в даному медіа підтримуєтьÑÑ Ð¿Ñ€Ð¾ÐºÑ€ÑƒÑ‚ÐºÐ° (тобто не stdin, pipe та ін.). Примітка: ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ–Ð½Ð´ÐµÐºÑа займає деÑкий чаÑ. + + + + &Create index if needed + Створити &Ñ–Ð½Ð´ÐµÐºÑ Ð¿Ñ€Ð¸ потребі + + + + Fast audio track switching + + + + + If checked, it will try the fastest method to switch audio tracks but might not work with some formats. + + + + + Fast seek to chapters in dvds + + + + + If checked, it will try the fastest method to seek to chapters but it might not work with some discs. + + + + + PrefSubtitles + + + Subtitles + Субтитри + + + + Choose a ttf file + Вибрати ttf файл + + + + Truetype Fonts + Шрифти Truetype + + + + &Subtitles + &Субтитри + + + + Autoload + ÐÐ²Ñ‚Ð¾Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ñ‚Ñ + + + + Same name as movie + Така ж назва Ñк Ñ– у кліпа + + + + All subs containing movie name + Підключати Ñубтитри, Ñкі міÑÑ‚ÑÑ‚ÑŒ назву кліпу + + + + All subs in directory + Ð’ÑÑ– Ñубтитри теки + + + + Position + ÐŸÐ¾Ð·Ð¸Ñ†Ñ–Ñ + + + + 0 + + + + + Top + Верх + + + + Bottom + Ðиз + + + + &Font + &Шрифти + + + + Font + Шрифт + + + + Select the font which will be used for subtitles (and OSD): + Виберіть шрифт Ð´Ð»Ñ Ñубтитрів (та OSD): + + + + Size + Розмір + + + + No autoscale + Без автомаÑÑˆÑ‚Ð°Ð±ÑƒÐ²Ð°Ð½Ð½Ñ + + + + Proportional to movie height + Пропорційно до виÑоти клипу + + + + Proportional to movie width + Пропорційно до ширини клипу + + + + Proportional to movie diagonal + Пропорційно до діагоналі клипу + + + + SSA/&ASS library + Бібліотека SSA/&ASS + + + + The new SSA/ASS library will provide nice styled subtitles for external SSA/ASS subtitles files and Matroska tracks. But it will be used too for rendering other formats like SUB and SRT files. + Ðова бібліотека SSA/ASS забезпечує хорошу Ñтилізацію Ñубтитрів Ð´Ð»Ñ Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½Ñ–Ñ… файлів Ñубтитрів SSA/ASS та треків Matroska. Ðле це також буде викориÑтовуватиÑÑŒ Ð´Ð»Ñ Ñ€ÐµÐ½Ð´ÐµÑ€Ñ–Ð½Ð³Ñƒ файлів інших форматів, таких Ñк SUB та SRT. + + + + Here you can override styles for SSA/ASS subtitles. It can be also used for fine-tuning the rendering of SRT and SUB subtitles by the SSA/ASS library. Example: <b>Bold=1,Outline=2,Shadow=4</b> + Тут Ð’Ñ‹ можете вказати Ñтилі Ð´Ð»Ñ Ñубтитрів SSA/ASS. Також може викориÑтовуватиÑÑ Ð´Ð»Ñ Ñ‚Ð¾Ñ‡Ð½Ð¾Ð³Ð¾ Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ñубтитрів SRT Ñ– SUB библиотекою SSA/ASS. Приклад: <b> Bold=1, Outline=2, Shadow=4 </b> + + + + Subtitle position + ÐŸÐ¾Ð·Ð¸Ñ†Ñ–Ñ Ñубтитрів + + + + This option specifies the position of the subtitles over the video window. <i>100</i> means the bottom, while <i>0</i> means the top. + Ð¦Ñ Ð¾Ð¿Ñ†Ñ–Ñ Ð²ÐºÐ°Ð·ÑƒÑ” позицію Ñубтитрів на вікні відео. <i>100</i> задає в Ñамому низу, тоді Ñк <i>0</i> задає Ñамий верх. + + + + SSA/ASS styles + Стилі SSA/ASS + + + + Au&toload subtitles files (*.srt, *.sub...): + Ðв&Ñ‚Ð¾Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñубтитрів (*.srt, *.sub...): + + + + S&elect first available subtitle + Вибрати &перші доÑтупні Ñубтитри + + + + &Default subtitle encoding: + &ÐšÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ñубтитрів за умовчаннÑм: + + + + Default &position of the subtitles on screen + ÐŸÐ¾Ð·Ð¸Ñ†Ñ–Ñ Ñубтитрів на &екрані за умовчаннÑм + + + + &Include subtitles on screenshots + &Включати Ñубтитри до знімків екрану + + + + &Use -subfont option (required by recent MPlayer releases) + ВикориÑтовувати &опцію -subfont (потрібна Ð´Ð»Ñ Ð¾Ñтанніх верÑій MPlayer) + + + + &TTF font: + Шрифт &TTF: + + + + Sea&rch... + По&шук... + + + + S&ystem font: + С&иÑтемний шрифт: + + + + A&utoscale: + Ðвто&маÑштабуваннÑ: + + + + S&cale: + Ðœ&аÑштаб: + + + + &Use SSA/ASS library for subtitle rendering + ВикориÑтовувати бібліотеку SSA/ASS Ð´Ð»Ñ &рендерингу Ñубтитрів + + + + &Text color: + Колір &текÑту: + + + + &Border color: + Колір &краю: + + + + St&yles: + Сти&лі: + + + + PreferencesDialog + + + SMPlayer - Help + SMPlayer - Допомога + + + + OK + Готово + + + + Cancel + Відмінити + + + + Apply + ЗаÑтоÑувати + + + + Help + Допомога + + + + SMPlayer - Preferences + SMPlayer - ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ + + + + QObject + + + 1 second + 1 Ñекунда + + + + %1 seconds + Ñекунд: %1 + + + + %1 minutes + хвилин: %1 + + + + %1 minutes and %2 seconds + хвилин: %1, Ñекунд: %2 + + + + 1 minute + 1 хвилина + + + + 1 minute and 1 second + 1 хвилина та 1 Ñекунда + + + + 1 minute and %1 seconds + 1 хвилина, Ñекунд: %1 + + + + %1 minutes and 1 second + хвилин: %1, 1 Ñекунда + + + + This is SMPlayer v. %1 running on %2 + Це SMPlayer v. %1 запущений на %2 + + + + specifies the directory for the configuration file (smplayer.ini). If directory is omitted, the application directory will be used. + вказати теку з конфігураційним файлом (smplayer.ini). Якщо тека вказана - програма Ñ—Ñ— буде викориÑтовувати. + + + + the main window will be closed when the file/playlist finishes. + головне вікно закриєтьÑÑ, коли ÑкінчитьÑÑ Ð²Ñ–Ð´Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ чи ÑпиÑку. + + + + will show this message and then will exit. + відобразити це Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ‚Ð° вийти. + + + + 'media' is any kind of file that SMPlayer can open. It can be a local file, a DVD (e.g. dvd://1), an Internet stream (e.g. mms://....) or a local playlist in format m3u. If the -playlist option is used, that means that SMPlayer will pass the -playlist option to MPlayer, so MPlayer will handle the playlist, not SMPlayer. + 'media' будь-Ñкий файл, Ñкий SMPlayer може відкрити. Це може бути локальний файл, DVD (наприклад dvd://1), інтернет-потік (наприклад mms://....) чи локальний ÑпиÑок у форматі m3u. Якщо буде викориÑтано опцю -playlist, то SMPlayer передаÑÑ‚ÑŒ опцію -playlist на MPlayer, таким чином ÑпиÑок буде опрацьовувати не SMPlayer, а MPlayer. + + + + Usage: %1 [-ini-path [directory]] [-send-action action_name] [-actions action_list [-close-at-end] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + ВикориÑтаннÑ: %1 [-ini-path [directory]] [-send-action action_name] [-actions action_list [-close-at-end] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + + + + tries to make a connection to another running instance and send to it the specified action. Example: -send-action pause The rest of options (if any) will be ignored and the application will exit. It will return 0 on success or -1 on failure. + Ñпробувати з'єднатиÑÑ Ð· віддаленою програмою та передати їй вказану дію. Ðаприклад: -send-action pause. Інша чаÑтина опцій (чи іншого) буде проігнорована Ñ– програма закриєтьÑÑ. Буде повернено 0 при вдалому виконанні чи -1 при помилці. + + + + action_list is a list of actions separated by spaces. The actions will be executed just after loading the file (if any) in the same order you entered. For checkable actions you can pass true or false as parameter. Example: -actions "fullscreen compact true". Quotes are necessary in case you pass more than one action. + action_list - перелік дій, розділених пробілами. Дії будуть виконані тільки піÑÐ»Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ (чи іншого) у порÑдку, вказаному вами. Ð”Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ дії Ви можете передати переметр true чи false. Ðаприклад: -actions "fullscreen compact true". Кавички потрібні, Ñкщо Ви передаєте більше одного параметра. + + + + media + медіа + + + + if there's another instance running, the media will be added to that instance's playlist. If there's no other instance, this option will be ignored and the files will be opened in a new instance. + + + + + specifies the directory for the configuration file (smplayer.ini). + + + + + the main window won't be closed when the file/playlist finishes. + + + + + Usage: %1 [-ini-path directory] [-send-action action_name] [-actions action_list [-close-at-end] [-no-close-at-end] [-fullscreen] [-no-fullscreen] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + + + + + the video will be played in fullscreen mode. + + + + + the video will be played in window mode. + + + + + SeekWidget + + + icon + піктограма + + + + label + мітка + + + + ShortcutGetter + + + Modify shortcut + Змінити комбінацію + + + + Press the key combination you want to assign + ÐатиÑніть комбінацію клавіш, Ñку Ви бажаєте + + + + Clear + ОчиÑтити + + + + Capture + Ð—Ð°Ñ…Ð¾Ð¿Ð»ÐµÐ½Ð½Ñ + + + + Capture keystrokes + ÐšÐ¾Ð¼Ð±Ñ–Ð½Ð°Ñ†Ñ–Ñ ÐºÐ»Ð°Ð²Ñ–Ñˆ Ð·Ð°Ñ…Ð¾Ð¿Ð»ÐµÐ½Ð½Ñ + + + + VideoEqualizer + + + Equalizer + Еквалайзер + + + + Contrast + КонтраÑтніÑÑ‚ÑŒ + + + + Brightness + ЯÑкравіÑÑ‚ÑŒ + + + + Hue + Колір + + + + Saturation + ÐаÑиченіÑÑ‚ÑŒ + + + + Gamma + Гама + + + + &Reset + Об&нулити + + + + &Set as default values + &Ð’Ñтановити Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð° умовчаннÑм + + + + Use the current values as default values for new videos. + ВикориÑтовувати поточні Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñк за умовчаннÑм Ð´Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ… кліпів. + + + + Set all controls to zero. + Скинути вÑе на нуль. + + + diff --git a/retroshare-gui/src/apps/smplayer/translations/smplayer_zh_CN.qm b/retroshare-gui/src/apps/smplayer/translations/smplayer_zh_CN.qm new file mode 100644 index 000000000..ee52f47ef Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/translations/smplayer_zh_CN.qm differ diff --git a/retroshare-gui/src/apps/smplayer/translations/smplayer_zh_CN.ts b/retroshare-gui/src/apps/smplayer/translations/smplayer_zh_CN.ts new file mode 100644 index 000000000..6128fe0f0 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/translations/smplayer_zh_CN.ts @@ -0,0 +1,3881 @@ + + + + AboutDialog + + + Version: %1 + 版本: %1 + + + + 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. + 这个软件是自由软件; ä½ å¯ä»¥åœ¨ GPL 或 GPL2 或之åŽç‰ˆæœ¬ä¸‹ä¿®æ”¹/é‡æ–°å‘布它。 + + + + Translators: + 翻译者: + + + + German + 德语 + + + + Slovak + 斯洛ä¼å…‹è¯­ + + + + Italian + æ„大利语 + + + + French + 法语 + + + + Simplified-Chinese + 简体中文 + + + + Russian + 俄罗斯语 + + + + Hungarian + 匈牙利语 + + + + Japanese + 日语 + + + + Dutch + è·å…°è¯­ + + + + Ukrainian + 乌克兰语 + + + + Georgian + 乔治亚语 + + + + Czech + æ·å…‹è¯­ + + + + Logo designed by %1 + Logo 设计 %1 + + + + Get updates at: %1 + 于 %1 获å–最新版本 + + + + About SMPlayer + 关于 SMPlayer + + + + Polish + 波兰语 + + + + Bulgarian + ä¿åŠ åˆ©äºšè¯­ + + + + Turkish + 土耳其语 + + + + Swedish + 瑞典语 + + + + Serbian + 赛尔维亚语 + + + + Traditional Chinese + ç¹ä½“中文 + + + + Romanian + 罗马尼亚语 + + + + Portuguese - Brazil + è‘¡è„牙语 - 巴西 + + + + Portuguese - Portugal + è‘¡è„牙语 - è‘¡è„牙 + + + + Compiled with Qt %1 + ç”± Qt %1 编译 + + + + %1, %2 and %3 + %1,%2å’Œ%3 + + + + %1 and %2 + %1 å’Œ %2 + + + + http://smplayer.sourceforge.net/en/windows/download.php + If the web page is translated into your language you can change the URL so it points to the download page in the translation.Otherwise leave as is. + + + + + http://smplayer.sourceforge.net/en/linux/download.php + If the web page is translated into your language you can change the URL so it points to the download page in the translation.Otherwise leave as is. + + + + + <b>%1</b>: %2 + <b>%1</b>:%2 + + + + ActionsEditor + + + Name + åå­— + + + + Description + æè¿° + + + + Shortcut + å¿«æ·é”® + + + + &Save + ä¿å­˜(&S) + + + + &Load + 加载(&L) + + + + Key files + Key 文件 + + + + Choose a filename + 选择一个文件å + + + + Confirm overwrite? + 是å¦è¦†ç›–? + + + + The file %1 already exists. +Do you want to overwrite? + 文件 %1 己存在。 +是å¦è¦†ç›–? + + + + Choose a file + 选择一个文件 + + + + Error + 错误 + + + + The file couldn't be saved + ä¸èƒ½ä¿å­˜æ–‡ä»¶ + + + + The file couldn't be loaded + ä¸èƒ½åŠ è½½æ–‡ä»¶ + + + + &Change shortcut... + 修改快æ·é”®(&C)... + + + + BaseGui + + + SMPlayer - mplayer log + SMPlayer - Mplayer 日志 + + + + SMPlayer - smplayer log + SMPlayer - SMPlayer 日志 + + + + &Open + 打开(&O) + + + + &Play + 播放(&P) + + + + &Video + 视频(&V) + + + + &Audio + 音频(&A) + + + + &Subtitles + 字幕(&S) + + + + &Browse + æµè§ˆ(&B) + + + + Op&tions + 选项(&T) + + + + &Help + 帮助(&H) + + + + &File... + 文件(&F)... + + + + D&irectory... + 目录(&I)... + + + + &Playlist... + 播放列表(&P)... + + + + &DVD from drive + 从设备打开 &DVD + + + + D&VD from folder... + 从目录打开 D&VD... + + + + &URL... + &URL... + + + + &Clear + 清空(&C) + + + + &Recent files + 最近打开的文件(&R) + + + + P&lay + 播放(&L) + + + + &Pause + æš‚åœ(&P) + + + + &Stop + åœæ­¢(&S) + + + + &Frame step + å•å¸§æ­¥è¿›(&F) + + + + &Normal speed + 常速(&N) + + + + &Halve speed + åŠé€Ÿ(&H) + + + + &Double speed + 两å€é€Ÿ(&D) + + + + Speed &-10% + 速度 &-10% + + + + Speed &+10% + 速度 &+10% + + + + Sp&eed + 速度(&E) + + + + &Repeat + é‡å¤(&R) + + + + &Fullscreen + å…¨å±(&F) + + + + &Compact mode + 简æ´æ¨¡å¼(&C) + + + + Si&ze + 大å°(&Z) + + + + &Autodetect + 自动探测(&A) + + + + &4:3 + &4:3 + + + + &5:4 + &5:4 + + + + &14:9 + &14:9 + + + + 16:&9 + 16:&9 + + + + 1&6:10 + 1&6:10 + + + + &2.35:1 + &2.35:1 + + + + 4:3 &Letterbox + 4:3 &Letterbox + + + + 16:9 L&etterbox + 16:9 L&etterbox + + + + 4:3 &Panscan + 4:3 &Panscan + + + + 4:3 &to 16:9 + 4:3 &to 16:9 + + + + &Aspect ratio + 外观比例(&A) + + + + &None + æ— (&N) + + + + &Lowpass5 + &Lowpass5 + + + + Linear &Blend + Linear &Blend + + + + &Deinterlace + å拉ä¸(&D) + + + + &Postprocessing + &Postprocessing + + + + &Autodetect phase + 自动探测(&A) + + + + &Deblock + &Deblock + + + + De&ring + De&ring + + + + Add n&oise + Add n&oise + + + + F&ilters + 过滤器(&I) + + + + &Equalizer + å‡è¡¡å™¨(&E) + + + + &Screenshot + 截图(&S) + + + + S&tay on top + 置顶(&T) + + + + &Track + 音轨(&T) + + + + &Extrastereo + 扩展立体声(&E) + + + + &Karaoke + å¡æ‹‰O&K + + + + &Filters + 过滤器(&F) + + + + &Default + 默认(&D) + + + + &Stereo + 立体声(&S) + + + + &4.0 Surround + &4.0 环绕 + + + + &5.1 Surround + &5.1 环绕 + + + + &Channels + 声é“(&C) + + + + &Left channel + 左声é“(&L) + + + + &Right channel + å³å£°é“(&R) + + + + &Stereo mode + 立体声模å¼(&M) + + + + &Mute + é™éŸ³(&M) + + + + Volume &- + éŸ³é‡ &- + + + + Volume &+ + éŸ³é‡ &+ + + + + &Delay - + 延时 - (&D) + + + + D&elay + + 延时 + (&E) + + + + &Select + 选择(&S) + + + + &Load... + 加载(&L)... + + + + Delay &- + 延时 &- + + + + Delay &+ + 延时 &+ + + + + &Up + 上移(&U) + + + + &Down + 下移(&D) + + + + &Title + 标题(&T) + + + + &Chapter + 章节(&C) + + + + &Angle + 角度(&A) + + + + &Playlist + 播放列表(&P) + + + + &Show frame counter + 显示帧数(&S) + + + + &Disabled + ç¦ç”¨(&D) + + + + &Seek bar + 定ä½æ¡(&S) + + + + &Time + 时间(&T) + + + + Time + T&otal time + 时间 + 总时间(&O) + + + + &OSD + OSD(&O) + + + + &View logs + 查看日志(&V) + + + + P&references + 首选项(&R) + + + + About &Qt + 关于 &Qt + + + + About &SMPlayer + 关于 &SMPlayer + + + + <empty> + <æ— > + + + + Video + 视频 + + + + Audio + 音频 + + + + Playlists + 播放列表 + + + + All files + 所有文件 + + + + Choose a file + 选择一个文件 + + + + SMPlayer - Information + SMPlayer - ä¿¡æ¯ + + + + The CDROM / DVD drives are not configured yet. +The configuration dialog will be shown now, so you can do it. + 还没有设置 CDROM / DVD 设备。 +ä½ å¯ä»¥åœ¨ä¸‹é¢æ˜¾çŽ°çš„é…置对è¯æ¡†é‡Œè®¾ç½®ã€‚ + + + + Choose a directory + 选择一个目录 + + + + Subtitles + 字幕 + + + + About Qt + 关于 Qt + + + + Playing %1 + 播放 %1 + + + + Pause + æš‚åœ + + + + Stop + åœæ­¢ + + + + De&noise + De&noise + + + + N&ormal + 标准(&O) + + + + &Soft + 软件(&S) + + + + Play / Pause + 播放 / æš‚åœ + + + + Pause / Frame step + æš‚åœ / å•å¸§æ­¥è¿› + + + + U&nload + å¸è½½(&N) + + + + V&CD + V&CD + + + + C&lose + 关闭(&L) + + + + View &info and properties... + 查看属性和信æ¯(&I)... + + + + Zoom &- + 缩å°(&-) + + + + Zoom &+ + 放大(&+) + + + + &Reset + é‡ç½®(&R) + + + + Move &left + 左移(&L) + + + + Move &right + å³ç§»(&R) + + + + Move &up + 上移(&U) + + + + Move &down + 下移(&D) + + + + &Pan && scan + 全景æµè§ˆ(&P) + + + + &Previous line in subtitles + å‰ä¸€è¡Œå­—幕(&P) + + + + N&ext line in subtitles + åŽä¸€è¡Œå­—幕(&E) + + + + -%1 + -%1 + + + + +%1 + +%1 + + + + Dec volume (2) + å‡å°éŸ³é‡(2) + + + + Inc volume (2) + 增大音é‡(2) + + + + Exit fullscreen + é€€å‡ºå…¨å± + + + + OSD - Next level + OSD - 下一级别 + + + + Dec contrast + å‡å°‘对比度 + + + + Inc contrast + 增加对比度 + + + + Dec brightness + å‡å°‘亮度 + + + + Inc brightness + 增大亮度 + + + + Dec hue + å‡å°‘色调 + + + + Inc hue + 增大色调 + + + + Dec saturation + å‡å°é¥±å’Œåº¦ + + + + Dec gamma + å‡å° Gamma + + + + Next audio + 下一音轨 + + + + Next subtitle + 下一字幕 + + + + Next chapter + 下一章节 + + + + Previous chapter + å‰ä¸€ç« èŠ‚ + + + + Inc saturation + 增大饱和度 + + + + Inc gamma + 增大 Gamma + + + + Toggle double size + 切æ¢åŒå€å¤§å° + + + + &Load external file... + 加载外部音频(&L)... + + + + &Kerndeint + + + + + &Yadif (normal) + &Yadif (一般) + + + + Y&adif (double framerate) + Y&adif (åŒå€å¸§çŽ‡) + + + + &Next + 下一个(&N) + + + + Pre&vious + 上一个(&V) + + + + Volume &normalization + 声音正常化(&N) + + + + &Audio CD + 音频 CD(&A) + + + + Denoise nor&mal + + + + + Denoise &soft + + + + + Denoise o&ff + + + + + Use SSA/&ASS library + 使用 SSA/&ASS 库 + + + + Flip i&mage + è£å‰ªå›¾åƒ(&M) + + + + &Toggle double size + 切æ¢åŒå€å¤§å°(&T) + + + + BaseGuiPlus + + + SMPlayer is still running here + SMPlayer 还在è¿è¡Œ + + + + S&how icon in system tray + 在系统托盘里显示图标(&H) + + + + &Hide + éšè—(&H) + + + + &Restore + æ¢å¤(&R) + + + + &Recent files + 最近打开的文件(&R) + + + + &Quit + 退出(&Q) + + + + Playlist + 播放列表 + + + + Core + + + Brightness: %1 + 亮度: %1 + + + + Contrast: %1 + 对比度: %1 + + + + Gamma: %1 + Gamma: %1 + + + + Hue: %1 + 色调: %1 + + + + Saturation: %1 + 饱和度: %1 + + + + Volume: %1 + 音é‡: %1 + + + + Zoom: %1 + 缩放: %1 + + + + DefaultGui + + + Welcome to SMPlayer + 欢迎使用 SMPlayer + + + + Volume + éŸ³é‡ + + + + Audio + 音频 + + + + Subtitle + 字幕 + + + + Playlist + 播放列表 + + + + &Main toolbar + 主工具æ¡(&M) + + + + &Language toolbar + 语言工具æ¡(&L) + + + + &Toolbars + 工具æ¡(&T) + + + + Encodings + + + Arabic + 阿拉伯语 + + + + Baltic + 波罗的海 + + + + Celtic + 凯尔特语 + + + + Cyrillic + Cyrillic + + + + Cyrillic Windows + Cyrillic Windows + + + + Esperanto, Galician, Maltese, Turkish + 世界语 + + + + Hebrew charsets + 希伯æ¥è¯­ + + + + Japanese charsets + 日本语 + + + + Korean charset + 韩国语 + + + + Modern Greek + 希腊语 + + + + Old Baltic charset + 波罗的海语 + + + + Russian + 俄罗斯语 + + + + Simplified Chinese charset + 简体中文 + + + + Slavic/Central European Languages + 斯拉夫语 + + + + Slavic/Central European Windows + 斯拉夫语 + + + + Thai charset + 泰国语 + + + + Traditional Chinese charset + ç¹ä½“中文 + + + + Turkish + 土耳其语 + + + + Ukrainian, Belarusian + 乌克兰语 + + + + Western European Languages + 西欧 + + + + Western European Languages with Euro + 西欧 + + + + Arabic Windows + + + + + EqSlider + + + icon + 图标 + + + + FilePropertiesDialog + + + SMPlayer - File properties + SMPlayer - 文件属性 + + + + &Information + ä¿¡æ¯(&I) + + + + &Demuxer + 解ç å™¨(&D) + + + + &Select the demuxer that will be used for this file: + 选择将被用在这个文件的解ç å™¨(&S): + + + + &Reset + é‡ç½®(&R) + + + + &Video codec + 视频编ç (&V) + + + + &Select the video codec: + 选择视频编ç (&S): + + + + A&udio codec + 音频编ç (&u) + + + + &Select the audio codec: + 选择音频编ç (&S): + + + + &MPlayer options + &Mplayer 选项 + + + + Additional Options for MPlayer + MPlayer 的附加选项 + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + 在这里你å¯ä»¥ä¼ é€’é¢å¤–的选项给 Mplayer。 +请用空格分隔它们。 +示例 : -flip -nosound + + + + &Options: + 选项(&O): + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + 在这里你å¯ä»¥ä¼ é€’附加的视频过滤器。 +请用 "," 分隔它们。ä¸è¦ä½¿ç”¨ç©ºæ ¼! +示例: scale=512:-2,eq2=1.1 + + + + V&ideo filters: + 视频过滤器(&I): + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + 最åŽæ˜¯éŸ³é¢‘过滤器。和视频过滤器的规则一样。 +示例: resample=44100:0:0,volnorm + + + + Audio &filters: + 音频过滤器(&F): + + + + OK + 确定 + + + + Cancel + å–消 + + + + Apply + 应用 + + + + InfoFile + + + General + 常规 + + + + Size + å¤§å° + + + + %1 KB (%2 MB) + %1 KB (%2 MB) + + + + URL + URL + + + + Length + 长度 + + + + Demuxer + 解ç å™¨ + + + + Name + åå­— + + + + Artist + 艺术家 + + + + Author + 作者 + + + + Album + 专辑 + + + + Genre + æµæ´¾ + + + + Date + 日期 + + + + Track + 音轨 + + + + Copyright + ç‰ˆæƒ + + + + Comment + 注释 + + + + Software + 软件 + + + + Clip info + å‰ªè¾‘ä¿¡æ¯ + + + + Video + 视频 + + + + Resolution + 分辨率 + + + + Aspect ratio + 外观比例 + + + + Format + æ ¼å¼ + + + + Bitrate + 比特率 + + + + %1 kbps + %1 kbps + + + + Frames per second + 帧æ¯ç§’ + + + + Selected codec + 选择编ç å™¨ + + + + Initial Audio Stream + åˆå§‹åŒ–éŸ³é¢‘æµ + + + + Rate + 比率 + + + + %1 Hz + %1 Hz + + + + Channels + å£°é“ + + + + Audio Streams + éŸ³é¢‘æµ + + + + Language + 语言 + + + + empty + 空 + + + + Subtitles + 字幕 + + + + Type + 类型 + + + + ID + Info for translators: this is a identification code + ID + + + + # + Info for translators: this is a abbreviation for number + # + + + + Stream title + æµæ ‡é¢˜ + + + + Stream URL + æµ URL + + + + File + 文件 + + + + InputDVDDirectory + + + Choose a directory + 选择一个目录 + + + + SMPlayer - Play a DVD from a folder + SMPlayer - 从一个目录播放 DVD + + + + You can play a dvd from your hard disc. Just select the folder which contains the VIDEO_TS and AUDIO_TS directories. + 您å¯ä»¥ä»Žæ‚¨çš„硬盘播放 DVD 。åªè¦é€‰æ‹©åŒ…å« VIDEO_TS å’Œ AUDIO_TS 目录的文件夹å³å¯ã€‚ + + + + Choose a directory... + 选择一个目录... + + + + InputURL + + + SMPlayer - Enter URL + SMPlayer - 输入 URL + + + + &URL: + URL(&U): + + + + It's a &playlist + 这是播放列表(&P) + + + + If this option is checked, the URL will be treated as a playlist: it will be opened as text and will play the URLs in it. + 如果选择这个选项,URL 将会被当作播放列表:它将被当æˆä¸€ä¸ªæ–‡æœ¬æ–‡ä»¶æ‰“å¼€åŒï¼Œç„¶åŽæ’­æ”¾é‡Œé¢çš„ URL。 + + + + LogWindow + + + Choose a filename to save under + 选择ä¿å­˜æ–‡ä»¶å + + + + Confirm overwrite? + 是å¦è¦†ç›–? + + + + Error saving file + ä¿å­˜æ–‡ä»¶å‡ºé”™ + + + + The file already exists. +Do you want to overwrite? + 文件己存在。 +是å¦è¦†ç›–? + + + + The log couldn't be saved + 日志ä¸èƒ½è¢«ä¿å­˜ + + + + Logs + 日志 + + + + LogWindowBase + + + Close + 关闭 + + + + Copy to clipboard + å¤åˆ¶åˆ°å‰ªè´´æ¿ + + + + Log Window + æ—¥å¿—çª—å£ + + + + Save + ä¿å­˜ + + + + &Close + 关闭(&C) + + + + Playlist + + + All files + 所有文件 + + + + Choose a directory + 选择一个目录 + + + + Choose a file + 选择一个文件 + + + + Choose a filename + 选择一个文件å + + + + Confirm overwrite? + 是å¦è¦†ç›–? + + + + &Edit + 编辑(&E) + + + + Edit name + 编辑åå­— + + + + Length + 长度 + + + + Name + åå­— + + + + &Play + 播放(&P) + + + + Playlists + 播放列表 + + + + Select one or more files to open + 选择打开一个或多个文件 + + + + The file %1 already exists. +Do you want to overwrite? + 文件 %1 己存在。 +是å¦è¦†ç›–? + + + + Type the name that will be displayed in the playlist for this file: + 给这个文件输入一个显现在播放列表的åå­—: + + + + &Load + 加载(&L) + + + + &Save + ä¿å­˜(&S) + + + + &Next + 下一个(&N) + + + + Pre&vious + 上一个(&V) + + + + Move &up + 上移(&U) + + + + Move &down + 下移(&D) + + + + &Repeat + é‡å¤(&R) + + + + S&huffle + 打乱(&H) + + + + Add &current file + 添加当å‰æ–‡ä»¶(&C) + + + + Add &file(s) + 添加文件(&F) + + + + Add &directory + 添加目录(&D) + + + + Remove &selected + 移除选中(&S) + + + + Remove &all + 全部移除(&A) + + + + SMPlayer - Playlist + SMPlayer - 播放列表 + + + + Add... + 添加... + + + + Remove... + 移除... + + + + Playlist modified + 播放列表己修改 + + + + There are unsaved changes, do you want to save the playlist? + 有没有ä¿å­˜çš„修改, 您想ä¿å­˜æ’­æ”¾åˆ—表å—? + + + + PrefAdvanced + + + Advanced + 高级 + + + + Auto + 自动 + + + + &Advanced + 高级(&A) + + + + icon + 图标 + + + + Additional Options for MPlayer + MPlayer 的附加选项 + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + 在这里你å¯ä»¥ä¼ é€’é¢å¤–的选项给 Mplayer。 +请用空格分隔它们。 +示例 : -flip -nosound + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + 在这里你å¯ä»¥ä¼ é€’附加的视频过滤器。 +请用 "," 分隔它们。ä¸è¦ä½¿ç”¨ç©ºæ ¼! +示例: scale=512:-2,eq2=1.1 + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + 最åŽæ˜¯éŸ³é¢‘过滤器。和视频过滤器的规则一样。 +示例: resample=44100:0:0,volnorm + + + + Don't repaint the background of the video window + ä¸é‡ç»˜è§†é¢‘窗å£çš„背景 + + + + &Logs + 日志(&L) + + + + Log MPlayer output + 记录 MPlayer 的输出 + + + + Log SMPlayer output + 记录 SMPlayer 的输出 + + + + This option is mainly intended for debugging the application. + 此选项主è¦ç”¨äºŽè°ƒè¯•ã€‚ + + + + &MPlayer language + MPlayer 语言(&M) + + + + SMPlayer needs to read and parse the output of MPlayer and sometimes it relies on English text. If you are using a MPlayer translated into another language, then you need to change the texts that SMPlayer looks for. (Technically you should enter regular expressions)<br><br> +The drop-down lists may provide already made regular expression for several languages. + SMPlayer 需è¦è¯»å–å’Œå¤„ç† MPlayer 的输出, 有的时候这ä¾èµ–英文文本。如果您使用翻译æˆå…¶å®ƒè¯­è¨€çš„ MPlayer, 那么您需è¦ä¿®æ”¹ SMPlayer 查找的文本。(技术上您å¯ä»¥ä½¿ç”¨æ­£åˆ™è¡¨è¾¾å¼)<br><br> +下拉列表å¯èƒ½å·²ç»ä¸ºä¸€äº›è¯­è¨€æ供了正则表达å¼ã€‚ + + + + Checking this option may reduce flickering, but it also might produce that the video won't be displayed properly. + 选择这个选项å¯ä»¥å‡å°‘é—ªçƒã€‚但也å¯èƒ½é€ æˆè§†é¢‘ä¸èƒ½æ­£å¸¸æ˜¾ç¤ºã€‚ + + + + If checked, smplayer will store the output of mplayer (you can see it in <b>Options->View logs->mplayer</b>). In case of problems this log can contain important information, so it's recommended to keep this option checked. + 如果勾选, SMPlayer 将记录 MPlayer 的输出 (ä½ å¯ä»¥åœ¨<b>选项->查看日志->mplayer</b>查看)。如果出现错误,此记录å¯èƒ½åŒ…å«é‡è¦ä¿¡æ¯, 所以推è勾选。 + + + + If this option is checked, smplayer will store the debugging messages that smplayer outputs (you can see the log in <b>Options->View logs->smplayer</b>). This information can be very useful for the developer in case you find a bug. + 如果勾选, SMPlayer 将记录 SMPlayer è¾“å‡ºçš„è°ƒè¯•ä¿¡æ¯ (ä½ å¯ä»¥åœ¨<b>选项->查看日志->smplayer</b>查看)。当你找到 bug æ—¶, 对于开å‘者这将会是éžå¸¸é‡è¦çš„ä¿¡æ¯ã€‚ + + + + Filter for SMPlayer logs + 过滤 SMPlayer 的记录 + + + + This option allows to filter the smplayer messages that will be stored in the log. Here you can write any regular expression.<br>For instance: <i>^Core::.*</i> will display only the lines starting with <i>Core::</i> + 这个选项å…许过滤 SMPlayer å°†è¦è®°å½•çš„日志。这里您å¯ä»¥ä½¿ç”¨ä»»ä½•æ­£åˆ™è¡¨è¾¾å¼ã€‚<br>示例:<i>^Core::..*</i> å°†åªè®°å½•ä»¥ <i>Core::</i> 开头的行 + + + + &Monitor aspect: + é”定外观(&M): + + + + &Run MPlayer in its own window + 让 Mplayer 在自己的窗å£é‡Œè¿è¡Œ(&R) + + + + &Options: + 选项(&O): + + + + V&ideo filters: + 视频过滤器(&I): + + + + Audio &filters: + 音频过滤器(&F): + + + + &Colorkey: + + + + + &Don't repaint the background of the video window + ä¸é‡ç»˜è§†é¢‘窗å£çš„背景(&D) + + + + Log &MPlayer output + 记录 MPlayer 的输出(&M) + + + + Log &SMPlayer output + 记录 SMPlayer 的输出(&S) + + + + &Filter for SMPlayer logs: + 过滤 SMPlayer 的记录(&F): + + + + &End of file: + + + + + &No video: + + + + + C&hange... + + + + + PrefAssociations + + + Warning + + + + + Not all files could be associated. Please check your security permissions and retry. + + + + + File Types + + + + + Select all + + + + + Check all file types in the list + + + + + Uncheck all file types in the list + + + + + List of file types + + + + + File types + + + + + Media files handled by SMPlayer: + + + + + Select All + + + + + Select None + + + + + Check the media file extensions you would like SMPlayer to handle. When you click Apply, the checked files will be associated with SMPlayer. If you uncheck a media type, the file association will be restored. + + + + + Select none + + + + + PrefDrives + + + Drives + 设备 + + + + Currently SMPlayer does not autodetect cdrom or dvd devices. So in order to play cdroms or dvds you must first select here your cdrom and dvd drives (can be the same). + 现在 SMPlayer 还ä¸èƒ½è‡ªåŠ¨æ£€æµ‹å…‰é©±æˆ– DVD 设备。所以你必需选择你的光驱和 DVD 设备(å¯ä»¥ç›¸åŒ),æ‰èƒ½æ’­æ”¾ CD 或 DVD。 + + + + icon + 图标 + + + + Select your CD device: + 选择你的 CD 设备: + + + + Select your DVD device: + 选择你的 DVD 设备: + + + + CD device + 光驱设备 + + + + Choose your CDROM device. It will be used to play VCDs and Audio CDs. + 选择您的光驱设备。它将用于播放 VCD å’Œ 音频 CD。 + + + + DVD device + DVD 设备 + + + + Choose your DVD device. It will be used to play DVDs. + 选择您的 DVD 设备。它将用于播放 DVD。 + + + + Select your &CD device: + 选择你的 CD 设备(&C): + + + + Select your &DVD device: + 选择你的 DVD 设备(&D): + + + + PrefGeneral + + + General + 常规 + + + + &General + 常规(&G) + + + + Paths + 路径 + + + + Select... + 选择... + + + + Folder for storing screenshots: + ä¿å­˜æˆªå›¾çš„目录: + + + + Search... + æœç´¢... + + + + Select the MPlayer executable: + 选择 Mplayer çš„å¯æ‰§è¡Œæ–‡ä»¶: + + + + Output drivers + 输出设备 + + + + Video: + 视频: + + + + Audio: + 音频: + + + + Media settings + 媒体设置 + + + + Remember settings for all files (audio track, subtitles...) + 记录所有文件的设置 (音轨, 字幕...) + + + + Don't remember time position (files start playing from the beginning) + ä¸è¦è®°å½•å½“å‰æ’­æ”¾ä½ç½® (从文件开始播放) + + + + Preferred audio and subtitles + 首选的音频和字幕 + + + + Subtitles: + 字幕: + + + + &Video and audio + 视频和音频(&V) + + + + Video + 视频 + + + + Use software video equalizer + 使用软件å‡è¡¡å™¨ + + + + Enable postprocessing for all videos + 为所有视频å¯ç”¨ postprocessing + + + + Quality: + å“è´¨: + + + + Start videos in fullscreen + 用全å±æ’­æ”¾ + + + + Disable screensaver + ç¦ç”¨å±ä¿ + + + + Audio + 音频 + + + + Use software volume control + 使用软件音é‡æŽ§åˆ¶ + + + + Max. Amplification: + 最大放大: + + + + AC3/DTS pass-through S/PDIF + AC3/DTS ç»ç”± S/PDIF + + + + Volume normalization + 音é‡æ­£å¸¸åŒ– + + + + Select the mplayer executable + 选择 Mplayer çš„å¯æ‰§è¡Œæ–‡ä»¶ + + + + Executables + å¯æ‰§è¡Œ + + + + All files + 所有文件 + + + + Select a directory + 选择一个目录 + + + + MPlayer executable + Mplayer çš„å¯æ‰§è¡Œæ–‡ä»¶ + + + + Here you must specify the mplayer executable that smplayer will use.<br>smplayer requires at least mplayer 1.0rc1 (svn recommended).<br><b>If this setting is wrong, smplayer won't be able to play anything!</b> + 这里您必须指定 SMPlayer è¦ä½¿ç”¨çš„ MPlayer çš„å¯æ‰§è¡Œæ–‡ä»¶ã€‚<br>SMPlayer 需è¦è‡³å°‘ 1.0rc1 çš„ MPlayer (推è SVN 版)。<br><b>如果此设置错误, SMPlayer å°†ä¸èƒ½æ’­æ”¾ä»»ä½•æ–‡ä»¶!</b> + + + + Screenshots folder + ä¿å­˜æˆªå›¾çš„目录 + + + + Here you can specify a folder where the screenshots taken by smplayer will be stored. If this field is empty the screenshot feature will be disabled. + 这里你å¯ä»¥è®¾ç½® SMPlayer 存放截图的目录。如果这里为空,截图功能将被ç¦ç”¨ã€‚ + + + + Video output driver + 视频输出驱动 + + + + Select the video output driver. Usually xv (linux) and directx (windows) provide the best performance. + 选择视频输出驱动。通常 xv (linux) å’Œ directx (windows) 能æ供最佳性能。 + + + + Audio output driver + 音频输出驱动 + + + + Select the audio output driver. + 选择音频输出驱动。 + + + + Remember settings + è®°ä½è®¾ç½® + + + + Usually smplayer will remember the settings for each file you play (audio track selected, volume, filters...). Uncheck this option if you don't like this feature. + 默认情况下 SMPlayer 会记录您播放的æ¯ä¸€ä¸ªæ–‡ä»¶çš„设置(选择的音轨, 音é‡, 过滤器...)。如果您ä¸å–œæ¬¢è¿™ä¸ªç‰¹æ€§, 请ä¸è¦å‹¾é€‰æ­¤é€‰é¡¹ã€‚ + + + + Don't remember time position + ä¸è®°å½•æ’­æ”¾çš„时间ä½ç½® + + + + If you check this option, smplayer will play all files from the beginning. + 如果勾选此选项, SMPlayer 将从头播放所有文件。 + + + + Preferred audio language + 首选音频语言 + + + + Here you can type your preferred language for the audio streams. When a media with multiple audio streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the audio streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the audio track if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + 这里您å¯ä»¥è¾“入您首选的语言和音频æµã€‚当在媒体里å‘现多个音频æµæ—¶, SMPlayer 将试图使用您的首选语言。<br>è¿™åªåœ¨åª’体æ供语言和音频æµä¿¡æ¯æ—¶æœ‰æ•ˆ, åƒ DVD 或 mkv 文件。<br>这里支æŒæ­£åˆ™è¡¨è¾¾å¼ã€‚示例: <b>es|esp|spa</b> å°†é€‰æ‹©åŒ¹é… <i>es</i>, <i>esp</i> 或 <i>spa</i> 的音轨。 + + + + Preferred subtitle language + 首选字幕语言 + + + + Here you can type your preferred language for the subtitle stream. When a media with multiple subtitle streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the subtitle streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the subtitle stream if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + 这里您å¯ä»¥è¾“入您首选的语言和音频æµã€‚当在媒体里å‘现多个音频æµæ—¶, SMPlayer 将试图使用您的首选语言。<br>è¿™åªåœ¨åª’体æ供语言和音频æµä¿¡æ¯æ—¶æœ‰æ•ˆ, åƒ DVD 或 mkv 文件。<br>这里支æŒæ­£åˆ™è¡¨è¾¾å¼ã€‚示例: <b>es|esp|spa</b> å°†é€‰æ‹©åŒ¹é… <i>es</i>, <i>esp</i> 或 <i>spa</i> 的音轨。 + + + + Software video equalizer + 软件视频å‡è¡¡ + + + + You can check this option if video equalizer is not supported by your graphic card or the selected video output driver.<br><b>Note:</b> this option can be incompatible with some video output drivers. + 您å¯ä»¥å‹¾é€‰æ­¤é€‰é¡¹å¦‚果视频å‡è¡¡å™¨ä¸è¢«æ‚¨çš„显å¡æˆ–选择的输出驱动支æŒã€‚<br><b>注æ„:</b>这个选项å¯èƒ½å’Œä¸€äº›è§†é¢‘输出驱动ä¸å…¼å®¹ã€‚ + + + + If this option is checked, all videos will start to play in fullscreen mode. + 如果勾选此选项, 所有的视频将一开始就使用全å±æ¨¡å¼ã€‚ + + + + Check this option to disable the screensaver while playing.<br>The screensaver will enabled again when play finishes.<br><b>Note:</b> This option works only in X11 and Windows. + 勾选此选项将在播放时ç¦ç”¨å±ä¿ã€‚<br>播放结æŸåŽå±ä¿ä¼šé‡æ–°èµ·ç”¨ã€‚<br><b>注æ„:</b> 这个选项åªåœ¨ X11 å’Œ Windows 下有效。 + + + + Software volume control + 软件音é‡æŽ§åˆ¶ + + + + Check this option to use the software mixer, instead of using the sound card mixer. + 勾选这个选项以使用软件混音(ä¸ä½¿ç”¨å£°å¡æ··éŸ³)。 + + + + Postprocessing quality + Postprocessing å“è´¨ + + + + Dynamically changes the level of postprocessing depending on the available spare CPU time. The number you specify will be the maximum level used. Usually you can use some big number. + 动æ€æ”¹å˜ postprocessing 的级别, ä¾èµ–于å¯ç”¨çš„空闲 CPU 时间. 这个数字说明将被用到的最大级别。通常您å¯ä»¥é€‰ç”¨è¾ƒå¤§çš„数字。 + + + + Change volume + 改å˜éŸ³é‡ + + + + If checked, SMPlayer will remember the volume for every file and will restore it when played again. For new files the default volume will be used. + 如果被选中,SMPlayer 将记ä½æ¯ä¸€ä¸ªæ–‡ä»¶çš„音é‡å¹¶åœ¨å†æ¬¡æ’­æ”¾æ—¶ä½¿ç”¨ã€‚对于新文件将使用默认音é‡ã€‚ + + + + Default volume: + 默认音é‡: + + + + 0 + 0 + + + + &Change volume on every file + 改å˜æ‰€æœ‰æ–‡ä»¶çš„音é‡(&C) + + + + &Search... + æœç´¢(&S)... + + + + S&elect... + 选择(&E)... + + + + Select the &MPlayer executable: + 选择 Mplayer çš„å¯æ‰§è¡Œæ–‡ä»¶(&M): + + + + &Folder for storing screenshots: + ä¿å­˜æˆªå›¾çš„目录(&F): + + + + V&ideo: + 视频(&V): + + + + &Audio: + 音频(&A): + + + + &Don't remember time position (files start playing from the beginning) + ä¸è¦è®°å½•å½“å‰æ’­æ”¾ä½ç½® (从文件开始播放)(&D) + + + + &Remember settings for all files (audio track, subtitles...) + 记录所有文件的设置 (音轨, 字幕...)(&R) + + + + A&udio: + 音频(&U): + + + + Su&btitles: + 字幕(&B): + + + + &Use software video equalizer + 使用软件å‡è¡¡å™¨(&U) + + + + &Quality: + å“è´¨(&Q): + + + + Start videos in &fullscreen + 用全å±æ’­æ”¾(&F) + + + + Disable &screensaver + ç¦ç”¨å±ä¿(&S) + + + + &Default volume: + 默认音é‡(&D): + + + + Use s&oftware volume control + 使用软件音é‡æŽ§åˆ¶(&O) + + + + Ma&x. Amplification: + 最大放大(&X): + + + + &AC3/DTS pass-through S/PDIF + AC3/DTS ç»ç”± S/PDIF(&A) + + + + Direct rendering + 直接呈现 + + + + If checked, turns on direct rendering (not supported by all codecs and video outputs)<br><b>WARNING:</b> May cause OSD/SUB corruption! + 如果被选中,将使用直接呈现(direct rendering)(ä¸æ˜¯æ‰€æœ‰çš„ç¼–ç å’Œè¾“出驱动都支æŒçš„)<br><b>警告:</b>å¯èƒ½ä½¿ OSD/字幕 出错! + + + + Double buffering + åŒå€ç¼“å­˜ + + + + D&irect rendering + 直接呈现(&I) + + + + Dou&ble buffering + åŒå€ç¼“å­˜(&B) + + + + Double buffering fixes flicker by storing two frames in memory, and displaying one while decoding another. If disabled it can affect OSD negatively, but often removes OSD flickering. + åŒå€ç¼“存通过将åŒå¸§å­˜åœ¨å†…存里æ¥è§£å†³é—ªçƒçš„问题, 显现一帧的åŒæ—¶è§£ç å¦ä¸€å¸§ã€‚如果ç¦ç”¨å°†å½±å“ OSD, 但能消除 OSD çš„é—ªçƒã€‚ + + + + &Enable postprocessing by default + 为所有视频å¯ç”¨ postprocessing(&E) + + + + Volume &normalization by default + 默认音é‡æ­£å¸¸åŒ–(&N) + + + + Close when finished + 结æŸæ—¶å…³é—­ + + + + If this option is checked, the main window will be automatically closed when the current file/playlist finishes. + 如果选择这个选项,主窗å£ä¼šåœ¨å½“å‰æ–‡ä»¶æˆ–播放列表结æŸåŽè‡ªåŠ¨å…³é—­ã€‚ + + + + &Close when finished + 结æŸæ—¶å…³é—­(&C) + + + + 2 (Stereo) + 2 (立体声) + + + + 4 (4.0 Surround) + 4 (4.0 环绕) + + + + 6 (5.1 Surround) + 6 (5.1 环绕) + + + + C&hannels by default: + 默认频é“(&H): + + + + &Pause when minimized + 最å°åŒ–时暂åœ(&P) + + + + Pause when minimized + + + + + If this option is enabled, the file will be paused when the main window is hidden. When the window is restored, play will be resumed. + + + + + Enable postprocessing by default + + + + + Postprocessing will be used by default on new opened files. + + + + + Max. Amplification + + + + + Sets the maximum amplification level in percent (default: 110). A value of 200 will allow you to adjust the volume up to a maximum of double the current level. With values below 100 the initial volume (which is 100%) will be above the maximum, which e.g. the OSD cannot display correctly. + + + + + Uses hardware AC3 passthrough + + + + + Volume normalization by default + + + + + Maximizes the volume without distorting the sound. + + + + + Default volume + + + + + Sets the initial volume that new files will use. + + + + + Channels by default + + + + + Requests the number of playback channels. MPlayer asks the decoder to decode the audio into as many channels as specified. Then it is up to the decoder to fulfill the requirement. This is usually only important when playing videos with AC3 audio (like DVDs). In that case liba52 does the decoding by default and correctly downmixes the audio into the requested number of channels. NOTE: This option is honored by codecs (AC3 only), filters (surround) and audio output drivers (OSS at least). + + + + + PrefInput + + + Keyboard and mouse + 键盘和鼠标 + + + + &Keyboard + 键盘(&K) + + + + icon + 图标 + + + + Here you can change any key shortcut. To do it double click or start typing over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + 在这里您å¯ä»¥æ›´æ”¹ä»»ä½•å¿«æ·é”®ã€‚通过在一个快æ·é”®å•å…ƒæ ¼åŒå‡»æˆ–键入æ¥è®¾ç½®ã€‚您也å¯ä»¥ä¿å­˜æ‚¨çš„设置然åŽå…±äº«ç»™ä»–人或加载别的电脑上的设置。 + + + + &Mouse + é¼ æ ‡(&M) + + + + Button functions: + 按键功能: + + + + Media seeking + åª’ä½“å®šä½ + + + + Volume control + 音é‡æŽ§åˆ¶ + + + + Zoom video + 缩放视频 + + + + None + æ—  + + + + Here you can change any key shortcut. To do it double click or press enter over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + 在这里您å¯ä»¥æ›´æ”¹ä»»ä½•å¿«æ·é”®ã€‚通过在一个快æ·é”®å•å…ƒæ ¼åŒå‡»æˆ–键入æ¥è®¾ç½®ã€‚您也å¯ä»¥ä¿å­˜æ‚¨çš„设置然åŽå…±äº«ç»™ä»–人或加载别的电脑上的设置。 + + + + &Left click + 左击(&L) + + + + &Double click + åŒå‡»(&D) + + + + &Wheel function: + 滚轮功能(&W): + + + + Shortcut editor + + + + + This table allows you to change the key shortcuts of most available actions. Double click or press enter on a item, or press the <b>Change shortcut</b> button to enter in the <i>Modify shortcut</i> dialog. There are two ways to change a shortcut: if the <b>Capture</b> button is on then just press the new key or combination of keys that you want to assign for the action (unfortunately this doesn't work for all keys). If the <b>Capture</b> button is off then you could enter the full name of the key. + + + + + Left click + + + + + Select the action for left click on the mouse. + + + + + Double click + + + + + Select the action for double click on the mouse. + + + + + Wheel function + + + + + Select the action for the mouse wheel. + + + + + PrefInterface + + + Interface + æ‚项 + + + + Bulgarian + ä¿åŠ åˆ©äºšè¯­ + + + + Czech + æ·å…‹è¯­ + + + + German + 德语 + + + + Greek + 希腊语 + + + + English + 英语 + + + + Spanish + 西ç­ç‰™è¯­ + + + + Finnish + 芬兰语 + + + + French + 法语 + + + + Hungarian + 匈牙利语 + + + + Italian + æ„大利语 + + + + Japanese + 日语 + + + + Georgian + 乔治亚语 + + + + Dutch + è·å…°è¯­ + + + + Polish + 波兰语 + + + + Portuguese - Brazil + è‘¡è„牙语 - 巴西 + + + + Portuguese - Portugal + è‘¡è„牙语 - è‘¡è„牙 + + + + Romanian + 罗马尼亚语 + + + + Russian + 俄罗斯语 + + + + Slovak + 斯洛ä¼å…‹è¯­ + + + + Serbian + 赛尔维亚语 + + + + Swedish + 瑞典语 + + + + Turkish + 土耳其语 + + + + Ukrainian + 乌克兰语 + + + + Simplified-Chinese + 简体中文 + + + + Traditional Chinese + ç¹ä½“中文 + + + + <Autodetect> + <自动探测> + + + + Default + 默认 + + + + &Interface + æ‚项(&I) + + + + Seeking + å®šä½ + + + + Never + ä»Žä¸ + + + + Whenever it's needed + 当需è¦çš„时候 + + + + Only after loading a new video + åªåœ¨æ–°å½±ç‰‡åŠ è½½åŽ + + + + Recent files + 最近打开的文件 + + + + Language + 语言 + + + + Here you can change the language of the application. + 在这里你å¯ä»¥æ”¹å˜åº”用程åºçš„语言。 + + + + Instances + 实例 + + + + Catalan + 西ç­ç‰™è¯­ + + + + Basque + 巴斯克语 + + + + Galician + 加里西亚语 + + + + &Short jump + 短跳跃(&S) + + + + &Medium jump + 跳跃(&M) + + + + &Long jump + 长跳跃(&L) + + + + Mouse &wheel jump + 鼠标滚轮跳跃(&W) + + + + &Use only one running instance of SMPlayer + åªä½¿ç”¨ä¸€ä¸ªè¿è¡Œçš„ SMPlayer 实例(&U) + + + + SMPlayer will listen to this &port to receive commands from other instances: + SMPlayer 会在这个端å£æŽ¥æ”¶å…¶å®ƒå®žä¾‹çš„命令(&P): + + + + Main window &resize method + 主窗å£ç¼©æ”¾æ–¹å¼(&R) + + + + Ma&x. items + 最大项数(&x) + + + + St&yle: + 风格(&Y): + + + + Ico&n set: + 图标集(&N): + + + + L&anguage: + 语言(&A): + + + + Main window + ä¸»çª—å£ + + + + Auto&resize: + 自动缩放(&R): + + + + R&emember position and size + 记录播放的时间ä½ç½®(&E) + + + + Default font: + 默认字体: + + + + &Change... + 修改(&C)... + + + + PrefPerformance + + + Performance + 首选项 + + + + &Performance + 首选项(&P) + + + + Priority + 优先级 + + + + Select the priority for the MPlayer process. + 选择 MPlayer 进程的优先级。 + + + + Priority: + 优先级: + + + + realtime + 实时 + + + + high + 高 + + + + abovenormal + 高于标准 + + + + normal + 标准 + + + + belownormal + 低于标准 + + + + idle + 空闲 + + + + Cache + 缓存 + + + + Size: + 大å°: + + + + KB + KB + + + + Use cache + 使用缓存 + + + + Setting a cache may improve performance on slow media + 设置缓存å¯ä»¥æ”¹è¿›æ’­æ”¾æ€§èƒ½ + + + + Allow frame drop + å…许丢帧 + + + + Allow hard frame drop (can lead to image distortion) + å…许强制丢帧 (å¯èƒ½å¯¼è‡´å›¾åƒå˜å½¢) + + + + Synchronization + åŒæ­¥ + + + + Audio/video auto synchronization + 音频/视频 自动åŒæ­¥ + + + + Factor: + å› å­: + + + + Fast audio track switching + 快速音轨选择 + + + + Fast seek to chapters in dvds + 在 DVD 里快速定ä½ç« èŠ‚ + + + + Set process priority for mplayer according to the predefined priorities available under Windows.<br><b>WARNING:</b> Using realtime priority can cause system lockup. + 为 MPlayer 设置优先级 (æ ¹æ® Windows 下的命å习惯)。<br><b>警告:</b> 使用实时会将您的系统é”死。 + + + + <br><b>Note:</b> This option is for Windows only. + <br><b>注æ„:</b> 这个选项是 Windows 专有的。 + + + + This option specifies how much memory (in kBytes) to use when precaching a file or URL. Especially useful on slow media. + 这里指定用于读å–文件或 URL 的内存大å°(KB)。对于 Slow Media 特别有用。 + + + + Skip displaying some frames to maintain A/V sync on slow systems. + 在较慢的系统上, 跳了一些帧æ¥ä¿è¯ A/V åŒæ­¥ã€‚ + + + + Allow hard frame drop + å…许强制丢帧 + + + + More intense frame dropping (breaks decoding). Leads to image distortion! + 大é‡å¸§è¢«è·³è¿‡(解ç é”™è¯¯)。将导致画é¢å˜å½¢! + + + + Gradually adjusts the A/V sync based on audio delay measurements. + æ ¹æ®éŸ³é¢‘延时æ¥è°ƒæ•´ A/V åŒæ­¥ã€‚ + + + + Priorit&y: + 优先级(&Y): + + + + Si&ze: + 大å°(&Z): + + + + &Use cache + 使用缓存(&U) + + + + &Allow frame drop + å…许丢帧(&A) + + + + Allow &hard frame drop (can lead to image distortion) + å…许强制丢帧 (å¯èƒ½å¯¼è‡´å›¾åƒå˜å½¢)(&H) + + + + Audio/&video auto synchronization + 音频/视频 自动åŒæ­¥(&V) + + + + Fact&or: + å› å­(&O): + + + + &Fast audio track switching + 快速音轨选择(&F) + + + + Fast &seek to chapters in dvds + 在 DVD 里快速定ä½ç« èŠ‚(&S) + + + + Create index if needed + 需è¦æ—¶å»ºç«‹ç´¢å¼• + + + + Rebuilds index of files if no index was found, allowing seeking. Useful with broken/incomplete downloads, or badly created files. This option only works if the underlying media supports seeking (i.e. not with stdin, pipe, etc).<br> Note: the creation of the index may take some time. + 当找ä¸åˆ°ç´¢å¼•æ—¶ï¼Œå°±é‡å»ºåª’体的索引使得定ä½åŠŸèƒ½ç”Ÿæ•ˆã€‚对播放那些破æŸæˆ–ä¸å®Œæ•´çš„下载或创建失败的文件å分有用。这个选项åªåœ¨èƒŒåŽçš„媒体支æŒå®šä¹‰æ—¶æ‰æœ‰æ•ˆ(例如对标准输入和管é“等无效)。<br>注æ„: é‡å»ºç´¢å¼•å¯èƒ½éœ€è¦ä¸€å®šçš„时间。 + + + + &Create index if needed + 需è¦æ—¶å»ºç«‹ç´¢å¼•(&C) + + + + If checked, it will try the fastest method to switch audio tracks but might not work with some formats. + + + + + If checked, it will try the fastest method to seek to chapters but it might not work with some discs. + + + + + PrefSubtitles + + + Subtitles + 字幕 + + + + Choose a ttf file + 选择一个 ttf 文件 + + + + Truetype Fonts + Truetype 字体 + + + + &Subtitles + 字幕(&S) + + + + Autoload + 自动加载 + + + + Autoload subtitles files (*.srt, *.sub...): + 自动加载字幕文件 (*.srt, *.sub...): + + + + Select first available subtitle + 选择第一个å¯ç”¨çš„字幕 + + + + Same name as movie + 和影片åŒå的字幕 + + + + All subs containing movie name + 所有包å«å½±ç‰‡å的字幕 + + + + All subs in directory + 目录里的所有字幕 + + + + Default subtitle encoding: + 默认字幕编ç : + + + + Position + ä½ç½® + + + + Default position of the subtitles on screen + 字幕在å±å¹•çš„默认ä½ç½® + + + + 0 + 0 + + + + Top + 顶部 + + + + Bottom + 底部 + + + + Include subtitles on screenshots + 将字幕包å«åœ¨æˆªå›¾é‡Œ + + + + Use -subfont option (required by recent MPlayer releases) + 使用 -subfont 选项(最近版本的 MPlayer 必需) + + + + &Font + 字体(&F) + + + + Font + 字体 + + + + TTF font: + TTF 字体: + + + + Search... + æœç´¢... + + + + System font: + 系统字体: + + + + Select the font which will be used for subtitles (and OSD): + 选择字幕 (å’Œ OSD) 的字体: + + + + Size + å¤§å° + + + + Autoscale: + 自适应比例: + + + + No autoscale + æ—  + + + + Proportional to movie height + 相对于影片的高度 + + + + Proportional to movie width + 相对于影片的宽度 + + + + Proportional to movie diagonal + 相对于影片的对角线 + + + + Scale: + 比例: + + + + SSA/&ASS library + SSA/&ASS 库 + + + + The new SSA/ASS library will provide nice styled subtitles for external SSA/ASS subtitles files and Matroska tracks. But it will be used too for rendering other formats like SUB and SRT files. + æ–°çš„ SSA/ASS 库将为外部的 SSA/ASS 字幕和 Matroska tracks æ供的èµå¿ƒæ‚¦ç›®é£Žæ ¼ã€‚它åŒæ ·å¯èƒ½ç”¨æ¥æ¸²æŸ“其它字幕格å¼, 如 SUB, SRT。 + + + + Use SSA/ASS library for subtitle rendering + 使用 SSA/AAS 库æ¥æ¸²æŸ“字体 + + + + Text color: + 文本颜色: + + + + Border color: + 边框颜色: + + + + Here you can override styles for SSA/ASS subtitles. It can be also used for fine-tuning the rendering of SRT and SUB subtitles by the SSA/ASS library. Example: <b>Bold=1,Outline=2,Shadow=4</b> + 这里您å¯ä»¥é‡è®¾ SSA/ASS 字幕的风格。 在选用 SSA/ASS 库æ¥æ¸²æŸ“ srt 字幕时, 也将使用该设置。<br>示例: <b>Bold=1,Outline=2,Shadow=2</b> + + + + Styles: + 风格: + + + + Subtitle position + 字幕ä½ç½® + + + + This option specifies the position of the subtitles over the video window. <i>100</i> means the bottom, while <i>0</i> means the top. + 这个选项指定字幕在视频窗å£é‡Œçš„ä½ç½®ã€‚<i>100</i>表示底部, <i>0</i>表示顶部。 + + + + SSA/ASS styles + SSA/ASS 风格 + + + + Au&toload subtitles files (*.srt, *.sub...): + 自动加载字幕文件 (*.srt, *.sub...)(&T): + + + + S&elect first available subtitle + 选择第一个å¯ç”¨çš„字幕(&E) + + + + &Default subtitle encoding: + 默认字幕编ç (&D): + + + + Default &position of the subtitles on screen + 字幕在å±å¹•çš„默认ä½ç½®(&P) + + + + &Include subtitles on screenshots + 将字幕包å«åœ¨æˆªå›¾é‡Œ(&I) + + + + &Use -subfont option (required by recent MPlayer releases) + 使用 -subfont 选项(最近版本的 MPlayer 必需)(&U) + + + + &TTF font: + TTF 字体(&T): + + + + Sea&rch... + æœç´¢(&R)... + + + + S&ystem font: + 系统字体(&Y): + + + + A&utoscale: + 自适应比例(&U): + + + + S&cale: + 比例(&C): + + + + &Use SSA/ASS library for subtitle rendering + 使用 SSA/AAS 库æ¥æ¸²æŸ“字体(&U) + + + + &Text color: + 文本颜色(&T): + + + + &Border color: + 边框颜色(&B): + + + + St&yles: + 风格(&Y): + + + + PreferencesDialog + + + SMPlayer - Help + SMPlayer - 帮助 + + + + OK + 确定 + + + + Cancel + å–消 + + + + Apply + 应用 + + + + Help + 帮助 + + + + SMPlayer - Preferences + SMPlayer - 首选项 + + + + QObject + + + 1 second + 1 秒 + + + + %1 seconds + %1 秒 + + + + %1 minutes + %1 分钟 + + + + %1 minutes and %2 seconds + %1 分钟 %2 秒钟 + + + + 1 minute + 1 分钟 + + + + 1 minute and 1 second + 1 分钟 1 秒钟 + + + + 1 minute and %1 seconds + 1 分钟 %1 秒钟 + + + + %1 minutes and 1 second + %1 分钟 1 秒钟 + + + + specifies the directory for the configuration file (smplayer.ini). If directory is omitted, the application directory will be used. + 指定é…置文件(smplayer.ini)的目录。如果被忽略,将使用应用程åºè·¯å¾„。 + + + + will show this message and then will exit. + 将显现这æ¡ä¿¡æ¯ç„¶åŽé€€å‡ºã€‚ + + + + 'media' is any kind of file that SMPlayer can open. It can be a local file, a DVD (e.g. dvd://1), an Internet stream (e.g. mms://....) or a local playlist in format m3u. If the -playlist option is used, that means that SMPlayer will pass the -playlist option to MPlayer, so MPlayer will handle the playlist, not SMPlayer. + '媒体'是SMPlayerå¯ä»¥æ‰“开的任æ„一ç§æ–‡ä»¶æ ¼å¼ã€‚它å¯ä»¥æ˜¯ä¸€ä¸ªæœ¬åœ°æ–‡ä»¶ï¼ŒDVD(例如 dvd://1),æµåª’体(例如 mms://....) 或一个 m3u æ ¼å¼çš„本地播放列表。如果设定了 -playlist,那æ„å‘³ç€ SMPlayer 将将 -playlist 这个选项传给 MPlayer,所以处ç†æ’­æ”¾åˆ—表的将是 MPlayer ä¸æ˜¯ SMPlayer。 + + + + the main window will be closed when the file/playlist finishes. + 当文件或播放列表结æŸæ—¶å°†å…³é—­ä¸»çª—å£ã€‚ + + + + This is SMPlayer v. %1 running on %2 + 这是è¿è¡Œåœ¨ %2 上的 SMPlayer v. %1 + + + + Usage: %1 [-ini-path [directory]] [-send-action action_name] [-actions action_list [-close-at-end] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + 用法: %1 [-ini-path [directory]] [-send-action action_name] [-actions action_list [-close-at-end] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + + + + tries to make a connection to another running instance and send to it the specified action. Example: -send-action pause The rest of options (if any) will be ignored and the application will exit. It will return 0 on success or -1 on failure. + å°è¯•è¿žæŽ¥åˆ°å¦ä¸€ä¸ªè¿è¡Œç€çš„实例并å‘é€æŒ‡å®šçš„æ“作。例如: -send-action pause 其它选项(如果有的è¯)将被忽略,程åºå°†è‡ªåŠ¨é€€å‡ºã€‚它æˆåŠŸå°†è¿”回0,失败-1。 + + + + action_list is a list of actions separated by spaces. The actions will be executed just after loading the file (if any) in the same order you entered. For checkable actions you can pass true or false as parameter. Example: -actions "fullscreen compact true". Quotes are necessary in case you pass more than one action. + action_list 是一系列用空格分隔的æ“作。加载完文件åŽå°†é©¬ä¸ŠæŒ‰æ‚¨ç»™å®šçš„顺åºæ‰§è¡Œè¿™äº›æ“作。对于选项æ“作您å¯ä»¥ç”¨ true 或 false 作为å‚数。例如:-actions "fullscreen compact true"。将有多个æ“作时引å·æ˜¯å¿…须。 + + + + media + 媒体 + + + + specifies the directory for the configuration file (smplayer.ini). + + + + + if there's another instance running, the media will be added to that instance's playlist. If there's no other instance, this option will be ignored and the files will be opened in a new instance. + + + + + the main window won't be closed when the file/playlist finishes. + + + + + Usage: %1 [-ini-path directory] [-send-action action_name] [-actions action_list [-close-at-end] [-no-close-at-end] [-fullscreen] [-no-fullscreen] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + + + + + the video will be played in fullscreen mode. + + + + + the video will be played in window mode. + + + + + SeekWidget + + + icon + 图标 + + + + label + 标签 + + + + ShortcutGetter + + + Modify shortcut + 修改快æ·é”® + + + + Clear + 清空 + + + + Press the key combination you want to assign + 按下您想分é…的组åˆé”® + + + + Capture + æ•æ‰ + + + + Capture keystrokes + æ•æ‰æŒ‰é”® + + + + VideoEqualizer + + + Brightness + 亮度 + + + + Contrast + 对比度 + + + + Equalizer + å‡è¡¡å™¨ + + + + Gamma + Gamma + + + + Hue + 色调 + + + + Saturation + 饱和度 + + + + &Reset + é‡ç½®(&R) + + + + &Set as default values + 设为默认(&S) + + + + Use the current values as default values for new videos. + 将当å‰å€¼åšä¸ºæ–°çš„视频的默认值。 + + + + Set all controls to zero. + 全部置 0。 + + + diff --git a/retroshare-gui/src/apps/smplayer/translations/smplayer_zh_TW.qm b/retroshare-gui/src/apps/smplayer/translations/smplayer_zh_TW.qm new file mode 100644 index 000000000..f20a337f4 Binary files /dev/null and b/retroshare-gui/src/apps/smplayer/translations/smplayer_zh_TW.qm differ diff --git a/retroshare-gui/src/apps/smplayer/translations/smplayer_zh_TW.ts b/retroshare-gui/src/apps/smplayer/translations/smplayer_zh_TW.ts new file mode 100644 index 000000000..f393704b2 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/translations/smplayer_zh_TW.ts @@ -0,0 +1,5372 @@ + + + + @default + + + Front-end for mplayer + MPlayer çš„å‰ç«¯ + + + + File to open + è¦é–‹å•Ÿçš„檔案 + + + + Developer + 開發者 + + + + AboutDialog + + + &Ok + 確定(&O) + + + + Version: %1 + 版本: %1 + + + + Qt version: %1 + Qt 版本: %1 + + + + 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. + 這個軟體是自由軟體; ä½ å¯ä»¥åœ¨ GPL 或 GPL2 或之後版本下修改/é‡æ–°ç™¼ä½ˆå®ƒã€‚ + + + + Translators: + 翻譯者: + + + + German + 德語 + + + + Slovak + 斯洛ä¼å…‹èªž + + + + Italian + æ„大利語 + + + + French + 法語 + + + + Simplified-Chinese + 簡體中文 + + + + Russian + 俄羅斯語 + + + + Hungarian + 匈牙利語 + + + + Japanese + 日語 + + + + Dutch + è·è˜­èªž + + + + Ukrainian + çƒå…‹è˜­èªž + + + + Brazilian Portuguese + è‘¡è„牙語 (巴西) + + + + Georgian + 喬治亞語 + + + + Czech + æ·å…‹èªž + + + + Logo designed by %1 + Logo 設計 %1 + + + + Get updates at: %1 + æ–¼ %1 ç²å¾—最新版本 + + + + About SMPlayer + 關於 SMPlayer + + + + %1 and %2 (%3) + %1 å’Œ %2 (%3) + + + + Polish + 波蘭語 + + + + Compiled with KDE support + 編譯包括 KDE æ”¯æŒ + + + + Bulgarian + ä¿åŠ åˆ©äºžèªž + + + + Turkish + 土耳其語 + + + + Swedish + 瑞典語 + + + + Serbian + 塞爾維亞語 + + + + Traditional Chinese + 正體中文 + + + + Romanian + 羅馬尼亞語 + + + + Portuguese - Brazil + è‘¡è„牙語 - 巴西 + + + + Portuguese - Portugal + è‘¡è„牙語- è‘¡è„牙 + + + + Compiled with Qt %1 + 以 Qt %1 編譯 + + + + %1, %2 and %3 (%4) + %1, %2 å’Œ %3 (%4) + + + + %1, %2 and %3 + + + + + %1 and %2 + + + + + http://smplayer.sourceforge.net/en/windows/download.php + If the web page is translated into your language you can change the URL so it points to the download page in the translation.Otherwise leave as is. + + + + + http://smplayer.sourceforge.net/en/linux/download.php + If the web page is translated into your language you can change the URL so it points to the download page in the translation.Otherwise leave as is. + + + + + <b>%1</b>: %2 + + + + + ActionsEditor + + + Name + åå­— + + + + Description + æè¿° + + + + Shortcut + å¿«æ·éµ + + + + &Save + 儲存(&S) + + + + &Load + 載入(&L) + + + + Key files + Key files + + + + Choose a filename + é¸æ“‡ä¸€å€‹æª”å + + + + Confirm overwrite? + 是å¦è¦†å¯«? + + + + The file %1 already exists. +Do you want to overwrite? + 檔案 %1 己存在。 +是å¦è¦†å¯«? + + + + Choose a file + é¸æ“‡ä¸€å€‹æª”案 + + + + Error + 錯誤 + + + + The file couldn't be saved + 檔案無法儲存 + + + + The file couldn't be loaded + 檔案無法載入 + + + + &Change shortcut... + 改變æ·å¾‘ (&C)... + + + + BaseGui + + + SMPlayer - mplayer log + SMPlayer - Mplayer 日誌 + + + + SMPlayer - smplayer log + SMPlayer - SMPlayer 日誌 + + + + &Open + é–‹å•Ÿ(&O) + + + + &Play + 播放(&P) + + + + &Video + 視訊(&V) + + + + &Audio + 音訊(&A) + + + + &Subtitles + 字幕(&S) + + + + &Browse + ç€è¦½(&B) + + + + Op&tions + é¸é …(&T) + + + + &Help + 說明(&H) + + + + &File... + 檔案(&F)... + + + + D&irectory... + 目錄(&I)... + + + + &Playlist... + 播放清單(&P)... + + + + &DVD from drive + 從ç£ç¢Ÿæ©Ÿé–‹å•Ÿ &DVD + + + + D&VD from folder... + 從目錄開啟 D&VD... + + + + &URL... + &URL... + + + + &Clear + 清除(&C) + + + + &Recent files + 最近使用的文件(&R) + + + + P&lay + 播放(&L) + + + + &Pause + æš«åœ(&P) + + + + &Stop + åœæ­¢(&S) + + + + &Frame step + &Frame step + + + + &Normal speed + 常速(&N) + + + + &Halve speed + åŠé€Ÿ(&H) + + + + &Double speed + å…©å€é€Ÿ(&D) + + + + Speed &-10% + 速度 &-10% + + + + Speed &+10% + 速度 &+10% + + + + Sp&eed + 速度(&E) + + + + &Repeat + é‡è¤‡ (&R) + + + + &Fullscreen + 全螢幕(&F) + + + + &Compact mode + 精簡模å¼(&C) + + + + Si&ze + 大å°(&Z) + + + + &Autodetect + 自動åµæ¸¬(&A) + + + + &4:3 + &4:3 + + + + &5:4 + &5:4 + + + + &14:9 + &14:9 + + + + 16:&9 + 16:&9 + + + + 1&6:10 + 1&6:10 + + + + &2.35:1 + &2.35:1 + + + + 4:3 &Letterbox + 4:3 ä¿¡ç®±æ¨¡å¼ (&L) + + + + 16:9 L&etterbox + 16:9 ä¿¡ç®±æ¨¡å¼ (&E) + + + + 4:3 &Panscan + 4:3 &Panscan + + + + 4:3 &to 16:9 + 4:3 &to 16:9 + + + + &Aspect ratio + 外觀比例(&A) + + + + &None + ç„¡(&N) + + + + &Lowpass5 + &Lowpass5 + + + + &Yadif + &Yadif + + + + Linear &Blend + Linear &Blend + + + + &Deinterlace + Deinterlace(&D) + + + + &Postprocessing + &Postprocessing + + + + &Autodetect phase + 自動åµæ¸¬(&A) + + + + &Deblock + &Deblock + + + + De&ring + De&ring + + + + Add n&oise + 加入雜訊(&O) + + + + F&ilters + éŽæ¿¾å™¨(&I) + + + + &Equalizer + 等化器(&E) + + + + &Screenshot + 螢幕擷å–(&S) + + + + S&tay on top + 置頂(&T) + + + + &Track + 音軌(&T) + + + + &Extrastereo + 擴展立體è²(&E) + + + + &Karaoke + å¡æ‹‰O&K + + + + &Filters + éŽæ¿¾å™¨(&F) + + + + &Default + é è¨­(&D) + + + + &Stereo + ç«‹é«”è²(&S) + + + + &4.0 Surround + &4.0 環繞 + + + + &5.1 Surround + &5.1 環繞 + + + + &Channels + è²é“(&C) + + + + &Left channel + å·¦è²é“(&L) + + + + &Right channel + å³è²é“(&R) + + + + &Stereo mode + ç«‹é«”è²æ¨¡å¼(&S) + + + + &Mute + é™éŸ³(&M) + + + + Volume &- + éŸ³é‡ &- + + + + Volume &+ + éŸ³é‡ &+ + + + + &Delay - + å»¶é² - (&D) + + + + D&elay + + å»¶é² + (&E) + + + + &Select + é¸æ“‡(&S) + + + + &Load... + 載入(&L)... + + + + Delay &- + å»¶é² &- + + + + Delay &+ + å»¶é² &+ + + + + &Up + 上移(&U) + + + + &Down + 下移(&D) + + + + &Title + 標題(&T) + + + + &Chapter + 章節(&C) + + + + &Angle + 角度(&A) + + + + &Playlist + 播放清單(&P) + + + + &Show frame counter + 顯示幀計數器(&S) + + + + &Disabled + åœç”¨(&D) + + + + &Seek bar + 定ä½æ¢(&S) + + + + &Time + 時間(&T) + + + + Time + T&otal time + 時間 + 總時間(&O) + + + + &OSD + &OSD + + + + &View logs + 檢視日誌(&V) + + + + P&references + å好設定(&R) + + + + About &Qt + 關於 &Qt + + + + About &SMPlayer + 關於 &SMPlayer + + + + <empty> + <空> + + + + Video + 視訊 + + + + Audio + 音訊 + + + + Playlists + 播放清單 + + + + All files + 所有檔案 + + + + Choose a file + é¸æ“‡ä¸€å€‹æª”案 + + + + SMPlayer - Information + SMPlayer - 資訊 + + + + The CDROM / DVD drives are not configured yet. +The configuration dialog will be shown now, so you can do it. + CDROM / DVD ç£ç¢Ÿå°šæœªè¨­ç½®ã€‚ +ä½ å¯ä»¥åœ¨ä¸‹é¢é¡¯ç¾çš„é…ç½®å°è©±æ¡†è£¡è¨­ç½®ã€‚ + + + + Choose a directory + é¸æ“‡ä¸€å€‹ç›®éŒ„ + + + + Subtitles + 字幕 + + + + About Qt + 關於 Qt + + + + Playing %1 + 播放 %1 + + + + Pause + æš«åœ + + + + Stop + åœæ­¢ + + + + De&noise + 去除雜訊(&N) + + + + N&ormal + 標準(&O) + + + + &Soft + 軟體(&S) + + + + Play / Pause + 播放 / æš«åœ + + + + Pause / Frame step + æš«åœ / Frame step + + + + U&nload + å¸è¼‰(&N) + + + + SMPlayer - Warning + SMPlayer - 警告 + + + + Port %1 is already used by another application. +Cannot start server. + 連接埠 %1 已經被其它程åºå ç”¨ã€‚ +無法啟動伺æœå™¨ã€‚ + + + + Server at port %1 does not respond. +The single instance option has been disabled. + 在連接埠 %1 的伺æœå™¨æ²¡æœ‰å›žæ‡‰ã€‚ +單實體é¸é …已被åœç”¨ã€‚ + + + + V&CD + V&CD + + + + &Quit + 退出(&Q) + + + + C&lose + 關閉(&L) + + + + View &info and properties... + 檢視資訊和內容(&I)... + + + + Zoom &- + 縮å°(&-) + + + + Zoom &+ + 放大(&+) + + + + &Reset + é‡è¨­(&R) + + + + Move &left + 左移(&L) + + + + Move &right + å³ç§»(&R) + + + + Move &up + 上移(&U) + + + + Move &down + 下移(&D) + + + + &Pan && scan + &Pan-scan + + + + &Previous line in subtitles + å‰ä¸€è¡Œå­—幕(&P) + + + + N&ext line in subtitles + 後一行字幕(&E) + + + + -%1 + -%1 + + + + +%1 + +%1 + + + + Dec volume (2) + é™ä½ŽéŸ³é‡(2) + + + + Inc volume (2) + 增加音é‡(2) + + + + Exit fullscreen + 退出全螢幕 + + + + OSD - Next level + OSD - 下一級别 + + + + Dec contrast + é™ä½Žå°æ¯”度 + + + + Inc contrast + 增加å°æ¯”度 + + + + Dec brightness + é™ä½Žäº®åº¦ + + + + Inc brightness + 增加亮度 + + + + Dec hue + é™ä½Žè‰²è°ƒ + + + + Inc hue + 增加色调 + + + + Dec saturation + é™ä½Žé£½å’Œåº¦ + + + + Dec gamma + é™ä½Ž Gamma + + + + Next audio + 下一音訊 + + + + Next subtitle + 下一字幕 + + + + Next chapter + 下一章節 + + + + Previous chapter + å‰ä¸€ç« ç¯€ + + + + Inc saturation + 增加飽和度 + + + + Inc gamma + 增加 Gamma + + + + &Load external file... + 載入外部檔案(&L)... + + + + &Kerndeint + + + + + &Yadif (normal) + + + + + Y&adif (double framerate) + + + + + &Next + 下一個(&N) + + + + Pre&vious + 上一個(&V) + + + + Volume &normalization + 音é‡æ¨™æº–化(&N) + + + + &Audio CD + 音訊 CD (&A) + + + + Denoise nor&mal + + + + + Denoise &soft + + + + + Denoise o&ff + + + + + Use SSA/&ASS library + + + + + Flip i&mage + + + + + &Toggle double size + + + + + BaseGuiPlus + + + SMPlayer is still running here + SMPlayer é‹è¡Œä¸­ + + + + S&how icon in system tray + 在系統閘裡顯示圖示(&H) + + + + &Hide + éš±è—(&H) + + + + &Restore + æ¢å¾©(&R) + + + + &Recent files + 最近使用的文件(&R) + + + + &Quit + 離開 (&Q) + + + + Playlist + 播放清單 + + + + Core + + + Brightness: %1 + 亮度: %1 + + + + Contrast: %1 + å°æ¯”度: %1 + + + + Gamma: %1 + Gamma: %1 + + + + Hue: %1 + 色調: %1 + + + + Saturation: %1 + 飽和度: %1 + + + + Volume: %1 + 音é‡: %1 + + + + Zoom: %1 + 縮放: %1 + + + + DefaultGui + + + Welcome to SMPlayer + 歡迎使用 SMPlayer + + + + Volume + éŸ³é‡ + + + + Audio + 音訊 + + + + Subtitle + 字幕 + + + + Playlist + 播放清單 + + + + &Main toolbar + 主工具列(&M) + + + + &Language toolbar + 語言工具列(&L) + + + + &Toolbars + 工具列(&T) + + + + Encodings + + + Arabic + 阿拉伯語 + + + + Baltic + 波羅的海語 + + + + Celtic + 凱爾特語 + + + + Cyrillic + 斯拉夫語 + + + + Cyrillic Windows + 斯拉夫語 Windows + + + + Esperanto, Galician, Maltese, Turkish + 世界語 + + + + Hebrew charsets + 希伯æ¥èªžå­—元集 + + + + Japanese charsets + 日語字元集 + + + + Korean charset + 韓語字元集 + + + + Modern Greek + ç¾ä»£å¸Œè‡˜èªž + + + + Old Baltic charset + 舊波羅的海語字元集 + + + + Russian + 俄羅斯語 + + + + Simplified Chinese charset + 簡體中文字元集 + + + + Slavic/Central European Languages + 斯拉夫/中æ­èªž + + + + Slavic/Central European Windows + Slavic/Central European Windows + + + + Thai charset + 泰語字元集 + + + + Traditional Chinese charset + 正體中文字元集 + + + + Turkish + 土耳其語 + + + + Ukrainian, Belarusian + çƒå…‹è˜­èªž, 白俄羅斯語 + + + + Western European Languages + 西æ­èªž + + + + Western European Languages with Euro + è¥¿æ­ + + + + Arabic Windows + + + + + EqSlider + + + icon + 圖示 + + + + EqSliderBase + + + EqSlider + 等化器滑塊 + + + + icon + 圖示 + + + + FilePropertiesDialog + + + SMPlayer - File properties + SMPlayer - 檔案內容 + + + + &Information + 資訊(&I) + + + + &Demuxer + 解碼器(&D) + + + + &Select the demuxer that will be used for this file: + é¸æ“‡ç”¨æ–¼é€™å€‹æª”案的解碼器(&S): + + + + &Reset + é‡è¨­(&R) + + + + &Video codec + 視訊編碼解碼器(&V) + + + + &Select the video codec: + é¸æ“‡è¦–訊編碼解碼器(&S): + + + + A&udio codec + 音訊編碼解碼器(&U) + + + + &Select the audio codec: + é¸æ“‡éŸ³è¨Šç·¨ç¢¼è§£ç¢¼å™¨(&S): + + + + &MPlayer options + &Mplayer é¸é … + + + + Additional Options for MPlayer + MPlayer çš„é¡å¤–é¸é … + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + 在這裡你å¯ä»¥å‚³éžé¡å¤–çš„é¸é …ç»™ Mplayer。 +請用空格分隔它們。 +示例 : -flip -nosound + + + + &Options: + é¸é …(&O): + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + 在這裡你å¯ä»¥å‚³éžé¡å¤–的視訊éŽæ¿¾å™¨ã€‚ +請用 "," 分隔它們。ä¸è¦ä½¿ç”¨ç©ºæ ¼! +示例: scale=512:-2,eq2=1.1 + + + + V&ideo filters: + 視訊éŽæ¿¾å™¨(&I): + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + 音訊éŽæ¿¾å™¨ã€‚è¦å‰‡å’Œè¦–訊éŽæ¿¾å™¨ä¸€æ¨£ã€‚ +示例: resample=44100:0:0,volnorm + + + + Audio &filters: + 音訊éŽæ¿¾å™¨(&F): + + + + &OK + 確定(&O) + + + + &Apply + 套用(&A) + + + + &Cancel + å–消(&C) + + + + OK + 確定 + + + + Cancel + å–消 + + + + Apply + 套用 + + + + FilePropertiesDialogBase + + + SMPlayer - File properties + SMPlayer - 檔案屬性 + + + + &Information + 資訊(&I) + + + + &Demuxer + 解碼器(&D) + + + + &Select the demuxer that will be used for this file: + é¸æ“‡å°‡ç”¨æ–¼é€™å€‹æª”案的解碼器(&S): + + + + &Reset + é‡è¨­(&R) + + + + &Video codec + &視訊編碼 + + + + &Select the video codec: + &é¸æ“‡è¦–訊編碼: + + + + A&udio codec + 音訊編碼(&u) + + + + &Select the audio codec: + &é¸æ“‡éŸ³è¨Šç·¨ç¢¼: + + + + &MPlayer options + &Mplayer é¸é … + + + + &Options: + é¸é …(&O): + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + 在這裡你å¯ä»¥å‚³éžé™„加的視訊éŽæ¿¾å™¨ã€‚ +請用 "," 分隔它們。ä¸è¦ä½¿ç”¨ç©ºæ ¼! +示例: scale=512:-2,eq2=1.1 + + + + V&ideo filters: + 視訊éŽæ¿¾å™¨(&I): + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + 最後是音訊éŽæ¿¾å™¨ã€‚和視訊éŽæ¿¾å™¨çš„è¦å‰‡ä¸€æ¨£ã€‚ +示例: resample=44100:0:0,volnorm + + + + Audio &filters: + 音訊éŽæ¿¾å™¨(&F): + + + + &OK + 確定(&O) + + + + &Apply + 套用(&A) + + + + &Cancel + å–消(&C) + + + + Additional Options for MPlayer + MPlayer é¡å¤–é¸é … + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + 在這裡你å¯ä»¥å‚³éžé¡å¤–çš„é¸é …ç»™ Mplayer。 +請用空格分隔它們。 +示例 : -flip -nosound + + + + InfoFile + + + General + 一般 + + + + Path + 路徑 + + + + Size + å¤§å° + + + + %1 KB (%2 MB) + %1 KB (%2 MB) + + + + URL + URL + + + + Length + 長度 + + + + Demuxer + 解碼器 + + + + Name + åå­— + + + + Artist + 演出者å稱 + + + + Author + 作者 + + + + Album + 專輯 + + + + Genre + æµæ´¾ + + + + Date + 日期 + + + + Track + 音軌 + + + + Copyright + 版權 + + + + Comment + 註解 + + + + Software + 軟體 + + + + Clip info + ç´ æ資訊 + + + + Video + 視訊 + + + + Resolution + 解æžåº¦ + + + + Aspect ratio + 外觀比例 + + + + Format + æ ¼å¼ + + + + Bitrate + ä½å…ƒçŽ‡ + + + + %1 kbps + %1 kbps + + + + Frames per second + å¹€/秒 + + + + Selected codec + é¸æ“‡çš„編碼解碼器 + + + + Initial Audio Stream + åˆå§‹åŒ–éŸ³è¨Šä¸²æµ + + + + Rate + 比率 + + + + %1 Hz + %1 Hz + + + + Channels + è²é“ + + + + Audio Streams + éŸ³è¨Šä¸²æµ + + + + Language + 語言 + + + + empty + 空 + + + + Subtitles + 字幕 + + + + Type + é¡žåž‹ + + + + ID + Info for translators: this is a identification code + ID + + + + # + Info for translators: this is a abbreviation for number + # + + + + Stream title + 串æµæ¨™é¡Œ + + + + Stream URL + ä¸²æµ URL + + + + File + + + + + InputDVDDirectory + + + Choose a directory + é¸å–一個目錄 + + + + SMPlayer - Play a DVD from a folder + SMPlayer - 從資料夾裡播放 DVD + + + + You can play a dvd from your hard disc. Just select the folder which contains the VIDEO_TS and AUDIO_TS directories. + ä½ å¯ä»¥å¾žä½ çš„硬碟播放 DVD 。åªè¦é¸å–åŒ…å« VIDEO_TS å’Œ AUDIO_TS 目錄的資料夾å³å¯ã€‚ + + + + Choose a directory... + é¸å–一個目錄... + + + + InputDVDDirectoryBase + + + &Cancel + å–消(&C) + + + + Choose a directory... + é¸æ“‡ä¸€å€‹ç›®éŒ„... + + + + &Ok + 確定(&O) + + + + SMPlayer - Play a DVD from a folder + SMPlayer - 從目錄裡播放 DVD + + + + You can play a dvd from your hard disc. Just select the folder which contains the VIDEO_TS and AUDIO_TS directories. + ä½ å¯ä»¥å¾žä½ çš„硬碟播放 DVD 。åªè¦é¸æ“‡åŒ…å« VIDEO_TS å’Œ AUDIO_TS 目錄的資料夾å³å¯ã€‚ + + + + InputURL + + + SMPlayer - Enter URL + + + + + &URL: + + + + + It's a &playlist + + + + + If this option is checked, the URL will be treated as a playlist: it will be opened as text and will play the URLs in it. + + + + + LogWindow + + + Choose a filename to save under + + + + + Confirm overwrite? + 是å¦è¦†å¯«? + + + + Error saving file + 儲存檔案出錯 + + + + The file already exists. +Do you want to overwrite? + 檔案己存在。 +是å¦è¦†å¯«? + + + + The log couldn't be saved + 日誌無法儲存 + + + + Logs + 日誌 + + + + LogWindowBase + + + Close + 關閉 + + + + Copy to clipboard + 複製到剪貼簿 + + + + Log Window + 日誌視窗 + + + + Save + 儲存 + + + + &Close + 關閉 (&C) + + + + Playlist + + + All files + 所有檔案 + + + + Choose a directory + é¸å–一個目錄 + + + + Choose a file + é¸å–一個檔案 + + + + Choose a filename + é¸å–一個檔å + + + + Confirm overwrite? + 是å¦è¦†å¯«? + + + + &Edit + 編輯(&E) + + + + Edit name + 編輯åå­— + + + + Length + 長度 + + + + Name + åå­— + + + + &Play + 播放(&P) + + + + Playlists + 播放清單 + + + + Select one or more files to open + é¸æ“‡é–‹å•Ÿä¸€å€‹æˆ–多個檔案 + + + + The file %1 already exists. +Do you want to overwrite? + 檔案 %1 己存在。 +是å¦è¦†å¯«? + + + + Type the name that will be displayed in the playlist for this file: + 給這個檔案輸入一個顯示於播放清單上的åå­—: + + + + &Load + 載入(&L) + + + + &Save + 儲存(&S) + + + + &Next + 下一個(&N) + + + + Pre&vious + 上一個(&V) + + + + Move &up + 上移(&U) + + + + Move &down + 下移(&D) + + + + &Repeat + é‡è¤‡ (&R) + + + + S&huffle + 隨機(&H) + + + + Add &current file + 加入目å‰çš„檔案(&C) + + + + Add &file(s) + 加入檔案(&F) + + + + Add &directory + 加入目錄(&D) + + + + Remove &selected + 移除已é¸å–çš„(&S) + + + + Remove &all + 全部移除(&A) + + + + SMPlayer - Playlist + SMPlayer - 播放清單 + + + + Add... + 加入... + + + + Remove... + 移除... + + + + Playlist modified + 播放清單己修改 + + + + There are unsaved changes, do you want to save the playlist? + 修改尚未儲存,您想儲存播放清單嗎? + + + + PrefAdvanced + + + Advanced + 進階 + + + + Auto + 自動 + + + + Form + 表單 + + + + &Advanced + 進階(&A) + + + + icon + 圖示 + + + + Monitor aspect: + 鎖定外觀: + + + + Run MPlayer in its own window + 讓 Mplayer 在自己的視窗裡é‹è¡Œ + + + + Additional Options for MPlayer + MPlayer çš„é¡å¤–é¸é … + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + 在這裡你å¯ä»¥å‚³éžé¡å¤–çš„é¸é …ç»™ Mplayer。 +請用空格分隔它們。 +範例 : -flip -nosound + + + + Options: + é¸é …: + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + 在這裡你å¯ä»¥å‚³éžé¡å¤–的視訊éŽæ¿¾å™¨ã€‚ +請用 "," 分隔它們。ä¸è¦ä½¿ç”¨ç©ºæ ¼! +範例: scale=512:-2,eq2=1.1 + + + + Video filters: + 視訊éŽæ¿¾å™¨: + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + 音訊éŽæ¿¾å™¨ã€‚è¦å‰‡å’Œè¦–訊éŽæ¿¾å™¨ä¸€æ¨£ã€‚ +範例: resample=44100:0:0,volnorm + + + + Audio filters: + 音訊éŽæ¿¾å™¨: + + + + Colorkey: + Colorkey: + + + + Change... + 修改... + + + + Don't repaint the background of the video window + ä¸é‡ç¹ªå½±åƒè¦–窗的背景 + + + + &Logs + 日誌(&L) + + + + Log MPlayer output + 日誌 MPlayer 的輸出 + + + + Log SMPlayer output + 日誌 SMPlayer 的輸出 + + + + This option is mainly intended for debugging the application. + 這個é¸é …主è¦ç”¨æ–¼æ­¤æ‡‰ç”¨ç¨‹å¼çš„除錯。 + + + + Filter for SMPlayer logs: + éŽæ¿¾ SMPlayer 的日誌: + + + + &MPlayer language + MPlayer 語言(&M) + + + + SMPlayer needs to read and parse the output of MPlayer and sometimes it relies on English text. If you are using a MPlayer translated into another language, then you need to change the texts that SMPlayer looks for. (Technically you should enter regular expressions)<br><br> +The drop-down lists may provide already made regular expression for several languages. + + + + + Checking this option may reduce flickering, but it also might produce that the video won't be displayed properly. + é¸æ“‡é€™å€‹é¸é …å¯ä»¥æ¸›å°‘é–ƒçˆã€‚但也å¯èƒ½é€ æˆè¦–訊ä¸èƒ½æ­£å¸¸é¡¯ç¤ºã€‚ + + + + If checked, smplayer will store the output of mplayer (you can see it in <b>Options->View logs->mplayer</b>). In case of problems this log can contain important information, so it's recommended to keep this option checked. + 如果勾é¸ï¼ŒSMPlayer 將儲存 MPlayer 的輸出 (ä½ å¯ä»¥åœ¨<b>é¸é …->查看記錄->mplayer</b>查看)。如果出ç¾éŒ¯èª¤ï¼Œæ­¤æ—¥èªŒå¯èƒ½åŒ…å«é‡è¦è³‡è¨Šï¼Œæ‰€ä»¥æŽ¨è勾é¸ã€‚ + + + + If this option is checked, smplayer will store the debugging messages that smplayer outputs (you can see the log in <b>Options->View logs->smplayer</b>). This information can be very useful for the developer in case you find a bug. + 如果勾é¸ï¼ŒSMPlayer 將儲存 SMPlayer è¼¸å‡ºçš„é™¤éŒ¯è¨Šæ¯ (ä½ å¯ä»¥åœ¨<b>é¸é …->查看記錄->smplayer</b>查看)。當你找到 bug 時,å°æ–¼é–‹ç™¼è€…將會是éžå¸¸é‡è¦çš„資訊。 + + + + Filter for SMPlayer logs + SMPlayer 日誌éŽæ¿¾å™¨ + + + + This option allows to filter the smplayer messages that will be stored in the log. Here you can write any regular expression.<br>For instance: <i>^Core::.*</i> will display only the lines starting with <i>Core::</i> + 這個é¸é …å…許éŽæ¿¾ SMPlayer å°‡è¦å„²å­˜çš„日誌。這裡您å¯ä»¥ä½¿ç”¨ä»»ä½•æ­£å‰‡è¡¨é”å¼ã€‚<br>示例:<i>^Core::..*</i> å°‡åªé¡¯ç¤ºä»¥ <i>Core::</i> é–‹é ­çš„è¡Œ + + + + &Monitor aspect: + 監視器外觀(&M): + + + + &Run MPlayer in its own window + æ–¼ MPlayer 的視窗執行(&R) + + + + &Options: + é¸é …(&O): + + + + V&ideo filters: + 視訊éŽæ¿¾å™¨(&I): + + + + Audio &filters: + 音訊éŽæ¿¾å™¨(&F): + + + + &Colorkey: + + + + + &Don't repaint the background of the video window + å‹¿é‡ç¹ªè¦–訊視窗的背景(&D) + + + + Log &MPlayer output + 日誌 MPlayer 的輸出 (&M) + + + + Log &SMPlayer output + 日誌 &SMPlayer 的輸出 + + + + &Filter for SMPlayer logs: + SMPlayer 日誌éŽæ¿¾å™¨(&F): + + + + &End of file: + 檔案末端(&E): + + + + &No video: + 無視訊(&N): + + + + C&hange... + 改變(&H)... + + + + PrefAssociations + + + Warning + + + + + Not all files could be associated. Please check your security permissions and retry. + + + + + File Types + + + + + Select all + + + + + Check all file types in the list + + + + + Uncheck all file types in the list + + + + + List of file types + + + + + File types + + + + + Media files handled by SMPlayer: + + + + + Select All + + + + + Select None + + + + + Check the media file extensions you would like SMPlayer to handle. When you click Apply, the checked files will be associated with SMPlayer. If you uncheck a media type, the file association will be restored. + + + + + Select none + + + + + PrefDrives + + + Drives + ç£ç¢Ÿ + + + + Currently SMPlayer does not autodetect cdrom or dvd devices. So in order to play cdroms or dvds you must first select here your cdrom and dvd drives (can be the same). + ç¾åœ¨ SMPlayer é‚„ä¸èƒ½è‡ªå‹•æª¢æ¸¬å…‰ç¢Ÿæ©Ÿæˆ– DVD ç£ç¢Ÿã€‚所以你必需é¸æ“‡ä½ çš„光碟機和 DVD ç£ç¢Ÿï¼Œæ‰èƒ½æ’­æ”¾ CD 或 DVD。 + + + + icon + 圖示 + + + + Select your CD device: + é¸æ“‡ä½ çš„ CD ç£ç¢Ÿ: + + + + Select your DVD device: + é¸æ“‡ä½ çš„ DVD ç£ç¢Ÿ: + + + + CD device + CD è£ç½® + + + + Choose your CDROM device. It will be used to play VCDs and Audio CDs. + é¸å–ä½ çš„ CDROM è£ç½®ï¼Œç”¨å…¶ä¾†æ’­æ”¾ VCDs å’Œ 音訊 CDs。 + + + + DVD device + DVD è£ç½® + + + + Choose your DVD device. It will be used to play DVDs. + é¸å–ä½ çš„ DVD è£ç½®ï¼Œç”¨å…¶ä¾†æ’­æ”¾ DVDs。 + + + + Select your &CD device: + + + + + Select your &DVD device: + + + + + PrefGeneral + + + General + 一般 + + + + &General + 一般 (&G) + + + + Paths + 路徑 + + + + Select... + é¸æ“‡... + + + + Folder for storing screenshots: + 儲存擷圖的目錄: + + + + Search... + æœå°‹... + + + + Select the MPlayer executable: + é¸æ“‡ Mplayer çš„å¯åŸ·è¡Œæª”案: + + + + Output drivers + 輸出ç£ç¢Ÿ + + + + Video: + 視訊: + + + + Audio: + 音訊: + + + + Media settings + 媒體設定 + + + + Remember settings for all files (audio track, subtitles...) + 記ä½æ‰€æœ‰æª”案的設定 (音軌,字幕...) + + + + Don't remember time position (files start playing from the beginning) + ä¸è¦è¨˜ä½ç›®å‰çš„時間ä½ç½®(從頭開始播放) + + + + Preferred audio and subtitles + å好的音訊和字幕 + + + + Subtitles: + 字幕: + + + + &Video and audio + 視訊和音訊 (&V) + + + + Video + 視訊 + + + + Use software video equalizer + 使用軟體視訊等化器 + + + + Enable postprocessing for all videos + å…è¨±æ‰€æœ‰è¦–è¨Šå¾Œè™•ç† + + + + Quality: + å“質: + + + + Start videos in fullscreen + 以全螢幕啟動視訊 + + + + Disable screensaver + åœç”¨èž¢å¹•ä¿è­·ç¨‹å¼ + + + + Audio + 音訊 + + + + Use software volume control + 使用軟體音é‡æŽ§åˆ¶ + + + + Max. Amplification: + 最大增幅 + + + + Volume normalization + 音é‡æ¨™æº–化 + + + + Select the mplayer executable + é¸æ“‡ Mplayer çš„å¯åŸ·è¡Œæª” + + + + Executables + å¯åŸ·è¡Œ + + + + All files + 所有檔案 + + + + Select a directory + é¸æ“‡ä¸€å€‹ç›®éŒ„ + + + + MPlayer executable + Mplayer å¯åŸ·è¡Œ + + + + Here you must specify the mplayer executable that smplayer will use.<br>smplayer requires at least mplayer 1.0rc1 (svn recommended).<br><b>If this setting is wrong, smplayer won't be able to play anything!</b> + 這裡您必須指定 SMPlayer è¦ä½¿ç”¨çš„ MPlayer çš„å¯åŸ·è¡Œæ–‡ä»¶ã€‚<br>SMPlayer 需è¦è‡³å°‘ 1.0rc1 çš„ MPlayer (推è SVN 版)。<br><b>如果此設定錯誤,SMPlayer 將無法播放任何æ±è¥¿!</b> + + + + Screenshots folder + 螢幕擷圖資料夾 + + + + Here you can specify a folder where the screenshots taken by smplayer will be stored. If this field is empty the screenshot feature will be disabled. + 這裡你å¯ä»¥è¨­ç½® SMPlayer 存放截圖的目錄。如果這裡為空,截圖功能將被åœç”¨ã€‚ + + + + Video output driver + è¦–è¨Šè¼¸å‡ºé©…å‹•ç¨‹å¼ + + + + Select the video output driver. Usually xv (linux) and directx (windows) provide the best performance. + é¸æ“‡å½±åƒè¼¸å‡ºé©…動程å¼ã€‚通常 xv (linux) å’Œ directx (windows) 能æ供最佳性能。 + + + + Audio output driver + éŸ³è¨Šè¼¸å‡ºé©…å‹•ç¨‹å¼ + + + + Select the audio output driver. + é¸æ“‡éŸ³è¨Šè¼¸å‡ºé©…動程å¼ã€‚ + + + + Remember settings + 記ä½è¨­å®š + + + + Usually smplayer will remember the settings for each file you play (audio track selected, volume, filters...). Uncheck this option if you don't like this feature. + é è¨­æƒ…况下 SMPlayer 會記ä½æ‚¨æ’­æ”¾çš„æ¯ä¸€å€‹æª”案的設定(é¸æ“‡çš„音軌,音é‡ï¼ŒéŽæ¿¾å™¨...)。如果您ä¸å–œæ­¡é€™å€‹ç‰¹æ€§ï¼Œè«‹ä¸è¦å‹¾é¸æ­¤é …。 + + + + Don't remember time position + ä¸è¦è¨˜ä½æ™‚é–“ä½ç½® + + + + If you check this option, smplayer will play all files from the beginning. + 如果勾é¸æ­¤é¸é …,SMPlayer 將從頭播放所有檔案。 + + + + Preferred audio language + å好的音訊語言 + + + + Here you can type your preferred language for the audio streams. When a media with multiple audio streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the audio streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the audio track if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + 這裡您å¯ä»¥è¼¸å…¥æ‚¨å–œå¥½çš„語言和音訊串æµã€‚當在媒體裡發ç¾å¤šå€‹éŸ³è¨Šä¸²æµæ™‚,SMPlayer 將試圖使用您的喜好語言。<br>這åªåœ¨åª’é«”æ供語言和音效æµè³‡è¨Šæ™‚有效, åƒ DVD 或 mkv 文件。<br>這裡支æŒæ­£å‰‡è¡¨é”å¼ã€‚示例: <b>es|esp|spa</b> å°‡é¸æ“‡ç¬¦åˆ <i>es</i>, <i>esp</i> 或 <i>spa</i> 的音軌。 + + + + Preferred subtitle language + å好的字幕語言 + + + + Here you can type your preferred language for the subtitle stream. When a media with multiple subtitle streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the subtitle streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the subtitle stream if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + 這裡您å¯ä»¥è¼¸å…¥æ‚¨å–œå¥½çš„語言和音效æµã€‚當在媒體裡發ç¾å¤šå€‹éŸ³æ•ˆæµæ™‚, SMPlayer 將試圖使用您的喜好語言。<br>這åªåœ¨åª’é«”æ供語言和音效æµè³‡è¨Šæ™‚有效, åƒ DVD 或 mkv 文件。<br>這裡支æŒæ­£å‰‡è¡¨é”å¼ã€‚示例: <b>es|esp|spa</b> å°‡é¸æ“‡ç¬¦åˆ <i>es</i>, <i>esp</i> 或 <i>spa</i> 的音軌。 + + + + Software video equalizer + 軟體視訊等化器 + + + + You can check this option if video equalizer is not supported by your graphic card or the selected video output driver.<br><b>Note:</b> this option can be incompatible with some video output drivers. + 如果視訊等化器ä¸è¢«æ‚¨çš„顯示å¡æˆ–é¸æ“‡çš„輸出驅動程å¼æ”¯æŒï¼Œæ‚¨å¯ä»¥å‹¾é¸æ­¤é¸é …。<br><b>注æ„:</b>這個é¸é …å¯èƒ½å’Œä¸€äº›å½±åƒè¼¸å‡ºé©…動程å¼ä¸ç›¸å®¹ã€‚ + + + + If this option is checked, all videos will start to play in fullscreen mode. + 如果勾é¸æ­¤é¸é …,所有的視訊將一開始就使用全螢幕模å¼ã€‚ + + + + Check this option to disable the screensaver while playing.<br>The screensaver will enabled again when play finishes.<br><b>Note:</b> This option works only in X11 and Windows. + 勾é¸æ­¤é¸é …將在播放時åœç”¨èž¢å¹•ä¿è­·ç¨‹å¼ã€‚<br>播放çµæŸå¾Œèž¢å¹•ä¿è­·ç¨‹å¼æœƒé‡å•Ÿã€‚<br><b>注æ„:</b> 這個é¸é …åªåœ¨ X11 å’Œ Windows 下有效。 + + + + Software volume control + 軟體音é‡æŽ§åˆ¶ + + + + Check this option to use the software mixer, instead of using the sound card mixer. + 勾é¸é€™å€‹é¸é …以使用軟體混音(ä¸ä½¿ç”¨éŸ³æ•ˆå¡æ··éŸ³)。 + + + + Postprocessing quality + + + + + Dynamically changes the level of postprocessing depending on the available spare CPU time. The number you specify will be the maximum level used. Usually you can use some big number. + Dynamically changes the level of postprocessing depending on the available spare CPU time. 這個數字說明將被用到的最大級别。通常您å¯ä»¥é¸ç”¨è¼ƒå¤§çš„數字。 + + + + Direct rendering + + + + + If checked, turns on direct rendering (not supported by all codecs and video outputs)<br><b>WARNING:</b> May cause OSD/SUB corruption! + + + + + Double buffering + + + + + Double buffering fixes flicker by storing two frames in memory, and displaying one while decoding another. If disabled it can affect OSD negatively, but often removes OSD flickering. + + + + + Change volume + + + + + If checked, SMPlayer will remember the volume for every file and will restore it when played again. For new files the default volume will be used. + + + + + &Search... + + + + + S&elect... + + + + + Select the &MPlayer executable: + + + + + &Folder for storing screenshots: + + + + + V&ideo: + + + + + &Audio: + + + + + &Don't remember time position (files start playing from the beginning) + + + + + &Remember settings for all files (audio track, subtitles...) + + + + + A&udio: + + + + + Su&btitles: + + + + + &Use software video equalizer + + + + + &Enable postprocessing by default + + + + + &Quality: + + + + + D&irect rendering + + + + + Dou&ble buffering + + + + + Start videos in &fullscreen + + + + + Disable &screensaver + + + + + &Default volume: + + + + + 0 + 0 + + + + Use s&oftware volume control + + + + + Ma&x. Amplification: + + + + + &AC3/DTS pass-through S/PDIF + + + + + Volume &normalization by default + + + + + &Change volume on every file + + + + + Close when finished + + + + + If this option is checked, the main window will be automatically closed when the current file/playlist finishes. + + + + + &Close when finished + + + + + 2 (Stereo) + + + + + 4 (4.0 Surround) + + + + + 6 (5.1 Surround) + + + + + C&hannels by default: + + + + + &Pause when minimized + + + + + Pause when minimized + + + + + If this option is enabled, the file will be paused when the main window is hidden. When the window is restored, play will be resumed. + + + + + Enable postprocessing by default + + + + + Max. Amplification + + + + + AC3/DTS pass-through S/PDIF + + + + + Volume normalization by default + + + + + Maximizes the volume without distorting the sound. + + + + + Default volume + + + + + Sets the initial volume that new files will use. + + + + + Channels by default + + + + + Sets the maximum amplification level in percent (default: 110). A value of 200 will allow you to adjust the volume up to a maximum of double the current level. With values below 100 the initial volume (which is 100%) will be above the maximum, which e.g. the OSD cannot display correctly. + + + + + Uses hardware AC3 passthrough + + + + + Requests the number of playback channels. MPlayer asks the decoder to decode the audio into as many channels as specified. Then it is up to the decoder to fulfill the requirement. This is usually only important when playing videos with AC3 audio (like DVDs). In that case liba52 does the decoding by default and correctly downmixes the audio into the requested number of channels. NOTE: This option is honored by codecs (AC3 only), filters (surround) and audio output drivers (OSS at least). + + + + + Postprocessing will be used by default on new opened files. + + + + + PrefInput + + + Keyboard and mouse + éµç›¤å’Œæ»‘é¼  + + + + Form + 表單 + + + + &Keyboard + éµç›¤(&K) + + + + icon + 圖示 + + + + Here you can change any key shortcut. To do it double click or start typing over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + 在這裡您å¯ä»¥æ›´æ”¹ä»»ä½•å¿«æ·éµã€‚通éŽåœ¨ä¸€å€‹å¿«æ·éµå–®å…ƒæ ¼åŒæ“Šæˆ–éµå…¥ä¾†è¨­å®šã€‚ +您也å¯ä»¥å„²å­˜æ‚¨çš„設定,然後分享给他人或載入别的電腦上。 + + + + &Mouse + 滑鼠(&M) + + + + Button functions: + 按鈕功能: + + + + Left click + 左擊 + + + + Double click + 雙擊 + + + + Wheel function: + 滾輪功能: + + + + Media seeking + åª’é«”å®šä½ + + + + Volume control + 音é‡æŽ§åˆ¶ + + + + Zoom video + 縮放視訊 + + + + None + ç„¡ + + + + Here you can change any key shortcut. To do it double click or press enter over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + + + + + &Left click + + + + + &Double click + + + + + &Wheel function: + + + + + Shortcut editor + + + + + This table allows you to change the key shortcuts of most available actions. Double click or press enter on a item, or press the <b>Change shortcut</b> button to enter in the <i>Modify shortcut</i> dialog. There are two ways to change a shortcut: if the <b>Capture</b> button is on then just press the new key or combination of keys that you want to assign for the action (unfortunately this doesn't work for all keys). If the <b>Capture</b> button is off then you could enter the full name of the key. + + + + + Select the action for left click on the mouse. + + + + + Select the action for double click on the mouse. + + + + + Wheel function + + + + + Select the action for the mouse wheel. + + + + + PrefInterface + + + Interface + ç•Œé¢ + + + + Bulgarian + ä¿åŠ åˆ©äºžæ–‡ + + + + Czech + æ·å…‹æ–‡ + + + + German + å¾·æ–‡ + + + + Greek + 希臘文 + + + + English + 英文 + + + + Spanish + 西ç­ç‰™æ–‡ + + + + Finnish + 芬蘭文 + + + + French + 法文 + + + + Hungarian + 匈牙利文 + + + + Italian + æ„大利文 + + + + Japanese + 日文 + + + + Georgian + 喬治亞文 + + + + Dutch + è·è˜­æ–‡ + + + + Polish + 波蘭文 + + + + Portuguese - Brazil + è‘¡è„牙文 - 巴西 + + + + Portuguese - Portugal + è‘¡è„牙文 - è‘¡è„牙 + + + + Romanian + 羅馬尼亞文 + + + + Russian + 俄羅斯文 + + + + Slovak + 斯洛ä¼å…‹æ–‡ + + + + Serbian + 塞爾維亞文 + + + + Swedish + 瑞典文 + + + + Turkish + 土耳其語 + + + + Ukrainian + çƒå…‹è˜­èªž + + + + Simplified-Chinese + 簡體中文 + + + + Traditional Chinese + 正體中文 + + + + <Autodetect> + <自動åµæ¸¬> + + + + Short jump + çŸ­è·³èº + + + + Medium jump + è·³èº + + + + Long jump + é•·è·³èº + + + + Mouse wheel jump + æ»‘é¼ æ»¾è¼ªè·³èº + + + + Default + é è¨­ + + + + Form + 表單 + + + + &Interface + ç•Œé¢(&I) + + + + Seeking + å®šä½ + + + + Volume + éŸ³é‡ + + + + icon + 圖示 + + + + Default volume: + é è¨­éŸ³é‡: + + + + 0 + 0 + + + + Window size + è¦–çª—å¤§å° + + + + Main window resize method: + 主視窗縮放方å¼: + + + + Never + å¾žä¸ + + + + Whenever it's needed + 當需è¦çš„時後 + + + + Only after loading a new video + åªåœ¨æ–°å½±ç‰‡è¼‰å…¥å¾Œ + + + + Use only one running instance of SMPlayer + åªä½¿ç”¨ä¸€å€‹é‹è¡Œçš„ SMPlayer 實體 + + + + SMPlayer will listen to this port to receive commands from other instances: + SMPlayer 會在這個連接埠接收其它實體的命令: + + + + (changes in this group require SMPlayer to be restarted) + (這裡的變更è¦åœ¨ SMPlayer é‡å•Ÿå¾Œæ‰èƒ½ç”Ÿæ•ˆ) + + + + Recent files + 最近使用的檔案 + + + + Max. items + 最大項數 + + + + Language: + 語言: + + + + Icon set: + 圖示集: + + + + Style: + 樣å¼: + + + + I&nstances + 實體(&N) + + + + Language + 語言 + + + + Here you can change the language of the application + 在此你å¯ä»¥è®Šæ›´æ‡‰ç”¨ç¨‹å¼çš„語言 + + + + Catalan + + + + + Basque + + + + + Galician + + + + + &Short jump + + + + + &Medium jump + + + + + &Long jump + + + + + Mouse &wheel jump + + + + + Here you can change the language of the application. + + + + + Instances + + + + + &Use only one running instance of SMPlayer + + + + + SMPlayer will listen to this &port to receive commands from other instances: + + + + + St&yle: + + + + + L&anguage: + + + + + Ico&n set: + + + + + Ma&x. items + + + + + Main window + + + + + Auto&resize: + + + + + R&emember position and size + + + + + Default font: + + + + + &Change... + + + + + PrefPerformance + + + Performance + 效能 + + + + Form + 表單 + + + + &Performance + 效能(&P) + + + + Priority + 優先等級 + + + + Select the priority for the MPlayer process. + é¸æ“‡ MPlayer 程å¼çš„優先等級。 + + + + Priority: + 優先等級: + + + + realtime + å³æ™‚ + + + + high + 高 + + + + abovenormal + 高於標準 + + + + normal + 標準 + + + + belownormal + 低於標準 + + + + idle + é–’ç½® + + + + Cache + å¿«å– + + + + Size: + 大å°: + + + + KB + KB + + + + Use cache + ä½¿ç”¨å¿«å– + + + + Setting a cache may improve performance on slow media + 設定快å–å¯ä»¥æ”¹é€²æ’­æ”¾æ€§èƒ½ + + + + Allow frame drop + Allow frame drop + + + + Allow hard frame drop (can lead to image distortion) + Allow hard frame drop (å¯èƒ½å°Žè‡´åœ–åƒè®Šå½¢) + + + + Synchronization + åŒæ­¥åŒ– + + + + Audio/video auto synchronization + 音訊/視訊 自動åŒæ­¥åŒ– + + + + Factor: + å› å­: + + + + Fast audio track switching + å¿«é€ŸéŸ³è»Œåˆ‡æ› + + + + Fast seek to chapters in dvds + 在 DVD 裡快速定ä½ç« ç¯€ + + + + Set process priority for mplayer according to the predefined priorities available under Windows.<br><b>WARNING:</b> Using realtime priority can cause system lockup. + 為 MPlayer 設置優先等級 (根據 Windows 下的命åç¿’æ…£)。<br><b>警告:</b> 使用å³æ™‚會將您的系统鎖死。 + + + + <br><b>Note:</b> This option is for Windows only. + <br><b>注æ„:</b> 這個é¸é …是 Windows 專有的。 + + + + This option specifies how much memory (in kBytes) to use when precaching a file or URL. Especially useful on slow media. + 這裡指定用於讀å–檔案或 URL 的記憶體大å°(KB)。å°æ–¼ Slow Media 特别有用。 + + + + Skip displaying some frames to maintain A/V sync on slow systems. + 在較慢的系统上,跳éŽä¸€äº›å¹€ä¾†ä¿è­‰ A/V åŒæ­¥ã€‚ + + + + Allow hard frame drop + + + + + More intense frame dropping (breaks decoding). Leads to image distortion! + 大é‡å¹€è¢«è·³éŽ(解碼錯誤)。將導致畫é¢è®Šå½¢! + + + + Gradually adjusts the A/V sync based on audio delay measurements. + 根據音訊延é²ä¾†èª¿æ•´ A/V åŒæ­¥ã€‚ + + + + Priorit&y: + + + + + Si&ze: + + + + + &Use cache + + + + + &Allow frame drop + + + + + Allow &hard frame drop (can lead to image distortion) + + + + + Audio/&video auto synchronization + + + + + Fact&or: + + + + + &Fast audio track switching + + + + + Fast &seek to chapters in dvds + + + + + Create index if needed + + + + + Rebuilds index of files if no index was found, allowing seeking. Useful with broken/incomplete downloads, or badly created files. This option only works if the underlying media supports seeking (i.e. not with stdin, pipe, etc).<br> Note: the creation of the index may take some time. + + + + + &Create index if needed + + + + + If checked, it will try the fastest method to switch audio tracks but might not work with some formats. + + + + + If checked, it will try the fastest method to seek to chapters but it might not work with some discs. + + + + + PrefSubtitles + + + Subtitles + 字幕 + + + + Choose a ttf file + é¸å–一個 ttf 檔案 + + + + Truetype Fonts + Truetype å­—é«” + + + + Form + 表單 + + + + &Subtitles + 字幕(&S) + + + + Autoload + 自動載入 + + + + Autoload subtitles files (*.srt, *.sub...): + 自動載入字幕檔 (*.srt, *.sub...): + + + + Select first available subtitle + é¸æ“‡ç¬¬ä¸€å€‹å¯ç”¨çš„字幕 + + + + Same name as movie + 和影片åŒå的字幕 + + + + All subs containing movie name + 所有包å«å½±ç‰‡å的字幕 + + + + All subs in directory + 目錄裡的所有字幕 + + + + Default subtitle encoding: + é è¨­å­—幕編碼方å¼: + + + + Position + ä½ç½® + + + + Default position of the subtitles on screen + 字幕在螢幕上的é è¨­ä½ç½® + + + + 0 + 0 + + + + Top + 頂部 + + + + Bottom + 底部 + + + + Include subtitles on screenshots + 擷圖包å«å­—幕 + + + + &Font + å­—é«”(&F) + + + + Font + å­—é«” + + + + TTF font: + TTF å­—é«”: + + + + Search... + æœå°‹... + + + + System font: + 系統字體: + + + + Select the font which will be used for subtitles (and OSD): + é¸æ“‡å­—幕 (å’Œ OSD) çš„å­—é«”: + + + + Size + å¤§å° + + + + Autoscale: + 自動縮放: + + + + No autoscale + 無自動縮放 + + + + Proportional to movie height + 相å°æ–¼å½±ç‰‡çš„高度 + + + + Proportional to movie width + 相å°æ–¼å½±ç‰‡çš„寬度 + + + + Proportional to movie diagonal + 相å°æ–¼å½±ç‰‡çš„å°è§’ç·š + + + + Scale: + 比例: + + + + SSA/&ASS library + SSA/&ASS 程å¼åº« + + + + The new SSA/ASS library will provide nice styled subtitles for external SSA/ASS subtitles files and Matroska tracks. But it will be used too for rendering other formats like SUB and SRT files. + + + + + Use SSA/ASS library for subtitle rendering + 使用 SSA/AAS 程å¼åº«ä¾†æ¼”算上色字幕 + + + + Text color: + 文字é¡è‰²: + + + + Border color: + 邊框é¡è‰²: + + + + Here you can override styles for SSA/ASS subtitles. It can be also used for fine-tuning the rendering of SRT and SUB subtitles by the SSA/ASS library. Example: <b>Bold=1,Outline=2,Shadow=4</b> + + + + + Styles: + 風格: + + + + Subtitle position + 字幕ä½ç½® + + + + This option specifies the position of the subtitles over the video window. <i>100</i> means the bottom, while <i>0</i> means the top. + 這個é¸é …指定字幕在視訊視窗裡的ä½ç½®ã€‚<i>100</i>表示底部, <i>0</i>表示頂部。 + + + + SSA/ASS styles + SSA/ASS æ¨£å¼ + + + + Au&toload subtitles files (*.srt, *.sub...): + + + + + S&elect first available subtitle + + + + + &Default subtitle encoding: + + + + + Default &position of the subtitles on screen + + + + + &Include subtitles on screenshots + + + + + &Use -subfont option (required by recent MPlayer releases) + + + + + &TTF font: + + + + + Sea&rch... + + + + + S&ystem font: + + + + + A&utoscale: + + + + + S&cale: + + + + + &Use SSA/ASS library for subtitle rendering + + + + + &Text color: + + + + + &Border color: + + + + + St&yles: + + + + + PreferencesDialog + + + Advanced + 進階 + + + + All files + 所有檔案 + + + + Choose a ttf file + é¸æ“‡ä¸€å€‹ ttf 檔案 + + + + Drives + ç£ç¢Ÿ + + + + Executables + å¯åŸ·è¡Œ + + + + General + 一般 + + + + Performance + 效能 + + + + Select a directory + é¸æ“‡ä¸€å€‹ç›®éŒ„ + + + + Select the mplayer executable + é¸æ“‡ Mplayer çš„å¯åŸ·è¡Œæª” + + + + Subtitles + 字幕 + + + + Truetype Fonts + Truetype å­—é«” + + + + Short jump + çŸ­è·³èº + + + + Medium jump + è·³èº + + + + Long jump + é•·è·³èº + + + + Mouse wheel jump + æ»‘é¼ æ»¾è¼ªè·³èº + + + + None + ç„¡ + + + + Interface + ç•Œé¢ + + + + Mouse and keyboard + 滑鼠和éµç›¤ + + + + Here you can specify a folder where the screenshots taken by smplayer will be stored. If this field is empty the screenshot feature will be disabled. + 這裡你å¯ä»¥è¨­ç½® SMPlayer 存放截圖的目錄。如果這裡為空,截圖功能將被åœç”¨ã€‚ + + + + Select the video output driver. Usually xv (linux) and directx (windows) provide the best performance. + é¸æ“‡å½±åƒè¼¸å‡ºé©…動程å¼ã€‚通常 xv (linux) å’Œ directx (windows) 能æ供最佳性能。 + + + + Select the audio output driver. + é¸æ“‡éŸ³è¨Šè¼¸å‡ºé©…動程å¼ã€‚ + + + + You can check this option if video equalizer is not supported by your graphic card or the selected video output driver.<br><b>Note:</b> this option can be incompatible with some video output drivers. + 如果視訊等化器ä¸è¢«æ‚¨çš„顯示å¡æˆ–é¸æ“‡çš„輸出驅動程å¼æ”¯æŒï¼Œæ‚¨å¯ä»¥å‹¾é¸æ­¤é¸é …。<br><b>注æ„:</b>這個é¸é …å¯èƒ½å’Œä¸€äº›å½±åƒè¼¸å‡ºé©…動程å¼ä¸å…¼å®¹ã€‚ + + + + Check this option to use the software mixer, instead of using the sound card mixer. + 勾é¸é€™å€‹é¸é …以使用軟體混音(ä¸ä½¿ç”¨éŸ³æ•ˆå¡æ··éŸ³)。 + + + + If you check this option, smplayer will play all files from the beginning. + 如果勾é¸æ­¤é¸é …,SMPlayer 將從頭播放所有檔案。 + + + + If this option is checked, all videos will start to play in fullscreen mode. + 如果勾é¸æ­¤é¸é …,所有的視訊將一開始就使用全螢幕模å¼ã€‚ + + + + Check this option to disable the screensaver while playing.<br>The screensaver will enabled again when play finishes.<br><b>Note:</b> This option works only in X11 and Windows. + 勾é¸æ­¤é¸é …將在播放時åœç”¨èž¢å¹•ä¿è­·ç¨‹å¼ã€‚<br>播放çµæŸå¾Œèž¢å¹•ä¿è­·ç¨‹å¼æœƒé‡å•Ÿã€‚<br><b>注æ„:</b> 這個é¸é …åªåœ¨ X11 å’Œ Windows 下有效。 + + + + Here you must specify the mplayer executable that smplayer will use.<br>smplayer requires at least mplayer 1.0rc1 (svn recommended).<br><b>If this setting is wrong, smplayer won't be able to play anything!</b> + 這裡您必須指定 SMPlayer è¦ä½¿ç”¨çš„ MPlayer çš„å¯åŸ·è¡Œæ–‡ä»¶ã€‚<br>SMPlayer 需è¦è‡³å°‘ 1.0rc1 çš„ MPlayer (推è SVN 版)。<br><b>如果此設定錯誤,SMPlayer 將無法播放任何æ±è¥¿!</b> + + + + If checked, smplayer will store the output of mplayer (you can see it in <b>Options->View logs->mplayer</b>). In case of problems this log can contain important information, so it's recommended to keep this option checked. + 如果勾é¸ï¼ŒSMPlayer 將儲存 MPlayer 的輸出 (ä½ å¯ä»¥åœ¨<b>é¸é …->查看記錄->mplayer</b>查看)。如果出ç¾éŒ¯èª¤ï¼Œæ­¤æ—¥èªŒå¯èƒ½åŒ…å«é‡è¦è³‡è¨Šï¼Œæ‰€ä»¥æŽ¨è勾é¸ã€‚ + + + + If this option is checked, smplayer will store the debugging messages that smplayer outputs (you can see the log in <b>Options->View logs->smplayer</b>). This information can be very useful for the developer in case you find a bug. + 如果勾é¸ï¼ŒSMPlayer 將儲存 SMPlayer è¼¸å‡ºçš„é™¤éŒ¯è¨Šæ¯ (ä½ å¯ä»¥åœ¨<b>é¸é …->查看記錄->smplayer</b>查看)。當你找到 bug 時,å°æ–¼é–‹ç™¼è€…將會是éžå¸¸é‡è¦çš„資訊。 + + + + This option allows to filter the smplayer messages that will be stored in the log. Here you can write any regular expression.<br>For instance: <i>^Core::.*</i> will display only the lines starting with <i>Core::</i> + 這個é¸é …å…許éŽæ¿¾ SMPlayer å°‡è¦å„²å­˜çš„日誌。這裡您å¯ä»¥ä½¿ç”¨ä»»ä½•æ­£å‰‡è¡¨é”å¼ã€‚<br>示例:<i>^Core::..*</i> å°‡åªé¡¯ç¤ºä»¥ <i>Core::</i> é–‹é ­çš„è¡Œ + + + + Logs + 日誌 + + + + <br><b>Note:</b> This option is for Windows only. + <br><b>注æ„:</b> 這個é¸é …是 Windows 專有的。 + + + + Default + é è¨­ + + + + Set process priority for mplayer according to the predefined priorities available under Windows.<br><b>WARNING:</b> Using realtime priority can cause system lockup. + 為 MPlayer 設置優先級 (根據 Windows 下的命åç¿’æ…£)。<br><b>警告:</b> 使用å³æ™‚會將您的系统鎖死。 + + + + Usually smplayer will remember the settings for each file you play (audio track selected, volume, filters...). Uncheck this option if you don't like this feature. + é è¨­æƒ…况下 SMPlayer 會記ä½æ‚¨æ’­æ”¾çš„æ¯ä¸€å€‹æª”案的設定(é¸æ“‡çš„音軌,音é‡ï¼ŒéŽæ¿¾å™¨...)。如果您ä¸å–œæ­¡é€™å€‹ç‰¹æ€§ï¼Œè«‹ä¸è¦å‹¾é¸æ­¤é …。 + + + + Here you can type your preferred language for the audio streams. When a media with multiple audio streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the audio streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the audio track if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + 這裡您å¯ä»¥è¼¸å…¥æ‚¨å–œå¥½çš„語言和音訊串æµã€‚當在媒體裡發ç¾å¤šå€‹éŸ³è¨Šä¸²æµæ™‚,SMPlayer 將試圖使用您的喜好語言。<br>這åªåœ¨åª’é«”æ供語言和音效æµè³‡è¨Šæ™‚有效, åƒ DVD 或 mkv 文件。<br>這裡支æŒæ­£å‰‡è¡¨é”å¼ã€‚示例: <b>es|esp|spa</b> å°‡é¸æ“‡ç¬¦åˆ <i>es</i>, <i>esp</i> 或 <i>spa</i> 的音軌。 + + + + Here you can type your preferred language for the subtitle stream. When a media with multiple subtitle streams is found, smplayer will try to use your preferred language.<br>This only will work with media that offer info about the language of the subtitle streams, like DVDs or mkv files.<br>This field accepts regular expressions. Example: <b>es|esp|spa</b> will select the subtitle stream if it matches with <i>es</i>, <i>esp</i> or <i>spa</i>. + 這裡您å¯ä»¥è¼¸å…¥æ‚¨å–œå¥½çš„語言和音效æµã€‚當在媒體裡發ç¾å¤šå€‹éŸ³æ•ˆæµæ™‚, SMPlayer 將試圖使用您的喜好語言。<br>這åªåœ¨åª’é«”æ供語言和音效æµè³‡è¨Šæ™‚有效, åƒ DVD 或 mkv 文件。<br>這裡支æŒæ­£å‰‡è¡¨é”å¼ã€‚示例: <b>es|esp|spa</b> å°‡é¸æ“‡ç¬¦åˆ <i>es</i>, <i>esp</i> 或 <i>spa</i> 的音軌。 + + + + This option specifies how much memory (in kBytes) to use when precaching a file or URL. Especially useful on slow media. + 這裡指定用於讀å–檔案或 URL 的記憶體大å°(KB)。å°æ–¼ Slow Media 特别有用。 + + + + Skip displaying some frames to maintain A/V sync on slow systems. + 在較慢的系统上,跳éŽä¸€äº›å¹€ä¾†ä¿è­‰ A/V åŒæ­¥ã€‚ + + + + More intense frame dropping (breaks decoding). Leads to image distortion! + 大é‡å¹€è¢«è·³éŽ(解碼錯誤)。將導致畫é¢è®Šå½¢! + + + + Gradually adjusts the A/V sync based on audio delay measurements. + 根據音訊延é²ä¾†èª¿æ•´ A/V åŒæ­¥ã€‚ + + + + Dynamically changes the level of postprocessing depending on the available spare CPU time. The number you specify will be the maximum level used. Usually you can use some big number. + Dynamically changes the level of postprocessing depending on the available spare CPU time. 這個數字說明將被用到的最大級别。通常您å¯ä»¥é¸ç”¨è¼ƒå¤§çš„數字。 + + + + Czech + æ·å…‹èªž + + + + German + 德語 + + + + English + 英語 + + + + Spanish + 西ç­ç‰™èªž + + + + French + 法語 + + + + Hungarian + 匈牙利語 + + + + Italian + æ„大利語 + + + + Japanese + 日語 + + + + Georgian + 喬治亞語 + + + + Dutch + è·è˜­èªž + + + + Polish + 波蘭語 + + + + Brazilian Portuguese + è‘¡è„牙語 + + + + Russian + 俄羅斯語 + + + + Slovak + 斯洛ä¼å…‹èªž + + + + Ukrainian + çƒå…‹è˜­èªž + + + + Simplified-Chinese + 簡體中文 + + + + <Autodetect> + <自動åµæ¸¬> + + + + Bulgarian + ä¿åŠ åˆ©äºžèªž + + + + Checking this option may reduce flickering, but it also might produce that the video won't be displayed properly. + é¸æ“‡é€™å€‹é¸é …å¯ä»¥æ¸›å°‘é–ƒçˆã€‚但也å¯èƒ½é€ æˆè¦–訊ä¸èƒ½æ­£å¸¸é¡¯ç¤ºã€‚ + + + + Turkish + 土耳其語 + + + + Greek + 希臘語 + + + + Finnish + 芬蘭語 + + + + Swedish + 瑞典語 + + + + This option specifies the position of the subtitles over the video window. <i>100</i> means the bottom, while <i>0</i> means the top. + 這個é¸é …指定字幕在視訊視窗裡的ä½ç½®ã€‚<i>100</i>表示底部, <i>0</i>表示頂部。 + + + + Here you can override styles for SSA/ASS subtitles. It can be also used for fine tunning the rendering of srt and sub subtitles by the SSA/ASS library.<br>Example: <b>Bold=1,Outline=2,Shadow=2</b> + 這裡您å¯ä»¥é‡è¨­ SSA/ASS 字幕的風格。 在é¸ç”¨ SSA/ASS 庫來演算上色 srt 字幕, 也將使用該設置。<br>示例: <b>Bold=1,Outline=2,Shadow=2</b> + + + + Serbian + 塞爾維亞語 + + + + Traditional Chinese + 正體中文 + + + + SMPlayer - Help + SMPlayer - 說明 + + + + OK + 確定 + + + + Cancel + å–消 + + + + Apply + 套用 + + + + Help + 說明 + + + + SMPlayer - Preferences + SMPlayer - å好 + + + + PreferencesDialog2 + + + &Help + 說明(&H) + + + + &Ok + 確定(&O) + + + + &Apply + 套用(&A) + + + + &Cancel + å–消(&C) + + + + SMPlayer - Preferences + SMPlayer - å好 + + + + SMPlayer - Help + SMPlayer - 說明 + + + + OK + 確定 + + + + Cancel + å–消 + + + + Apply + 套用 + + + + Help + 說明 + + + + PreferencesDialogBase + + + abovenormal + 高於標準 + + + + Advanced + 進階 + + + + Allow frame drop + Allow frame drop + + + + Allow hard frame drop (can lead to image distortion) + Allow hard frame drop (å¯èƒ½å°Žè‡´åœ–åƒè®Šå½¢) + + + + All subs containing movie name + 所有包å«å½±ç‰‡å的字幕 + + + + All subs in directory + 目錄裡的所有字幕 + + + + And finally audio filters. Same rule as for video filters. +Example: resample=44100:0:0,volnorm + 最後是音訊éŽæ¿¾å™¨ã€‚和視訊éŽæ¿¾å™¨çš„è¦å‰‡ä¸€æ¨£ã€‚ +示例: resample=44100:0:0,volnorm + + + + &Apply + 套用(&A) + + + + Audio: + 音訊: + + + + Audio filters: + 音訊éŽæ¿¾å™¨: + + + + Audio/video auto synchronization + 音訊/視訊 自動åŒæ­¥ + + + + Autoload + 自動載入 + + + + Autoload subtitles files (*.srt, *.sub...): + 自動載入字幕檔 (*.srt, *.sub...): + + + + Automatically select first available subtitle + 自动选择第一个å¯ç”¨çš„字幕 + + + + Auto quality for postprocessing filter: + Auto quality for postprocessing filter: + + + + Autoscale: + 自動縮放: + + + + belownormal + 低於標準 + + + + Border color: + 邊框é¡è‰²: + + + + Cache: + å¿«å–: + + + + (cache will be disabled and it's not guaranteed that it really works) + (如果ä¸èƒ½ä¿è­‰å…¶èƒ½å¤Ÿä½¿ç”¨ï¼Œå¿«å–將被åœç”¨) + + + + &Cancel + å–消(&C) + + + + (changes in this group require SMPlayer to be restarted) + (這裡的變更è¦åœ¨ SMPlayer é‡å•Ÿå¾Œæ‰èƒ½ç”Ÿæ•ˆ) + + + + Choose... + é¸æ“‡... + + + + Default subtitle encoding: + é è¨­å­—幕編碼: + + + + Disable screensaver + åœç”¨èž¢å¹•ä¿è­·ç¨‹å¼ + + + + Don't remember time position (files start playing from the beginning) + ä¸è¦è¨˜ä½ç›®å‰çš„播放ä½ç½® (從頭開始播放) + + + + Drives + ç£ç¢Ÿ + + + + Factor: + å› å­: + + + + Fast audio track switching + å¿«é€ŸéŸ³è»Œåˆ‡æ› + + + + Fast seek to chapters in dvds + 在 DVD 裡快速定ä½ç« ç¯€ + + + + Folder for storing screenshots: + 儲存截圖的目錄: + + + + Font + å­—é«” + + + + General + 一般 + + + + high + 高 + + + + Highest + 最高 + + + + idle + é–’ç½® + + + + Include subtitles on screenshots + 將字幕包å«åœ¨æˆªåœ–裡 + + + + KB + KB + + + + Level: + 等级: + + + + Lowest + 最低 + + + + Main window resize method: + 主視窗縮放方å¼: + + + + Media settings + 媒體設定 + + + + Monitor aspect: + 鎖定外觀: + + + + Never + å¾žä¸ + + + + No autoscale + 無自動縮放 + + + + normal + 標準 + + + + &OK + 確定(&O) + + + + Only after loading a new video + åªåœ¨æ–°å½±ç‰‡è¼‰å…¥å¾Œ + + + + Options: + é¸é …: + + + + Output drivers + 輸出ç£ç¢Ÿ + + + + Paths + 路徑 + + + + Performance + 效能 + + + + Priority: + 優先级: + + + + Proportional to movie diagonal + 相å°æ–¼å½±ç‰‡çš„å°è§’ç·š + + + + Proportional to movie height + 相å°æ–¼å½±ç‰‡çš„高度 + + + + Proportional to movie width + 相å°æ–¼å½±ç‰‡çš„寬度 + + + + realtime + å³æ™‚ + + + + Remember settings for all files (audio track, subtitles...) + 記ä½æ‰€æœ‰æª”案的設定 (音軌,字幕...) + + + + Same name as movie + 和影片åŒå的字幕 + + + + Scale: + 比例: + + + + Search... + æœå°‹... + + + + Select... + é¸æ“‡... + + + + Select the font which will be used for subtitles (and OSD): + é¸æ“‡å­—幕 (å’Œ OSD) çš„å­—é«”: + + + + Select your CD device: + é¸æ“‡ä½ çš„ CD ç£ç¢Ÿ: + + + + Select your DVD device: + é¸æ“‡ä½ çš„ DVD ç£ç¢Ÿ: + + + + Setting a cache may improve performance on slow media + 設定快å–å¯ä»¥æ”¹é€²æ’­æ”¾æ€§èƒ½ + + + + Single instance + 單實體 + + + + Size + å¤§å° + + + + SMPlayer - Preferences + SMPlayer - å好 + + + + SMPlayer will listen to this port to receive commands from other instances: + SMPlayer 會在這個連接埠接收其它實體的命令: + + + + SSA/ASS + SSA/ASS + + + + Start videos in fullscreen + 用全螢幕播放 + + + + Style: + 風格: + + + + Subtitles + 字幕 + + + + Synchronization + åŒæ­¥ + + + + System font: + 系統字體: + + + + Text color: + 文字é¡è‰²: + + + + TTF font: + TTF å­—é«”: + + + + Use only one running instance of SMPlayer + åªä½¿ç”¨ä¸€å€‹é‹è¡Œçš„ SMPlayer 實體 + + + + Use software video equalizer + 使用軟體影åƒç­‰åŒ–器 + + + + Use software volume control + 使用軟體音é‡æŽ§åˆ¶ + + + + Use SSA/ASS library for subtitle rendering + 使用 SSA/AAS 庫來演算上色字幕 + + + + Video: + 視訊: + + + + Video filters: + 視訊éŽæ¿¾å™¨: + + + + Whenever it's needed + 當需è¦çš„時後 + + + + You can also pass additional video filters. +Separate them with ",". Do not use spaces! +Example: scale=512:-2,eq2=1.1 + 在這裡你å¯ä»¥å‚³éžé™„加的視訊éŽæ¿¾å™¨ã€‚ +請用 "," 分隔它們。ä¸è¦ä½¿ç”¨ç©ºæ ¼! +示例: scale=512:-2,eq2=1.1 + + + + Currently SMPlayer does not autodetect cdrom or dvd devices. So in order to play cdroms or dvds you must first select here your cdrom and dvd drives (can be the same). + ç¾åœ¨ SMPlayer é‚„ä¸èƒ½è‡ªå‹•æª¢æ¸¬å…‰ç¢Ÿæ©Ÿæˆ– DVD ç£ç¢Ÿã€‚所以你必需é¸æ“‡ä½ çš„光碟機和 DVD ç£ç¢Ÿï¼Œæ‰èƒ½æ’­æ”¾ CD 或 DVD。 + + + + icon + 圖示 + + + + Recent files + 最近開啟的檔案 + + + + Max. items + 最大項數 + + + + Clear list + 清空清單 + + + + Seeking + å®šä½ + + + + Volume + éŸ³é‡ + + + + Default volume: + é è¨­éŸ³é‡: + + + + 0 + 0 + + + + Mouse + 滑鼠 + + + + Button functions: + 按éµåŠŸèƒ½: + + + + Double click + åŒæ“Š + + + + Left click + 左擊 + + + + Window size + è¦–çª—å¤§å° + + + + Interface + ä»‹é¢ + + + + Wheel function: + 滾輪功能: + + + + Media seeking + åª’é«”å®šä½ + + + + Volume control + 音é‡æŽ§åˆ¶ + + + + Mouse and keyboard + 滑鼠和éµç›¤ + + + + Keyboard + éµç›¤ + + + + Logs + 日誌 + + + + This option is mainly intended for debugging the application. + 這個é¸é …主è¦ç”¨æ–¼æ­¤æ‡‰ç”¨ç¨‹å¼çš„除錯。 + + + + Language: + 語言: + + + + Icon set: + 圖示集: + + + + Preferred audio and subtitles + å好的音訊和字幕 + + + + Subtitles: + 字幕: + + + + Priority + 優先級 + + + + Select the MPlayer executable: + é¸æ“‡ Mplayer çš„å¯åŸ·è¡Œæª”案: + + + + Run MPlayer in its own window + 讓 Mplayer 在自己的視窗裡é‹è¡Œ + + + + Additional Options for MPlayer + MPlayer 的附加é¸é … + + + + Here you can pass extra options to MPlayer. +Write them separated by spaces. +Example: -flip -nosound + 在這裡你å¯ä»¥å‚³éžé¡å¤–çš„é¸é …ç»™ Mplayer。 +請用空格分隔它們。 +示例 : -flip -nosound + + + + Select the priority for the MPlayer process. + é¸æ“‡ MPlayer 程å¼çš„優先級。 + + + + Log MPlayer output + 日誌 MPlayer 的輸出 + + + + Log SMPlayer output + 日誌 SMPlayer 的輸出 + + + + Filter for SMPlayer logs: + éŽæ¿¾ SMPlayer 的日誌: + + + + Don't repaint the background of the video window + ä¸é‡ç¹ªå½±åƒè¦–窗的背景 + + + + Here you can change any key shortcut. To do it double click or start typing over a shortcut cell. Optionally you can also save the list to share it with other people or load it in another computer. + 在這裡您å¯ä»¥æ›´æ”¹ä»»ä½•å¿«æ·éµã€‚通éŽåœ¨ä¸€å€‹å¿«æ·éµå–®å…ƒæ ¼åŒæ“Šæˆ–éµå…¥ä¾†è¨­å®šã€‚ +您也å¯ä»¥å„²å­˜æ‚¨çš„設定,然後分享给他人或載入别的電腦上。 + + + + Select first available subtitle + é¸æ“‡ç¬¬ä¸€å€‹å¯ç”¨çš„字幕 + + + + Position + ä½ç½® + + + + Default position of the subtitles on screen + 字幕在螢幕上的é è¨­ä½ç½® + + + + Colorkey: + Colorkey: + + + + Change... + 修改... + + + + Top + 頂部 + + + + Bottom + 底部 + + + + Styles: + 風格: + + + + &Subtitles + 字幕(&S) + + + + Video + 視訊 + + + + Audio + 音訊 + + + + QObject + + + 1 second + 1 秒 + + + + %1 seconds + %1 秒 + + + + %1 minutes + %1 åˆ†é˜ + + + + %1 minutes and %2 seconds + %1 åˆ†é˜ %2 ç§’é˜ + + + + 1 minute + 1 åˆ†é˜ + + + + 1 minute and 1 second + 1 åˆ†é˜ 1 ç§’é˜ + + + + 1 minute and %1 seconds + 1 åˆ†é˜ %1 ç§’é˜ + + + + %1 minutes and 1 second + %1 åˆ†é˜ 1 ç§’é˜ + + + + will show this message and then will exit. + + + + + 'media' is any kind of file that SMPlayer can open. It can be a local file, a DVD (e.g. dvd://1), an Internet stream (e.g. mms://....) or a local playlist in format m3u. If the -playlist option is used, that means that SMPlayer will pass the -playlist option to MPlayer, so MPlayer will handle the playlist, not SMPlayer. + + + + + the main window will be closed when the file/playlist finishes. + + + + + This is SMPlayer v. %1 running on %2 + + + + + tries to make a connection to another running instance and send to it the specified action. Example: -send-action pause The rest of options (if any) will be ignored and the application will exit. It will return 0 on success or -1 on failure. + + + + + action_list is a list of actions separated by spaces. The actions will be executed just after loading the file (if any) in the same order you entered. For checkable actions you can pass true or false as parameter. Example: -actions "fullscreen compact true". Quotes are necessary in case you pass more than one action. + + + + + media + + + + + if there's another instance running, the media will be added to that instance's playlist. If there's no other instance, this option will be ignored and the files will be opened in a new instance. + + + + + specifies the directory for the configuration file (smplayer.ini). + + + + + the main window won't be closed when the file/playlist finishes. + + + + + Usage: %1 [-ini-path directory] [-send-action action_name] [-actions action_list [-close-at-end] [-no-close-at-end] [-fullscreen] [-no-fullscreen] [-add-to-playlist] [-help|--help|-h|-?] [[-playlist] media] [[-playlist] media]... + + + + + the video will be played in fullscreen mode. + + + + + the video will be played in window mode. + + + + + SeekWidget + + + icon + 圖示 + + + + label + 標籤 + + + + SeekWidgetBase + + + SeekWidgetBase + SeekWidgetBase + + + + icon + 圖示 + + + + label + 標籤 + + + + mm:ss + mm:ss + + + + ShortcutGetter + + + Modify shortcut + 修改æ·å¾‘ + + + + Clear + 清除 + + + + Press the key combination you want to assign + + + + + Capture + + + + + Capture keystrokes + + + + + VideoEqualizer + + + Brightness + 亮度 + + + + Contrast + å°æ¯”度 + + + + Equalizer + 等化器 + + + + Gamma + Gamma + + + + Hue + 色調 + + + + Saturation + 飽和度 + + + + &Reset + é‡è¨­(&R) + + + + &Set as default values + 設為é è¨­å€¼(&S) + + + + Use the current values as default values for new videos. + 將當å‰å€¼åšç‚ºæ–°è¦–訊的é è¨­å€¼ã€‚ + + + + Set all controls to zero. + 全部設置為零。 + + + diff --git a/retroshare-gui/src/apps/smplayer/translator.cpp b/retroshare-gui/src/apps/smplayer/translator.cpp new file mode 100644 index 000000000..ae0ff36be --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/translator.cpp @@ -0,0 +1,63 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "translator.h" +#include "helper.h" +#include +#include +#include + +Translator::Translator() { + qApp->installTranslator( &app_trans ); + qApp->installTranslator( &qt_trans ); +} + +Translator::~Translator() { +} + +bool Translator::loadCatalog(QTranslator & t, QString name, QString locale, QString dir) { + QString s = name + "_" + locale; //.toLower(); + bool r = t.load(s, dir); + if (r) + qDebug("Translator::loadCatalog: successfully loaded %s from %s", s.toUtf8().data(), dir.toUtf8().data()); + else + qDebug("Translator::loadCatalog: can't load %s from %s", s.toUtf8().data(), dir.toUtf8().data()); + return r; +} + +void Translator::load(QString locale) { + if (locale.isEmpty()) { + locale = QLocale::system().name(); + } + + QString trans_path = Helper::translationPath(); + QString qt_trans_path = Helper::qtTranslationPath(); + +#ifdef Q_OS_WIN + // In windows try to load the qt translation from the app path, as + // most users won't have Qt installed. + loadCatalog(qt_trans, "qt", locale, trans_path ); +#else + // In linux try to load it first from app path (in case there's an updated + // translation), if it fails it will try then from the Qt path. + if (! loadCatalog(qt_trans, "qt", locale, trans_path ) ) { + loadCatalog(qt_trans, "qt", locale, qt_trans_path); + } +#endif + loadCatalog(app_trans, "smplayer", locale, trans_path); +} diff --git a/retroshare-gui/src/apps/smplayer/translator.h b/retroshare-gui/src/apps/smplayer/translator.h new file mode 100644 index 000000000..0bbd5f939 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/translator.h @@ -0,0 +1,41 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef _TRANSLATOR_H_ +#define _TRANSLATOR_H_ + +#include +#include + +class Translator +{ + +public: + Translator(); + ~Translator(); + + void load(QString locale); + +protected: + static bool loadCatalog(QTranslator & t, QString name, QString locale, QString dir); + + QTranslator app_trans; + QTranslator qt_trans; +}; + +#endif diff --git a/retroshare-gui/src/apps/smplayer/version.cpp b/retroshare-gui/src/apps/smplayer/version.cpp new file mode 100644 index 000000000..bbab86fa3 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/version.cpp @@ -0,0 +1,35 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "version.h" + +//#define USE_SVN_VERSIONS 1 + +#define VERSION "0.5.61" + +#if USE_SVN_VERSIONS +#include "svn_revision.h" +#endif + +QString smplayerVersion() { +#if USE_SVN_VERSIONS + return QString(QString(VERSION) + "+" + QString(SVN_REVISION)); +#else + return QString(VERSION); +#endif +} diff --git a/retroshare-gui/src/apps/smplayer/version.h b/retroshare-gui/src/apps/smplayer/version.h new file mode 100644 index 000000000..3be7ceb2e --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/version.h @@ -0,0 +1,27 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef _VERSION_H_ +#define _VERSION_H_ + +#include + +QString smplayerVersion(); + +#endif + diff --git a/retroshare-gui/src/apps/smplayer/verticaltext.cpp b/retroshare-gui/src/apps/smplayer/verticaltext.cpp new file mode 100644 index 000000000..eb665ea91 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/verticaltext.cpp @@ -0,0 +1,56 @@ +/* + * KMix -- KDE's full featured mini mixer + * + * + * Copyright (C) 2003-2004 Christian Esken + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free + * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include "verticaltext.h" +#include +#include +/*#include */ + + +VerticalText::VerticalText(QWidget * parent, Qt::WindowFlags f) + : QWidget(parent, f) +{ + resize(20,100 /*parent->height() */ ); + setMinimumSize(20,10); // neccesary for smooth integration into layouts (we only care for the widths). +} + +VerticalText::~VerticalText() { +} + + +void VerticalText::paintEvent ( QPaintEvent * /*event*/ ) { + //kdDebug(67100) << "paintEvent(). height()=" << height() << "\n"; + QPainter paint(this); + paint.rotate(270); + // Fix for bug 72520 + //- paint.drawText(-height()+2,width(),name()); + //+ paint.drawText( -height()+2, width(), QString::fromUtf8(name()) ); + paint.drawText( -height()+2, width(), _label ); +} + +QSize VerticalText::sizeHint() const { + return QSize(20,100); // !! UGLY. Should be reworked +} + +QSizePolicy VerticalText::sizePolicy () const +{ + return QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred); +} diff --git a/retroshare-gui/src/apps/smplayer/verticaltext.h b/retroshare-gui/src/apps/smplayer/verticaltext.h new file mode 100644 index 000000000..e61a33263 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/verticaltext.h @@ -0,0 +1,27 @@ +/* Taken from KMix */ +/* Copyright (C) 2003-2004 Christian Esken */ + + +#ifndef VerticalText_h +#define VerticalText_h + +#include +#include + +class VerticalText : public QWidget +{ +public: + VerticalText(QWidget * parent, Qt::WindowFlags f = 0); + ~VerticalText(); + + void setText(QString s) { _label = s; }; + QString text() { return _label; }; + QSize sizeHint() const; + QSizePolicy sizePolicy () const; + +protected: + void paintEvent ( QPaintEvent * event ); + QString _label; +}; + +#endif diff --git a/retroshare-gui/src/apps/smplayer/videoequalizer.cpp b/retroshare-gui/src/apps/smplayer/videoequalizer.cpp new file mode 100644 index 000000000..4ab56adb0 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/videoequalizer.cpp @@ -0,0 +1,137 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "videoequalizer.h" +#include "eqslider.h" +#include "images.h" +#include "preferences.h" +#include "global.h" +#include +#include +/* +#include +#include +*/ + +VideoEqualizer::VideoEqualizer( QWidget* parent, Qt::WindowFlags f) + : QWidget(parent, f) +{ + contrast = new EqSlider(this); + brightness = new EqSlider(this); + hue = new EqSlider(this); + saturation = new EqSlider(this); + gamma = new EqSlider(this); + + QBoxLayout *bl = new QHBoxLayout; //(0, 4, 2); + bl->addWidget(contrast); + bl->addWidget(brightness); + bl->addWidget(hue); + bl->addWidget(saturation); + bl->addWidget(gamma); + + reset_button = new QPushButton( "&Reset", this); + connect( reset_button, SIGNAL(clicked()), this, SLOT(reset()) ); + set_default_button = new QPushButton( "&Set as default values", this ); + connect( set_default_button, SIGNAL(clicked()), this, SLOT(setDefaults()) ); + + QBoxLayout *button_layout = new QVBoxLayout; //(0, 4, 2); + button_layout->addWidget(set_default_button); + button_layout->addWidget(reset_button); + + QBoxLayout *layout = new QVBoxLayout(this); //, 4, 2); + layout->addLayout(bl); + layout->addLayout(button_layout); + + retranslateStrings(); + + adjustSize(); + //setFixedSize( sizeHint() ); +} + +VideoEqualizer::~VideoEqualizer() { +} + +void VideoEqualizer::retranslateStrings() { + setWindowTitle( tr("Equalizer") ); + setWindowIcon( Images::icon("logo") ); + + contrast->setLabel( tr("Contrast") ); + contrast->setToolTip( tr("Contrast") ); + contrast->setIcon( Images::icon("contrast") ); + + brightness->setLabel( tr("Brightness") ); + brightness->setToolTip( tr("Brightness") ); + brightness->setIcon( Images::icon("brightness") ); + + hue->setLabel( tr("Hue") ); + hue->setToolTip( tr("Hue") ); + hue->setIcon( Images::icon("hue") ); + + saturation->setLabel( tr("Saturation") ); + saturation->setToolTip( tr("Saturation") ); + saturation->setIcon( Images::icon("saturation") ); + + gamma->setLabel( tr("Gamma") ); + gamma->setToolTip( tr("Gamma") ); + gamma->setIcon( Images::icon("gamma") ); + + reset_button->setText( tr("&Reset") ); + set_default_button->setText( tr("&Set as default values") ); + + // What's this help: + set_default_button->setWhatsThis( + tr("Use the current values as default values for new videos.") ); + + reset_button->setWhatsThis( tr("Set all controls to zero.") ); + +} + +void VideoEqualizer::reset() { + contrast->setValue(0); + brightness->setValue(0); + hue->setValue(0); + saturation->setValue(0); + gamma->setValue(0); +} + +void VideoEqualizer::setDefaults() { + pref->initial_contrast = contrast->value(); + pref->initial_brightness = brightness->value(); + pref->initial_hue = hue->value(); + pref->initial_saturation = saturation->value(); + pref->initial_gamma = gamma->value(); +} + +void VideoEqualizer::hideEvent( QHideEvent * ) { + emit visibilityChanged(); +} + +void VideoEqualizer::showEvent( QShowEvent * ) { + emit visibilityChanged(); +} + +// Language change stuff +void VideoEqualizer::changeEvent(QEvent *e) { + if (e->type() == QEvent::LanguageChange) { + retranslateStrings(); + } else { + QWidget::changeEvent(e); + } +} + +#include "moc_videoequalizer.cpp" diff --git a/retroshare-gui/src/apps/smplayer/videoequalizer.h b/retroshare-gui/src/apps/smplayer/videoequalizer.h new file mode 100644 index 000000000..0ea11f1fd --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/videoequalizer.h @@ -0,0 +1,65 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + + +#ifndef _VIDEOEQUALIZER_H_ +#define _VIDEOEQUALIZER_H_ + +#include +#include +#include + +class QPushButton; +class EqSlider; + +class VideoEqualizer : public QWidget +{ + Q_OBJECT + +public: + VideoEqualizer( QWidget* parent = 0, Qt::WindowFlags f = Qt::Dialog ); + ~VideoEqualizer(); + + EqSlider * brightness; + EqSlider * contrast; + EqSlider * hue; + EqSlider * saturation; + EqSlider * gamma; + +signals: + void visibilityChanged(); + +protected slots: + void reset(); + void setDefaults(); + +protected slots: + virtual void hideEvent( QHideEvent * ); + virtual void showEvent( QShowEvent * ); + +protected: + virtual void retranslateStrings(); + virtual void changeEvent ( QEvent * event ) ; + +protected: + QPushButton * reset_button; + QPushButton * set_default_button; +}; + + +#endif diff --git a/retroshare-gui/src/apps/smplayer/winfileassoc.cpp b/retroshare-gui/src/apps/smplayer/winfileassoc.cpp new file mode 100644 index 000000000..53b332f74 --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/winfileassoc.cpp @@ -0,0 +1,160 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Winfileassoc.cpp + Handles file associations in Windows + Author: Florin Braghis (florin@libertv.ro) +*/ + +#include "winfileassoc.h" +#include + +WinFileAssoc::WinFileAssoc( const QString& ClassId ) +{ + m_ClassId = ClassId; +} + +bool WinFileAssoc::CreateFileAssociation(const QString& fileExtension) +{ + //Registry keys modified: + //HKEY_CLASSES_ROOT\.extension + //HKEY_CLASSES_ROOT\smplayer.exe + //Shell 'Open With...' entry: + //HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.avi + + QSettings RegCR ("HKEY_CLASSES_ROOT", QSettings::NativeFormat); + QSettings RegCU ("HKEY_CURRENT_USER", QSettings::NativeFormat); + + if (!RegCR.isWritable() || RegCR.status() != QSettings::NoError) + return false; + + if (!RegCU.isWritable() || RegCU.status() != QSettings::NoError) + return false; + + QString ExtKeyName = QString("SOFTWARE/Microsoft/Windows/CurrentVersion/Explorer/FileExts/.%1").arg(fileExtension); + QString ClassesKeyName = m_ClassId; + + QString BackupKeyName = ClassesKeyName + "/" + fileExtension; + + //Save last ClassId from the extension class + QString KeyVal = RegCR.value("." + fileExtension + "/.").toString(); + if (KeyVal != m_ClassId) + RegCR.setValue(BackupKeyName + "/OldClassId", KeyVal); + + //Save last ProgId and Application values from the Exts key + KeyVal = RegCU.value(ExtKeyName + "/Progid").toString(); + if (KeyVal != m_ClassId) + RegCR.setValue(BackupKeyName + "/OldProgId", KeyVal); + + KeyVal = RegCU.value(ExtKeyName + "/Application").toString(); + if (KeyVal != m_ClassId) + RegCR.setValue(BackupKeyName + "/OldApplication", KeyVal); + + //Create the associations + RegCR.setValue("." + fileExtension + "/.", m_ClassId); //Extension class + RegCU.setValue(ExtKeyName + "/Progid", m_ClassId); //Explorer FileExt association + return true; +} + +bool WinFileAssoc::RestoreFileAssociation(const QString& fileExtension) +{ + QSettings RegCR ("HKEY_CLASSES_ROOT", QSettings::NativeFormat); + QSettings RegCU ("HKEY_CURRENT_USER", QSettings::NativeFormat); + + if (!RegCR.isWritable() || RegCR.status() != QSettings::NoError) + return false; + + if (!RegCU.isWritable() || RegCU.status() != QSettings::NoError) + return false; + + + QString ClassesKeyName = m_ClassId; + QString ExtKeyName = QString("SOFTWARE/Microsoft/Windows/CurrentVersion/Explorer/FileExts/.%1").arg(fileExtension); + + QString BackupKeyName = ClassesKeyName + "/" + fileExtension; + QString OldProgId = RegCR.value(BackupKeyName + "/OldProgId").toString(); + QString OldApp = RegCR.value(BackupKeyName + "/OldApplication").toString(); + QString OldClassId = RegCR.value(BackupKeyName + "/OldClassId").toString(); + + //Restore old association + if (!OldProgId.isEmpty() && OldProgId != m_ClassId) + { + RegCU.setValue(ExtKeyName + "/Progid", OldProgId); + } + else + { + RegCU.remove(ExtKeyName + "/Progid"); + } + + if (!OldApp.isEmpty() && OldApp != m_ClassId) + { + RegCU.setValue(ExtKeyName + "/Application", OldApp); + } + else + { + RegCU.remove(ExtKeyName + "/Application"); + } + + if (!OldClassId.isEmpty() && OldClassId != m_ClassId) + { + RegCR.setValue("." + fileExtension + "/.", OldClassId); + } + else + { + //No old association with this extension, it's better to remove it entirely + RegCR.remove("." + fileExtension); + } + + //Remove our keys + RegCR.remove(BackupKeyName + "/OldProgId"); + RegCR.remove(BackupKeyName + "/OldApplication"); + RegCR.remove(BackupKeyName + "/OldClassId"); + RegCR.remove(BackupKeyName); + return true; +} + +bool WinFileAssoc::CreateClassId(const QString& executablePath, const QString& friendlyName) +{ + QSettings RegCR ("HKEY_CLASSES_ROOT", QSettings::NativeFormat); + if (!RegCR.isWritable() || RegCR.status() != QSettings::NoError) + return false; + + QString appPath = executablePath; + appPath.replace('/', '\\'); //Explorer gives 'Access Denied' if we write the path with forward slashes to the registry + + //Add our ProgId to the HKCR classes + RegCR.setValue(m_ClassId + "/shell/open/FriendlyAppName", friendlyName); + RegCR.setValue(m_ClassId + "/shell/open/command/.", QString("\"%1\" \"%2\"").arg(appPath, "%1")); + RegCR.setValue(m_ClassId + "/DefaultIcon/.", QString("\"%1\",0").arg(appPath)); + return true; +} + +//Called when no associations exist +bool WinFileAssoc::RemoveClassId() +{ + QSettings RegCR ("HKEY_CLASSES_ROOT", QSettings::NativeFormat); + + if (!RegCR.isWritable() || RegCR.status() != QSettings::NoError) + return false; + + RegCR.remove(m_ClassId + "/shell/open/FriendlyAppName"); + RegCR.remove(m_ClassId + "/shell/open/command/."); + RegCR.remove(m_ClassId + "/DefaultIcon/."); + RegCR.remove(m_ClassId); + return true; +} diff --git a/retroshare-gui/src/apps/smplayer/winfileassoc.h b/retroshare-gui/src/apps/smplayer/winfileassoc.h new file mode 100644 index 000000000..0a6fb785f --- /dev/null +++ b/retroshare-gui/src/apps/smplayer/winfileassoc.h @@ -0,0 +1,40 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2007 Ricardo Villalba + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Winfileassoc.h + Handles file associations in Windows + Author: Florin Braghis (florin@libertv.ro) +*/ + +#ifndef WINFILEASSOC_H +#define WINFILEASSOC_H + +#include +class WinFileAssoc +{ +protected: + QString m_ClassId; //Application ClassId +public: + WinFileAssoc(const QString& ClassId); + bool CreateFileAssociation(const QString& fileExtension); + bool RestoreFileAssociation(const QString& fileExtension); + bool CreateClassId(const QString& executablePath, const QString& friendlyName); + bool RemoveClassId(); +}; + +#endif diff --git a/retroshare-gui/src/config/rsharesettings.cpp b/retroshare-gui/src/config/rsharesettings.cpp new file mode 100644 index 000000000..5e261e86a --- /dev/null +++ b/retroshare-gui/src/config/rsharesettings.cpp @@ -0,0 +1,251 @@ +/**************************************************************** + * Retroshare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 +#include +#include +#include + +#include "rsharesettings.h" + +#include +#include + +#if defined(Q_WS_WIN) +#include +#include +#endif + + +/* Rshare's Settings */ +#define SETTING_LANGUAGE "LanguageCode" +#define SETTING_STYLE "InterfaceStyle" +#define SETTING_DATA_DIRECTORY "DataDirectory" + +#define SETTING_BWGRAPH_FILTER "StatisticDialog/BWLineFilter" +#define SETTING_BWGRAPH_OPACITY "StatisticDialog/Opacity" +#define SETTING_BWGRAPH_ALWAYS_ON_TOP "StatisticDialog/AlwaysOnTop" + +/* Default Rshare Settings */ +#if defined(Q_WS_MAC) +#define DEFAULT_STYLE "macintosh (aqua)" +#else +#define DEFAULT_STYLE "plastique" +#endif + +#define DEFAULT_LANGUAGE LanguageSupport::defaultLanguageCode() + +#define DEFAULT_OPACITY 100 + + +#if defined(Q_OS_WIN32) + +#define STARTUP_REG_KEY "Software\\Microsoft\\Windows\\CurrentVersion\\Run" +#define Rshare_REG_KEY "RetroShare" +#else + +#endif + +/* Default bandwidth graph settings */ +#define DEFAULT_BWGRAPH_FILTER (BWGRAPH_SEND|BWGRAPH_REC) +#define DEFAULT_BWGRAPH_ALWAYS_ON_TOP false + +/** The location of RetroShare's settings and configuration file. */ +#define SETTINGS_FILE (Rshare::dataDirectory() + "/RetroShare.conf") + + +/** Default Constructor */ +RshareSettings::RshareSettings() +: QSettings(SETTINGS_FILE, QSettings::IniFormat) +{ + setDefault(SETTING_STYLE, DEFAULT_STYLE); +} + +/** Sets the default value of key to be val. */ +void RshareSettings::setDefault(QString key, QVariant val) +{ + _defaults.insert(key, val); +} + +/** Returns the default value for key. */ +QVariant RshareSettings::defaultValue(QString key) +{ + if (_defaults.contains(key)) { + return _defaults.value(key); + } + return QVariant(); +} + + + +/** Save val to the configuration file for the setting key, if + * val is different than key's current value. */ +void RshareSettings::setValue(QString key, QVariant val) +{ + if (value(key) != val) { + QSettings::setValue(key, val); + } +} + +/** Returns the value for key. If no value is currently saved, then the + * default value for key will be returned. */ +QVariant RshareSettings::value(QString key) +{ + return value(key, defaultValue(key)); +} + +/** Returns the value for key. If no value is currently saved, then + * defaultValue will be returned. */ +QVariant RshareSettings::value(QString key, QVariant defaultValue) +{ + return QSettings::value(key, defaultValue); +} + + +/** Resets all of RetroShare's settings. */ +void RshareSettings::reset() +{ + QSettings settings(SETTINGS_FILE, QSettings::IniFormat); + settings.clear(); +} + +/** Gets the currently preferred language code for Rshare. */ +QString RshareSettings::getLanguageCode() +{ + return value(SETTING_LANGUAGE, DEFAULT_LANGUAGE).toString(); +} + +/** Sets the preferred language code. */ +void RshareSettings::setLanguageCode(QString languageCode) +{ + setValue(SETTING_LANGUAGE, languageCode); +} + +/** Gets the interface style key (e.g., "windows", "motif", etc.) */ +QString RshareSettings::getInterfaceStyle() +{ + return value(SETTING_STYLE, DEFAULT_STYLE).toString(); +} + +/** Sets the interface style key. */ +void RshareSettings::setInterfaceStyle(QString styleKey) +{ + setValue(SETTING_STYLE, styleKey); +} + + +/** Returns the bandwidth line filter. */ +uint RshareSettings::getBWGraphFilter() +{ + return value(SETTING_BWGRAPH_FILTER, DEFAULT_BWGRAPH_FILTER).toUInt(); +} + +/** Saves the setting for whether or not the given line will be graphed */ +void RshareSettings::setBWGraphFilter(uint line, bool status) +{ + uint filter = getBWGraphFilter(); + filter = (status ? (filter | line) : (filter & ~(line))); + setValue(SETTING_BWGRAPH_FILTER, filter); +} + +/** Get the level of opacity for the BandwidthGraph window. */ +int RshareSettings::getBWGraphOpacity() +{ + return value(SETTING_BWGRAPH_OPACITY, DEFAULT_OPACITY).toInt(); +} + +/** Set the level of opacity for the BandwidthGraph window. */ +void RshareSettings::setBWGraphOpacity(int value) +{ + setValue(SETTING_BWGRAPH_OPACITY, value); +} + +/** Gets whether the bandwidth graph is always on top when displayed. */ +bool RshareSettings::getBWGraphAlwaysOnTop() +{ + return value(SETTING_BWGRAPH_ALWAYS_ON_TOP, + DEFAULT_BWGRAPH_ALWAYS_ON_TOP).toBool(); +} + +/** Sets whether the bandwidth graph is always on top when displayed. */ +void RshareSettings::setBWGraphAlwaysOnTop(bool alwaysOnTop) +{ + setValue(SETTING_BWGRAPH_ALWAYS_ON_TOP, alwaysOnTop); +} + + + +/** Saving Generic Widget Size / Location */ + +void RshareSettings::saveWidgetInformation(QWidget *widget) +{ + beginGroup("widgetInformation"); + beginGroup(widget->objectName()); + + setValue("size", widget->size()); + setValue("pos", widget->pos()); + + endGroup(); + endGroup(); +} + +void RshareSettings::saveWidgetInformation(QMainWindow *widget, QToolBar *toolBar) +{ + beginGroup("widgetInformation"); + beginGroup(widget->objectName()); + + setValue("toolBarArea", widget->toolBarArea(toolBar)); + + endGroup(); + endGroup(); + + saveWidgetInformation(widget); +} + +void RshareSettings::loadWidgetInformation(QWidget *widget) +{ + beginGroup("widgetInformation"); + beginGroup(widget->objectName()); + + widget->resize(value("size", widget->size()).toSize()); + widget->move(value("pos", QPoint(200, 200)).toPoint()); + + endGroup(); + endGroup(); +} + +void RshareSettings::loadWidgetInformation(QMainWindow *widget, QToolBar *toolBar) +{ + beginGroup("widgetInformation"); + beginGroup(widget->objectName()); + + widget->addToolBar((Qt::ToolBarArea) value("toolBarArea", Qt::TopToolBarArea).toInt(), + toolBar); + + endGroup(); + endGroup(); + + loadWidgetInformation(widget); +} + + diff --git a/retroshare-gui/src/config/rsharesettings.h b/retroshare-gui/src/config/rsharesettings.h new file mode 100644 index 000000000..778e66a96 --- /dev/null +++ b/retroshare-gui/src/config/rsharesettings.h @@ -0,0 +1,122 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 _RSHARESETTINGS_H +#define _RSHARESETTINGS_H + +#include +#include + +#include + + +//Forward declaration. +class QWidget; +class QTableWidget; +class QToolBar; +class QMainWindow; + +/** Handles saving and restoring RShares's settings, such as the + * location of Tor, the control port, etc. + * + * NOTE: Qt 4.1 documentation states that constructing a QSettings object is + * "very fast", so we shouldn't need to create a global instance of this + * class. + */ +class RshareSettings : public QSettings +{ + +public: + /** Default constructor. */ + RshareSettings(); + + /** Resets all of Rshare's settings. */ + static void reset(); + + /** Sets the default value of key to be val. */ + void setDefault(QString key, QVariant val); + /** Returns the default value for key. */ + QVariant defaultValue(QString key); + /** Save val to the configuration file for the setting key, if + * val is different than key's current value. */ + void setValue(QString key, QVariant val); + /** Returns the value for key. If no value is currently saved, then + * the default value for key will be returned. */ + QVariant value(QString key); + /** Returns the value for key. If no value is currently saved, then + * defaultValue will be returned. */ + QVariant value(QString key, QVariant defaultValue); + + /** Gets the currently preferred language code for RShare. */ + QString getLanguageCode(); + /** Saves the preferred language code. */ + void setLanguageCode(QString languageCode); + + /** Gets the interface style key (e.g., "windows", "motif", etc.) */ + QString getInterfaceStyle(); + /** Sets the interface style key. */ + void setInterfaceStyle(QString styleKey); + + /* Get the destination log file. */ + QString getLogFile(); + /** Set the destination log file. */ + void setLogFile(QString file); + + /* Get the bandwidth graph line filter. */ + uint getBWGraphFilter(); + /** Set the bandwidth graph line filter. */ + void setBWGraphFilter(uint line, bool status); + + /** Set the bandwidth graph opacity setting. */ + int getBWGraphOpacity(); + /** Set the bandwidth graph opacity settings. */ + void setBWGraphOpacity(int value); + + /** Gets whether the bandwidth graph is always on top. */ + bool getBWGraphAlwaysOnTop(); + /** Sets whether the bandwidth graph is always on top. */ + void setBWGraphAlwaysOnTop(bool alwaysOnTop); + + + //! Save placement, state and size information of a window. + void saveWidgetInformation(QWidget *widget); + + //! Load placement, state and size information of a window. + void loadWidgetInformation(QWidget *widget); + + //! Method overload. Save window and toolbar information. + void saveWidgetInformation(QMainWindow *widget, QToolBar *toolBar); + + //! Method overload. Restore window and toolbar information. + void loadWidgetInformation(QMainWindow *widget, QToolBar *toolBar); + + +private: + QHash _defaults; + + + +}; + +#endif + diff --git a/retroshare-gui/src/control/bandwidthevent.h b/retroshare-gui/src/control/bandwidthevent.h new file mode 100644 index 000000000..b876b2b3b --- /dev/null +++ b/retroshare-gui/src/control/bandwidthevent.h @@ -0,0 +1,49 @@ +/**************************************************************** + * RetroShare QT gui is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 _BANDWIDTHEVENT_H +#define _BANDWIDTHEVENT_H +#include "eventtype.h" + +#include + + +class BandwidthEvent : public QEvent +{ +public: + /** Constructor */ + BandwidthEvent(quint64 bytesRead, quint64 bytesWritten) + : QEvent((QEvent::Type)CustomEventType::BandwidthEvent) + { _bytesRead = bytesRead; _bytesWritten = bytesWritten; } + + /** Returns the number of bytes read in the last second */ + quint64 bytesRead() { return _bytesRead; } + /** Returns the number of bytes written in the last second */ + quint64 bytesWritten() { return _bytesWritten; } + +private: + quint64 _bytesWritten; + quint64 _bytesRead; +}; + +#endif + diff --git a/retroshare-gui/src/control/eventtype.h b/retroshare-gui/src/control/eventtype.h new file mode 100644 index 000000000..26acbb941 --- /dev/null +++ b/retroshare-gui/src/control/eventtype.h @@ -0,0 +1,37 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 _EVENTTYPE_H +#define _EVENTTYPE_H + +#include + + +/** Custom event type identifiers. */ +namespace CustomEventType { + /** Bandwidth update event. */ + const int BandwidthEvent = QEvent::User; + +} + +#endif + diff --git a/retroshare-gui/src/games/qbackgammon/bgboard.cpp b/retroshare-gui/src/games/qbackgammon/bgboard.cpp new file mode 100644 index 000000000..9fb954608 --- /dev/null +++ b/retroshare-gui/src/games/qbackgammon/bgboard.cpp @@ -0,0 +1,1769 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2007, RetroShare Team + * + * 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 +#include +#include +#include +#include + +#include "bgboard.h" + +/* Labelling convention: + players are 0 and 1 + points on board are 1 (top right) counterclockwise to 24 (bottom right) + home is 1-6 for player 0, 19-24 for player 1 + delta = endpoint - startpoint < 0 for player 0 + > 0 for player 1 + define activePlayerSign() = -1 for player 0, +1 for player 1 (same sign as delta) + PointCount[i] is < 0 for player 0's checkers, >0 for player 1's checkers + home board is 0 for player 0, 25 for player 1 ( ie 25 * activePlayer ) + centre board is 26 for player 0, 27 for player 1 ( ie 26 + activePlayer ) + */ + +using namespace std; + +BgBoard::BgBoard( QWidget *parent ) + : QFrame( parent ) +{ + setFrameStyle(QFrame::Panel | QFrame::Sunken); + setFocusPolicy(Qt::StrongFocus); + + m_ClickTimeout = false; // used to determine whether player clicks or drags + + definePoints(); + + setColor( 0, Qt::red ); //FIXME enum + setColor( 1, Qt::blue ); + setColor( 2, QColor( 128, 115, 130 ) ); + setColor( 3, QColor( 200, 66, 66 ) ); + setColor( 4, QColor( 10, 90, 5 ) ); + setColor( 5, QColor( 6, 60, 0 ) ); + + m_draggingChecker = -1; // the point from which we picked up a checker + + diceInitial.push_back( 0 ); + diceInitial.push_back( 0 ); + + startNewGame(); +} + +void BgBoard::setColor( int item, QColor color ) //FIXME make an array of colors +{ + bgColor[ item ] = color; + bgBrush[ item ] = QBrush( bgColor[ item ] ); + + if ( item > 1 ) { + bgBrush[ item ].setStyle( Qt::SolidPattern ); + } + +} + +QColor BgBoard::getColor( int item ) +{ + return bgColor[ item ]; +} + +void BgBoard::setPlayerType( int player, int opponent ) +{ // set whether the player is human or computer + playerType[ player ] = opponent; +} + +int BgBoard::getPlayerType( int player ) +{ + return playerType[ player ]; +} + +void BgBoard::setAutoRoll( int player, bool value ) +{//if value = true, the player's dice will be rolled automatically + autoRoll[ player ] = value; +} + +bool BgBoard::getAutoRoll( int player ) +{// return true if autoRoll[ player ] is true + return autoRoll[ player ]; +} + +QSize BgBoard::sizeHint() const +{ + return QSize( 300, 400 ); +} + +int BgBoard::activePlayer() +{ + return m_activePlayer; +} + +void BgBoard::definePoints() +{ + //define the points Point 1 is top right, counts counterclockwise + // point 0 is player 0 home; point 25 is player 1 home (i.e., 0,1 and 24,25 are adjacent + // centre board is 26 for player 0, 27 for player 1 + //checkerPosAllowed is the centre of the rectangle where we will draw each checker + float x = 2 * home_width + 11 * point_width; + float y = case_width; + for ( int i = 0; i < 2; ++i ) { //top or bottom + for ( int j = 0; j < 2; ++j ){ //left or right + for ( int k = 0; k < 6; ++k ) { + int ii = i * 12 + j * 6 + k; + cellRect[ii+1].setRect( int( x ), int( y ), int( point_width ), int( point_height ) ); + for ( int jj = 0; jj < 5; ++jj ) { // this QPoint is where we draw the checkers + checkerPosAllowed[ii+1][jj] = QPoint( int( x + point_width / 2 +1), int( y + jj*(1 - 2*i) * checker_size + i*(point_height - checker_size -1) +1) ); // +1 is a fudge factor + } + + x += point_width * (2 * i - 1); + } + x += home_width * (2 * i - 1); + } + x = home_width; + y = board_height - case_width - point_height; + } + // define home boards + + cellRect[0].setRect( int( board_width - home_width + case_width ), int( case_width ), int( home_width - case_width ), int( board_height/2 - 2* case_width ) ); + cellRect[25].setRect( int( board_width - home_width + case_width ), int( case_width + board_height /2), int( home_width - case_width ), int( board_height/2 - 2* case_width ) ); + for ( int i = 0; i < 5; ++i ) { + checkerPosAllowed[0][i] = QPoint( int( board_width - home_width/2 ), int( case_width + i * ( checker_size + 2 ) ) ); + checkerPosAllowed[25][i] = QPoint( int( board_width - home_width/2 ), int( board_height - case_width - (i+1) * (checker_size + 2) ) ); + checkerPosAllowed[26][i] = QPoint( int( board_width/2 ), int( case_width + (i) * checker_size ) ); + checkerPosAllowed[27][i] = QPoint( int( board_width/2 ), int( board_height - case_width - (i+1) * checker_size ) ); + } + cellRect[26].setRect( int( board_width/2 - home_width/2 ), int( case_width ), int( home_width ), int( board_height /2 - 3 * die_size ) ); + cellRect[27].setRect( int( board_width/2 - home_width/2 ), int( board_height/2 + 3 * die_size ), int( home_width ), int( board_height /2 - 3 * die_size ) ); +} + +void BgBoard::mousePressEvent( QMouseEvent *event ) +{ + m_ClickTimeout = false; + m_clicked = true; + + if ( !diceRolled ) + return; + if ( diceLeft.size() == 0 && diceRolled ) { + return; + } + for ( int i = 0; i < 28; ++i ) { + staticPointCount[ i ] = PointCount[ i ]; + } + + QTimer *timer = new QTimer(this); + timer->setSingleShot( true ); + connect(timer, SIGNAL(timeout()), this, SLOT( unsetSingleClick())); //determine whether this is a single click or a drag + timer->start(150);//TODO: kde parameter? + + m_draggingChecker = checkerHit( event->pos() ); + if ( m_draggingChecker < 0 ) + return; // m_draggingChecker is the point from which the checker was taken + if ( 1 ) { // FIXME + staticPointCount[ m_draggingChecker ] -= activePlayerSign(); // + checkerBeingDragged = true; + } +} + +void BgBoard::unsetSingleClick() // if this slot is called the player is dragging, not single clicking +{ + m_ClickTimeout = true; +} + +void BgBoard::mouseMoveEvent( QMouseEvent *event ) +{ + if ( m_draggingChecker < 0) + return; + if ( !m_ClickTimeout ) + return; + QPoint pos = event->pos(); + if (pos.x() <= 0 ) + pos.setX( 1 ); + if (pos.y() >= height() ) + pos.setY( int( height() - 1 ) ); + checkerPos.setX( int( pos.x() ) ); + checkerPos.setY( int( pos.y() - checker_size / 2 ) ); + update(); +} + +void BgBoard::mouseDoubleClickEvent( QMouseEvent *event ) +{// not sure how to handle mouse clicks the best way + // at present the single click has been handled already, so one checker has been moved + // here we just move the second one + Move move; + if ( !diceRolled ) + return; //can't move before rolling dice + + if ( diceLeft.size() == 0 && diceRolled ) { + return; + } + m_draggingChecker = checkerHit( event->pos() ); + if ( m_draggingChecker < 0 ) + return; + if ( diceLeft.size() > 0 ) { + move.startPoint = m_draggingChecker; + move.dieValue = diceLeft.at( 0 ) * activePlayerSign(); + moveChecker( move ); + return; + } + return; +} + +void BgBoard::mouseReleaseEvent( QMouseEvent *event ) +{ + Move move; + int dieValueWanted = 0; + int dieValueNotWanted = 0; + + int delta; // calculated move length + + m_clicked = false; + + int pointReleased = -1; + QPoint pos = event->pos(); + if ( !m_ClickTimeout ) { // mouse was clicked, rather than dragging + if ( dieRect[0].contains( pos ) || dieRect[1].contains( pos ) ) { + m_draggingChecker = -1; + //if mouse is on the player's dice, she wants to roll or end turn + if ( diceRolled && ( ( diceLeft.size() == 0 ) || ( !movePossible( PointCount, diceLeft, m_activePlayer ) ) ) ) { + // either dice are finished, or now valid moves left + //if this player is a person we need to check if the move combination is valid + // the computer engine does it itself + if ( ( playerType[ m_activePlayer ] == 0 ) ) {// if the player is human we need to check move is valid + if ( isValidTotalMove( initialPointCount, movesMade, maxMovePossible ) ) { + //player has to discover on their own what is wrong with their move + changePlayer(); //if all dice are used, and player has actually rolled change player + return; + } + else { + QString s1 = QString::number( diceRolled ); + QString s2 = QString::number( diceLeft.size() ); + //QString s3 = QString::number( movePossible( PointCount, diceLeft, m_activePlayer ) ); + QString s4 = QString::number( maxMovePossible ); + error("1: diceRolled = "+s1+", diceLeft.size() = "+s2+", mP = "+/*s3+*/", mmP = "+s4); + return; + } + } + else { + changePlayer(); + return; + } + } + else if ( !diceRolled ) { // roll the dice. Only called from here at beginning of game, otherwise in ChangePlayer (if autoroll==true) //FIXME + newGame = false; + rollDice(); + maxMovePossible = getMaxMovePossible( initialPointCount, diceInitial, m_activePlayer ); + if ( playerType[ m_activePlayer ] == 1 ) { //player is the computer + moveComputer(); + changePlayer(); + } + //error("max move poss = " + QString::number(maxMovePossible) ); + + return; + } + return; + } + + if ( !diceRolled ) + return; //can't move before rolling dice + + if ( diceLeft.size() == 0 && diceRolled ) { + return; + } + + if ( m_draggingChecker < 0 ) + return; + + // move a piece by clicking on it. Left click, largest die value possible; right click, smallest + if ( event->button() == Qt::LeftButton ) { + dieValueWanted = maxDieValue( diceLeft ); + dieValueNotWanted = minDieValue( diceLeft ); + } + else if ( event->button() == Qt::RightButton ) { + dieValueWanted = minDieValue( diceLeft ); + dieValueNotWanted = maxDieValue( diceLeft ); + } + delta = dieValueWanted * activePlayerSign(); + + move.startPoint = m_draggingChecker; + move.dieValue = delta; + if ( moveChecker( move ) == false ) { //if the move corresponding to the L/R button isn't allowed, try the R/L button + delta = dieValueNotWanted * activePlayerSign(); + move.dieValue = delta; + moveChecker( move ); //FIXME this doesn't work for some reason + } + update(); + } + + else if ( m_draggingChecker > 0 ) { // we are moving a checker by dragging it + for ( int i = 0; i < 26; ++i ) { + if ( cellRect[i].contains( pos ) ) { + pointReleased = i; + break; + } + } + delta = pointReleased - m_draggingChecker; // -ve for player 0 + if ( m_draggingChecker > 25 ) { + delta = pointReleased - 25 * ( 1 - m_activePlayer ); + } + move.startPoint = m_draggingChecker; + move.dieValue = delta; + moveChecker( move ); + update(); + } +} + +bool BgBoard::moveChecker( Move move ) +{ // move a checker + // return true if the checker was moved, false otherwise + + bool checkerMoved = false; + bool allowed = false; + int endpoint = move.startPoint + move.dieValue; + vector diceTemp; // in case move is eventually rejected + diceTemp.assign( diceLeft.begin(), diceLeft.end() ); + vector::iterator diceIt1; + // is there a checker on startpoint? + if ( PointCount[ move.startPoint ] * activePlayerSign() < 0 ) { + return false; + } + + //check basic arithmetic + int numDiceLeft = diceTemp.size(); + if ( move.startPoint > 25 ) { // dragging from center board + endpoint = 25 * ( 1 - m_activePlayer ) + move.dieValue; + } + if ( ( endpoint > 0 ) && ( endpoint < 25 ) && ( move.startPoint < 28 ) && ( move.dieValue != 0 ) ) { //released on a point + for ( diceIt1 = diceTemp.begin(); diceIt1 != diceTemp.end(); diceIt1++ ) { + if ( ( move.dieValue * activePlayerSign() ) == *diceIt1 ) { + if ( !allowed ) { + diceTemp.erase( diceIt1 ); // once allowed is true, we don't need to iterate over the rest of the loop + allowed = true; + break; + } + } + } + int i,j; + if ( !allowed && ( numDiceLeft > 1 ) ) { //check combinations of 2 dice //FIXME only if there's no opponent's point in the way! + vector::iterator diceIt2, marker1, marker2; + for ( diceIt1 = diceTemp.begin(); diceIt1 != diceTemp.end(); diceIt1++ ) { + i = *diceIt1; + for ( diceIt2 = diceIt1+1; diceIt2 != diceTemp.end(); diceIt2++ ) { + j = *diceIt2; + if ( move.dieValue * activePlayerSign() == *diceIt1 + *diceIt2 ) { + if ( ( PointCount[ move.startPoint + *diceIt1 ] * activePlayerSign() >= 0 ) || ( PointCount[ move.startPoint + *diceIt2 ] * activePlayerSign() >= 0 ) ) { + if ( !allowed ) { // only want to mark dice used once + marker1 = diceIt1; + marker2 = diceIt2; + } + } + allowed = true; + break; + } + } + } + if ( allowed ) { + diceTemp.erase( marker2 ); + diceTemp.erase( marker1 ); + } + } + if ( !allowed && ( numDiceLeft > 2 ) ) { //check combinations of 3 dice + vector::iterator diceIt2, diceIt3, marker1, marker2, marker3; + for ( diceIt1 = diceTemp.begin(); diceIt1 != diceTemp.end(); diceIt1++ ) { + for ( diceIt2 = diceIt1+1; diceIt2 != diceTemp.end(); diceIt2++ ) { + for ( diceIt3 = diceIt2+1; diceIt3 != diceTemp.end(); diceIt3++ ) { + if ( move.dieValue * activePlayerSign() == *diceIt1 + *diceIt2 + *diceIt3 ) { + if ( ( PointCount[ move.startPoint + *diceIt1 ] * activePlayerSign() >= 0 ) && ( PointCount[ move.startPoint + *diceIt1 + *diceIt2 ] * activePlayerSign() >= 0 ) ) { + if ( !allowed ) { + marker1 = diceIt1; + marker2 = diceIt2; + marker3 = diceIt3; + } + } + allowed = true; + break; + } + } + } + } + if ( allowed ) { + diceTemp.erase( marker3 ); + diceTemp.erase( marker2 ); + diceTemp.erase( marker1 ); + } + } + if ( !allowed && ( numDiceLeft > 3 ) ) { // all four dice + if ( move.dieValue * activePlayerSign() == 4 * diceTemp.at( 0 ) ) { + int die = diceTemp.at( 0 ) * activePlayerSign(); + int start = move.startPoint; + if ( ( PointCount[ start + die ] * activePlayerSign() >= 0 ) && ( PointCount[ start + 2 * die ] * activePlayerSign() >= 0 ) && ( PointCount[ start + 3 * die ] * activePlayerSign() >= 0 ) ) { + allowed = true; + diceTemp.clear(); + } + } + } + } + if ( ( endpoint < 1 ) || ( endpoint > 24 ) ) { // bearing off. moves < dice value allowed. Have to be careful to use correct (min) die + // we check if bearing off is allowed below, in the function isValidSingleMove + bool tempAllowed = true; + move.dieValue = ( 25 * m_activePlayer ) - move.startPoint; + if ( endpoint < 0 ) + endpoint = 0; + if ( endpoint > 25 ) + endpoint = 25; + vector::iterator it = diceTemp.begin(); + + //FIXME the below is now in isValidSingleMove, remove from here [this isn't true! check] + if ( move.dieValue * activePlayerSign() > maxDieValue( diceTemp ) ) { + allowed = false; + } + + else if ( move.dieValue * activePlayerSign() == maxDieValue( diceTemp ) ) { + vector::iterator ii = maxDie( diceTemp ); + diceTemp.erase( ii ); + allowed = true; + } // say you have checkers on 3 and 5, and roll a 4. you must move 5->1. + else if ( move.dieValue * activePlayerSign() > minDieValue( diceLeft ) ) { //maxDieValue > move > minDieValue + for ( int i = move.dieValue *activePlayerSign() + 1; i < 7; ++i ) { + if ( PointCount[ 25 * m_activePlayer - i * activePlayerSign() ] * activePlayerSign() > 0 ) { + tempAllowed = false; + } + } + if ( tempAllowed ) { + allowed = true; + vector::iterator jj = maxDie( diceTemp ); + diceTemp.erase( jj ); + } + } + else if ( move.dieValue * activePlayerSign() == minDieValue( diceLeft ) ) { + vector::iterator kk = minDie( diceTemp ); + diceTemp.erase(kk); + allowed = true; + } + + else if ( move.dieValue * activePlayerSign() < minDieValue( diceLeft ) ) { //maxDieValue > move > minDieValue + for ( int i = move.dieValue * activePlayerSign() + 1; i < 7; ++i ) { + if ( PointCount[ 25 * m_activePlayer - i * activePlayerSign() ] * activePlayerSign() > 0 ) { + tempAllowed = false; + break; + } + } + if ( tempAllowed ) { + vector::iterator kk = minDie( diceTemp ); + diceTemp.erase(kk); + allowed = true; + } + } + //FIXME end of previous fixme + +// TODO: bear off using more than 1 die at a time + } + // no need to check if move is of correct length. more advanced checking done in other functions + + if ( allowed ) { + if ( isValidSingleMove( PointCount, move ) ) { + checkerMoved = true; + movesMade.push_back( move ); + if ( PointCount[ endpoint ] == -activePlayerSign() ) { // opponent had 1 checker on point + PointCount[ endpoint ] = activePlayerSign(); + PointCount[ move.startPoint ] -= activePlayerSign(); + PointCount[ 27 - m_activePlayer ] -= activePlayerSign(); // put it on centre board + } + else { + if ( endpoint < 0 ) //put them into the home board! + endpoint = 0; + if ( endpoint > 25 ) + endpoint = 25; + PointCount[ endpoint ] += activePlayerSign(); + PointCount[ move.startPoint ] -= activePlayerSign(); + } + + diceLeft.assign( diceTemp.begin(), diceTemp.end() ); + + moveDone(); + } + } + + for ( int i = 0; i < 28; ++i ) { + staticPointCount[ i ] = PointCount[ i ]; + } + update(); + m_draggingChecker = -1; + return checkerMoved; +} + + + +int BgBoard::checkerHit( const QPoint &pos ) +{ // return the number of the point player is trying to take a checker from, -1 if not allowed + int pointPressed = -1; + for ( int i = 0; i < 28; ++i ) { + if ( cellRect[i].contains( pos ) ) { + pointPressed = i; + break; + } + } + if ( ( PointCount[26 + m_activePlayer] != 0 ) && ( pointPressed != ( 26 + m_activePlayer ) ) ) //have checker on centreboard, must pick up + return -2; + + if ( pointPressed == 25 ) + return -3; // can't pick up a checker from home + + if ( activePlayerSign() * PointCount[ pointPressed ] > 0 ) + return pointPressed; + + //fell through + return -4; +} + +void BgBoard::moveDone() // check to see if we've won +{ + if ( PointCount[ m_activePlayer * 25 ] * activePlayerSign() == 15 ) { //all checkers on homeboard + QString mess1 = QString::number( m_activePlayer ); + emit gameOver( 1 ); + update(); + } +} + + +bool BgBoard::movePossible( int *points, vector &dice, int player ) //points[i]*activePlayerSign > 0 if activePlayer has checker on point i + // return true if a player has a valid move left, false otherwise + // uses getMaxMovePossible to do the hard work + // FIXME don't have to pas points, dice, player +{ + int sumMoves = 0; + vector::iterator moveIt; + for ( moveIt = movesMade.begin(); moveIt != movesMade.end(); ++moveIt ) { + sumMoves += (*moveIt).dieValue; + } + if ( sumMoves == maxMovePossible ) + return false; + if ( sumMoves == -maxMovePossible ) //FIXME do we need the sign? + return false; + else + return true; +} + +bool BgBoard::canBearOff( int *points, int player ) +{// return true if the player is allowed to bear off + int sumBearOff = 0; + int playerSign = 2 * player - 1; + + if ( player == 0 ) { // if all the checkers are in the home court, or home, we are allowed to bear off + for ( int i = 0; i < 7; ++i ) { + if ( points[ i ] * playerSign > 0 ) + sumBearOff += points[ i ] * playerSign; + } + } + if ( player == 1 ) { + for ( int i = 19; i < 25; ++i ) { + if ( points[ i ] * playerSign > 0 ) + sumBearOff += points[ i ] * playerSign; + } + } + + if ( sumBearOff == 15 ) { + return true; + } + else + return false; +} + +void BgBoard::changePlayer() +{ + movesMade.clear(); + if ( m_activePlayer == 0) { + m_activePlayer = 1; + } + else + m_activePlayer = 0; + diceRolled = false; + for ( int i = 0; i < 28; ++i ) { // in case of undo + initialPointCount[ i ] = PointCount[ i ]; + } + if ( autoRoll[ m_activePlayer ] ) { + rollDice(); + maxMovePossible = getMaxMovePossible( initialPointCount, diceInitial, m_activePlayer ); + //error("max move poss = " + QString::number(maxMovePossible) ); + if ( playerType[ m_activePlayer ] == 1 ) { //player is the computer + moveComputer(); + update(); + changePlayer(); + } + //FIXME redraw the dice before calculating computer move + } + update(); +} + +void BgBoard::moveComputer() +{ + Move move; + vector bestMoveList; + vector bestMove; + bestMoveList.clear(); + bestMove.clear(); + + computeMove( PointCount, diceInitial, bestMoveList, m_activePlayer ); + if ( bestMoveList.size() > 0 ) { + bestMove = bestMoveList.at(0).moves ; + vector::iterator it; + for ( it = bestMove.begin(); it != bestMove.end(); ++it ) { + move.startPoint = ( *it ).startPoint; + move.dieValue = ( *it ).dieValue; + moveChecker( move ); + } + } +} + +int BgBoard::rollDie() +{ + + int D = rand() % 6 +1; + return D; +} + +void BgBoard::rollDice() +{ + diceInitial.clear(); + diceInitial.push_back( rollDie() ); + diceInitial.push_back( rollDie() ); + if ( diceInitial.at(0) == diceInitial.at(1) ) { + diceInitial.push_back( diceInitial.at(0) ); + diceInitial.push_back( diceInitial.at(0) ); + } + diceLeft.assign( diceInitial.begin(), diceInitial.end() ); + + diceRolled = true; + update(); + rand1 = rand() % 100;//some random numbers for positioning the dice + rand2 = rand() % 100; + rand3 = rand() % 100; + rand4 = rand() % 100; +} + +void BgBoard::startNewGame() +{ + + for ( int i = 0; i < 28; ++i ) { + PointCount[i] = 0; + } + PointCount[1] = 2; + PointCount[6] = -5; + PointCount[8] = -3; + PointCount[12] = 5; + PointCount[13] = -5; + PointCount[17] = 3; + PointCount[19] = 5; + PointCount[24] = -2; + + movesMade.clear(); + + static bool firstTime = true; + if (firstTime) { + firstTime = false; + QTime midnight(0, 0, 0); + srand(midnight.secsTo(QTime::currentTime())); + } + int r = rand() % 2; + if ( r == 0 ) { + m_activePlayer = 0; + } + else { + m_activePlayer = 1; + } + for ( int i = 0; i < 28; ++i ) { // in case of undo + initialPointCount[ i ] = PointCount[ i ]; + staticPointCount[ i ] = PointCount[ i ]; + } + newGame = true; + diceRolled = false; + diceInitial.clear(); + diceInitial.push_back( 0 ); + diceInitial.push_back( 0 ); +} + +void BgBoard::paintEvent(QPaintEvent *event /* event */) +{ + QFrame::paintEvent(event); + + QPainter painter( this ); + QRect rect = contentsRect(); + + board_width = rect.width(); + + board_height = 9/15.6 * board_width; //TODO: put an is_changed flag on this, to minimize redraws + checker_size = .08 * board_height; + + point_width = board_height / 9; + point_height = point_width * 4; + home_width = 1.2 * point_width; + die_size = .075 * rect.height(); + die_spot_size = .2 * die_size; + + case_width = .02 * rect.height(); //width of small bit of case around board + + painter.setRenderHint(QPainter::Antialiasing); + + paintBoard( painter ); + definePoints(); + paintStaticCheckers( painter ); + + paintDice( painter, diceInitial ); + if ( m_clicked ) + paintChecker( painter );//the moving checker +} + +void BgBoard::paintBoard( QPainter &painter ) +{ + + QPoint points[3] = { + QPoint( 0, int( case_width ) ), + QPoint( int( point_width / 2 ), int( point_height ) ), + QPoint( int( point_width ), int( case_width ) ) + }; + + QPen casePen; + casePen.setWidth( 2 ); + casePen.setColor( Qt::black ); + + painter.setPen( casePen ); + painter.setBrush( bgBrush[ caseColor ] ); + painter.drawRect( 0, 0, int( board_width / 2 ), int( board_height ) ); + painter.drawRect( int( board_width / 2 ), 0, int( board_width /2 ), int( board_height ) ); + + painter.setBrush( bgBrush[ feltColor ] ); + painter.drawRect( int(home_width), int( case_width ), int(6 * point_width + 1), int(board_height - 2 * case_width + 1) ); + painter.drawRect( int( 2 * home_width + 6 * point_width ), int( case_width ), int(6 * point_width + 1), int( board_height - 2* case_width + 1) ); + //home + painter.drawRect( int( case_width ), int( case_width ), int( home_width - 2*case_width ), int( board_height /2 -2*case_width ) ); + painter.drawRect( int( case_width ), int( board_height/2 + case_width ), int( home_width - 2 * case_width ), int( board_height/2 - 2 * case_width + 1) ); + painter.drawRect( int( board_width - home_width + case_width ), int( case_width ), int( home_width - 2 * case_width ), int( board_height/2 -2 * case_width )); + painter.drawRect( int( board_width - home_width + case_width ), int( board_height/2 +case_width ), int( home_width-2 * case_width ), int( board_height/2 -2*case_width + 1) ); + painter.save(); + painter.translate( home_width, 0 ); + + //draw the points + painter.setPen( Qt::NoPen ); + for (int i = 0; i < 2; ++i ) { + for (int j = 0; j < 2; ++j ) { + for (int k = 0; k < 3; ++k ) { + painter.setBrush( bgBrush[ point0Color ] ); + painter.drawPolygon( points, 3 ); + painter.translate( point_width, 0 ); + painter.setBrush( bgBrush[ point1Color ] ); + painter.drawPolygon( points, 3 ); + painter.translate( point_width, 0 ); + } + painter.translate( home_width, 0 ); + } + painter.translate( -home_width, board_height-1 ); + painter.rotate( 180 ); + } + painter.restore(); + painter.setBrush( Qt::NoBrush ); + painter.setPen( casePen ); //FIXME do we really have to redraw these rectangles? How else to get the borders on top? + painter.drawRect( int(home_width), int( case_width ), int(6 * point_width + 1 ), int(board_height - 2 * case_width + 1 ) ); + painter.drawRect( int( 2 * home_width + 6 * point_width ), int( case_width ), int(6 * point_width + 1 ), int( board_height - 2* case_width + 1 ) ); + +} + +void BgBoard::paintChecker( QPainter &painter ) +{ + if ( m_draggingChecker < 0 ) + return; + paintCheck( painter, checkerPos, m_activePlayer ); +} + +void BgBoard::paintCheck( QPainter &painter, QPoint &pos, int player ) +{ + painter.save(); + painter.setPen( Qt::NoPen ); + painter.translate( int( pos.x() - checker_size / 2 ), int( pos.y() ) ); + + QRadialGradient radialGradient(10, 10, checker_size, int( .33*checker_size ), int( .33*checker_size ) ); + radialGradient.setColorAt(0.0, Qt::white ); + radialGradient.setColorAt(0.2, bgColor[ player ] ); + radialGradient.setColorAt(1.0, Qt::black ); + painter.setBrush(radialGradient); + + QRect R = QRect( 0, 0, int( checker_size ), int( checker_size ) ); + painter.drawEllipse( R ); + painter.restore(); +} + +void BgBoard::paintStaticCheckers( QPainter &painter ) +{ + int number; + int numberToPaint; + int player; + + painter.setPen( Qt::NoPen ); + for ( int i = 0; i < 28; ++i ) { + if ( staticPointCount[ i ] == 0 ) + continue; + if ( staticPointCount[i] < 0 ) + player = 0; + else + player = 1; + number = abs( staticPointCount[ i ] ); + numberToPaint = number; + if ( number > 5 ) { + numberToPaint = 5; + } + + for ( int j = 0; j < numberToPaint; ++j ) { + QPoint p = checkerPosAllowed[ i ][ j ]; + paintCheck( painter, p, player ); + } + if ( number > 5 ) { //only draw 5 checkers per point + QString txt; + txt = QString::number( number ); + int size = int( .85 * checker_size ); + int textSize = int( .6 * checker_size );//FIXME center the text in the box + QRect textRect = QRect( int (checkerPosAllowed[ i ][ 4 ].x() - size/2 ), checkerPosAllowed[ i ][ 4 ].y(), size, size ); + number = 5; + painter.save(); + painter.setPen( Qt::white ); + painter.setBrush( Qt::white ); + painter.drawRect( textRect ); + painter.setPen( Qt::blue ); + painter.setFont(QFont("Courier", textSize, QFont::Bold )); //TODO prettify + painter.drawText( textRect, txt ); + painter.restore(); + } + } +} + +void BgBoard::paintDice( QPainter &painter, vector dice ) +{ + if ( dice.size() == 0 ) + return; + float y [2]; + int x[2]; + float ds = die_spot_size ; + if ( m_activePlayer == 0 ) { + painter.setBrush( bgBrush[ checker0Color ] ); + } + else { + painter.setBrush( bgBrush[ checker1Color ] ); + } + + painter.setPen( Qt::black ); + + if ( !diceRolled ) { + y[0] = 1.1 * board_height; + y[1] = y[0]; + if ( m_activePlayer == 0 ) { + x[0] = int( case_width ); + x[1] = int( 2* case_width + die_size ); + } + if ( m_activePlayer == 1 ) { + x[0] = int( board_width - case_width - die_size ); + x[1] = int( board_width - 2 * case_width - 2 * die_size ); + } + dieRect[0] = QRect( x[0], int( y[0] ), int( die_size ), int( die_size ) ); + dieRect[1] = QRect( x[1], int( y[1] ), int( die_size ), int( die_size ) ); + } + + else { + y[0] = (.47 + rand1 / 1666) * board_height - die_size/2; + y[1] = (.47 + rand2 / 1666) * board_height - die_size/2; + if ( m_activePlayer == 0 ) { + x[0] = int( home_width + (1 + rand3 /100) * die_size ); + x[1] = int( x[0] + (1.2 + rand4/100) * die_size ); + } + if ( m_activePlayer == 1 ) { + x[0] = int( board_width - home_width - ( 2 + rand3 / 100 ) * die_size ); + x[1] = int( x[0] - ( 1.2 + rand4/100) * die_size ); + } + + dieRect[0] = QRect( x[0], int( y[0] ), int( die_size ), int( die_size ) ); + dieRect[1] = QRect( x[1], int( y[1] ), int( die_size ), int( die_size ) ); + } + + painter.drawRect( dieRect[0] ); + painter.drawRect( dieRect[1] ); + + painter.setBrush( Qt::white ); + + + for ( int i = 0; i < 2; ++i ) { // TODO: fix positions! + switch ( dice.at(i) ) { + case 5: + painter.drawEllipse( int( x[i] + .25 * die_size - ds/2), int( y[i] + .25 * die_size -ds/2 ), int(ds), int(ds) ); + painter.drawEllipse( int( x[i] + .75 * die_size - ds/2), int( y[i] + .75 * die_size -ds/2 ), int(ds), int(ds) ); + case 3: + painter.drawEllipse( int( x[i] + .75 * die_size - ds/2), int( y[i] + .25 * die_size -ds/2 ), int(ds), int(ds) ); + painter.drawEllipse( int( x[i] + .25 * die_size - ds/2), int( y[i] + .75 * die_size -ds/2 ), int(ds), int(ds) ); + case 1: + painter.drawEllipse( int( x[i] + .5 * die_size - ds/2 ), int( y[i] + .5 * die_size -ds/2 ), int(ds), int(ds) ); + break; + case 6: + painter.drawEllipse( int( x[i] + .25 * die_size - ds/2 ), int ( y[i] + .5 * die_size - ds/2 ), int(ds), int(ds) ); + painter.drawEllipse( int( x[i] + .75 * die_size - ds/2 ), int ( y[i] + .5 * die_size - ds/2 ), int(ds), int(ds) ); + case 4: + painter.drawEllipse( int( x[i] + .25 * die_size - ds/2 ), int ( y[i] + .25 * die_size - ds/2 ), int(ds), int(ds) ); + painter.drawEllipse( int( x[i] + .75 * die_size - ds/2 ), int ( y[i] + .75 * die_size - ds/2 ), int(ds), int(ds) ); + case 2: + painter.drawEllipse( int( x[i] + .25 * die_size - ds/2 ), int ( y[i] + .75 * die_size - ds/2 ), int(ds), int(ds) ); + painter.drawEllipse( int( x[i] + .75 * die_size - ds/2 ), int ( y[i] + .25 * die_size - ds/2 ), int(ds), int(ds) ); + break; + } + } +} + +int BgBoard::maxDieValue( vector &dice ) //helper functions to determine if moves are possible +{ + vector::iterator it; + int value = 0; + for ( it = dice.begin(); it != dice.end(); ++it ) { + if ( *it > value ) + value = *it; + } + return value; +} + +int BgBoard::minDieValue( vector &dice ) +{ + vector::iterator it; + int value = 7; + for ( it = dice.begin(); it != dice.end(); ++it ) { + if ( *it < value ) + value = *it; + } + if ( value == 7 ) + return 0; // all dice are used + return value; +} + +vector::iterator BgBoard::maxDie( vector &dice ) +{ + vector::iterator it, it1; + int dieVal = 0; + for ( it = dice.begin() ; it != dice.end(); ++it ) { + if ( *it > dieVal ) { + dieVal = *it; + it1 = it; + } + } + return it1; +} + +vector::iterator BgBoard::minDie( vector &dice ) +{ + vector::iterator it, it1; + int dieVal = 7; + for ( it = dice.begin(); it != dice.end(); ++it ) { + if ( *it < dieVal ) { + dieVal = *it; + it1 = it; + } + } + return it1; +} + +void BgBoard::undo() +{ + for ( int i = 0; i < 28; ++i ) { + PointCount[ i ] = initialPointCount[ i ]; + staticPointCount[ i ] = initialPointCount[ i ]; + } + diceLeft.assign( diceInitial.begin(), diceInitial.end() ); + movesMade.clear(); + update(); +} + + +void BgBoard::error( QString string ) +{ + QMessageBox::StandardButton reply; + reply = QMessageBox::information(this, tr("QBackgammon"), string ); + return; +} + + +bool BgBoard::isValidSingleMove( int *points, Move move ) + //return true if the single move, from startpoint a distance dieval, is allowed + //sign of dieval determines orientation + //note: the player with points > 0 has dieval > 0 + // to bear off, you can move past the home board +{ + bool allowed = false; + bool tempAllowed = true; + + int startpoint, endpoint; + + int playerSign = 1;// -1 for player 0; 1 for player 1 + int player = 1; // 0 for player 0; 1 for player 1 + + if ( move.dieValue < 0 ) { + playerSign = -1; + player = 0; + } + + if ( move.startPoint == 0 || move.startPoint == 25 )//can't move a checker from home + return false; + + if ( points[ 26 + player ] > 0 ) {// point on center board, must move it + if ( move.startPoint < 26 ) { + return false; + } + } + + if ( move.startPoint > 25 ) { //from centre board + startpoint = ( 25 * ( 1 - player ) ); + } + else + startpoint = move.startPoint; + + endpoint = startpoint + move.dieValue; + + if ( endpoint > 25 ) //bearing off + endpoint = 25; + if ( endpoint < 0 ) + endpoint = 0; + if ( ( playerSign * points[ endpoint ] ) < -1 ) // opponent has > 1 checker on point + return false; + + int delta = ( endpoint - startpoint ) * playerSign; + + int sumBearOff = 0; // to keep this general, do not use m_active + if ( player == 0 ) { // if all the checkers are in the home court, or home, we are allowed to bear off + for ( int i = 0; i < 7; ++i ) { + if ( points[ i ] * playerSign > 0 ) + sumBearOff += points[ i ] * playerSign;//FIXME combine into 1 + } + } + if ( player == 1 ) { + for ( int i = 19; i < 26; ++i ) { + if ( points[ i ] * playerSign > 0 )//FIXME only check this if we try to bear off + sumBearOff += points[ i ] * playerSign;//FIXME call canBearOff + } + } + if ( ( sumBearOff < 15 ) && ( ( endpoint == 0 ) || ( endpoint == 25 ) ) )//trying to bear off when not allowed + return false; + + if ( ( sumBearOff == 15 ) && ( endpoint == ( 25 * player ) ) ) {// bearing off + // we need to check the following doesn't happen. say points[6] = -1, points[3] = 2, points[2] = 1, die = 3. We are not allowed to move. + + if ( delta > move.dieValue * playerSign ) { + allowed = false; + } + + else if ( delta == move.dieValue * playerSign ) { //FIXME these elses might not all be necessary + allowed = true; + } // say you have checkers on 3 and 5, and roll a 4. you must move 5->1. + + else if ( delta < move.dieValue * playerSign ) { //maxDieValue > move > minDieValue + for ( int i = startpoint + 1; i < 7; ++i ) { + if ( points[ 25 * player - i * playerSign ] * playerSign > 0 ) { + tempAllowed = false; + break; + } + } + if ( tempAllowed ) { + allowed = true; + } + } + + if ( allowed ) + return true; + else + return false; + } + + if ( ( startpoint == ( 25 * (1 - player ) ) ) && ( endpoint == ( 25 * (1 - player) + move.dieValue ) ) ) // checker from player i's centre board + return true; + + if ( ( startpoint > 0 ) && ( startpoint < 25 ) && ( endpoint > 0 ) && ( endpoint < 25 ) ) // nothing left to check for ordinary moves + return true; + + return false; // +} + +bool BgBoard::isValidTotalMove( int *startpoints, vector &moves, int maxMovePossible ) +{//both moves may be individually valid, but not the combination. eg when bearing off, need to use max value + // pass maxMovePossible to avoid determining it many times + //FIXME startpoints not needed + int playerSign = 1;// -1 for player 0; 1 for player 1 + int player = 1; // 0 for player 0; 1 for player 1 + + if (moves.size() > 0 ) { + if ( moves.at(0).dieValue < 0 ) { + playerSign = -1; + player = 0; + } + } + + int sumMoves = 0; + int delta; + int endpoint, startpoint; + vector::iterator moveIt; + + + + for ( moveIt = moves.begin(); moveIt < moves.end(); moveIt++ ) { + if ( (*moveIt).startPoint > 25 ) { //from centre board + startpoint = ( 25 * ( 1 - player ) ); + } + else { + startpoint = (*moveIt).startPoint; + } + + endpoint = startpoint + (*moveIt).dieValue; + + if ( endpoint > 25 ) //bearing off + endpoint = 25; + if ( endpoint < 0 ) + endpoint = 0; + + delta = endpoint - startpoint; + sumMoves += delta; + } + if (sumMoves == maxMovePossible) { + return true; + } + else if (sumMoves == -maxMovePossible) { //FIXME not keeping track of sign in this function + return true; + } + else { + return false; + } +} + +int BgBoard::getMaxMovePossible( int *points, vector &dice, int player ) +{ + // given a checker configuration points[28], the dice, and which player it is, we calculate the largest move (which is the only valid move length) + Move move_temp; + vector::iterator it; + vector::iterator itD1, itD2, itD3, itD4; // iterators over dice + + vector bestMove; + vector move; + vector tempMove1; + vector tempDice1; + int tempPoints1[28]; + + vector tempMove2; + vector tempDice2; + int tempPoints2[28]; + + vector tempMove3; + vector tempDice3; + int tempPoints3[28]; + + vector tempMove4; + vector tempDice4; + int tempPoints4[28]; + + vector newDice; + + int sumDice = 0; // sum of rolled dice + for ( it = dice.begin(); it != dice.end(); ++it ) { + newDice.push_back( *it ); + sumDice += *it; + } + + tempMove1.clear(); + move.clear(); + int tempScore1 = 0; + int tempScore2 = 0; + int tempScore3 = 0; + int tempScore4 = 0; + int score = 0; + int bestScore = 0; + + int playerSign = 1; + if ( player == 0 ) { + playerSign = -1; + } + + int jj,kk; + + bool movePoss2 = false; + bool movePoss3 = false; + bool movePoss4 = false; + int bestScore1 = 0; + int bestScore2 = 0; + int bestScore3 = 0; + + for ( itD1 = newDice.begin(); itD1 != newDice.end(); ++itD1 ) { + for ( int i = 1; i < 27 + player; ++i ) { + if ( points[ 26 + player ] * playerSign > 0 ) { // if there is a checker on center board we must move it + i = 26 + player; + } + movePoss2 = false; + if ( points[ i ] * playerSign > 0 ) { + move_temp.dieValue = *itD1 * playerSign; + move_temp.startPoint = i; + if ( isValidSingleMove( points, move_temp ) ) { + tempScore1 = updateTemps( points, tempPoints1, newDice, tempDice1, i, itD1, player ); + for ( itD2 = tempDice1.begin(); itD2 != tempDice1.end(); ++itD2 ) { + for ( int ii = 1; ii < 27 + player; ++ii ) { + if ( tempPoints1[ 26 + player ] * playerSign > 0 ) { // if there is a checker on center board we must move it + ii = 26 + player; + } + if ( tempPoints1[ ii ] * playerSign > 0 ) { + move_temp.dieValue = *itD2 * playerSign; + move_temp.startPoint = ii; + if ( isValidSingleMove( tempPoints1, move_temp ) ) { + movePoss2 = true; + movePoss3 = false; + tempScore2 = updateTemps( tempPoints1, tempPoints2, tempDice1, tempDice2, ii, itD2, player ); + + if ( newDice.size() > 2 ) { //doubles were rolled, go two more steps + for ( itD3 = tempDice2.begin(); itD3 != tempDice2.end(); ++itD3 ) { + for ( int iii = 1; iii < 27 + player; ++iii ) { + if ( tempPoints2[ 26 + player ] * playerSign > 0 ) { // if there is a checker on center board we must move it + iii = 26 + player; + } + if ( tempPoints2[ iii ] * playerSign > 0 ) { + move_temp.dieValue = *itD3 * playerSign; + move_temp.startPoint = iii; + if ( isValidSingleMove( tempPoints2, move_temp ) ) { + movePoss3 = true; + movePoss4 = false; + tempScore3 = updateTemps( tempPoints2, tempPoints3, tempDice2, tempDice3, iii, itD3, player ); + // no iteration over dice as there's only one left + for ( int iiii = 1; iiii < 27 + player; ++iiii ) { + if ( tempPoints3[ 26 + player ] * playerSign > 0 ) { // if there is a checker on center board we must move it + iiii = 26 + player; + } + if ( tempPoints3[ iiii ] * playerSign > 0 ) { + move_temp.dieValue = tempDice3.at(0) * playerSign; + move_temp.startPoint = iiii; + if ( isValidSingleMove( tempPoints3, move_temp ) ) { + itD4 = tempDice3.begin(); + movePoss4 = true; + tempScore4 = updateTemps( tempPoints3, tempPoints4, tempDice3, tempDice4, iiii, itD4, player ); + + score = tempScore1 + tempScore2 + tempScore3 + tempScore4; + if ( score > bestScore ) { + bestScore = score; + } + if ( bestScore == sumDice ) { + return bestScore; + } + } + + } + }// end of iiii loop + if ( !movePoss4 ) {// have made it through third die without finding a valid move + bestScore3 = tempScore1 + tempScore2 + tempScore3; + } + + } + } + } + } + // end of for (itD3) + if ( !movePoss3 ) {// have made it through third die without finding a valid move + if ( tempScore1 + tempScore2 > bestScore3 ) { + bestScore2 = tempScore1 + tempScore2; + } + } + } + + else { //doubles not rolled ( dice.size() !> 2 ) + jj = tempPoints2[ 26 + player ] * playerSign; + kk = points[ 26 + player ] * playerSign; + score = tempScore1 + tempScore2; + if ( score > bestScore ) { + bestScore = score; + if ( bestScore == sumDice ) + return bestScore; + + } + } + } + } + } + } + if ( !movePoss2 ) {// have made it through second die without finding a valid move + if ( tempScore1 > bestScore1 ) { + bestScore1 = tempScore1; + } + } + } + } + } + }//have looped over all possible moves + + + if ( bestScore3 > bestScore ) + return bestScore3; + if ( bestScore2 > bestScore ) + return bestScore2; + if ( bestScore1 > bestScore ) + return bestScore1; + return bestScore; +} + + + +int BgBoard::updateTemps( int *oldPoints, int *newPoints, vector &oldDice, vector &newDice, int startpoint, vector::iterator &die, int player ) //FIXME playerSign isn't necessary, pass a signed die + //return value is the number of points moved +{// a helper function for getMaxMovePossible + // after a virtual move is made, call this function to get the new dice, points, checkers, and move + int endpoint; + int playerSign = 1; + int delta = 0; + + if ( player == 0 ) + playerSign = -1; + + vector::iterator it; + + newDice.clear(); + for ( it = oldDice.begin(); it != oldDice.end(); ++it ) { + if ( it != die ) { + newDice.push_back( *it ); + } + } + + for ( int i = 0; i < 28; ++i ) {// reset the temporary points, for evaluating next move + newPoints[ i ] = oldPoints[ i ]; + } + + newPoints[ startpoint ] -= playerSign; + + if ( startpoint > 25 ) { // coming from centre board + if ( player == 1 ) { + startpoint = 0; + } + else { + startpoint = 25; + } + } + + endpoint = startpoint + *die * playerSign; + if ( ( endpoint < 0 ) || ( endpoint > 25 ) ) { // want to move to the home board + if ( player == 1 ) { + endpoint = 25; + } + else + endpoint = 0; + } + delta = ( endpoint - startpoint ) * playerSign; + + if ( oldPoints[ endpoint ] == -playerSign ) { // opponent had 1 checker on point + newPoints[ 27 - player ] -= playerSign; + newPoints[ endpoint ] = 0; // will be incremented below + } + + newPoints[ endpoint ] += playerSign; + return delta; +} + +void BgBoard::hint() +{ +// QString message = ""; +// QString s0 = QString::number( m_activePlayer ); +// QString s1 = QString::number( diceRolled ); +// QString s2 = QString::number( diceLeft.size() ); +// QString s3 = QString::number( movePossible( PointCount, diceLeft, m_activePlayer ) ); +// QString s4 = QString::number( maxMovePossible ); +// QString m1 = ""; + vector::iterator it; +// for ( it = movesMade.begin(); it != movesMade.end(); ++it ) { +// m1.append( QString::number( (*it).startPoint ) ); +// m1.append( ", "); +// m1.append( QString::number( (*it).dieValue ) ); +// m1.append( "; "); +// } +// + vector list; + computeMove( initialPointCount, diceInitial, list, m_activePlayer ); + + QString mess; + + for ( int i = 0; i < 10; ++i ) { + if ( list.size() > i ) { + mess.append( QString::number( list.at(i).score ) + "; " ); + for ( it = list.at(i).moves.begin(); it != list.at(i).moves.end(); ++it ) { + mess.append( QString::number( (*it).startPoint ) + ", " ); + mess.append( QString::number( (*it).dieValue ) + "; " ); + } + mess.append("\n"); + } + } + +// message = "player: "+s0+"; diceRolled = "+s1+", diceLeft.size() = "+s2+", mP = "+s3+", mmP = "+s4+"\n"; +// message.append( "moves made: " +m1+"\n" ); +// message.append(mess); +// +// error( message ); + error( mess ); + return; +} + +//FIXME display player X wins after updating point counts + +void BgBoard::computeMove( int *points, vector &dice, vector &movesList, int player ) +{ + // given a checker configuration points[28], the dice, and which player it is, we calculate the largest move + + Move move_temp; + moveScore moveScore_temp; + + vector::iterator it; + vector::iterator listIt; + + vector::iterator itD1, itD2, itD3, itD4; // iterators over dice + + vector move, tempMove1, tempMove2, tempMove3, tempMove4; + vector tempDice1, tempDice2, tempDice3, tempDice4; + int tempPoints1[28], tempPoints2[28], tempPoints3[28], tempPoints4[28]; + + vector newDice; + + int sumDice = 0; // sum of rolled dice + for ( it = dice.begin(); it != dice.end(); ++it ) { + newDice.push_back( *it ); + sumDice += *it; + } + + int playerSign = 1; + if ( player == 0 ) { + playerSign = -1; + } + + bool movePoss2 = false; + bool movePoss3 = false; + bool movePoss4 = false; + + int maxMovePossible; + int start; + maxMovePossible = getMaxMovePossible( points, dice, player ); + + //FIXME this is horrible, rewrite as recursive function calls + for ( itD1 = newDice.begin(); itD1 != newDice.end(); ++itD1 ) { + for ( int i = 1; i < 27 + player; ++i ) { + if ( points[ 26 + player ] * playerSign > 0 ) { // if there is a checker on center board we must move it + i = 26 + player; + } + tempMove1.clear(); + if ( points[ i ] * playerSign > 0 ) { + move_temp.dieValue = *itD1 * playerSign; + move_temp.startPoint = i; + if ( isValidSingleMove( points, move_temp ) ) { + updateTemps( points, tempPoints1, newDice, tempDice1, i, itD1, player ); + tempMove1.push_back( move_temp ); + + for ( itD2 = tempDice1.begin(); itD2 != tempDice1.end(); ++itD2 ) { + // have to start from 1, sometimes valid moves are otherwise blocked + start = 1; + for ( int ii = start; ii < 27 + player; ++ii ) { + if ( tempPoints1[ 26 + player ] * playerSign > 0 ) { // if there is a checker on center board we must move it + ii = 26 + player; + } + if ( tempPoints1[ ii ] * playerSign > 0 ) { + move_temp.dieValue = *itD2 * playerSign; + move_temp.startPoint = ii; + tempMove2.clear(); + tempMove2.assign( tempMove1.begin(), tempMove1.end() ); + if ( isValidSingleMove( tempPoints1, move_temp ) ) { + movePoss2 = true; + tempMove2.push_back( move_temp ); + updateTemps( tempPoints1, tempPoints2, tempDice1, tempDice2, ii, itD2, player ); + if ( newDice.size() > 2 ) { //doubles were rolled, go two more steps + + //////////////////////////////////////////// + + for ( itD3 = tempDice2.begin(); itD3 != tempDice2.end(); ++itD3 ) { + start = 1; + for ( int iii = start; iii < 27 + player; ++iii ) { + if ( tempPoints2[ 26 + player ] * playerSign > 0 ) { // if there is a checker on center board we must move it + iii = 26 + player; + } + tempMove3.clear(); + tempMove3.assign( tempMove2.begin(), tempMove2.end() ); + if ( tempPoints2[ iii ] * playerSign > 0 ) { + move_temp.dieValue = *itD3 * playerSign; + move_temp.startPoint = iii; + if ( isValidSingleMove( tempPoints2, move_temp ) ) { + movePoss3 = true; + tempMove3.push_back( move_temp ); + updateTemps( tempPoints2, tempPoints3, tempDice2, tempDice3, iii, itD3, player ); + // no iteration over dice as there's only one left + start = 1; + for ( int iiii = start; iiii < 27 + player; ++iiii ) { + + if ( tempPoints3[ 26 + player ] * playerSign > 0 ) { // if there is a checker on center board we must move it + iiii = 26 + player; + } + + tempMove4.clear(); + tempMove4.assign( tempMove3.begin(), tempMove3.end() ); + if ( tempPoints3[ iiii ] * playerSign > 0 ) { + move_temp.dieValue = tempDice3.at(0) * playerSign; + move_temp.startPoint = iiii; + + if ( isValidSingleMove( tempPoints3, move_temp ) ) { + itD4 = tempDice3.begin(); + movePoss4 = true; + tempMove4.push_back( move_temp ); + updateTemps( tempPoints3, tempPoints4, tempDice3, tempDice4, iiii, itD4, player ); + if ( isValidTotalMove( points, tempMove4, maxMovePossible ) ) { + pushMove( tempPoints4, tempMove4, movesList ); + } + } + } + }// end of iiii loop + if ( !movePoss4 ) {// have made it through third die without finding a valid move + if ( isValidTotalMove( points, tempMove3, maxMovePossible ) ) { + pushMove( tempPoints3, tempMove3, movesList ); + } + }//end of if (!movePoss4 ) + } + } + } //end of iii loop + }// end of for (itD3) + if ( !movePoss3 ) {// have made it through third die without finding a valid move + if ( isValidTotalMove( points, tempMove2, maxMovePossible ) ) { + pushMove( tempPoints2, tempMove2, movesList ); + } + } // end of ( !movePoss3 ) + } // end of ( newDice.size() > 2 ) + + //////////////////////////////////////////////////////////////// + + else { //doubles not rolled ( dice.size() !> 2 ) + if ( isValidTotalMove( points, tempMove2, maxMovePossible ) ) { + pushMove( tempPoints2, tempMove2, movesList ); + } + } + } //end of if ( isValidSingleMove( tempPoints1, move_temp ) ) { + } + } + } + if ( !movePoss2 ) {// have made it through second die without finding a valid move + if ( isValidTotalMove( points, tempMove1, maxMovePossible ) ) { + pushMove( tempPoints1, tempMove1, movesList ); + } + } + } + } + } + + }//have looped over all possible moves + return; +} + +void BgBoard::pushMove( int *newPoints, vector &move, vector &list ) +{ + //helper function for computeMove. Push a move onto the stack of moves + float score; + vector::iterator listIt; + moveScore moveScore_temp; + score = pointsScore( newPoints, m_activePlayer ); + moveScore_temp.score = score; + moveScore_temp.moves = move; + if ( list.size() == 0 ) { + list.push_back( moveScore_temp ); + return; + } + else { + for ( listIt = list.begin(); listIt != list.end(); ++listIt ) { + if ( score > (*listIt).score ) { + list.insert( listIt, moveScore_temp ); + if ( list.size() > 10 ) { + list.pop_back(); + } + return; + } + } + } + // if we've made it here, this is the worst move. add to the back + list.push_back( moveScore_temp ); + if ( list.size() > 10 ) {//keep the size small + list.pop_back(); + } + return; +} + + +float BgBoard::pointsScore( int *points, int player ) +{// given a checker layout points (array[28]), and which player it is, we calculate the score for that position + // use to calculate the best move + //TODO improve! + //TODO check if the game is a race + //TODO suggestions for bearing off + //FIXME get the last two out of there sooner! + float score = 0; + float doubleScore = 0; + + int p[25]; + + int playerSign = 1; + if ( player == 0 ) { + playerSign = -1; + for ( int i = 0; i < 25; ++i ) { // point label p is valid for either player + p[i] = i; // takes same index as player 0 + } // home court = 1 through 6 + } // NB home and centre boards unchanged, used 26+player etc + else { + for ( int i = 0; i < 25; ++i ) { + p[i] = 25 - i; + } + } + + // if the game is a race, move the furthest checkers + //FIXME for use with doubling cube (deciding when to double) need some way to compare scores calculated different ways + int sum = 0; + bool isRace = true; + for ( int i = 0; i < 19; ++i ) {//just need to check for 1 player! + if ( ( points[ i ] > 0 ) && ( sum != -15 ) ) + isRace = false; + if ( points[ i ] < 0 ) + sum += points[ i ]; + } + if ( sum != -15 ) + isRace = false; + if ( ( points[ 26 ] != 0 ) || ( points[ 27 ] != 0 ) ) + isRace = false; + // isRace == true, race is on + // move furthest checkers, bear off if posible + if ( isRace ) { + for ( int i = 24; i > 0; --i ) { + if ( points[ p[ i ] ] * playerSign > 0 ) { + score -= i * i * points[ p[ i ] ] * playerSign; + } + } + score += points[ 25 * player ] * 100; + return score; + } + + //doubles are good + for ( int i = 1; i < 25; ++i ) { // skip the furthest from home + if ( points[ p[i] ] * playerSign > 1 ) + score += 10; + } + + //some doubles are even better + if ( points[ p[3] ] * playerSign > 1 ) + doubleScore += 30; + if ( points[ p[4] ] * playerSign > 1 ) + doubleScore += 40; + if ( points[ p[5] ] * playerSign > 1 ) + doubleScore += 60; + if ( points[ p[6] ] * playerSign > 1 ) + doubleScore += 100; + if ( points[ p[7] ] * playerSign > 1 ) + doubleScore += 100; + if ( points[ p[8] ] * playerSign > 1 ) + doubleScore += 40; + if ( points[ p[9] ] * playerSign > 1 ) + doubleScore += 40; + if ( points[ p[18] ] * playerSign > 1 ) + doubleScore += 60; + if ( points[ p[19] ] * playerSign > 1 ) + doubleScore += 60; + if ( points[ p[20] ] * playerSign > 1 ) + doubleScore += 40; + + for ( int i = 2; i < 12; ++i ) { + if ( points[ p[i] ] * playerSign > 1 ) { + doubleScore *= 1.3; //more blocked points are better + } + } + + score += doubleScore /2; + + //however we don't want too much pileup in the home board + + if ( points[ p[1] ] * playerSign > 2 ) + score -= 10 * ( ( points[ p[1] ] * playerSign) - 2 ); + if ( points[ p[2] ] * playerSign > 2 ) + score -= 10 * ( ( points[ p[2] ] * playerSign) - 2 ); + if ( points[ p[3] ] * playerSign > 2 ) + score -= 7 * ( ( points[ p[3] ] * playerSign) - 2 ); + if ( points[ p[4] ] * playerSign > 2 ) + score -= 3 * ( ( points[ p[4] ] * playerSign) - 2 ); + if ( points[ p[5] ] * playerSign > 2 ) + score -= 3 * ( ( points[ p[5] ] * playerSign) - 2 ); + if ( points[ p[6] ] * playerSign > 2 ) + score -= 1 * ( ( points[ p[6] ] * playerSign) - 2 ); + if ( points[ p[7] ] * playerSign > 2 ) + score -= 2 * ( ( points[ p[6] ] * playerSign) - 2 ); + + // nor in the opponent's home board + + if ( points[ p[24] ] * playerSign > 2 ) + score -= 20 * ( ( points[ p[1] ] * playerSign) - 2 ); + if ( points[ p[23] ] * playerSign > 2 ) + score -= 20 * ( ( points[ p[2] ] * playerSign) - 2 ); + if ( points[ p[22] ] * playerSign > 2 ) + score -= 20 * ( ( points[ p[3] ] * playerSign) - 2 ); + if ( points[ p[21] ] * playerSign > 2 ) + score -= 20 * ( ( points[ p[4] ] * playerSign) - 2 ); + if ( points[ p[19] ] * playerSign > 2 ) + score -= 20 * ( ( points[ p[5] ] * playerSign) - 2 ); + if ( points[ p[18] ] * playerSign > 2 ) + score -= 20 * ( ( points[ p[6] ] * playerSign) - 2 ); + + //opponent's points on centre board is good + + if ( points[ 27 - player ] != 0 ) { + score += 120 * points[ 27 - player ] * points[ 27 - player ];// square takes care of sign--but weights checkers off too heavily + } // opponents checkers are opposite sign + + //singles within striking distance are bad + + for ( int i = 1; i < 25; ++i ) { + if ( points[ i ] * playerSign == 1 ) { + for ( int j = 1; j < 7; ++j ) { + if ( i + (j*playerSign) < 25 ) { //TODO replace 4 by value prop to probability of value being rolled + if ( points[ i + (j*playerSign) ] * playerSign < 0 ) { //opponent has checkers there + score -= (4*i); // weight, depending on how far from home board checker is + } + } + if ( i + (j*playerSign) == 25) { //coming from opponents centre board + if ( points[ 27 - player ] * playerSign < 0 ) { + score -= (4*i); + } + } + } + for ( int j = 7; j < 13; ++j ) { + if ( i + (j*playerSign) < 25 ) { + if ( points[ i + (j*playerSign) ] * playerSign < 0 ) { //opponent has checkers there + score -= (2*i); // weight, depending on how far from home board checker is + } + } + if ( i + (j*playerSign) == 25) { + if ( points[ 27 - player ] * playerSign < 0 ) { + score -= (2*i); + } + } + } + } + } + + // give some incentive to move the furthest two + + for ( int i = 13; i < 25; ++i ) { + if ( points[ p[ i ] ] * playerSign > 0 ) { + score -= (4*i) * points[ p[ i ] ] * playerSign; + } + } + + if ( points[ p[24] ] * playerSign < 2 ) + score += 20; + if ( points[ p[24] ] * playerSign < 1 ) + score += 10; + + return score; +} diff --git a/retroshare-gui/src/games/qbackgammon/bgboard.h b/retroshare-gui/src/games/qbackgammon/bgboard.h new file mode 100644 index 000000000..9d7dcb162 --- /dev/null +++ b/retroshare-gui/src/games/qbackgammon/bgboard.h @@ -0,0 +1,166 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2007, RetroShare Team + * + * 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 BGBOARD_H +#define BGBOARD_H + +#include +#include +#include + +class BgEngine; + +enum { checker0Color, checker1Color, point0Color, point1Color, feltColor, caseColor }; + + + +struct Move { + int startPoint; + int dieValue; +}; + +struct moveScore { + std::vector moves; + float score; +}; + +class BgBoard : public QFrame +{ + Q_OBJECT + + public: + BgBoard( QWidget *parent = 0 ); + QSize sizeHint() const; + int activePlayer(); + void setColor( int item, QColor color ); + QColor getColor( int item ); + void setPlayerType( int player, int opponent ); + int getPlayerType( int player ); + void setAutoRoll( int player, bool value ); + bool getAutoRoll( int player ); + + public slots: + void unsetSingleClick(); + void undo(); + void startNewGame(); + void hint(); + + signals: + void playerChanged( int player ); + void gameOver( int points ); + + protected: + + void paintEvent( QPaintEvent *event ); + void paintBoard( QPainter &painter ); + void paintChecker( QPainter &painter ); // paint the checker being dragged + void paintStaticCheckers( QPainter &painter ); + void paintDice( QPainter &painter, std::vector dice ); + void paintCheck( QPainter &painter, QPoint &pos, int player ); + + void mousePressEvent( QMouseEvent *event ); + void mouseMoveEvent( QMouseEvent *event ); + void mouseReleaseEvent( QMouseEvent *event ); + void mouseDoubleClickEvent( QMouseEvent *event ); + + private: + float board_height; + float point_width; + float point_height; + float home_width; + float board_width; + float checker_size; + float case_width; + float die_size; + float die_spot_size; + + int m_draggingChecker; //when dragging a checker, the pip from which it came; -1 otherwise + double checkerX, checkerY; + + void moveDone(); + int rollDie(); + void rollDice(); + void changePlayer(); + + void error( QString string ); + + void computeMove( int *points, std::vector &dice, std::vector &moveList, int player ); + float pointsScore( int *points, int player ); + bool moveChecker( Move move ); + void moveComputer(); + + std::vector diceInitial; + std::vector diceLeft; + std::vector movesMade; + + bool m_canBearOff [2]; + bool diceRolled; + bool newGame; + + int playerType [2]; + bool autoRoll [2]; + + void definePoints(); + int checkerHit( const QPoint &pos ); + QRect cellRect[28]; + QPoint checkerPosAllowed[28][5]; // allowed checker positions + //only display 5 checkers on each pip. + QRect dieRect [2]; //where the dice are + + QPoint checkerPos; // current checker position + QPoint checkerPosInitial; // checker position before beginning move + int PointCount [28]; //number of checkers on each pip + int initialPointCount [28]; + int staticPointCount [28]; //this is what we draw + + QColor bgColor [6]; + QBrush bgBrush [6]; + + int m_activePlayer; //players are 0 and 1 + inline int activePlayerSign() { return ( 2 * m_activePlayer - 1 ) ; } //their signs are -1 and 1 + + int minDieValue( std::vector &dice ); + int maxDieValue( std::vector &dice ); + std::vector::iterator minDie( std::vector &dice ); + std::vector::iterator maxDie( std::vector &dice ); + + QTimer *m_ClickTimer; + bool m_ClickTimeout; + bool checkerBeingDragged; + bool m_clicked; //button pressed down + + int maxMovePossible; + + float rand1, rand2, rand3, rand4; + + bool isValidSingleMove( int *points, Move move ); + bool isValidTotalMove( int *startpoints, std::vector &move, int maxMovePossible ); + bool movePossible( int *points, std::vector &dice, int player ); + bool canBearOff( int *points, int player ); + int getMaxMovePossible( int *startpoints, std::vector &dice, int player ); + int updateTemps( int *oldPoints, int *newPoints, std::vector &oldDice, std::vector &newDice, int startPoint, std::vector::iterator &die, int player ); + void pushMove( int *newPoints, std::vector &move, std::vector &list ); + +}; + +#endif //BGBOARD_H + + diff --git a/retroshare-gui/src/games/qbackgammon/bgwidget.cpp b/retroshare-gui/src/games/qbackgammon/bgwidget.cpp new file mode 100644 index 000000000..1f1718f7b --- /dev/null +++ b/retroshare-gui/src/games/qbackgammon/bgwidget.cpp @@ -0,0 +1,145 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2007, RetroShare Team + * + * 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 + +#include "bgwidget.h" +#include "bgwindow.h" +#include "bgboard.h" +#include "optionsdlg.h" + +BgWidget::BgWidget() +{ + bgBoard = new BgBoard; + + connect( bgBoard, SIGNAL( gameOver( int ) ), this, SLOT( changeScore( int ) ) ); + connect( bgBoard, SIGNAL( gameOver( int ) ), this, SLOT( newGame() ) ); + + for ( int i = 0; i < 2; ++i ) { + score[ i ] = 0; + name[ i ] = tr( "Player ") + QString::number( i + 1 ) ; + nameLabel[ i ] = new QLabel( name[ i ] ); + scoreLabel[ i ] = new QLabel( QString::number( score[ i ] ) ); + + bgBoard->setAutoRoll( i, false ); + bgBoard->setPlayerType( i, 0 ); + } + + mainGroupBox = new QGroupBox; + QGridLayout *mainLayout = new QGridLayout; + + gridGroupBox = new QGroupBox; + QGridLayout *layout = new QGridLayout; + + layout->addWidget( nameLabel[0], 0, 0 ); + layout->addWidget( nameLabel[1], 1, 0 ); + layout->addWidget( scoreLabel[0], 0, 1 ); + layout->addWidget( scoreLabel[1], 1, 1 ); + + mainLayout->addWidget(bgBoard,0,0,3,3); + mainLayout->addLayout(layout,5,1); + + setLayout(mainLayout); +} + +void BgWidget::undo() +{ + bgBoard->undo(); +} + +void BgWidget::newGame() +{ + bgBoard->startNewGame(); + return; +} + +void BgWidget::changeScore( int points ) +{//points may be positive or negative; if points > 0 current player has won and points added; if points < 0 current player lost, points added to opponent + int player = bgBoard->activePlayer(); + if ( points > 0 ) { + score[ player ] += points; + } + else { + player = 1 - player; + score[ player ] -= points; + } + QString s = QString::number( score[ player ] ); + scoreLabel[ player ]->setText(s); + + QMessageBox::StandardButton reply; + + reply = QMessageBox::information(this, tr("QBackgammon"), name[ player ]+tr( " wins!" ) ); + + return; +} + +void BgWidget::hint() +{ + bgBoard->hint(); + return; +} + +void BgWidget::options() +{ + optionsDlg = new OptionsDlg( ); + for ( int i = 0; i < 6; ++i ) { + optionsDlg->color[ i ] = bgBoard->getColor( i ); + } + + for ( int i = 0; i < 2; ++i ) { + optionsDlg->pLineEdit[ i ]->setText( name[ i ] ); + optionsDlg->pComboBox[ i ]->setCurrentIndex( bgBoard->getPlayerType( i ) ); + + + if ( bgBoard->getAutoRoll( i ) ) { + optionsDlg->autoRollCheckBox[ i ]->setCheckState( Qt::Checked ); + } + else { + optionsDlg->autoRollCheckBox[ i ]->setCheckState( Qt::Unchecked ); + } + } + + + if ( optionsDlg->exec() ) { + QString str0 = optionsDlg->pLineEdit[ 0 ]->text(); + nameLabel[ 0 ]->setText( str0 ); + name[ 0 ] = str0; + QString str1 = optionsDlg->pLineEdit[ 1 ]->text(); + nameLabel[ 1 ]->setText( str1 ); + name[ 1 ] = str1; + + for ( int i = 0; i < 6; ++i ) { + bgBoard->setColor( i, optionsDlg->color[ i ] ); + } + + for ( int i = 0; i < 2; ++i ) { + bgBoard->setPlayerType( i, optionsDlg->pComboBox[ i ]->currentIndex() ); + + if ( optionsDlg->autoRollCheckBox[ i ]->checkState() == Qt::Checked ) { + bgBoard->setAutoRoll( i, true ); + } + else { + bgBoard->setAutoRoll( i, false ); + } + } + } +} + diff --git a/retroshare-gui/src/games/qbackgammon/bgwidget.h b/retroshare-gui/src/games/qbackgammon/bgwidget.h new file mode 100644 index 000000000..cd6b2ee0a --- /dev/null +++ b/retroshare-gui/src/games/qbackgammon/bgwidget.h @@ -0,0 +1,77 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2007, RetroShare Team + * + * 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 BGWIDGET_H +#define BGWIDGET_H + +#include +#include + +class BgBoard; +class QLabel; +class QLCDNumber; +class QGroupBox; +class QLineEdit; +class OptionsDlg; +class QColor; + +class BgWidget : public QWidget +{ + Q_OBJECT + + public: + BgWidget(); + + public slots: + void undo(); + void newGame(); + void changeScore( int ); + void hint(); + void options(); + + signals: + void widget_undoCalled(); + void widget_newGame(); + void widget_hint(); + + private: + BgBoard *bgBoard; + QLabel *labela; + QLabel *labelb; + + QString name [ 2]; + QGroupBox *horizontalGroupBox; + + QGroupBox *gridGroupBox; + QGroupBox *mainGroupBox; + QLabel *nameLabel [2]; + + QLabel *scoreLabel [2]; + QLineEdit *lineEdits [2]; + + int score [2]; + + OptionsDlg *optionsDlg; +}; + + +#endif // BGWIDGET_H + diff --git a/retroshare-gui/src/games/qbackgammon/bgwindow.cpp b/retroshare-gui/src/games/qbackgammon/bgwindow.cpp new file mode 100644 index 000000000..0cc514934 --- /dev/null +++ b/retroshare-gui/src/games/qbackgammon/bgwindow.cpp @@ -0,0 +1,153 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2007, RetroShare Team + * + * 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 + +#include "bgwindow.h" +#include "bgwidget.h" + +BgWindow::BgWindow(QWidget* parent, Qt::WFlags flags) + : QMainWindow(parent, flags) +{ + bgWidget = new BgWidget; + setCentralWidget( bgWidget ); + + createActions(); + createMenus(); + statusBar()->showMessage(tr("Ready")); + + setWindowTitle(tr("QBackgammon")); + resize(600,600); +} + +/** Destructor. */ +BgWindow::~BgWindow() +{ + +} + +void BgWindow::createActions() +{ + newAct = new QAction( tr( "&New Game"), this ); + newAct->setShortcut( tr( "Ctrl+O") ); + undoAct = new QAction( tr( "&Undo" ), this ); + undoAct->setShortcut( tr( "Ctrl+Z") ); + resignAct = new QAction( tr( "Resign" ), this ); + optionsAct = new QAction( tr( "Options" ), this ); + hintAct = new QAction( tr( "Hint" ), this ); + quitAct = new QAction( tr( "Quit" ), this ); + aboutAct = new QAction( tr( "About" ), this ); + + connect( newAct, SIGNAL( triggered() ), this, SLOT(newGame() ) ); + connect( undoAct, SIGNAL( triggered() ), bgWidget, SLOT( undo() )); + connect( resignAct, SIGNAL( triggered() ), this, SLOT( resign() ) ); + connect( optionsAct, SIGNAL( triggered() ), bgWidget, SLOT( options() ) ); + connect( hintAct, SIGNAL( triggered() ), bgWidget, SLOT( hint() ) ); + connect( quitAct, SIGNAL( triggered() ), this, SLOT( quit() ) ); + connect( aboutAct, SIGNAL( triggered() ), this, SLOT( about() ) ); + connect( this, SIGNAL( newGameCalled() ), bgWidget, SLOT( newGame() ) ); +} + +void BgWindow::createMenus() +{ + fileMenu = new QMenu(tr("&File"), this ); + fileMenu->addAction( newAct); + fileMenu->addAction( undoAct ); + fileMenu->addAction( resignAct ); + fileMenu->addAction( optionsAct ); + fileMenu->addAction( hintAct ); + fileMenu->addAction( quitAct ); + fileMenu->addAction( aboutAct ); + + menuBar()->addMenu(fileMenu); +} + +void BgWindow::newGame() +{ + //FIXME check to see if this is a brand new game first + QMessageBox::StandardButton reply; + reply = QMessageBox::question(this, tr("QBackgammon"), + tr("Are you sure you want to start a new game?\n" + "The current one will be lost."), + QMessageBox::Yes | QMessageBox::No ); + if (reply == QMessageBox::Yes) { + bgWidget->newGame(); + } + +} + +void BgWindow::undo() +{ +} + +void BgWindow::resign() +{ + QMessageBox::StandardButton reply; + reply = QMessageBox::question(this, tr("QBackgammon"), + tr("Are you sure you want to resign?"), + QMessageBox::Yes | QMessageBox::No ); + if ( reply == QMessageBox::Yes ) { + bgWidget->changeScore( -1 ); + bgWidget->newGame(); + } +} + +void BgWindow::quit() +{ + QMessageBox::StandardButton reply; + reply = QMessageBox::question(this, tr("QBackgammon"), + tr("Are you sure you want to quit?"), + QMessageBox::Yes | QMessageBox::No ); + if ( reply == QMessageBox::Yes ) { + emit callQuit(); + } + + + +} + +void BgWindow::about() +{ + QMessageBox::StandardButton reply; + reply = QMessageBox::information( this, tr( "QBackgammon" ), + tr("QBackgammon\n(C) Daren Sawkey 2006\ndaren@sawkey.net\nReleased under GPL"), + QMessageBox::Ok ); + return; +} + +void BgWindow::show() +{ + + if(!this->isVisible()) { + QMainWindow::show(); + } else { + QMainWindow::activateWindow(); + setWindowState(windowState() & ~Qt::WindowMinimized | Qt::WindowActive); + QMainWindow::raise(); + } + +} + +void BgWindow::closeEvent (QCloseEvent * event) +{ + hide(); + event->ignore(); +} \ No newline at end of file diff --git a/retroshare-gui/src/games/qbackgammon/bgwindow.h b/retroshare-gui/src/games/qbackgammon/bgwindow.h new file mode 100644 index 000000000..bebde0338 --- /dev/null +++ b/retroshare-gui/src/games/qbackgammon/bgwindow.h @@ -0,0 +1,87 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2007, RetroShare Team + * + * 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 BGWINDOW_H +#define BGWINDOW_H + +#include + +class QAction; +class QLabel; +class QMenu; +class QTextEdit; +class QPushButton; +class BgWidget; + +class BgWindow : public QMainWindow +{ + Q_OBJECT + + public: + //BgWindow(); + + /** Default Constructor */ + BgWindow(QWidget *parent = 0, Qt::WFlags flags = 0); + + /** Destructor. */ + ~BgWindow(); + + signals: + void undoCalled(); + void newGameCalled(); + void WchangeScore(); + void callQuit(); + +protected: + void closeEvent (QCloseEvent * event); + + public slots: + /** Called when this dialog is to be displayed */ + void show(); + + private slots: + void newGame(); + void undo(); + void quit(); + void resign(); + void about(); + + private: + void createActions(); + void createMenus(); + void updateActions(); + + BgWidget *bgWidget; + + QAction *newAct; + QAction *undoAct; + QAction *resignAct; + QAction *hintAct; + QAction *quitAct; + QAction *optionsAct; + QAction *aboutAct; + + QMenu *fileMenu; + + +}; + +#endif diff --git a/retroshare-gui/src/games/qbackgammon/optionsdlg.cpp b/retroshare-gui/src/games/qbackgammon/optionsdlg.cpp new file mode 100644 index 000000000..e6f8cc184 --- /dev/null +++ b/retroshare-gui/src/games/qbackgammon/optionsdlg.cpp @@ -0,0 +1,142 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2007, RetroShare Team + * + * 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 + +#include "optionsdlg.h" + +OptionsDlg::OptionsDlg( QWidget *parent ) + : QDialog( parent ) +{ + rowLayout[ 0 ] = new QHBoxLayout; + rowLayout[ 1 ] = new QHBoxLayout; + rowLayout[ 2 ] = new QHBoxLayout; + rowLayout[ 3 ] = new QHBoxLayout; + + for ( int i = 0; i < 2; ++i ) { + QString str = "Player " + QString::number( i + 1 ); + pGroupBox[ i ] = new QGroupBox( str ); + pLineEdit[ i ] = new QLineEdit; + pColorButton[ i ] = new QPushButton( tr( "Color" ) ); + pComboBox[ i ] = new QComboBox; + pComboBox[ i ]->addItem( tr( "Human" ) ); + pComboBox[ i ]->addItem( tr( "Computer" ) ); + autoRollCheckBox[ i ] = new QCheckBox( tr( "auto roll" ) ); + + rowLayout[ i ]->addWidget( pLineEdit[ i ] ); + rowLayout[ i ]->addWidget( pColorButton[ i ] ); + rowLayout[ i ]->addWidget( pComboBox[ i ] ); + rowLayout[ i ]->addWidget( autoRollCheckBox[ i ] ); + pGroupBox[ i ]->setLayout( rowLayout[ i ] ); + } + + + + colorGroupBox = new QGroupBox( tr( "Colors" ) ); + colorLabel = new QLabel( tr( "Colors:" ) ); + color1Button = new QPushButton( tr( "Points (1)" ) ); + color2Button = new QPushButton( tr( "Points (2)" ) ); + color3Button = new QPushButton( tr( "Board" ) ); + color4Button = new QPushButton( tr( "Case" ) ); + + rowLayout[ 2 ]->addWidget( color1Button ); + rowLayout[ 2 ]->addWidget( color2Button ); + rowLayout[ 2 ]->addWidget( color3Button ); + rowLayout[ 2 ]->addWidget( color4Button ); + colorGroupBox->setLayout( rowLayout[ 2 ] ); + + + okButton = new QPushButton( tr( "Ok" ) ); + cancelButton = new QPushButton( tr( "Cancel" ) ); + okButton->setDefault( true ); //FIXME why doesn't this work? + okButton->setFocus(); + + rowLayout[ 3 ]->addStretch( 1 ); + rowLayout[ 3 ]->addWidget( okButton ); + rowLayout[ 3 ]->addWidget( cancelButton ); + + + QVBoxLayout *mainLayout = new QVBoxLayout; + + mainLayout->addWidget( pGroupBox[ 0 ] ); + mainLayout->addWidget( pGroupBox[ 1 ] ); + mainLayout->addWidget( colorGroupBox ); + mainLayout->addLayout( rowLayout[ 3 ] ); + + setLayout( mainLayout ); + + connect( okButton, SIGNAL( clicked() ), this, SLOT( accept() ) ); + connect( cancelButton, SIGNAL( clicked() ), this, SLOT( reject() ) ); + connect( pColorButton[ 0 ], SIGNAL( clicked() ), this, SLOT( setColor0() ) ); + connect( pColorButton[ 1 ], SIGNAL( clicked() ), this, SLOT( setColor1() ) ); + connect( color1Button, SIGNAL( clicked() ), this, SLOT( setColor2() ) ); + connect( color2Button, SIGNAL( clicked() ), this, SLOT( setColor3() ) ); + connect( color3Button, SIGNAL( clicked() ), this, SLOT( setColor4() ) ); + connect( color4Button, SIGNAL( clicked() ), this, SLOT( setColor5() ) ); + +} + + +OptionsDlg::~OptionsDlg() +{ +} + +void OptionsDlg::setColor0()//FIXME how to make these functions into a single 1? (problem, how to connect the pushbuttons) +{ + QColor newColor = QColorDialog::getColor( color[ 0 ], this); + if ( newColor.isValid() ) + color[ 0 ] = newColor; +} + +void OptionsDlg::setColor1() +{ + QColor newColor = QColorDialog::getColor( color[ 1 ], this); + if ( newColor.isValid() ) + color[ 1 ] = newColor; +} + +void OptionsDlg::setColor2() +{ + QColor newColor = QColorDialog::getColor( color[ 2 ], this); + if ( newColor.isValid() ) + color[ 2 ] = newColor; +} + +void OptionsDlg::setColor3() +{ + QColor newColor = QColorDialog::getColor( color[ 3 ], this); + if ( newColor.isValid() ) + color[ 3 ] = newColor; +} + +void OptionsDlg::setColor4() +{ + QColor newColor = QColorDialog::getColor( color[ 4 ], this); + if ( newColor.isValid() ) + color[ 4 ] = newColor; +} + +void OptionsDlg::setColor5() +{ + QColor newColor = QColorDialog::getColor( color[ 5 ], this); + if ( newColor.isValid() ) + color[ 5 ] = newColor; +} diff --git a/retroshare-gui/src/games/qbackgammon/optionsdlg.h b/retroshare-gui/src/games/qbackgammon/optionsdlg.h new file mode 100644 index 000000000..62365ac2a --- /dev/null +++ b/retroshare-gui/src/games/qbackgammon/optionsdlg.h @@ -0,0 +1,77 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2007, RetroShare Team + * + * 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 OPTIONSDLG_H +#define OPTIONSDLG_H + +#include + +class QLabel; +class QLineEdit; +class QGroupBox; +class QPushButton; +class QHBoxLayout; +class QComboBox; +class QCheckBox; + +class OptionsDlg : public QDialog +{ + Q_OBJECT + + public: + OptionsDlg( QWidget *parent = 0 ); + + ~OptionsDlg(); + QLineEdit *pLineEdit [2]; + + QColor color [6]; + QComboBox *pComboBox [2]; + + QCheckBox *autoRollCheckBox [2]; + + public slots: + void setColor0(); + void setColor1(); + void setColor2(); + void setColor3(); + void setColor4(); + void setColor5(); + + private: + QGroupBox *pGroupBox [2]; + QGroupBox *colorGroupBox; + + QPushButton *pColorButton [2]; + + QLabel *colorLabel; + QPushButton *color1Button; + QPushButton *color2Button; + QPushButton *color3Button; + QPushButton *color4Button; + + + QPushButton *okButton; + QPushButton *cancelButton; + + QHBoxLayout *rowLayout [4]; +}; + +#endif diff --git a/retroshare-gui/src/games/qcheckers/AUTHORS b/retroshare-gui/src/games/qcheckers/AUTHORS new file mode 100644 index 000000000..fd88dae2a --- /dev/null +++ b/retroshare-gui/src/games/qcheckers/AUTHORS @@ -0,0 +1,7 @@ +Andi Peredri +Artur Wiebe + +Contributors: + Sebastien Prud'homme + Guillaume Bedot french translations + diff --git a/retroshare-gui/src/games/qcheckers/COPYING b/retroshare-gui/src/games/qcheckers/COPYING new file mode 100644 index 000000000..c7aea1896 --- /dev/null +++ b/retroshare-gui/src/games/qcheckers/COPYING @@ -0,0 +1,280 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 675 Mass Ave, Cambridge, MA 02139, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS diff --git a/retroshare-gui/src/games/qcheckers/ChangeLog b/retroshare-gui/src/games/qcheckers/ChangeLog new file mode 100644 index 000000000..bf066f66c --- /dev/null +++ b/retroshare-gui/src/games/qcheckers/ChangeLog @@ -0,0 +1,70 @@ +2005-12-29 Artur Wiebe + * toplevel.cc, view.h: Removed unused slots. + * Renamed info to histrory. + * history.cc: Removed useless code. + +2005-12-19 Artur Wiebe + * KCheckers 0.8 released. + * Added support for free men placement at the beginning of the game. + * Added multiple undos/redos: free movement in move history. + * Removed network code: there will be network in the next version. + * See below for more changes since 0.6. + +2005-09-09 Artur Wiebe + * KCheckers 0.7 is done - will not be released. + * Ported to Qt 4.0. So watch out for more bugs. + * Added basic Theme support. + * Improved thread termination. + * Redesigned GUI. + * echeckers.cc: Fixed bug: man reaching the king row became king and + continued move. + * Improved PDN support. Can now re-play games. + +2005-04-11 Artur Wiebe + * KCheckers 0.6 released. + * New game mode: Human vs. Human. + * Added Info widget next to game's board. + * Added different board sizes. + * Rewrote menubar and toolbar code. + * Rewrote network code. + * Fixed some bugs, introduced new. + +2004-08-08 Artur Wiebe + * KCheckers 0.5 released. + * Machine thinks in a thread now. + * Added Internationalization support. + * Added Network support. + * Altered GUI interface to match KDE specifications. + * Extended Preview in File Open Dialog. + * Various improvements. + +2003-01-15 Andi Peredri + * KCheckers 0.4 released. + * Added support for Portable Draughts Notation database format. + * Added saving, loading and restarting of game. + * Added PDN preview widget. + * Added 20 PDN compositions. + * Added game information box. + * Various improvements. + +2002-06-10 Andi Peredri + * KCheckers 0.3 released. + * Ported to Qt 3. + * Added toolbar. + * Added green theme of the board. + * Added undo of last move. + * Added auto saving of settings. + * Added optional notation of the board. + +2002-03-10 Andi Peredri + * KCheckers 0.2 released. + * Ported to pure Qt. + * KCheckers engine improvements. + * Added support of english checkers. + * Added wooden theme of the board. + * Added auto change of the men's color. + * Added on-line description of the play's rules. + +2002-01-15 Andi Peredri + * Initial Release. + diff --git a/retroshare-gui/src/games/qcheckers/FAQ b/retroshare-gui/src/games/qcheckers/FAQ new file mode 100644 index 000000000..63df0fbcd --- /dev/null +++ b/retroshare-gui/src/games/qcheckers/FAQ @@ -0,0 +1,49 @@ +What is my IP address? +---------------------- +Run ifconfig and loop for the eth0/ppp0/ippp0 entry. The second line starts +with "inet addr". That's your IP address! + + +How to create a themes? +----------------------- +There are two places you can put your own theme directories: +$SHARE/themes or $HOME/.kcheckers/themes. $SHARE is /usr/local/kcheckers on +default. simply create a directory there that contains the following files: + tile1.png - unused tiles. + tile2.png - where men are placed. + frame.png - around selected man. + manblack.png - + manwhite.png - + kingblack.png - + kingwhite.png - + theme - the first line should be the default/english name + - of the theme. This will be used if the correct locale + - name should not be found. + - Locale specific names can be provided with the + - following syntax: [locale]=Theme Name. + - Example theme file: + - Line 1) This is a default theme name + - Line 2) [de_DE]=Das ist Deutsch + - Line 2) [en]=This is English +Directory name will be shown as theme name. All pictures are the same size. + + +My theme is not loaded. Why? +---------------------------- +Start kcheckers in a x-terminal. Watch out for errors otherwise send me your +compressed theme directory. + + +PDN. +---- +Because draught is a fast (compared to chess) game there are less situations +one will save a game. Nevertheless, this is possible in kcheckers. + +Now, imagine you want to see how a match on the last WCM was played. You simply +open the PDN file, select the game you are interested in from the list and +click move after a move and watch how the men on the board are moved. + +If you want to continue a game at certain position, no problem, click on the +"Continue" button in toolbar. But consider who is next on turn, what kind of +game (against computer or human) you are playing. + diff --git a/retroshare-gui/src/games/qcheckers/README b/retroshare-gui/src/games/qcheckers/README new file mode 100644 index 000000000..a1f9620c1 --- /dev/null +++ b/retroshare-gui/src/games/qcheckers/README @@ -0,0 +1,83 @@ + + KCheckers is a Qt-based checkers board game. + + Requirements: Qt 3.0 + + Installation: Read INSTALLS for more information. + + Information: If you find any bugs, send a report to wibix@gmx.de. + For further information and recent versions of KCheckers, + please visit it's Homepage at + + http://kcheckers.org + http://kcheckers.wibix.de + + Usage: Read FAQ for more information. + + PDN Format: For storing the positions of games KCheckers uses the + Portable Draughts Notation (PDN) database format. It is + used by many other checkers programs, and is becoming + the standard way to swap games. + + PDN is based on the Portable Game Notation (PGN) standard + which is widely used for Chess. + + For details see http://www.chessandcheckers.com/pdn.htm + + ----------------------------------------------------------------------- + PDN File: [Event "Game 1"] + [Black "Nemet,A"] + [White "Terens,B"] + [Date "11.05.2002"] + [Result "1-0"] + [GameType "21"] + [SetUp "1"] + [FEN "W:WK4,28:BK11,19."] + + 1. 4-8 11x4 2. 28-24 19x28 {black win...} 1-0 + + ----------------------------------------------------------------------- + Results: 1-0 White wins + 0-1 Black wins + 1/2-1/2 Drawn game + * Unfinished game + + ----------------------------------------------------------------------- + Game Types: 0: Chess + 1: Chinese chess + 2-19: Future chess expansion + 20: International draughts + 21: English draughts + 22: Italian draughts + 23: American pool + 24: Spanish draughts + 25: Russian draughts + 26: Brazilian draughts + 27: Canadian draughts + 28: Portugese draughts + 29-49: Future draughts expansion + 50: Othello + + ----------------------------------------------------------------------- + FEN: If a game starts from a set-up position, a Forsyth-Edwards + Notation (FEN) header is given with the position. + + W Turn + :W White pieces + K4 King on field 4 + 28 Man on field 28 + :B Black pieces + + ----------------------------------------------------------------------- + Rules: Board BackCapture MoveKing TakeMax + International 10x10 + >1 + + English 8x8 kings 1 - + Italian 8x8 kings 1 + + American pool 8x8 + >1 - + Spanish 8x8 kings >1 + + Russian 8x8 + >1 - + Brasilian 8x8 + >1 + + Canadian 12x12 + >1 + + + ----------------------------------------------------------------------- + diff --git a/retroshare-gui/src/games/qcheckers/board.cc b/retroshare-gui/src/games/qcheckers/board.cc new file mode 100644 index 000000000..7b20f1d92 --- /dev/null +++ b/retroshare-gui/src/games/qcheckers/board.cc @@ -0,0 +1,364 @@ +/*************************************************************************** + * Copyright (C) 2004-2005 Artur Wiebe * + * wibix@gmx.de * + * * + * 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., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include +#include + +#include "board.h" +#include "common.h" +#include "pdn.h" +#include "echeckers.h" +#include "rcheckers.h" +/* +#include "newgamedlg.h" + +#include "player.h" +#include "humanplayer.h" +#include "computerplayer.h" +*/ + + +myBoard::myBoard(QWidget* parent) + : QFrame(parent) +{ + /* + * board & info + */ + setFrameStyle(QFrame::Box|QFrame::Plain); + for(int i=0; i<64; i++) + m_fields[i] = new Field(this, i); + + QGridLayout* grid = new QGridLayout(this); + grid->setSpacing(0); + grid->setMargin(0); + for(int i=0; i<4; i++) { + for(int k=0; k<4; k++) { + grid->addWidget(m_fields[i*8+k+32], i*2, k*2 ); + grid->addWidget(m_fields[i*8+k ], i*2, k*2+1); + grid->addWidget(m_fields[i*8+k+4 ], i*2+1,k*2 ); + grid->addWidget(m_fields[i*8+k+36], i*2+1,k*2+1); + } + } + + for(int i=0; i<32; i++) + connect(m_fields[i], SIGNAL(click(int)), + this, SIGNAL(fieldClicked(int))); + + + /* + * game init + */ + m_game = 0; + + xpmPat1 = 0; + xpmPat2 = 0; + xpmFrame= 0; + xpmManBlack = 0; + xpmManWhite = 0; + xpmKingBlack= 0; + xpmKingWhite= 0; +} + + +myBoard::~myBoard() +{ + if(m_game) + delete m_game; +} + + +void myBoard::setTheme(const QString& path, bool set_white) +{ + // delete them later. + QPixmap* p1 = xpmManWhite; + QPixmap* p2 = xpmManBlack; + QPixmap* p3 = xpmKingWhite; + QPixmap* p4 = xpmKingBlack; + QPixmap* p5 = xpmPat1; + QPixmap* p6 = xpmPat2; + QPixmap* p7 = xpmFrame; + + if(path == DEFAULT_THEME) { + // just in case no themes installed. + xpmPat1 = new QPixmap(":/icons/theme/tile1.png"); + xpmPat2 = new QPixmap(":/icons/theme/tile2.png"); + xpmFrame= new QPixmap(":/icons/theme/frame.png"); + xpmManBlack = new QPixmap(":/icons/theme/manblack.png"); + xpmManWhite = new QPixmap(":/icons/theme/manwhite.png"); + xpmKingBlack= new QPixmap(":/icons/theme/kingblack.png"); + xpmKingWhite= new QPixmap(":/icons/theme/kingwhite.png"); + } else { + xpmPat1 = new QPixmap(path+"/"THEME_TILE1); + xpmPat2 = new QPixmap(path+"/"THEME_TILE2); + xpmFrame= new QPixmap(path+"/"THEME_FRAME); + xpmManBlack + = new QPixmap(path+"/"THEME_MANBLACK); + xpmManWhite + = new QPixmap(path+"/"THEME_MANWHITE); + xpmKingBlack + = new QPixmap(path+"/"THEME_KINGBLACK); + xpmKingWhite + = new QPixmap(path+"/"THEME_KINGWHITE); + } + + setColorWhite(set_white); + + for(int i=0; i<32; i++) + m_fields[i]->setPattern(xpmPat2); + for(int i=32; i<64; i++) + m_fields[i]->setPattern(xpmPat1); + for(int i=0; i<32; i++) + m_fields[i]->setFrame(xpmFrame); + + setFixedSize(xpmMan1->width()*8 + 2*frameWidth(), + xpmMan1->height()*8 + 2*frameWidth()); + + if(m_game) + do_draw(); + + // now delete. + if(p1) delete p1; + if(p2) delete p2; + if(p3) delete p3; + if(p4) delete p4; + if(p5) delete p5; + if(p6) delete p6; + if(p7) delete p7; +} + + +void myBoard::reset() +{ + int new_board[32]; + + for(int i=0; i<12; i++) + new_board[i]=MAN2; + for(int i=12; i<20; i++) + new_board[i]=FREE; + for(int i=20; i<32; i++) + new_board[i]=MAN1; + + // reset frames. + for(int i=0; i<32; i++) + m_fields[i]->showFrame(false); + + if(m_game) + m_game->setup(new_board); + + do_draw(); +} + + +void myBoard::adjustNotation(bool bottom_is_white) +{ + if(!m_game) + return; + + QString notation = (m_game->type()==ENGLISH + ? ENOTATION : QString(RNOTATION).toUpper()); + + if(bottom_is_white) { + for(int i=0; i<32; i++) + m_fields[i]->setLabel(notation.mid(i*2,2).trimmed()); + } else { + for(int i=0; i<32; i++) + m_fields[i]->setLabel(notation.mid(62-i*2,2).trimmed()); + } +} + + +void myBoard::do_draw() +{ + for(int i=0; i<32; i++) { + switch(m_game->item(i)) { + case MAN1: + m_fields[i]->setPicture(xpmMan1); + break; + case MAN2: + m_fields[i]->setPicture(xpmMan2); + break; + case KING1: + m_fields[i]->setPicture(xpmKing1); + break; + case KING2: + m_fields[i]->setPicture(xpmKing2); + break; + default: + m_fields[i]->setPicture(NULL); + } + } +} + + +void myBoard::setColorWhite(bool b) +{ + if(b) { + xpmMan1 = xpmManWhite; + xpmMan2 = xpmManBlack; + xpmKing1= xpmKingWhite; + xpmKing2= xpmKingBlack; + } else { + xpmMan1 = xpmManBlack; + xpmMan2 = xpmManWhite; + xpmKing1= xpmKingBlack; + xpmKing2= xpmKingWhite; + } +} + +void myBoard::setNotation(bool s, bool above) +{ + for(int i=0; i<32; i++) + m_fields[i]->showLabel(s, above); +} + +/* +void myBoard::do_move(const QString& move) +{ + qDebug() << __PRETTY_FUNCTION__; + if(!m_current->isHuman()) { + add_log(myBoard::Warning, tr("It's not your turn.")); + return; + } + + int from_num, to_num; + if(extract_move(move, &from_num, &to_num)) { + slot_click(from_num); + slot_click(to_num); + } else + add_log(myBoard::Warning, tr("Syntax error. Usage: /from-to")); +} + */ + + + +bool myBoard::convert_move(const QString& move_orig, int* from_num, int* to_num) +{ + QString move = move_orig.toUpper().replace('X', '-'); + QString from; + QString to; + int sect = move.count('-'); + + *from_num = *to_num = -1; + + from = move.section('-', 0, 0); + to = move.section('-', sect, sect); + + if(from!=QString::null && to!=QString::null) { + for(int i=0; i<32; i++) { + if(m_fields[i]->label()==from) + *from_num = m_fields[i]->number(); + if(m_fields[i]->label()==to) + *to_num = m_fields[i]->number(); + } + + if(*from_num>=0 && *to_num>=0) + return true; + } + + return false; +} + + +void myBoard::setNotationFont(const QFont& f) +{ + setFont(f); + for(int i=0; i<32; i++) + m_fields[i]->fontUpdate(); +} + + +void myBoard::setGame(int rules) +{ + if(m_game) + delete m_game; + + if(rules==ENGLISH) { + m_game = new ECheckers(); + } else { + m_game = new RCheckers(); + } + + reset(); +} + + +void myBoard::selectField(int field_num, bool is_on) +{ + for(int i=0; i<32; i++) { + if(i==field_num) + m_fields[i]->showFrame(is_on); + else + m_fields[i]->showFrame(false); + } +} + + +QString myBoard::doMove(int from_num, int to_num, bool white_player) +{ + bool bottom_player = (white_player && (xpmMan1==xpmManWhite)) + || (!white_player && (xpmMan1==xpmManBlack)); + + int from_pos = from_num; + int to_pos = to_num; + + if(!bottom_player) { + from_pos = 31-from_pos; + to_pos = 31-to_pos; + m_game->fromString(m_game->toString(true)); + } + if(!m_game->go1(from_pos, to_pos)) { + return QString::null; + /* + qDebug() << __PRETTY_FUNCTION__ + << from_pos << "," << to_pos + << " could not move."; + */ + } + if(!bottom_player) { + m_game->fromString(m_game->toString(true)); + } + + do_draw(); + + return QString("%1?%3") + .arg(m_fields[from_num]->label()) + .arg(m_fields[to_num]->label()); +} + + +bool myBoard::doMove(const QString& move, bool white_player) +{ + int from_pos, to_pos; + if(convert_move(move, &from_pos, &to_pos)) { + doMove(from_pos, to_pos, white_player); + return true; + } + return false; +} + + +void myBoard::doFreeMove(int from, int to) +{ + int old_to = m_game->item(to); + int old_from = m_game->item(from); + m_game->setItem(to, old_from); + m_game->setItem(from, old_to); + do_draw(); +} + diff --git a/retroshare-gui/src/games/qcheckers/board.h b/retroshare-gui/src/games/qcheckers/board.h new file mode 100644 index 000000000..2273761b1 --- /dev/null +++ b/retroshare-gui/src/games/qcheckers/board.h @@ -0,0 +1,94 @@ +/*************************************************************************** + * Copyright (C) 2004-2005 Artur Wiebe * + * wibix@gmx.de * + * * + * 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., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + + +#include + +#include "field.h" +#include "checkers.h" + + +class myBoard : public QFrame +{ + Q_OBJECT + +public: + myBoard(QWidget* parent); + ~myBoard(); + + // returns coded move string: from_pos_string?to_pos_string + QString doMove(int from_pos, int to_pos, bool white_player); + // coded move. + bool doMove(const QString& move, bool white_player); + // + void doFreeMove(int from, int to); + + void selectField(int field_num, bool is_on); + + void setTheme(const QString& theme_path, bool set_white); + + void setNotation(bool enabled, bool show_above); + void setNotationFont(const QFont& f); + + void setColorWhite(bool); + void reset(); + void adjustNotation(bool bottom_is_white); + + void setGame(int rules); + + bool whiteIsNext() const; + + int type() const { return m_game->type(); } + // TODO + const Checkers* game() const { return m_game; } + +signals: + void fieldClicked(int); + +private: + bool convert_move(const QString&, int* from, int* to); + void do_draw(); + +private: + Field* m_fields[64]; + + QPixmap* xpmPat1; + QPixmap* xpmPat2; + QPixmap* xpmFrame; + + QPixmap* xpmMan1; + QPixmap* xpmMan2; + QPixmap* xpmKing1; + QPixmap* xpmKing2; + + QPixmap* xpmManBlack; + QPixmap* xpmManWhite; + QPixmap* xpmKingBlack; + QPixmap* xpmKingWhite; + + Checkers* m_game; +}; + + +#endif + diff --git a/retroshare-gui/src/games/qcheckers/checkers.cc b/retroshare-gui/src/games/qcheckers/checkers.cc new file mode 100644 index 000000000..b3dd35489 --- /dev/null +++ b/retroshare-gui/src/games/qcheckers/checkers.cc @@ -0,0 +1,451 @@ +/*************************************************************************** + * Copyright (C) 2002-2003 Andi Peredri * + * andi@ukr.net * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 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., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +// +// KCheckers Engine + +// +// Internal: External: +// +// Board = 54 Fields: Board = 32 Fields: +// +// | 06 07 08 09| MAN2 | 00 01 02 03| +// |11 12 13 14 | |04 05 06 07 | +// | 17 18 19 20| | 08 09 10 11| +// |22 23 24 25 | |12 13 14 15 | +// | 28 29 30 31| | 16 17 18 19| +// |33 34 35 36 | |20 21 22 23 | +// | 39 40 41 42| | 24 25 26 27| +// |44 45 46 47 | MAN1 |28 29 30 31 | + +#include +#include + +#include + +#include "checkers.h" + + +int Checkers::internal(int external) const +{ + const int i[]={6,7,8,9,11,12,13,14,17,18,19,20,22,23,24,25, + 28,29,30,31,33,34,35,36,39,40,41,42,44,45,46,47}; + return i[external]; +} + + +/* +int Checkers::external(int internal) const +{ + const int i[]={ + -1,-1,-1,-1,-1,-1,0,1,2,3, // 0-9 internal + -1,4,5,6,7,-1,-1,8,9,10, // 10-19 + 11,-1,12,13,14,15,-1,-1,16,17, // 20-29 + 18,19,-1,20,21,22,23,-1,-1,24, // 30-39 + 25,26,27,-1,28,29,30,31,-1,-1, // 40-49 + -1,-1,-1,-1}; // 50-53 + return i[internal]; +} +*/ + + +Checkers::Checkers() +{ + for(int i=0;i<54;i++) board[i] = NONE; + + for(int i=0; i<12; i++) board[internal(i)] = MAN2; + for(int i=12; i<20; i++) board[internal(i)] = FREE; + for(int i=20; i<32; i++) board[internal(i)] = MAN1; + + levelmax = 2; + + srand(time(0)); // Seed the random number generator +} + + +bool Checkers::setup(int setupboard[]) +{ + /*aw - caused problems + int sum1=0; // Sum of MAN1 & KING1 + int sum2=0; // Sum of MAN2 & KING2 + + for(int i=0; i<32; i++) { + switch(setupboard[i]) { + case MAN1: + case KING1: sum1++; break; + case MAN2: + case KING2: sum2++; break; + + case FREE: break; + + default: return false; + } + } + + if(sum1>12 || sum1==0 || sum2>12 || sum2==0) + return false; + + for(int i=0; i<4; i++) + if(setupboard[i]==MAN1) return false; + + for(int i=28; i<32; i++) + if(setupboard[i]==MAN2) return false; + */ + + for(int i=0; i<32; i++) + board[internal(i)] = setupboard[i]; + + return true; +} + + +/////////////////////////////////////////////////// +// +// Player Functions +// +/////////////////////////////////////////////////// + + +bool Checkers::checkMove1() const +{ + for(int i=6;i<48;i++) + if(checkMove1(i)) + return true; + return false; +} + + +bool Checkers::checkMove1(int i) const +{ + switch(board[i]) { + case MAN1: + if(board[i-6]==FREE) return true; + if(board[i-5]==FREE) return true; + break; + case KING1: + if(board[i-6]==FREE) return true; + if(board[i-5]==FREE) return true; + if(board[i+5]==FREE) return true; + if(board[i+6]==FREE) return true; + } + return false; +} + + +//////////////////////////////////////////////////// +// +// Computer Functions +// +//////////////////////////////////////////////////// + + +void Checkers::go2() +{ + // + level=0; + for(int i=6;i<48;i++) + bestboard[i] = board[i]; + turn(); + for(int i=6;i<48;i++) + board[i] = bestboard[i]; + ; +} + + +void Checkers::turn(int& resMax, bool capture) +{ + if(levelresMax) { + resMax=res; + if(level==1) { + for(int i=6;i<48;i++) bestboard[i]=board[i]; + bestcounter=1; + } + } else if(res==resMax && level==1) { + bestcounter++; + if((rand()%bestcounter)==0) { + for(int i=6;i<48;i++) bestboard[i]=board[i]; + } + } + + if(capture) { + if(f12) board[12]=NONE; + if(f13) board[13]=NONE; + if(f14) board[14]=NONE; + if(f17) board[17]=NONE; + if(f18) board[18]=NONE; + if(f19) board[19]=NONE; + if(f23) board[23]=NONE; + if(f24) board[24]=NONE; + if(f25) board[25]=NONE; + if(f28) board[28]=NONE; + if(f29) board[29]=NONE; + if(f30) board[30]=NONE; + if(f34) board[34]=NONE; + if(f35) board[35]=NONE; + if(f36) board[36]=NONE; + if(f39) board[39]=NONE; + if(f40) board[40]=NONE; + if(f41) board[41]=NONE; + } + } + else if(resMax<0) resMax=0; +} + + +bool Checkers::checkMove2() const +{ + for(int i=6;i<48;i++) { + switch(board[i]) { + case MAN2: + if(board[i+5]==FREE) return true; + if(board[i+6]==FREE) return true; + break; + case KING2: + if(board[i-6]==FREE) return true; + if(board[i-5]==FREE) return true; + if(board[i+5]==FREE) return true; + if(board[i+6]==FREE) return true; + } + } + return false; +} + + +int Checkers::turn() +{ + int resMax=(level-levelmax)*10; + level++; + + if(checkCapture2()) { + for(int i=6; i<48; i++) { + switch(board[i]) { + case MAN2: + manCapture2(i, resMax); + break; + case KING2: + kingCapture2(i,UL,resMax); + kingCapture2(i,UR,resMax); + kingCapture2(i,DL,resMax); + kingCapture2(i,DR,resMax); + } + } + + } else if(checkMove2()) { + for(int i=6;i<48;i++) { + switch(board[i]) { + case MAN2: + if(board[i+5]==FREE) { // down left + board[i]=FREE; + if(i>38) + board[i+5]=KING2; + else + board[i+5]=MAN2; + turn(resMax); + board[i+5]=FREE; + board[i]=MAN2; + } + if(board[i+6]==FREE) { // down right + board[i]=FREE; + if(i>38) + board[i+6]=KING2; + else + board[i+6]=MAN2; + turn(resMax); + board[i+6]=FREE; + board[i]=MAN2; + } + break; + case KING2: + kingMove2(i,resMax); + break; + } + } + + } else ; + + level--; + return resMax; +} + + +QString Checkers::toString(bool rotate) const +{ + int fields[32]; + int it; + + for(int i=0; i<32; i++) { + it = item(i); + if(rotate) + fields[31-i] = (~it&7)-1; + else + fields[i] = it; + } + + QString str; + for(int i=0; i<32; i++) + str += QString("").sprintf("%.2u", fields[i]); + + return str; +} + + +bool Checkers::fromString(const QString& str) +{ + int fields[32]; + + for(int i=0; i<32; i++) + fields[i] = str.mid(i*2, 2).toInt(); + + // apply + if(!setup(fields)) { + qDebug() << "Checkers::fromString:" << str; + return false; + } + + return true; +} + diff --git a/retroshare-gui/src/games/qcheckers/checkers.h b/retroshare-gui/src/games/qcheckers/checkers.h new file mode 100644 index 000000000..c9381e533 --- /dev/null +++ b/retroshare-gui/src/games/qcheckers/checkers.h @@ -0,0 +1,105 @@ +/*************************************************************************** + * Copyright (C) 2002-2003 Andi Peredri * + * andi@ukr.net * + * Copyright (C) 2004-2005 Artur Wiebe * + * wibix@gmx.de * + * * + * 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., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#ifndef CHECKERS_H +#define CHECKERS_H + + +#include + + +// do not change - hard coded +#define NONE 0 +#define MAN1 1 +#define KING1 2 +#define FREE 3 +#define KING2 4 +#define MAN2 5 +#define FULL 6 + +#define UL -6 +#define UR -5 +#define DL 5 +#define DR 6 + + +class Checkers +{ +public: + Checkers(); + virtual ~Checkers() {} + + bool setup(int setupboard[]); + virtual bool go1(int from, int to)=0; + + void go2(); + + void setSkill(int i) { levelmax=i; }; + int skill() const { return levelmax; } + virtual int type() const = 0; + + int item(int i) const { return board[internal(i)]; } + void setItem(int i, int item) { board[internal(i)] = item; } + + // string representation of the game board. + // set rotate to switch player sides. + QString toString(bool rotate) const; + bool fromString(const QString&); + + // checks for a capture/move for particular stone in external + // representation. human player only. + bool canCapture1(int i) { return checkCapture1(internal(i)); } + bool canMove1(int i) { return checkMove1(internal(i)); } + + bool checkMove1() const; + bool checkMove2() const; + virtual bool checkCapture1() const = 0; + virtual bool checkCapture2() const = 0; + +protected: + bool checkMove1(int) const; + virtual bool checkCapture1(int) const = 0; + + int level; // Current level + int levelmax; // Maximum level + + int turn(); + void turn(int&, bool capture=false); + + int to; + int board[54]; + int bestboard[54]; + int bestcounter; + + virtual void kingMove2(int,int &)=0; + + virtual bool manCapture2(int,int &)=0; + virtual bool kingCapture2(int,int,int &)=0; + + virtual bool manCapture1(int,int,bool &)=0; + virtual bool kingCapture1(int,int,bool &)=0; + + int internal(int) const; // Return internal board position +}; + + +#endif diff --git a/retroshare-gui/src/games/qcheckers/common.h b/retroshare-gui/src/games/qcheckers/common.h new file mode 100644 index 000000000..8b34655f5 --- /dev/null +++ b/retroshare-gui/src/games/qcheckers/common.h @@ -0,0 +1,61 @@ +/*************************************************************************** + * Copyright (C) 2004-2005 Artur Wiebe * + * wibix@gmx.de * + * * + * 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., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#ifndef _COMMON_H_ +#define _COMMON_H_ + + +#define APPNAME "QCheckers" +#define VERSION "0.8.1" +#define EXT "pdn" + + +#define HOMEPAGE "http://kcheckers.org" +#define COPYRIGHT "(c) 2002-2003, Andi Peredri (andi@ukr.net)
    " \ + "(c) 2004-2005, Artur Wiebe (wibix@gmx.de)" +#define CONTRIBS "Sebastien Prud'homme (prudhomme@laposte.net)
    " \ + "Guillaume Bedot (guillaume.bedot@wanadoo.fr)" + +/* !!! Do not change PREFIX variable name, please. !!! */ +/* !!! It is used in qcheckers.pro. !!! */ +#define PREFIX "/usr/local" +#define USER_PATH ".kcheckers" // in $HOME +#define THEME_DIR "themes/" + +// some keys for QSettings +#define CFG_KEY "/"APPNAME"/" + +// +#define DEFAULT_THEME "Default" +// +#define THEME_TILE1 "tile1.png" +#define THEME_TILE2 "tile2.png" +#define THEME_FRAME "frame.png" +#define THEME_MANBLACK "manblack.png" +#define THEME_MANWHITE "manwhite.png" +#define THEME_KINGBLACK "kingblack.png" +#define THEME_KINGWHITE "kingwhite.png" +#define THEME_FILE "theme" + +// +#define MAX_TILE_SIZE 64 + +#endif + diff --git a/retroshare-gui/src/games/qcheckers/computerplayer.cc b/retroshare-gui/src/games/qcheckers/computerplayer.cc new file mode 100644 index 000000000..0d9539847 --- /dev/null +++ b/retroshare-gui/src/games/qcheckers/computerplayer.cc @@ -0,0 +1,114 @@ +/*************************************************************************** + * Copyright (C) 2004-2005 Artur Wiebe * + * wibix@gmx.de * + * * + * 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., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include +#include +#include + +#include "computerplayer.h" +#include "pdn.h" +#include "rcheckers.h" +#include "echeckers.h" +#include "checkers.h" + + +myComputerPlayer::myComputerPlayer(const QString& name, bool white, int skill) + : myPlayer(name, white) +{ + m_game = 0; + m_thread = 0; + m_skill = skill; +} + + +myComputerPlayer::~myComputerPlayer() +{ + if(m_thread) { + m_thread->stop(); + // delete m_thread + } + delete m_game; +} + + +void myComputerPlayer::yourTurn(const Checkers* g) +{ + if(m_thread) + qDebug("myComputerPlayer::yourTurn: a thread exists."); + + // first create it. + if(!m_game || m_game->type()!=g->type()) { + delete m_game; + if(g->type()==RUSSIAN) + m_game = new RCheckers(); + else + m_game = new ECheckers(); + } + + m_game->setSkill(m_skill); + m_game->fromString(g->toString(false)); + + m_thread = new myThread(this, m_game); + m_thread->start(); +} + + +void myComputerPlayer::stop() +{ + if(m_thread) { + m_thread->stop(); + } +} + + +void myComputerPlayer::customEvent(QEvent* ev) +{ + if(ev->type() == QEvent::MaxUser) { + m_thread->wait(); + + delete m_thread; + m_thread = 0; + + emit moveDone(m_game->toString(false)); + } +} + + + +/**************************************************************************** + * + * + ***************************************************************************/ +void myThread::run() +{ + m_game->go2(); + if(!m_aborted) { + QEvent* ev = new QEvent(QEvent::MaxUser); + QApplication::postEvent(m_player, ev); + } else + qDebug("thread.aborted.done."); +} + + +void myThread::stop() +{ + m_aborted = true; + m_game->setSkill(0); +} + diff --git a/retroshare-gui/src/games/qcheckers/computerplayer.h b/retroshare-gui/src/games/qcheckers/computerplayer.h new file mode 100644 index 000000000..553389f3a --- /dev/null +++ b/retroshare-gui/src/games/qcheckers/computerplayer.h @@ -0,0 +1,75 @@ +/*************************************************************************** + * Copyright (C) 2004-2005 Artur Wiebe * + * wibix@gmx.de * + * * + * 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., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#ifndef _COMPUTERPLAYER_H_ +#define _COMPUTERPLAYER_H_ + + +#include + +#include "player.h" + + +class myThread; + + +class myComputerPlayer : public myPlayer +{ + Q_OBJECT + +public: + myComputerPlayer(const QString& name, bool white, int skill); + ~myComputerPlayer(); + + virtual void yourTurn(const Checkers* game); + virtual void stop(); + + // need this to process thread's events + virtual void customEvent(QEvent*); + +private: + myThread* m_thread; + Checkers* m_game; + int m_skill; +}; + + + +/****************************************************************************/ +class myThread : public QThread { +public: + myThread(myComputerPlayer* p, Checkers* g) + : m_player(p), m_game(g), m_aborted(false) {} + + virtual void run(); + + void stop(); + + Checkers* game() const { return m_game; } + +private: + myComputerPlayer* m_player; + Checkers* m_game; + bool m_aborted; +}; + + +#endif + diff --git a/retroshare-gui/src/games/qcheckers/echeckers.cc b/retroshare-gui/src/games/qcheckers/echeckers.cc new file mode 100644 index 000000000..362e59e1b --- /dev/null +++ b/retroshare-gui/src/games/qcheckers/echeckers.cc @@ -0,0 +1,423 @@ +/*************************************************************************** + * Copyright (C) 2002-2003 Andi Peredri * + * andi@ukr.net * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 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., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + + +// aw?1 - due to english rules a man reaching the king-row becomes a king +// and the is complete. +// +// English Checkers + + +#include "echeckers.h" + + +/////////////////////////////////////////////////// +// +// Player Functions +// +/////////////////////////////////////////////////// + + +bool ECheckers::go1(int from, int field) +{ + from=internal(from); + field=internal(field); + + to=field; + + if(checkCapture1()) { + bool capture=false; + + switch(board[from]) { + case MAN1: + if(manCapture1(from, UL, capture)) return true; + if(manCapture1(from, UR, capture)) return true; + return false; + case KING1: + if(kingCapture1(from, UL, capture)) return true; + if(kingCapture1(from, UR, capture)) return true; + if(kingCapture1(from, DL, capture)) return true; + if(kingCapture1(from, DR, capture)) return true; + return false; + } + + } else { + switch(board[from]) { + case MAN1: + if((to==(from-6))||(to==(from-5))) { + board[from]=FREE; + if(to<10) + board[to]=KING1; + else + board[to]=MAN1; + return true; + } + return false; + case KING1: + if((to==(from-6))||(to==(from-5)) || + (to==(from+5))||(to==(from+6)) ) { + board[from]=FREE; + board[to]=KING1; + return true; + } + return false; + } + } + + return false; +} + + +bool ECheckers::checkCapture1() const +{ + for(int i=6;i<48;i++) + if(checkCapture1(i)) + return true; + + return false; +} + + +bool ECheckers::checkCapture1(int i) const +{ + switch(board[i]) { + case MAN1: + // forward-left + if(board[i-6]==MAN2 || board[i-6]==KING2) + if(board[i-12]==FREE) return true; + // forward-right + if(board[i-5]==MAN2 || board[i-5]==KING2) + if(board[i-10]==FREE) return true; + break; + + case KING1: + // forward-left + if(board[i-6]==MAN2 || board[i-6]==KING2) + if(board[i-12]==FREE) return true; + // forward-right + if(board[i-5]==MAN2 || board[i-5]==KING2) + if(board[i-10]==FREE) return true; + // backward-left + if(board[i+5]==MAN2 || board[i+5]==KING2) + if(board[i+10]==FREE) return true; + // backward-right + if(board[i+6]==MAN2 || board[i+6]==KING2) + if(board[i+12]==FREE) return true; + } + + return false; +} + + +/* ORIG FUNC aw??? +bool ECheckers::checkCapture1() +{ + for(int i=6;i<48;i++) { + switch(board[i]) { + case MAN1: + // forward-left + if(board[i-6]==MAN2 || board[i-6]==KING2) + if(board[i-12]==FREE) return true; + // forward-right + if(board[i-5]==MAN2 || board[i-5]==KING2) + if(board[i-10]==FREE) return true; + break; + + case KING1: + // forward-left + if(board[i-6]==MAN2 || board[i-6]==KING2) + if(board[i-12]==FREE) return true; + // forward-right + if(board[i-5]==MAN2 || board[i-5]==KING2) + if(board[i-10]==FREE) return true; + // backward-left + if(board[i+5]==MAN2 || board[i+5]==KING2) + if(board[i+10]==FREE) return true; + // backward-right + if(board[i+6]==MAN2 || board[i+6]==KING2) + if(board[i+12]==FREE) return true; + } + } + + return false; +} +*/ + + +// Return TRUE if a course of the player true +// Return FALSE if a course of the player incorrect + +bool ECheckers::manCapture1(int from, int direction, bool& capture) +{ + int i=from+direction; + + if(board[i]==MAN2 || board[i]==KING2) { + int k=i+direction; + if(board[k]==FREE) { + bool next=false; + int save=board[i]; + board[from]=FREE; + board[i]=NONE; + + // become a king! + if(k<10) { + board[k]=KING1; + /*aw?1 + if(kingCapture1(k, direction+11, next)) { + board[i]=FREE; + return true; + } + */ + } else { + board[k]=MAN1; + if(manCapture1(k,UL,next)) {board[i]=FREE; return true;} + if(manCapture1(k,UR,next)) {board[i]=FREE; return true;} + } + + //?? make move here, too??? + if((!next) && k==to) {board[i]=FREE; return true;}// move success + + // move failed, restore + board[k]=FREE; + board[i]=save; + board[from]=MAN1; + capture=true; + } + } + + return false; +} + + +bool ECheckers::kingCapture1(int from, int direction, bool& capture) +{ + int i=from+direction; + if(board[i]==MAN2 || board[i]==KING2) + { + int k=i+direction; + if(board[k]==FREE) + { + bool next=false; + int save=board[i]; + board[from]=FREE; + board[i]=NONE; + board[k]=KING1; + + if(direction==UL || direction==DR) { + if(kingCapture1(k,UR,next)) {board[i]=FREE;return true;} + if(kingCapture1(k,DL,next)) {board[i]=FREE;return true;} + } else { + if(kingCapture1(k,UL,next)) {board[i]=FREE;return true;} + if(kingCapture1(k,DR,next)) {board[i]=FREE;return true;} + } + if(kingCapture1(k,direction,next)) {board[i]=FREE;return true;} + + if((!next) && k==to) {board[i]=FREE;return true;}// move ok + + // move failed, restore + board[k]=FREE; + board[i]=save; + board[from]=KING1; + capture=true; + } + } + return false; +} + + +//////////////////////////////////////////////////// +// +// Computer Functions +// +//////////////////////////////////////////////////// + + +void ECheckers::kingMove2(int from, int& resMax) +{ + board[from]=FREE; + + int i=from-6; + if(board[i]==FREE) { + board[i]=KING2; + turn(resMax); + board[i]=FREE; + } + + i=from-5; + if(board[i]==FREE) { + board[i]=KING2; + turn(resMax); + board[i]=FREE; + } + + i=from+5; + if(board[i]==FREE) { + board[i]=KING2; + turn(resMax); + board[i]=FREE; + } + + i=from+6; + if(board[i]==FREE) { + board[i]=KING2; + turn(resMax); + board[i]=FREE; + } + + board[from]=KING2; +} + + +bool ECheckers::checkCapture2() const +{ + for(int i=6;i<48;i++) + { + switch(board[i]) + { + case MAN2: + if(board[i+5]==MAN1 || board[i+5]==KING1) + if(board[i+10]==FREE) return true; + if(board[i+6]==MAN1 || board[i+6]==KING1) + if(board[i+12]==FREE) return true; + break; + case KING2: + if(board[i-6]==MAN1 || board[i-6]==KING1) + if(board[i-12]==FREE) return true; + if(board[i-5]==MAN1 || board[i-5]==KING1) + if(board[i-10]==FREE) return true; + if(board[i+5]==MAN1 || board[i+5]==KING1) + if(board[i+10]==FREE) return true; + if(board[i+6]==MAN1 || board[i+6]==KING1) + if(board[i+12]==FREE) return true; + } + } + return false; +} + + +// Return TRUE if it is possible to capture +// Return FALSE if it is impossible to capture +bool ECheckers::manCapture2(int from, int& resMax) +{ + bool capture=false; + + // try left-down + int i=from+5; + if(board[i]==MAN1 || board[i]==KING1) { + int k=from+10; + if(board[k]==FREE) { + int save=board[i]; + board[from]=FREE; + board[i]=NONE; + resMax--; + + // become a king! + if(from>32) { + board[k]=KING2; + // aw?1 + turn(resMax, true); //aw??? + //aw??if(!kingCapture2(k, UL, resMax)) turn(resMax, true); + } else { + board[k]=MAN2; + if(!manCapture2(k, resMax)) turn(resMax, true); + } + + // restore + resMax++; + board[k]=FREE; + board[i]=save; + board[from]=MAN2; + capture=true; + } + } + + // now right-down + i=from+6; + if(board[i]==MAN1 || board[i]==KING1) { + int k=from+12; + if(board[k]==FREE) { + int save=board[i]; + board[from]=FREE; + board[i]=NONE; + resMax--; + + // become a king! + if(from>32) { + board[k]=KING2; + // aw?1 + turn(resMax, true); // aw??? + //aw???if(!kingCapture2(k,UR,resMax)) turn(resMax,true); + } else { + board[k]=MAN2; + if(!manCapture2(k,resMax)) turn(resMax,true); + } + + // restore + resMax++; + board[k]=FREE; + board[i]=save; + board[from]=MAN2; + capture=true; + } + } + + if(capture) return true; + return false; +} + + +bool ECheckers::kingCapture2(int from, int direction, int &resMax) +{ + int i=from+direction; + if(board[i]==MAN1 || board[i]==KING1) + { + int k=i+direction; + if(board[k]==FREE) + { + bool capture=false; + int save=board[i]; + board[from]=FREE; + board[i]=NONE; + resMax--; + + board[k]=KING2; + if(direction==UL || direction==DR) { + if(kingCapture2(k,UR,resMax)) capture=true; + if(kingCapture2(k,DL,resMax)) capture=true; + } else { + if(kingCapture2(k,UL,resMax)) capture=true; + if(kingCapture2(k,DR,resMax)) capture=true; + } + if(kingCapture2(k,direction,resMax)) capture=true; + + if(!capture) turn(resMax,true); + board[k]=FREE; + + //restore + resMax++; + board[i]=save; + board[from]=KING2; + return true; + } + } + return false; +} + + diff --git a/retroshare-gui/src/games/qcheckers/echeckers.h b/retroshare-gui/src/games/qcheckers/echeckers.h new file mode 100644 index 000000000..89d1da551 --- /dev/null +++ b/retroshare-gui/src/games/qcheckers/echeckers.h @@ -0,0 +1,55 @@ +/*************************************************************************** + * Copyright (C) 2002-2003 Andi Peredri * + * andi@ukr.net * + * Copyright (C) 2004-2005 Artur Wiebe * + * wibix@gmx.de * + * * + * 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., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#ifndef ECHECKERS_H +#define ECHECKERS_H + +#include "checkers.h" +#include "pdn.h" + + +class ECheckers:public Checkers +{ +public: + virtual bool go1(int,int); + + + virtual int type() const { return ENGLISH; } + + virtual bool checkCapture1() const; + virtual bool checkCapture2() const; + +protected: + virtual bool checkCapture1(int) const; + +private: + void kingMove2(int,int &); + + bool manCapture1(int,int,bool &); + bool kingCapture1(int,int,bool &); + + bool manCapture2(int,int &); + bool kingCapture2(int,int,int &); + +}; + +#endif diff --git a/retroshare-gui/src/games/qcheckers/field.cc b/retroshare-gui/src/games/qcheckers/field.cc new file mode 100644 index 000000000..6006a5537 --- /dev/null +++ b/retroshare-gui/src/games/qcheckers/field.cc @@ -0,0 +1,150 @@ +/*************************************************************************** + * Copyright (C) 2002-2003 Andi Peredri * + * andi@ukr.net * + * Copyright (C) 2004-2005 Artur Wiebe + * wibix@gmx.de + * * + * 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., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#include +#include +#include + +#include "field.h" +#include "common.h" + + +Field::Field(QWidget* parent,int i) + : QWidget(parent) +{ + pixmap = new QPixmap(MAX_TILE_SIZE, MAX_TILE_SIZE); + + m_number=i; + + m_pattern=NULL; + m_checker=NULL; + m_frame=NULL; + + show_frame = false; + + m_show_label = true; +} + + +void Field::paintEvent(QPaintEvent*) +{ + QPainter p(this); + + p.drawPixmap(0, 0, *pixmap); + + p.end(); +} + + +void Field::mousePressEvent(QMouseEvent* me) +{ + if(me->button() != Qt::LeftButton) + return; + emit click(m_number); +} + + +void Field::draw() +{ + QPainter paint; + paint.begin(pixmap); + paint.setFont(font()); + + if(m_pattern) + paint.drawPixmap(0, 0, *m_pattern); + + // notation + paint.setPen(Qt::white); + QRect not_rect = paint.boundingRect(2, 2, 0, 0, Qt::AlignLeft, m_label); + if(m_show_above) { + if(m_checker) + paint.drawPixmap(0, 0, *m_checker); + if(m_show_label) { + paint.fillRect(not_rect, Qt::black); + paint.drawText(not_rect, Qt::AlignTop|Qt::AlignLeft, m_label); + } + } else { + if(m_show_label) + paint.drawText(not_rect, Qt::AlignTop|Qt::AlignLeft, m_label); + if(m_checker) + paint.drawPixmap(0, 0, *m_checker); + } + + if(show_frame) + paint.drawPixmap(0, 0, *m_frame); + + paint.end(); + update(); +} + + +void Field::setFrame(QPixmap* xpm) +{ + m_frame = xpm; +} + + +void Field::showFrame(bool b) +{ + if(show_frame != b) { + show_frame = b; + draw(); + } +} + + +void Field::setPicture(QPixmap* xpm) +{ + if(m_checker!=xpm) { + m_checker = xpm; + draw(); + } +} + + +void Field::setPattern(QPixmap* xpm) +{ + if(m_pattern != xpm) { + m_pattern = xpm; + draw(); + } +} + + +void Field::setLabel(const QString& str) +{ + if(m_label!=str) { + m_label=str; + draw(); + } +} + + +void Field::showLabel(bool s, bool a) +{ + if(s!=m_show_label || a!=m_show_above) { + m_show_above = a; + m_show_label = s; + draw(); + } +} + diff --git a/retroshare-gui/src/games/qcheckers/field.h b/retroshare-gui/src/games/qcheckers/field.h new file mode 100644 index 000000000..8e62d8af0 --- /dev/null +++ b/retroshare-gui/src/games/qcheckers/field.h @@ -0,0 +1,78 @@ +/*************************************************************************** + * Copyright (C) 2002-2003 Andi Peredri * + * andi@ukr.net * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 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., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#ifndef FIELD_H +#define FIELD_H + +#include +#include + + +class Field : public QWidget +{ + Q_OBJECT + +public: + Field(QWidget*, int num); + + const QString& label() const { return m_label; } + void setLabel(const QString&); + void showLabel(bool s, bool above); + + void showFrame(bool); + void setFrame(QPixmap*); + void setPicture(QPixmap*); + void setPattern(QPixmap*); + + int number() const { return m_number; } + + void fontUpdate() { draw(); } + +signals: + void click(int); + +protected: + + void paintEvent(QPaintEvent*); + void mousePressEvent(QMouseEvent*); + +private: + void draw(); + + int m_number; + + // pixmap = pattern + label + picture + frame; + + QPixmap* m_frame; + QPixmap* m_checker; + QPixmap* m_pattern; + + QString m_label; + bool m_show_label; + bool m_show_above; + + QPixmap* pixmap; + + bool show_frame; +}; + +#endif + + diff --git a/retroshare-gui/src/games/qcheckers/history.cc b/retroshare-gui/src/games/qcheckers/history.cc new file mode 100644 index 000000000..22303cffc --- /dev/null +++ b/retroshare-gui/src/games/qcheckers/history.cc @@ -0,0 +1,514 @@ +/*************************************************************************** + * Copyright (C) 2004-2005 Artur Wiebe * + * wibix@gmx.de * + * * + * 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., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include +#include +#include +#include +#include +#include + +#include "history.h" +#include "common.h" + + + +#define COL_TAG_NR 0 // m_tags, this col is hidden. +#define COL_TAG_NAME 1 +#define COL_TAG_VAL 2 + +#define COL_MOVE_NR 0 // m_movelist +#define COL_MOVE 1 +#define COL_MOVE_COMM 2 + + +myHistory::myHistory(QWidget* parent) + : QFrame(parent) +{ + setFixedWidth(240); + + m_gamelist = new QComboBox(this); + connect(m_gamelist, SIGNAL(activated(int)), + this, SLOT(slot_game_selected(int))); + + m_taglist = new QTreeWidget(this); + m_taglist->setColumnCount(3); + m_taglist->header()->hide(); + m_taglist->setColumnHidden(COL_TAG_NR, true); +// m_taglist->header()->setStretchLastSection(true); +// m_taglist->header()->setResizeMode(QHeaderView::Stretch); + m_taglist->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + connect(m_taglist, SIGNAL(itemDoubleClicked(QTreeWidgetItem*, int)), + this, SLOT(slot_modify_tag(QTreeWidgetItem*, int))); + + m_movelist = new QTreeWidget(this); + m_movelist->setColumnCount(3); + m_movelist->header()->setStretchLastSection(true); + m_movelist->header()->setMovable(false); + m_movelist->setRootIsDecorated(false); + QStringList header; + header << "#" << tr("Move") << tr("Comment"); + m_movelist->setHeaderLabels(header); + // + connect(m_movelist, SIGNAL(itemDoubleClicked(QTreeWidgetItem*, int)), + this, SLOT(slot_modify_comment(QTreeWidgetItem*, int))); + connect(m_movelist, + SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), + this, + SLOT(slot_move(QTreeWidgetItem*, QTreeWidgetItem*))); + + // history + /* + gameUndo = new QAction(QIcon(":/icons/undo.png"), tr("&Undo"), this); + connect(gameUndo, SIGNAL(triggered()), m_view, SLOT(slotUndo())); + + gameRedo = new QAction(QIcon(":/icons/redo.png"), tr("&Redo"), this); + connect(gameRedo, SIGNAL(triggered()), m_view, SLOT(slotRedo())); + + gameContinue = new QAction(QIcon(":/icons/continue.png"), + tr("&Continue"), this); + connect(gameContinue, SIGNAL(triggered()), m_view, SLOT(slotContinue())); + + + */ + m_mode_icon = new QLabel(this); + m_mode_icon->setFrameStyle(QFrame::Panel | QFrame::Sunken); + + m_undo = new QToolButton(this); + m_undo->setIcon(QIcon(":/icons/undo.png")); + m_undo->setToolTip(tr("Undo")); + connect(m_undo, SIGNAL(clicked()), this, SLOT(slot_undo())); + + m_redo = new QToolButton(this); + m_redo->setIcon(QIcon(":/icons/redo.png")); + m_redo->setToolTip(tr("Redo")); + connect(m_redo, SIGNAL(clicked()), this, SLOT(slot_redo())); + + m_cont = new QToolButton(this); + m_cont->setIcon(QIcon(":/icons/continue.png")); + m_cont->setToolTip(tr("Continue")); + connect(m_cont, SIGNAL(clicked()), this, SLOT(slot_continue())); + + m_current = new QLabel(this); + + QHBoxLayout* history = new QHBoxLayout(); + history->addWidget(m_mode_icon); +//TODO history->addStretch(); + history->addWidget(m_undo); + history->addWidget(m_redo); + history->addWidget(m_cont); + history->addStretch(); + history->addWidget(m_current); + + // layout + QVBoxLayout* vb = new QVBoxLayout(this); + vb->setMargin(0); + vb->addWidget(m_gamelist, 0); + vb->addWidget(m_taglist, 2); + vb->addWidget(m_movelist, 4); + vb->addLayout(history); + + /* + * other stuff + */ + m_pdn = new Pdn(); + m_disable_moves = false; + // + m_paused = true; // little hack ensures a mode change. + m_freeplace = false; + set_mode(false); +} + + +myHistory::~myHistory() +{ + delete m_pdn; +} + + +void myHistory::clear() +{ + m_gamelist->clear(); + m_pdn->clear(); + m_taglist->clear(); + m_movelist->clear(); +} + + +void myHistory::setTag(PdnGame::Tag tag, const QString& val) +{ + QTreeWidgetItem* item = 0; + QList item_list = m_taglist->findItems( + tag_to_string(tag), Qt::MatchExactly, COL_TAG_NAME); + if(item_list.count()) { + if(item_list.count() == 1) + item = item_list[0]; + else + qDebug() << __PRETTY_FUNCTION__ << "ERR"; + } + + if(item) { + item->setText(COL_TAG_VAL, val); + } else { + item = new QTreeWidgetItem(m_taglist); + item->setText(COL_TAG_NR, QString::number(tag)); + item->setText(COL_TAG_NAME, tag_to_string(tag)); + item->setText(COL_TAG_VAL, val); + } + + if(tag==PdnGame::Type) { + item->setText(COL_TAG_VAL, val + " (" + + typeToString(QString("%1").arg(val).toInt()) + + ")"); + } + + m_game->set(tag, val); +//TODO m_taglist->resizeColumnToContents(COL_TAG_NAME); +} + + +QString myHistory::getTag(PdnGame::Tag tag) +{ + QList item_list = m_taglist->findItems( + tag_to_string(tag), Qt::MatchExactly, COL_TAG_NAME); + if(item_list.count() == 1) + return item_list[0]->text(COL_TAG_VAL); + return ""; +} + + +QString myHistory::tag_to_string(PdnGame::Tag tag) +{ + switch(tag) { + case PdnGame::Date: return /*tr(*/"Date";//); + case PdnGame::Site: return /*tr(*/"Site";//); + case PdnGame::Type: return /*tr(*/"Type";//); + case PdnGame::Event: return /*tr(*/"Event";//); + case PdnGame::Round: return /*tr(*/"Round";//); + case PdnGame::White: return /*tr(*/"White";//); + case PdnGame::Black: return /*tr(*/"Black";//); + case PdnGame::Result: return /*tr(*/"Result";//); + } + + return "Site"; // FIXME +} + + +void myHistory::appendMove(const QString& text, const QString& comm) +{ + m_disable_moves = true; + + QTreeWidgetItem* new_item = new QTreeWidgetItem(m_movelist); + new_item->setText(COL_MOVE, text); + new_item->setText(COL_MOVE_COMM, comm); + + int move_nr = (m_movelist->topLevelItemCount() - 2) / 2; + PdnMove* m = m_game->getMove(move_nr); + + if(m_movelist->topLevelItemCount()%2) { + m->m_second = text; + m->m_comsecond = comm; + } else { + new_item->setText(COL_MOVE_NR, QString("%1.").arg(move_nr+1)); + m->m_first = text; + m->m_comfirst = comm; + } + + m_movelist->setCurrentItem(new_item); + m_movelist->scrollToItem(new_item); + + // TODO + m_movelist->resizeColumnToContents(COL_MOVE_NR); + + m_disable_moves = false; +} + + +void myHistory::slot_modify_comment(QTreeWidgetItem* item, int) +{ + if(!item || item==m_movelist->topLevelItem(0) || m_paused) + return; + + bool ok; + QString new_text = QInputDialog::getText(this, tr("Set Comment"),//FIXME + tr("Comment")+":", QLineEdit::Normal, item->text(COL_MOVE_COMM), + &ok); + if(!ok) + return; + + new_text.remove('{'); + new_text.remove('}'); + if(new_text != item->text(COL_MOVE_COMM)) { + // gui + item->setText(COL_MOVE_COMM, new_text); + + // pdn + int index = m_movelist->indexOfTopLevelItem(item); + PdnMove* move = m_game->getMove((index - 1) / 2); + if(index%2==1) + move->m_comfirst = new_text; + else + move->m_comsecond = new_text; + } +} + + +void myHistory::slot_modify_tag(QTreeWidgetItem* item, int/* col*/) +{ + if(!item || m_paused) + return; + + PdnGame::Tag tag =(PdnGame::Tag)item->text(COL_TAG_NR).toUInt(); + if(tag==PdnGame::Type) { + return; + } + + bool ok; + QString new_text = QInputDialog::getText(this, tr("Set Tag"),//FIXME + tr("Tag")+":", QLineEdit::Normal, item->text(COL_TAG_VAL), &ok); + if(!ok) + return; + + new_text.remove('"'); + new_text.remove('['); + new_text.remove(']'); + + if(new_text != item->text(COL_TAG_VAL)) { + item->setText(COL_TAG_VAL, new_text); + m_game->set(tag, new_text); + if(tag==PdnGame::Event) + m_gamelist->setItemText(m_gamelist->currentIndex(), + new_text); + } +} + + +bool myHistory::openPdn(const QString& filename, QString& log_text) +{ + if(!m_pdn->open(filename, this, tr("Reading file..."), log_text)) { + set_mode(false); + return false; + } + + set_mode(true); + + m_gamelist->clear(); + m_movelist->clear(); + m_taglist->clear(); + + QProgressDialog progress(this); + progress.setModal(true); + progress.setLabelText(tr("Importing games...")); + progress.setRange(0, m_pdn->count()); + progress.setMinimumDuration(0); + + for(int i=0; icount(); ++i) { + if((i%10)==0) + progress.setValue(i); + m_gamelist->insertItem(i, m_pdn->game(i)->get(PdnGame::Event)); + } + + slot_game_selected(0); + + return true; +} + + +bool myHistory::savePdn(const QString& fn) +{ + return m_pdn->save(fn); +} + + +void myHistory::slot_game_selected(int index) +{ + if(index>=m_pdn->count()) { + qDebug() << __PRETTY_FUNCTION__ << "Index" << index + << "out of range >=" << m_pdn->count(); + return; + } + + m_game = m_pdn->game(index); + m_movelist->clear(); + + QTreeWidgetItem* root = new QTreeWidgetItem(m_movelist); + for(int i=0; imovesCount(); ++i) { + PdnMove* m = m_game->getMove(i); + + appendMove(m->m_first, m->m_comfirst); + if(m->m_second.length()) + appendMove(m->m_second, m->m_comsecond); + } + + setTag(PdnGame::Site, m_game->get(PdnGame::Site)); + setTag(PdnGame::Black, m_game->get(PdnGame::Black)); + setTag(PdnGame::White, m_game->get(PdnGame::White)); + setTag(PdnGame::Result, m_game->get(PdnGame::Result)); + setTag(PdnGame::Date, m_game->get(PdnGame::Date)); + setTag(PdnGame::Site, m_game->get(PdnGame::Site)); + setTag(PdnGame::Type, m_game->get(PdnGame::Type)); + setTag(PdnGame::Round, m_game->get(PdnGame::Round)); + setTag(PdnGame::Event, m_game->get(PdnGame::Event)); + + // signal to view + if(m_paused && !m_freeplace) { + emit previewGame(m_game->get(PdnGame::Type).toInt()); + } + + m_movelist->setCurrentItem(root); + slot_move(root, 0); +} + + +void myHistory::newPdn(const QString& event, bool freeplace) +{ + m_freeplace = freeplace; + m_paused = !m_freeplace; // FIXME - needed to force view update. + set_mode(m_freeplace); + + PdnGame* game = m_pdn->newGame(); + game->set(PdnGame::Event, event); + + int index = m_gamelist->count(); + m_gamelist->insertItem(index, event); + m_gamelist->setCurrentIndex(index); + + slot_game_selected(index); +} + + +QString myHistory::typeToString(int type) +{ + switch(type) { + case ENGLISH: return tr("English draughts"); + case RUSSIAN: return tr("Russian draughts"); + }; + return tr("Unknown game type"); +} + + +void myHistory::set_mode(bool paused) +{ + if(m_paused != paused) { + m_paused = paused; + + if(m_paused) { + if(m_freeplace) { + m_mode_icon->setPixmap(QPixmap(":/icons/freeplace.png")); + m_mode_icon->setToolTip(tr("Free Placement Mode")); + } else { + m_mode_icon->setPixmap(QPixmap(":/icons/paused.png")); + m_mode_icon->setToolTip(tr("Paused Mode")); + } + } else { + m_mode_icon->setPixmap(QPixmap(":/icons/logo.png")); + m_mode_icon->setToolTip(tr("Play Mode")); + } + + m_gamelist->setEnabled(m_paused); + //FIXME m_movelist->setEnabled(yes); + + emit newMode(m_paused, m_freeplace); + } +} + + +void myHistory::slot_move(QTreeWidgetItem* item, QTreeWidgetItem*) +{ + // update history buttons. + bool curr_is_first = + (m_movelist->topLevelItem(0) == m_movelist->currentItem()); + bool curr_is_last = + (m_movelist->indexOfTopLevelItem(m_movelist->currentItem()) + == m_movelist->topLevelItemCount()-1); + + m_undo->setEnabled(!curr_is_first); + m_redo->setEnabled(!curr_is_last); + m_cont->setEnabled(m_paused); + + + // process + if(!item || !m_paused || m_disable_moves) + return; + + do_moves(); +} + + +void myHistory::history_undo(bool move_backwards) +{ + int next = m_movelist->indexOfTopLevelItem(m_movelist->currentItem()) + + (move_backwards ? -1 : +1); + + if(next>=0 && nexttopLevelItemCount()) + m_movelist->setCurrentItem(m_movelist->topLevelItem(next)); +} + + +void myHistory::do_moves() +{ + QString moves; + QTreeWidgetItem* item = m_movelist->currentItem(); + for(int i=0; itopLevelItemCount(); ++i) { + QTreeWidgetItem* cur = m_movelist->topLevelItem(i); + moves += cur->text(COL_MOVE) + MOVE_SPLIT; + if(m_movelist->topLevelItem(i)==item) + break; + } + emit applyMoves(moves); +} + + +void myHistory::delete_moves() +{ + int curr = m_movelist->indexOfTopLevelItem(m_movelist->currentItem()); + while(m_movelist->topLevelItemCount() > curr+1) { + delete m_movelist->topLevelItem( + m_movelist->topLevelItemCount()-1); + } +} + + +void myHistory::slot_undo() +{ + set_mode(true); + history_undo(true); + do_moves(); +} + +void myHistory::slot_redo() +{ + set_mode(true); + history_undo(false); + do_moves(); +} + + +void myHistory::slot_continue() +{ + delete_moves(); + set_mode(false); +} + + +void myHistory::slotWorking(bool b) +{ + setEnabled(!b); +} + diff --git a/retroshare-gui/src/games/qcheckers/history.h b/retroshare-gui/src/games/qcheckers/history.h new file mode 100644 index 000000000..8ca495fd4 --- /dev/null +++ b/retroshare-gui/src/games/qcheckers/history.h @@ -0,0 +1,112 @@ +/*************************************************************************** + * Copyright (C) 2004-2005 Artur Wiebe * + * wibix@gmx.de * + * * + * 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., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifndef _HISTORY_H_ +#define _HISTORY_H_ + + +#include +#include +#include +#include +#include + +#include "pdn.h" + + +#define MOVE_SPLIT '#' + + +class myHistory : public QFrame +{ + Q_OBJECT + +public: + myHistory(QWidget* parent); + ~myHistory(); + + void newPdn(const QString& event, bool freeplace); + bool openPdn(const QString& filename, QString& log_text); + bool savePdn(const QString& fn); + + void clear(); + + bool isPaused() const { return m_paused; } + bool isFreePlacement() const { return m_freeplace; } + + void setTag(PdnGame::Tag, const QString& val); + QString getTag(PdnGame::Tag); + + void appendMove(const QString& move, const QString& comment); + // FIXME - provide a function that returns who is next, black or white. + int moveCount() const { return m_movelist->topLevelItemCount()-1; } + + static QString typeToString(int type); + + void setCurrent(const QString& t) { m_current->setText(t); } + +signals: + void previewGame(int game_type); + void applyMoves(const QString& moves); + void newMode(bool paused, bool freeplace); + +public slots: + void slotWorking(bool); + +private slots: + void slot_move(QTreeWidgetItem*, QTreeWidgetItem*); + void slot_game_selected(int index); + void slot_modify_tag(QTreeWidgetItem* item, int col); + void slot_modify_comment(QTreeWidgetItem* item, int col); + + void slot_undo(); + void slot_redo(); + void slot_continue(); + +private: + QString tag_to_string(PdnGame::Tag); + void set_mode(bool); + + void do_moves(); + void history_undo(bool move_backwards); + void delete_moves(); + + +private: + QTreeWidget* m_taglist; + QTreeWidget* m_movelist; + QComboBox* m_gamelist; + Pdn* m_pdn; + PdnGame* m_game; + + bool m_paused; + bool m_freeplace; + bool m_disable_moves; + + QToolButton* m_undo; + QToolButton* m_redo; + QToolButton* m_cont; + + QLabel* m_mode_icon; + QLabel* m_current; +}; + + +#endif + diff --git a/retroshare-gui/src/games/qcheckers/humanplayer.cc b/retroshare-gui/src/games/qcheckers/humanplayer.cc new file mode 100644 index 000000000..31e50a108 --- /dev/null +++ b/retroshare-gui/src/games/qcheckers/humanplayer.cc @@ -0,0 +1,112 @@ +/*************************************************************************** + * Copyright (C) 2004-2005 Artur Wiebe * + * wibix@gmx.de * + * * + * 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., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#include + +#include "humanplayer.h" +#include "rcheckers.h" +#include "echeckers.h" +#include "pdn.h" + + +myHumanPlayer::myHumanPlayer(const QString& name, bool white, + bool second_player) + : myPlayer(name, white) +{ + selected = false; + + m_second = second_player; + m_game = 0; +} + + +myHumanPlayer::~myHumanPlayer() +{ +} + + +void myHumanPlayer::yourTurn(const Checkers* g) +{ + if(!m_game || m_game->type()!=g->type()) { + delete m_game; + if(g->type()==RUSSIAN) + m_game = new RCheckers(); + else + m_game = new ECheckers(); + } + + // synchronize + m_game->fromString(g->toString(m_second)); +} + + +bool myHumanPlayer::fieldClicked(int field_num, bool* select, QString& errmsg) +{ + if(m_second) + field_num = 31 - field_num; + + switch(m_game->item(field_num)) { + case MAN1: + case KING1: + if(m_game->checkCapture1() && !m_game->canCapture1(field_num)) { + errmsg = tr("You must capture."); //TODO better text. + return false; + } + if(!m_game->canCapture1(field_num) && !m_game->canMove1(field_num)) { + errmsg = tr("Cannot move this."); //TODO better text. + return false; + } + + // Player (re)selects + from = field_num; + fromField = field_num; + selected = true; + *select = true; + return true; + break; + + case FREE: + if(!selected) + return true; + + if(!go(field_num)) + return false; // incorrect course + + // move done - unselect + if(selected) + *select = false; + selected = false; + + emit moveDone(m_game->toString(m_second)); + break; + + default: + break; + } + + return true; +} + + +bool myHumanPlayer::go(int to) +{ + return m_game->go1(from, to); +} + diff --git a/retroshare-gui/src/games/qcheckers/humanplayer.h b/retroshare-gui/src/games/qcheckers/humanplayer.h new file mode 100644 index 000000000..807f6bc91 --- /dev/null +++ b/retroshare-gui/src/games/qcheckers/humanplayer.h @@ -0,0 +1,64 @@ +/*************************************************************************** + * Copyright (C) 2004-2005 Artur Wiebe * + * wibix@gmx.de * + * * + * 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., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#ifndef _HUMANPLAYER_H_ +#define _HUMANPLAYER_H_ + +#include "player.h" + +#include + + +class myHumanPlayer : public myPlayer +{ + Q_OBJECT + +public: + // when playing player vs. player on same computer. the second + // player must invert some things. + myHumanPlayer(const QString& name, bool white, bool second_player); + ~myHumanPlayer(); + + virtual void yourTurn(const Checkers* game); + virtual bool fieldClicked(int fieldnumber, bool*, QString& err_msg); + virtual void stop() {} + + virtual bool isHuman() const { return true; } + + +public slots: +// virtual void getReady() { emit readyToPlay(); } + +private: + bool go(int fieldnumber); + +private: + bool m_second; + + Checkers* m_game; + bool selected; + + int from; // on Checkers board + int fromField; // on GUI board +}; + + +#endif + diff --git a/retroshare-gui/src/games/qcheckers/i18n/kcheckers_de.qm b/retroshare-gui/src/games/qcheckers/i18n/kcheckers_de.qm new file mode 100644 index 000000000..50c459474 Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/i18n/kcheckers_de.qm differ diff --git a/retroshare-gui/src/games/qcheckers/i18n/kcheckers_de.ts b/retroshare-gui/src/games/qcheckers/i18n/kcheckers_de.ts new file mode 100644 index 000000000..2dd665fc6 --- /dev/null +++ b/retroshare-gui/src/games/qcheckers/i18n/kcheckers_de.ts @@ -0,0 +1,611 @@ + + + myHistory + + Move + Zug + + + Comment + Kommentar + + + Undo + Rückgängig + + + Redo + Wiederholen + + + Continue + Fortsetzen + + + Set Comment + Setze Kommentar + + + Set Tag + Setze Tag + + + Tag + Tag + + + Reading file... + Lese Datei... + + + Importing games... + Importiere Spiele... + + + English draughts + Englische Regeln + + + Russian draughts + Russische Regeln + + + Unknown game type + Unbekannter Spieltyp + + + Free Placement Mode + Platzieren-Modus + + + Paused Mode + Pause-Modus + + + Play Mode + Spiel-Modus + + + + myHumanPlayer + + You must capture. + Sie müssen Schlagen. + + + Unmovable. + Unbewegbar. + + + you must capture + Sie müssen Schlagen + + + unmovable + unbewegbar + + + Cannot move this. + Kann nicht bewegen. + + + + myInfo + + Move + Zug + + + Comment + Kommentar + + + White + Weiß + + + Black + Schwarz + + + English draughts + Englische Regeln + + + Russian draughts + Russische Regeln + + + Unknown game type + Unbekannter Spieltyp + + + Importing games... + Importiere Spiele... + + + Reading file... + Lese Datei... + + + Continue + Fortsetzen + + + Previous + Zurück + + + Next + Vor + + + Undo + Rückgängig + + + Redo + Wiederholen + + + Set Comment + Setze Kommentar + + + Set Tag + Setze Tag + + + Free Placement Mode + Platzieren-Modus + + + Paused Mode + Pause-Modus + + + Play Mode + Spiel-Modus + + + Tag + Tag + + + + myNewGameDlg + + New Game + Neues Spiel + + + Rules + Regeln + + + Skill + Schwierigkeitsgrad + + + Beginner + Anfänger + + + Novice + Novize + + + Average + Durchschnitt + + + Good + Gut + + + Expert + Experte + + + Master + Meister + + + Accept + Akzeptieren + + + Address: + Adresse: + + + Servername: + Servername: + + + Serverinfo: + Serverinfo: + + + &Start + &Starten + + + &Cancel + A&bbrechen + + + Wait... + Warte... + + + Waiting for client to connect... + Warte auf Netzwerkspieler... + + + Waiting for server to accept... + Warte auf Serverbestätigung... + + + Server denied. + Server lehnt ab. + + + Connection aborted. + Verbindung getrennt. + + + Human + Mensch + + + Player One + Spieler Eins + + + White + Weiß + + + Player Two + Spieler Zwei + + + Computer + Computer + + + Network - New Game + Netzwerk - Neues Spiel + + + Network - Join Game + Netzwerk - Spiel betreten + + + Server + Server + + + Could not create a game on the server. + Konnte kein Spiel auf dem Server erstellen. + + + Could not join the game. + Konnte dem Spiel nicht beitreten. + + + Client connected. + Mit dem Client verbunden. + + + Client disconnected. + Client hat sich verabschiedet. + + + Free Men Placement + Freies Platzieren der Figuren + + + + myTopLevel + + &New... + &Neu... + + + CTRL+N + File|New + CTRL+N + + + &Next Round + &Nächste Runde + + + &Stop + &Stopp + + + &Undo Move + &Zug rückgängig + + + CTRL+Z + File|Undo + CTRL+Z + + + &Information + &Information + + + &Open... + &Öffnen... + + + CTRL+O + File|Open + CTRL+O + + + &Save... + &Speichern... + + + CTRL+S + File|Save + CTRL+S + + + &Quit + &Beenden + + + CTRL+Q + File|Quit + CTRL+Q + + + &Show Notation + &Zeige Notation + + + &Green Board + &Grünes Brett + + + &Marble Board + &Rotes Brett + + + &Wooden Board + &Hölzernes Brett + + + &Console + &Konsole + + + What's This + Was ist das + + + SHIFT+F1 + Help|WhatsThis + SHIFT+F1 + + + &Rules of Play + &Spielregeln + + + F1 + Help|Help + F1 + + + About &Qt + Ãœber &Qt + + + &Game + &Spiel + + + &View + &Ansicht + + + &Settings + &Einstellungen + + + &Help + &Hilfe + + + Error + Fehler + + + &Close + &Schließen + + + Save Game + Spiel speichern + + + Could not save: + Konnte nicht speichern: + + + Open Game + Spiel laden + + + Could not load: + Konnte nicht öffnen: + + + Game Info + Spielinfo + + + Rules of Play + Spielregeln + + + About + Ãœber + + + Current game will be lost if you continue. +Do you really want to discard it? + Das aktuelle Spiel geht verloren, wenn Sie fortfahren. +Wollen sie es wirklich verwerfen? + + + Abort Game? + Spiel abbrechen? + + + <p>In the beginning of game you have 12 checkers (men). White always moves first. The men move forward only. The men can capture:<ul><li>by jumping forward only (english rules);<li>by jumping forward or backward (russian rules).</ul><p>A man which reaches the far side of the board becomes a king. The kings move forward or backward:<ul><li>to one square only (english rules);<li>to any number of squares (russian rules).</ul><p>The kings capture by jumping forward or backward. Whenever a player is able to make a capture he must do so. + <p>Sie beginnen mit 12 Steinen. Weiß beginnt das Spiel. Sie können die Steine nur nach vorne bewegen. Diese können andere Steine schlagen:<ul><li>indem sie nur nach vorne springen (Englische Regeln);<li>indem sie sowohl nach vorn als auch nach hinten springen (Russische Regeln).</ul><p>Ein Stein der die gegenüberliegende Seite erreicht, wird zur Dame.Die Dame bewegt sich sowohl vorwärts als auch rückwärts:<ul><li>immer nur ein Feld pro Zug (Englische Regeln);<li>beliebig viele Felder pro Zug (Russische Regeln).</ul><p>Die Dame kann vor-/ und rückwärts schlagen. Schlagen ist Pflicht. + + + &Confirm aborting current game + &Bestätige Abbrechen des laufenden Spiels + + + &Open console on new messages + &Öffne Konsole beim Entreiffen neues Nachrichten + + + &Small board + &Kleines Brett + + + &Big board + &Großes Brett + + + &About + &Ãœber + + + Show notation &above + Zeige Notation &über + + + &Notation font... + &Notationsschrift... + + + <p>In the beginning of game you have 12 checkers (men). The men move forward only. The men can capture:<ul><li>by jumping forward only (english rules);<li>by jumping forward or backward (russian rules).</ul><p>A man which reaches the far side of the board becomes a king. The kings move forward or backward:<ul><li>to one square only (english rules);<li>to any number of squares (russian rules).</ul><p>The kings capture by jumping forward or backward. Whenever a player is able to make a capture he must do so. + <p>Sie beginnen mit 12 Steinen. Sie können die Steine nur nach vorne bewegen. Diese können andere Steine schlagen:<ul><li>indem sie nur nach vorne springen (Englische Regeln);<li>indem sie sowohl nach vorn als auch nach hinten springen (Russische Regeln).</ul><p>Ein Stein der die gegenüberliegende Seite erreicht, wird zur Dame.Die Dame bewegt sich sowohl vorwärts als auch rückwärts:<ul><li>immer nur ein Feld pro Zug (Englische Regeln);<li>beliebig viele Felder pro Zug (Russische Regeln).</ul><p>Die Dame kann vor-/ und rückwärts schlagen. Schlagen ist Pflicht. + + + File already exists. +Do you really want to override it? + Die Datei existiert bereits. +Wollen Sie sie wirklich überschreiben? + + + Clear &log on new round + Lösche &Log bei Rundenbeginn + + + Shift+/ + Shift+/ + + + Show notation &above men + Zeige Notation &über Spielsteinen + + + &Toolbar + &Toolleiste + + + + myView + + Go! + Los! + + + Game aborted. + Spiel abgebrochen. + + + Connection closed. + Verbundung getrennt. + + + Drawn game. + Unentschieden. + + + Invalid move. + Ungültiger Zug. + + + Waiting for opponent to move... + Warte auf Gegenspieler... + + + White wins! + Weiß gewinnt! + + + Black wins! + Schwarz gewinnt! + + + White + Weiß + + + Black + Schwarz + + + Invalid move + Ungültiger Zug + + + It's not your turn. + Du bist nicht am Zug. + + + opponent + Gegner + + + Warning! Some errors occured. + Warnung! Es sind Fehler aufgetreten. + + + Preview mode + Vorschau-Modus + + + Syntax error. Usage: /from-to + Syntaxfehler. Gebrauch: /von-nach + + + Saved: + Gespeichert: + + + Opened: + Geöffnet: + + + Play mode + Spiel-Modus + + + diff --git a/retroshare-gui/src/games/qcheckers/i18n/kcheckers_fr.qm b/retroshare-gui/src/games/qcheckers/i18n/kcheckers_fr.qm new file mode 100644 index 000000000..769e705ae Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/i18n/kcheckers_fr.qm differ diff --git a/retroshare-gui/src/games/qcheckers/i18n/kcheckers_fr.ts b/retroshare-gui/src/games/qcheckers/i18n/kcheckers_fr.ts new file mode 100644 index 000000000..068641a70 --- /dev/null +++ b/retroshare-gui/src/games/qcheckers/i18n/kcheckers_fr.ts @@ -0,0 +1,570 @@ + + + myHistory + + Move + Déplacer + + + Comment + Commentaire + + + Undo + Annuler + + + Redo + Refaire + + + Continue + Continuer + + + Set Comment + Définir le Commentaire + + + Set Tag + Définir le Tag + + + Tag + Tag + + + Reading file... + Lecture du fichier en cours... + + + Importing games... + Importe les jeux... + + + English draughts + Dames anglaises + + + Russian draughts + Dames russes + + + Unknown game type + Type de jeu inconnu + + + Free Placement Mode + Mode de Placement Libre + + + Paused Mode + Mode Pause + + + Play Mode + Mode Jeu + + + + myHumanPlayer + + Go! + Commencer ! + + + Incorrect course. + Mouvement impossible. Peut-être une capture est-elle possible ? + + + You must capture. + Vous devez capturer. + + + Cannot move this. + Impossible de déplacer cet élément. + + + + myInfo + + Move + Déplacer + + + Comment + Commentaire + + + Undo + Annuler + + + Redo + Refaire + + + Continue + Continuer + + + Set Comment + Définir le Commentaire + + + Set Tag + Définir le Tag + + + Reading file... + Lecture du fichier en cours... + + + Importing games... + Importe les jeux... + + + English draughts + Dames anglaises + + + Russian draughts + Dames russes + + + Unknown game type + Type de jeu inconnu + + + Free Placement Mode + Mode de Placement Libre + + + Paused Mode + Mode Pause + + + Play Mode + Mode Jeu + + + Tag + Tag + + + + myNewGameDlg + + New Game + Nouveau Jeu + + + Against CPU on this PC + Contre l'ordinateur local + + + Against Human on Network - New Game + Contre un humain en réseau - Nouvelle partie + + + Against Human on Network - Join Game + Contre un humain en réseau - Joindre une partie + + + Rules + Règles + + + English + Anglaises + + + Russian + Russes + + + Skill + Niveau de difficulté + + + Beginner + Débutant + + + Novice + Novice + + + Average + Moyen + + + Good + Bon + + + Expert + Expert + + + Master + Maître + + + Server IP: + IP du serveur: + + + Pick free port + Prendre un port libre + + + &Start + &Commencer + + + &Cancel + &Annuler + + + Human + Humain + + + Player One + Joueur Un + + + White + Blancs + + + Player Two + Joueur Deux + + + Computer + Ordinateur + + + Free Men Placement + Placement des Pions Libre + + + + myTopLevel + + &New... + &Nouveau... + + + CTRL+N + File|New + CTRL+N + + + &Next Round + Niveau &Suivant + + + &Stop + &Arrêter + + + &Undo Move + &Annuler le mouvement + + + CTRL+Z + File|Undo + CTRL+Z + + + &Information + &Information + + + &Open... + &Ouvrir... + + + CTRL+O + File|Open + CTRL+O + + + &Save... + &Enregistrer... + + + CTRL+S + File|Save + CTRL+S + + + &Quit + &Quitter + + + CTRL+Q + File|Quit + CTRL+Q + + + &Show Notation + &Afficher la notation + + + &Green Board + &Plateau vert + + + &Marble Board + &Plateau marbré + + + &Wooden Board + &Plateau en bois + + + What's This + Qu'est ce que c'est ? + + + SHIFT+F1 + Help|WhatsThis + SHIFT+F1 + + + &Rules of Play + &Règles du jeu + + + F1 + Help|Help + F1 + + + &About + À &propos + + + About &Qt + À propos de &Qt + + + &Game + &Jeu + + + &View + &Afficher + + + &Settings + &Configurer KCheckers + + + &Help + &Aide + + + Error + Erreur + + + &Close + &Fermer + + + Save Game + Enregistrer la Partie + + + Could not save: + Impossible d'enregistrer : + + + Open Game + Charger une Partie + + + Could not load: + Impossible d'ouvrir: + + + Game Info + Informations sur la partie + + + Rules of Play + Règles de jeu + + + About + À propos + + + Quit Game? + Quitter la partie ? + + + Current game will be lost if you continue. +Do you really want to discard it? + La partie en cours sera perdue si vous continuez. +Voulez-vous vraiment l'abandonner ? + + + Abort Game? + Abandonner la partie ? + + + &Confirm aborting current game + &Confirmer l'abandon de la partie + + + &About + &À Propos + + + Show notation &above men + Afficher la notation &au dessus des pions + + + Clear &log on new round + Nettoyer le &log au niveau niveau + + + &Notation font... + Fonte pour la &notation... + + + &Toolbar + &Barre d'outils + + + <p>In the beginning of game you have 12 checkers (men). The men move forward only. The men can capture:<ul><li>by jumping forward only (english rules);<li>by jumping forward or backward (russian rules).</ul><p>A man which reaches the far side of the board becomes a king. The kings move forward or backward:<ul><li>to one square only (english rules);<li>to any number of squares (russian rules).</ul><p>The kings capture by jumping forward or backward. Whenever a player is able to make a capture he must do so. + <p>Au début vous avez 12 pions. Les pions peuvent se déplacer uniquement en avant. Ils peuvent capturer :<ul><li>en sautant en avant seulement (règles anglaises),<li>en sautant en avant ou en arrière (règles russes).</ul><p>Un pion qui arrive du côté adverse du plateau devient une dame. Les dames peuvent se déplacer en avant ou en arrière :<ul><li>d'une seule case (règles anglaises),<li>de plusieurs cases (règles russes).</ul><p>Les dames peuvent capturer en sautant en avant ou en arrière. Quand une capture est possible, elle doit obligatoirement être exécutée. + + + + + myView + + Go! + Commencer ! + + + You have lost. Game over. + Vous avez perdu. Fin de la partie. + + + Congratulation! You have won! + Félicitations ! Vous avez gagné ! + + + I am thinking... + Je pense... + + + Waiting network player to move... + En attente du mouvement du joueur distant... + + + Incorrect course. + Mouvement impossible. Peut-être une capture est-elle possible ? + + + Waiting for network player to connect... + En attente de la connexion du joueur distant... + + + Waiting for server to reply... + En attente de la réponse du serveur... + + + Game aborted. + Partie abandonnée. + + + ENGLISH rules. + Règles ANGLAISES. + + + RUSSIAN rules. + Règles RUSSES. + + + +New Network Game + +Nouvelle partie en réseau + + + +Join Network Game + +Rejoindre une partie en réseau + + + Unknown rules. Playing current rules: + Règles inconnues. Adopte les règles courantes : + + + Unknown skill. Keeping current skill: + Niveau inconnu. Conserve le niveau courant : + + + Player + Le joueur + + + is played by KCheckers with current skill: + est controllé par KCheckers avec le niveau courant : + + + This is not implemented yet. + Ceci n'est pas encore implémenté. + + + Please consider Information mismatch. + Veuillez considérer que les informations sont discordantes. + + + Russian + Russes + + + Drawn game. + Match nul. + + + Invalid move. + Mouvement invalide. + + + White wins! + Les blancs gagnent ! + + + Black wins! + Les noirs gagnent ! + + + opponent + adversaire + + + Opened: + Ouvert : + + + Warning! Some errors occured. + Attention ! Des erreurs sont survenues. + + + Saved: + Enregistré : + + + diff --git a/retroshare-gui/src/games/qcheckers/i18n/kcheckers_ru.ts b/retroshare-gui/src/games/qcheckers/i18n/kcheckers_ru.ts new file mode 100644 index 000000000..222ecdbff --- /dev/null +++ b/retroshare-gui/src/games/qcheckers/i18n/kcheckers_ru.ts @@ -0,0 +1,545 @@ + + + PdnPreview + + White + Белые + + + Black + Черные + + + Open board only + Показывать доÑку + + + No preview available. + ПредпроÑмотр невозможен. + + + English draughts + ÐнглийÑкие чекерÑÑ‹ + + + Russian draughts + РуÑÑкие шашки + + + Unknown game type + Правила неизвеÑтны + + + + myConsole + + Clear + ОчиÑтить + + + Save + Сохранить + + + Save Console + Сохранить команды + + + + myHumanPlayer + + You must capture. + Ð’Ñ‹ должны бить. + + + Unmovable. + Ðет хода. + + + Cannot move this. + Ðет хода. + + + + myInfo + + White + Белые + + + Black + Черные + + + English draughts + ÐнглийÑкие чекерÑÑ‹ + + + Russian draughts + РуÑÑкие шашки + + + Unknown game type + Правила неизвеÑтны + + + Importing games... + + + + Reading file... + + + + Continue + + + + Move + + + + Comment + + + + Undo + + + + Redo + + + + Set Comment + + + + Set Tag + + + + Free Placement Mode + + + + Paused Mode + + + + Play Mode + + + + Tag + + + + + myNewGameDlg + + New Game + ÐÐ¾Ð²Ð°Ñ Ð¸Ð³Ñ€Ð° + + + Rules + Правила + + + Skill + Уровень + + + Beginner + Подготовительный + + + Novice + Ðачальный + + + Average + Средний + + + Good + Сложный + + + Expert + ЭкÑперт + + + Master + МаÑтер + + + Accept + ПринÑÑ‚ÑŒ + + + Address: + ÐдреÑ: + + + Servername: + Ð˜Ð¼Ñ Ñервера: + + + Serverinfo: + Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ Ñервере: + + + &Start + &Старт + + + &Cancel + &Отмена + + + Wait... + Подождите... + + + Waiting for client to connect... + Ожидание ÑвÑзи Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð¾Ð¼... + + + Waiting for server to accept... + Ожидание ответа от Ñервера... + + + Server denied. + Сервер недоÑтупен. + + + Connection aborted. + СвÑзь прервана. + + + Human + Человек + + + Player One + Первый игрок + + + White + Белые + + + Player Two + Второй игрок + + + Computer + Компьютер + + + Network - New Game + Сеть - ÐÐ¾Ð²Ð°Ñ Ð¸Ð³Ñ€Ð° + + + Network - Join Game + Сеть - ПриÑоединитьÑÑ + + + Server + Сервер + + + Client + Клиент + + + Could not create a game on the server. + Ðевозможно запуÑтить игру на Ñервере. + + + Could not join the game. + Ðевозможно приÑоединитьÑÑ Ðº игре. + + + Client connected. + СвÑзь Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð¾Ð¼ уÑтановлена. + + + Client disconnected. + СвÑзь Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð¾Ð¼ разорвана. + + + Free Men Placement + + + + + myTopLevel + + &New... + &ÐоваÑ... + + + CTRL+N + File|New + CTRL+N + + + &Next Round + &Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð¿Ð°Ñ€Ñ‚Ð¸Ñ + + + &Stop + &Стоп + + + &Undo Move + &Ход назад + + + CTRL+Z + File|Undo + CTRL+Z + + + &Information + &Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ + + + &Open... + &Открыть... + + + CTRL+O + File|Open + CTRL+O + + + &Save... + &Сохранить... + + + CTRL+S + File|Save + CTRL+S + + + &Quit + &Выход + + + CTRL+Q + File|Quit + CTRL+Q + + + &Show Notation + &Показать нотацию + + + &Green Board + &Ð—ÐµÐ»ÐµÐ½Ð°Ñ Ð´Ð¾Ñка + + + &Marble Board + &ÐœÑ€Ð°Ð¼Ð¾Ñ€Ð½Ð°Ñ Ð´Ð¾Ñка + + + &Wooden Board + &ДеревÑÐ½Ð½Ð°Ñ Ð´Ð¾Ñка + + + &Console + &КонÑоль + + + What's This + Что Ñто + + + SHIFT+F1 + Help|WhatsThis + SHIFT+F1 + + + &Rules of Play + &Правила игры + + + F1 + Help|Help + F1 + + + About &Qt + О &Qt + + + &Game + &Игра + + + &View + &Вид + + + &Settings + &ÐаÑтройки + + + &Help + &Справка + + + Error + Ошибка + + + &Close + &Закрыть + + + Save Game + Сохранить игру + + + Could not save: + Ðевозможно Ñохранить: + + + Open Game + Открыть игру + + + Could not load: + Ðевозможно открыть: + + + Game Info + Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ð± игре + + + Rules of Play + Правила игры + + + About + О программе + + + Current game will be lost if you continue. +Do you really want to discard it? + Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ð¸Ð³Ñ€Ð° будет прервана. +Ð’Ñ‹ дейÑтвительно Ñтого хотите? + + + Abort Game? + Прервать игру? + + + <p>In the beginning of game you have 12 checkers (men). White always moves first. The men move forward only. The men can capture:<ul><li>by jumping forward only (english rules);<li>by jumping forward or backward (russian rules).</ul><p>A man which reaches the far side of the board becomes a king. The kings move forward or backward:<ul><li>to one square only (english rules);<li>to any number of squares (russian rules).</ul><p>The kings capture by jumping forward or backward. Whenever a player is able to make a capture he must do so. + <p>Ð’ начале игры у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ 12 пешек. Белые вÑегда начинают. Пешки могут ходить только вперед. Пешки могут бить:<ul><li>только вперед (английÑкие правила);<li>вперед и назад (руÑÑкие правила).</ul><p>Пешка, доÑÑ‚Ð¸Ð³Ð°ÑŽÑ‰Ð°Ñ Ð¿Ñ€Ð¾Ñ‚Ð¸Ð²Ð¾Ð¿Ð¾Ð»Ð¾Ð¶Ð½Ð¾Ð³Ð¾ ÐºÑ€Ð°Ñ Ð´Ð¾Ñки, ÑтановитÑÑ Ð´Ð°Ð¼ÐºÐ¾Ð¹. Дамки ходÑÑ‚ вперед и назад:<ul><li>только на ÑоÑедние Ð¿Ð¾Ð»Ñ (английÑкие правила);<li>на любое количеÑтво клеток (руÑÑкие правила).</ul><p>Дамки могут бить и вперед и назад. ЕÑли игрок может бить, то он обÑзан Ñто Ñделать. + + + + &Confirm aborting current game + &Подтвердите прерывание текущей игры + + + &Open console on new messages + &Открытие конÑоли Ð´Ð»Ñ Ñообщений + + + &Small board + &ÐœÐ°Ð»ÐµÐ½ÑŒÐºÐ°Ñ Ð´Ð¾Ñка + + + &Big board + &Ð‘Ð¾Ð»ÑŒÑˆÐ°Ñ Ð´Ð¾Ñка + + + &About + &О программе + + + &Notation font... + + + + <p>In the beginning of game you have 12 checkers (men). The men move forward only. The men can capture:<ul><li>by jumping forward only (english rules);<li>by jumping forward or backward (russian rules).</ul><p>A man which reaches the far side of the board becomes a king. The kings move forward or backward:<ul><li>to one square only (english rules);<li>to any number of squares (russian rules).</ul><p>The kings capture by jumping forward or backward. Whenever a player is able to make a capture he must do so. + <p>Ð’ начале игры у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ 12 пешек. Пешки могут ходить только вперед. Пешки могут бить:<ul><li>только вперед (английÑкие правила);<li>вперед и назад (руÑÑкие правила).</ul><p>Пешка, доÑÑ‚Ð¸Ð³Ð°ÑŽÑ‰Ð°Ñ Ð¿Ñ€Ð¾Ñ‚Ð¸Ð²Ð¾Ð¿Ð¾Ð»Ð¾Ð¶Ð½Ð¾Ð³Ð¾ ÐºÑ€Ð°Ñ Ð´Ð¾Ñки, ÑтановитÑÑ Ð´Ð°Ð¼ÐºÐ¾Ð¹. Дамки ходÑÑ‚ вперед и назад:<ul><li>только на ÑоÑедние Ð¿Ð¾Ð»Ñ (английÑкие правила);<li>на любое количеÑтво клеток (руÑÑкие правила).</ul><p>Дамки могут бить и вперед и назад. ЕÑли игрок может бить, то он обÑзан Ñто Ñделать. + + + Clear &log on new round + + + + Show notation &above men + + + + &Toolbar + + + + + myView + + Go! + Ваш ход! + + + Game aborted. + Игра прервана. + + + Connection closed. + Соединение закрыто. + + + Drawn game. + ЗатÑвнушаÑÑÑ Ð¸Ð³Ñ€Ð°. + + + Invalid move. + Ðеверный ход. + + + Waiting for opponent to move... + Ожидание хода противника... + + + White wins! + Выиграли белые! + + + Black wins! + Выиграли черные! + + + White + Белые + + + Black + Черные + + + opponent + противник + + + Warning! Some errors occured. + + + + Saved: + + + + Opened: + + + + diff --git a/retroshare-gui/src/games/qcheckers/icons/biglogo.png b/retroshare-gui/src/games/qcheckers/icons/biglogo.png new file mode 100644 index 000000000..a4b052a34 Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/icons/biglogo.png differ diff --git a/retroshare-gui/src/games/qcheckers/icons/clear.png b/retroshare-gui/src/games/qcheckers/icons/clear.png new file mode 100644 index 000000000..66d96d85c Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/icons/clear.png differ diff --git a/retroshare-gui/src/games/qcheckers/icons/console.png b/retroshare-gui/src/games/qcheckers/icons/console.png new file mode 100644 index 000000000..ef1fb8979 Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/icons/console.png differ diff --git a/retroshare-gui/src/games/qcheckers/icons/context.png b/retroshare-gui/src/games/qcheckers/icons/context.png new file mode 100644 index 000000000..e8e6b4d45 Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/icons/context.png differ diff --git a/retroshare-gui/src/games/qcheckers/icons/continue.png b/retroshare-gui/src/games/qcheckers/icons/continue.png new file mode 100644 index 000000000..4d069e52a Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/icons/continue.png differ diff --git a/retroshare-gui/src/games/qcheckers/icons/dialog.png b/retroshare-gui/src/games/qcheckers/icons/dialog.png new file mode 100644 index 000000000..c5630c6ba Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/icons/dialog.png differ diff --git a/retroshare-gui/src/games/qcheckers/icons/down.png b/retroshare-gui/src/games/qcheckers/icons/down.png new file mode 100644 index 000000000..9990d86d4 Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/icons/down.png differ diff --git a/retroshare-gui/src/games/qcheckers/icons/exit.png b/retroshare-gui/src/games/qcheckers/icons/exit.png new file mode 100644 index 000000000..363c9b4c3 Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/icons/exit.png differ diff --git a/retroshare-gui/src/games/qcheckers/icons/fileopen.png b/retroshare-gui/src/games/qcheckers/icons/fileopen.png new file mode 100644 index 000000000..e4bdb3df1 Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/icons/fileopen.png differ diff --git a/retroshare-gui/src/games/qcheckers/icons/filesave.png b/retroshare-gui/src/games/qcheckers/icons/filesave.png new file mode 100644 index 000000000..869209e31 Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/icons/filesave.png differ diff --git a/retroshare-gui/src/games/qcheckers/icons/freeplace.png b/retroshare-gui/src/games/qcheckers/icons/freeplace.png new file mode 100644 index 000000000..5ec4b060c Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/icons/freeplace.png differ diff --git a/retroshare-gui/src/games/qcheckers/icons/info.png b/retroshare-gui/src/games/qcheckers/icons/info.png new file mode 100644 index 000000000..36524824b Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/icons/info.png differ diff --git a/retroshare-gui/src/games/qcheckers/icons/logo.png b/retroshare-gui/src/games/qcheckers/icons/logo.png new file mode 100644 index 000000000..16facdd15 Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/icons/logo.png differ diff --git a/retroshare-gui/src/games/qcheckers/icons/next.png b/retroshare-gui/src/games/qcheckers/icons/next.png new file mode 100644 index 000000000..93fa94c81 Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/icons/next.png differ diff --git a/retroshare-gui/src/games/qcheckers/icons/paused.png b/retroshare-gui/src/games/qcheckers/icons/paused.png new file mode 100644 index 000000000..9d4b7d911 Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/icons/paused.png differ diff --git a/retroshare-gui/src/games/qcheckers/icons/redo.png b/retroshare-gui/src/games/qcheckers/icons/redo.png new file mode 100644 index 000000000..defa358de Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/icons/redo.png differ diff --git a/retroshare-gui/src/games/qcheckers/icons/stop.png b/retroshare-gui/src/games/qcheckers/icons/stop.png new file mode 100644 index 000000000..ea7ddcdad Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/icons/stop.png differ diff --git a/retroshare-gui/src/games/qcheckers/icons/theme/Thumbs.db b/retroshare-gui/src/games/qcheckers/icons/theme/Thumbs.db new file mode 100644 index 000000000..e0fe14024 Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/icons/theme/Thumbs.db differ diff --git a/retroshare-gui/src/games/qcheckers/icons/theme/frame.png b/retroshare-gui/src/games/qcheckers/icons/theme/frame.png new file mode 100644 index 000000000..669aa8d71 Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/icons/theme/frame.png differ diff --git a/retroshare-gui/src/games/qcheckers/icons/theme/kingblack.png b/retroshare-gui/src/games/qcheckers/icons/theme/kingblack.png new file mode 100644 index 000000000..b6a596a4f Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/icons/theme/kingblack.png differ diff --git a/retroshare-gui/src/games/qcheckers/icons/theme/kingwhite.png b/retroshare-gui/src/games/qcheckers/icons/theme/kingwhite.png new file mode 100644 index 000000000..64fc42f1a Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/icons/theme/kingwhite.png differ diff --git a/retroshare-gui/src/games/qcheckers/icons/theme/manblack.png b/retroshare-gui/src/games/qcheckers/icons/theme/manblack.png new file mode 100644 index 000000000..32372efee Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/icons/theme/manblack.png differ diff --git a/retroshare-gui/src/games/qcheckers/icons/theme/manwhite.png b/retroshare-gui/src/games/qcheckers/icons/theme/manwhite.png new file mode 100644 index 000000000..6262d38f1 Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/icons/theme/manwhite.png differ diff --git a/retroshare-gui/src/games/qcheckers/icons/theme/tile1.png b/retroshare-gui/src/games/qcheckers/icons/theme/tile1.png new file mode 100644 index 000000000..843fa0043 Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/icons/theme/tile1.png differ diff --git a/retroshare-gui/src/games/qcheckers/icons/theme/tile2.png b/retroshare-gui/src/games/qcheckers/icons/theme/tile2.png new file mode 100644 index 000000000..c415b4d0d Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/icons/theme/tile2.png differ diff --git a/retroshare-gui/src/games/qcheckers/icons/undo.png b/retroshare-gui/src/games/qcheckers/icons/undo.png new file mode 100644 index 000000000..3ad9e865c Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/icons/undo.png differ diff --git a/retroshare-gui/src/games/qcheckers/icons/up.png b/retroshare-gui/src/games/qcheckers/icons/up.png new file mode 100644 index 000000000..27f475c89 Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/icons/up.png differ diff --git a/retroshare-gui/src/games/qcheckers/main.cc b/retroshare-gui/src/games/qcheckers/main.cc new file mode 100644 index 000000000..f3dede268 --- /dev/null +++ b/retroshare-gui/src/games/qcheckers/main.cc @@ -0,0 +1,49 @@ +#include +#include +#include +#include +//#include + + +#include "toplevel.h" +#include "common.h" + + +int main(int argc, char *argv[]) +{ + QApplication app(argc,argv); +// app.setStyle(new QPlastiqueStyle); + + qDebug() + << "Your Locale:" << QLocale::system().name() << endl + << "Prefix path:" << PREFIX; + + // Qt translations + QTranslator qt_tr; + if(qt_tr.load("qt_" + QLocale::system().name())) + app.installTranslator(&qt_tr); + else + qDebug() << "Loading Qt translations failed."; + + // App translations + QTranslator app_tr; + if(app_tr.load("kcheckers_" + QLocale::system().name(), + PREFIX"/share/kcheckers")) + app.installTranslator(&app_tr); + else + qDebug() << "Loading KCheckers translations failed."; + + myTopLevel* top = new myTopLevel(); + top->show(); + + // command line + if(app.argc()==2) + top->open(app.argv()[1]); + + int exit = app.exec(); + + delete top; + return exit; +} + + diff --git a/retroshare-gui/src/games/qcheckers/newgamedlg.cc b/retroshare-gui/src/games/qcheckers/newgamedlg.cc new file mode 100644 index 000000000..d13af8f1c --- /dev/null +++ b/retroshare-gui/src/games/qcheckers/newgamedlg.cc @@ -0,0 +1,324 @@ +/*************************************************************************** + * Copyright (C) 2004-2005 Artur Wiebe * + * wibix@gmx.de * + * * + * 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., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include + +#include +#include + +#include "newgamedlg.h" +#include "pdn.h" +#include "common.h" +#include "history.h" + +#include "player.h" + + +#define BEGINNER 2 +#define NOVICE 4 +#define AVERAGE 6 +#define GOOD 7 +#define EXPERT 8 +#define MASTER 9 + +#define CFG_SKILL CFG_KEY"Skill" +#define CFG_RULES CFG_KEY"Rules" +#define CFG_WHITE CFG_KEY"White" +#define CFG_PLAYER1 CFG_KEY"Player1" +#define CFG_PLAYER2 CFG_KEY"Player2" + + +myNewGameDlg::myNewGameDlg(QWidget* parent) + : QDialog(parent) +{ + setModal(true); + setWindowTitle(tr("New Game")+QString(" - "APPNAME)); + + + /* + * buttons, options. + */ + start_button = new QPushButton(tr("&Start"), this); + start_button->setDefault(true); + connect(start_button, SIGNAL(clicked()), this, SLOT(slot_start())); + + QPushButton* cn = new QPushButton(tr("&Cancel"), this); + connect(cn, SIGNAL(clicked()), this, SLOT(slot_reject())); + + // TODO - better text + m_freeplace = new QCheckBox(tr("Free Men Placement"), this); + + QHBoxLayout* buttons_layout = new QHBoxLayout(); + buttons_layout->addWidget(m_freeplace); + buttons_layout->addStretch(); + buttons_layout->addWidget(start_button); + buttons_layout->addWidget(cn); + + + /* + * global layout. + */ + QHBoxLayout* players_layout = new QHBoxLayout(); + players_layout->addWidget(create_player_one()); + players_layout->addWidget(create_player_two()); + + QVBoxLayout* global_layout = new QVBoxLayout(this); + global_layout->addLayout(players_layout); + global_layout->addLayout(buttons_layout); +} + + +myNewGameDlg::~myNewGameDlg() +{ +} + + +QWidget* myNewGameDlg::create_human_options() +{ + QFrame* frm = new QFrame(); + QVBoxLayout* frm_layout = new QVBoxLayout(frm); + frm_layout->addWidget(new QLabel("No options available.")); + frm_layout->addStretch(); + + return frm; +} + + +QWidget* myNewGameDlg::create_player_one() +{ + m_player_one.box = new QGroupBox(tr("Player One"), this); + + // name + m_player_one.name = new QLineEdit(m_player_one.box); + + // rules group box + m_player_one.rules = new QGroupBox(tr("Rules"), m_player_one.box); + m_player_one.rule_english = new QRadioButton( + myHistory::typeToString(ENGLISH), m_player_one.rules); + m_player_one.rule_russian = new QRadioButton( + myHistory::typeToString(RUSSIAN), m_player_one.rules); + + QVBoxLayout* rules_layout = new QVBoxLayout(m_player_one.rules); + rules_layout->addWidget(m_player_one.rule_english); + rules_layout->addWidget(m_player_one.rule_russian); + + // play white men? + m_player_one.white = new QCheckBox(tr("White"), m_player_one.box); + + // layout + QVBoxLayout* vb1_layout = new QVBoxLayout(m_player_one.box); + vb1_layout->addWidget(m_player_one.name); + vb1_layout->addWidget(m_player_one.rules); + vb1_layout->addWidget(m_player_one.white); + + return m_player_one.box; +} + + +QWidget* myNewGameDlg::create_player_two() +{ + m_player_two.box = new QGroupBox(tr("Player Two"), this); + + // name + m_player_two.name = new QLineEdit(m_player_two.box); + + // options + m_player_two.options = new QTabWidget(m_player_two.box); + m_player_two.options->insertTab(COMPUTER, create_computer_options(), tr("Computer")); + m_player_two.options->insertTab(HUMAN, create_human_options(), tr("Human")); + connect(m_player_two.options, SIGNAL(currentChanged(int)), + this, SLOT(slot_game(int))); + + /* + * frame layout + */ + QVBoxLayout* frm_layout = new QVBoxLayout(m_player_two.box); + frm_layout->addWidget(m_player_two.name); + frm_layout->addWidget(m_player_two.options); + + return m_player_two.box; +} + + +QWidget* myNewGameDlg::create_computer_options() +{ + QFrame* frm = new QFrame(); + + // skills + QGroupBox* skills = new QGroupBox(tr("Skill"), frm); + m_player_two.computer.skills[BEGINNER] = new QRadioButton(tr("Beginner"), + skills); + m_player_two.computer.skills[NOVICE] = new QRadioButton(tr("Novice"), + skills); + m_player_two.computer.skills[AVERAGE] = new QRadioButton(tr("Average"), + skills); + m_player_two.computer.skills[GOOD] = new QRadioButton(tr("Good"), + skills); + m_player_two.computer.skills[EXPERT] = new QRadioButton(tr("Expert"), + skills); + m_player_two.computer.skills[MASTER] = new QRadioButton(tr("Master"), + skills); + + QGridLayout* skills_layout = new QGridLayout(skills); + int row = 0; + int col = 0; + foreach(QRadioButton* rb, m_player_two.computer.skills) { + skills_layout->addWidget(rb, row++, col); + connect(rb, SIGNAL(clicked()), this, SLOT(slot_skills())); + if(row > 2) { + row = 0; + col = 1; + } + } + + // layout + QHBoxLayout* frm_layout = new QHBoxLayout(frm); + frm_layout->addWidget(skills); + + return frm; +} + + +void myNewGameDlg::slot_reject() +{ + reject(); +} + + +void myNewGameDlg::slot_start() +{ + accept(); +} + + +void myNewGameDlg::slot_skills() +{ + QRadioButton* skill = 0; + foreach(QRadioButton* rb, m_player_two.computer.skills) { + if(rb->isChecked()) { + skill = rb; + break; + } + } + + if(skill) + m_player_two.name->setText("*"+skill->text()+"*"); +} + + +void myNewGameDlg::slot_game_start(int id) +{ + slot_game(id); + slot_start(); +} + + +void myNewGameDlg::slot_game(int id) +{ + start_button->setEnabled(true); + m_player_one.box->setEnabled(true); + m_player_two.options->setEnabled(true); + + if(m_player_two.last_game_index==HUMAN) { + m_cfg_player2 = m_player_two.name->text(); + } + + m_player_two.last_game_index = id; + + switch(id) { + case COMPUTER: + m_player_two.name->setReadOnly(true); + slot_skills(); + + m_player_one.rules->setEnabled(true); + m_player_one.white->setEnabled(true); + break; + + case HUMAN: + m_player_two.name->setReadOnly(false); + m_player_two.name->setText(m_cfg_player2); + + m_player_one.rules->setEnabled(true); + m_player_one.white->setEnabled(true); + break; + + default: + qDebug() << __PRETTY_FUNCTION__ << "ERR"; + break; + } +} + + +void myNewGameDlg::writeSettings(QSettings* cfg) +{ + cfg->setValue(CFG_SKILL, skill()); + cfg->setValue(CFG_RULES, rules()); + cfg->setValue(CFG_WHITE, m_player_one.white->isChecked()); + + cfg->setValue(CFG_PLAYER1, m_player_one.name->text()); + cfg->setValue(CFG_PLAYER2, m_cfg_player2); +} + + +void myNewGameDlg::readSettings(QSettings* cfg) +{ + int skills = cfg->value(CFG_SKILL, BEGINNER).toInt(); + QMap::iterator it; + it = m_player_two.computer.skills.find(skills); + if(it != m_player_two.computer.skills.end()) + it.value()->setChecked(true); + else + m_player_two.computer.skills[BEGINNER]->setChecked(true); + slot_skills(); + + int rules = cfg->value(CFG_RULES, ENGLISH).toInt(); + if(rules == ENGLISH) + m_player_one.rule_english->setChecked(true); + else + m_player_one.rule_russian->setChecked(true); + + m_player_one.white->setChecked(cfg->value(CFG_WHITE, false).toBool()); + + m_player_one.name->setText(cfg->value(CFG_PLAYER1, + getenv("USER")).toString()); + m_cfg_player2 = cfg->value(CFG_PLAYER2, "Player2").toString(); +} + + +int myNewGameDlg::skill() const +{ + QMap::const_iterator it; + it = m_player_two.computer.skills.begin(); + for(; it!=m_player_two.computer.skills.end(); ++it) { + if(it.value()->isChecked()) + return it.key(); + } + + qDebug() << __PRETTY_FUNCTION__ << "No skill selected."; + return BEGINNER; +} + + +int myNewGameDlg::rules() const +{ + if(m_player_one.rule_english->isChecked()) + return ENGLISH; + return RUSSIAN; +} + diff --git a/retroshare-gui/src/games/qcheckers/newgamedlg.h b/retroshare-gui/src/games/qcheckers/newgamedlg.h new file mode 100644 index 000000000..22b4dc34a --- /dev/null +++ b/retroshare-gui/src/games/qcheckers/newgamedlg.h @@ -0,0 +1,116 @@ +/*************************************************************************** + * Copyright (C) 2004-2005 Artur Wiebe * + * wibix@gmx.de * + * * + * 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., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#ifndef _NEWGAMEDLG_H_ +#define _NEWGAMEDLG_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#define COMPUTER 0 +#define HUMAN 1 + + +class myPlayer; + + +class myNewGameDlg : public QDialog +{ + Q_OBJECT + +public: + myNewGameDlg(QWidget* parent); + ~myNewGameDlg(); + + // playing against the computer + int rules() const; + // return HUMAN/COMPUTER + int opponent() const { return m_player_two.options->currentIndex(); } + // + int skill() const; + // + bool freePlacement() const { return m_freeplace->isChecked(); } + + // + const QString name() const { return m_player_one.name->text(); } + bool isWhite() const { return m_player_one.white->isChecked(); } + const QString opponentName() const { return m_player_two.name->text(); } + + // for settings + void writeSettings(QSettings*); + void readSettings(QSettings*); + +private slots: + void slot_game(int id); // ListWidget + void slot_game_start(int id); + void slot_skills(); + + void slot_reject(); + void slot_start(); + +private: + QWidget* create_player_one(); + QWidget* create_player_two(); + + QWidget* create_human_options(); + QWidget* create_computer_options(); + +private: + struct player_one_struct { + QGroupBox* box; + QLineEdit* name; + QGroupBox* rules; + QRadioButton* rule_english; + QRadioButton* rule_russian; + QCheckBox* white; + }; + struct player_one_struct m_player_one; + + struct player_two_struct { + QGroupBox* box; + QLineEdit* name; + int last_game_index; + QTabWidget* options; + // human options + // computer options + struct computer_stuct { + QMap skills; + }; + struct computer_stuct computer; + }; + struct player_two_struct m_player_two; + + QCheckBox* m_freeplace; + QPushButton* start_button; + + QString m_cfg_player2; +}; + +#endif + diff --git a/retroshare-gui/src/games/qcheckers/pdn.cc b/retroshare-gui/src/games/qcheckers/pdn.cc new file mode 100644 index 000000000..01d32f269 --- /dev/null +++ b/retroshare-gui/src/games/qcheckers/pdn.cc @@ -0,0 +1,541 @@ +/*************************************************************************** + * Copyright (C) 2002-2003 Andi Peredri * + * andi@ukr.net * + * Copyright (C) 2004-2005 Artur Wiebe * + * wibix@gmx.de * + * * + * 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., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include +#include +#include +#include + +#include "checkers.h" +#include "pdn.h" + + +#define PLAYER true +#define COMPUTER false + +#define END_OF_MOVELINE "@." + + +Pdn::Pdn() +{ +} + + +Pdn::~Pdn() +{ + qDeleteAll(m_database); + m_database.clear(); +} + + +bool Pdn::open(const QString& filename, QWidget* parent, + const QString& label, QString& text_to_log) +{ + qDeleteAll(m_database); + m_database.clear(); + + QFile file(filename); + if(!file.open(QFile::ReadOnly)) return false; + + QTextStream ts(&file); + + QString str1, str2; + + QProgressDialog progress(parent); + progress.setModal(true); + progress.setLabelText(label); + progress.setRange(0, file.size()); + progress.setMinimumDuration(0); + + unsigned int line_nr = 1; + unsigned int game_started = 1; + bool in_tags = false; + while(!ts.atEnd()) { + str1 = ts.readLine().trimmed(); + if(ts.atEnd()) + str2 += str1; + + if((str1.length() && str1[0]=='[') || ts.atEnd()) { + if(!in_tags) { + // tags begin again, so a game is ended. + if(str2.length()) { + if((m_database.count()%10)==0) + progress.setValue(file.pos()); + + QString log_txt; + PdnGame* game = new PdnGame(str2, log_txt); + m_database.append(game); + + if(log_txt.length()) { + text_to_log + += QString("%1. game begins at line %2:\n") + .arg(m_database.count()) + .arg(game_started); + text_to_log += log_txt; + } + + game_started = line_nr; + str2=""; + } + + in_tags = true; + } + } else { + if(in_tags) + in_tags = false; + } + + str2.append(str1+"\n"); + + if(progress.wasCanceled()) + break; + + line_nr++; + } + + file.close(); + + return true; +} + + +bool Pdn::save(const QString& filename) +{ + QFile file(filename); + if(!file.open(QFile::WriteOnly)) + return false; + + QTextStream ts(&file); + + foreach(PdnGame* game, m_database) { + ts << game->toString() << endl << endl; + } + + file.close(); + return true; +} + + + +PdnGame* Pdn::newGame() +{ + QString log_txt; // here: ignore TODO + PdnGame* game = new PdnGame("", log_txt); + m_database.append(game); + return game; +} + + +/*************************************************************************** + * * + * * + ***************************************************************************/ +PdnMove::PdnMove(QString line) +{ + if(line[0]=='{') { + qDebug("a move must not begin with a comment."); + return; + } + + // first move. + m_first = line.section(' ', 0, 0); + line = line.mid(m_first.length()).trimmed(); + + // check for a first comment. + if(line[0]=='{') { + int end = line.indexOf('}', 1); + if(end>=0) { + m_comfirst = line.mid(1, end-1); + line.remove(0, end+1); + line = line.trimmed(); + } else + qDebug("no comment ending of the first comment."); + } + + // second move. + m_second = line.section(' ', 0, 0); + line = line.mid(m_second.length()).trimmed(); + + // check for a second comment. + if(line[0]=='{') { + int end = line.indexOf('}', 1); + if(end>=0) + m_comsecond = line.mid(1, end-1); + else + qDebug("no comment ending of the second comment."); + } +} + + +/*************************************************************************** + * * + * * + ***************************************************************************/ +PdnGame::PdnGame(const QString& game_string, QString& log_txt) +{ + white = PLAYER; + for(int i=0; i<12; i++) + board[i]=MAN2; + for(int i=20; i<32; i++) + board[i]=MAN1; + + if(!parse(game_string, log_txt)) { + qDebug(" errors occured while processing game."); // TODO + } +} + + +PdnGame::~PdnGame() +{ + qDeleteAll(m_moves); + m_moves.clear(); +} + + +QString PdnGame::get(Tag tag) const +{ + switch(tag) { + case Date: return pdnDate; + case Site: return pdnSite; + case Type: return pdnType; + case Event: return pdnEvent; + case Round: return pdnRound; + case White: return pdnWhite; + case Black: return pdnBlack; + default: return pdnResult; + } +} + + +void PdnGame::set(Tag tag, const QString& string) +{ + switch(tag) { + case Date: pdnDate=string; break; + case Site: pdnSite=string; break; + case Type: pdnType=string; break; + case Event: pdnEvent=string;break; + case Round: pdnRound=string;break; + case White: pdnWhite=string;break; + case Black: pdnBlack=string;break; + default: pdnResult=string; + } +} + + +bool PdnGame::parse_moves(const QString& line) +{ + qDeleteAll(m_moves); + m_moves.clear(); + + QStringList list = line.split(' '); + + QString current_move; + int move_num = 0; + bool in_comment = false; + foreach(QString str, list) { + if(str.startsWith("{")) + in_comment = true; + if(str.endsWith("}")) + in_comment = false; + + if(str.endsWith(".") && !in_comment) { + if(str!=END_OF_MOVELINE) { + if((move_num+1) != str.mid(0, str.length()-1).toInt()) { + qDebug() << "Move num expected:" << move_num+1 + << "received:" << str; + return false; + } + move_num++; + } + + current_move = current_move.trimmed(); + if(current_move.length()) { + m_moves.append(new PdnMove(current_move)); + current_move = ""; + } + continue; + } + + if(str.isEmpty()) + current_move += " "; + else + current_move += str + " "; + } + + return true; +} + + +bool PdnGame::parse(const QString& pdngame, QString& log_txt) +{ + QString fen; + QString moves; + int num = pdngame.count("\n"); // Number of lines + + for(int i=0; i<=num; i++) { + QString line = pdngame.section('\n',i ,i); + if(!line.length()) + continue; + + if(line.startsWith("[")) { + line.remove(0, 1); + line = line.trimmed(); + + if(line.startsWith("GameType")) pdnType=line.section('"',1,1); + else if(line.startsWith("FEN")) fen=line.section('"',1,1); + else if(line.startsWith("Date")) pdnDate=line.section('"',1,1); + else if(line.startsWith("Site")) pdnSite=line.section('"',1,1); + else if(line.startsWith("Event")) pdnEvent=line.section('"',1,1); + else if(line.startsWith("Round")) pdnRound=line.section('"',1,1); + else if(line.startsWith("White")) pdnWhite=line.section('"',1,1); + else if(line.startsWith("Black")) pdnBlack=line.section('"',1,1); + else if(line.startsWith("Result")) pdnResult=line.section('"',1,1); + else ; // Skip other unsupported tags + + } else { + moves += " " + line; + } + } + + // parse move section. + if(moves.endsWith(pdnResult)) + moves.truncate(moves.length()-pdnResult.length()); + else { + log_txt += " +Different result at the end of the movelist:\n" + + QString(" \"%1\" expected, got \"%2\"\n") + .arg(pdnResult) + .arg(moves.right(pdnResult.length())); + + // need to remove the incorrect result. + if(moves.endsWith(" *")) { + log_txt += " => Ignoring \" *\" from the end.\n"; + moves.truncate(moves.length()-2); + } else { + int pos = moves.lastIndexOf('-') - 1; + bool skip_ws = true; + for(int i=pos; i>=0; i--) { + if(moves[i]==' ') { + if(!skip_ws) { + log_txt += " => Ignoring \"" + + moves.right(moves.length()-i-1) + + "\" from the end.\n", + moves.truncate(i+1); + break; + } + } else { + skip_ws = false; + } + } + } + } + + if(!parse_moves(moves+" "END_OF_MOVELINE)) { // :) + log_txt += "\n +parsing moves failed."; + return false; + } + + // Translation of the GameType tag + switch(pdnType.toInt()) { + case ENGLISH: + case RUSSIAN: + break; + default: +// log_txt += "\n +setting game type to english."; + pdnType.setNum(ENGLISH); + break; + } + + // Parsing of the Forsyth-Edwards Notation (FEN) tag + if(fen.isNull()) + return true; + + fen=fen.trimmed(); + + for(int i=fen.indexOf(" "); i!=-1; i=fen.indexOf(" ")) + fen=fen.remove(i,1); + + if(fen.startsWith("W:W")) + white=PLAYER; + else if(fen.startsWith("B:W")) + white=COMPUTER; + else + return false; + + QString string = fen.mid(3).section(":B",0,0); + if(!parse(string, white)) + return false; + + string=fen.section(":B",1,1); + if(string.endsWith(".")) + string.truncate(string.length()-1); + if(!parse(string, !white)) + return false; + + return true; +} + + +bool PdnGame::parse(const QString& str, bool side) +{ + QString notation; + + if(pdnType.toInt() == ENGLISH) + notation=QString(ENOTATION); + else + notation=QString(RNOTATION); + + QStringList sections = str.split(","); + foreach(QString pos, sections) { + bool king=false; + + if(pos.startsWith("K")) { + pos=pos.remove(0,1); + king=true; + } + if(pos.length()==1) + pos.append(' '); + if(pos.length()!=2) + return false; + + int index = notation.indexOf(pos); + if(index%2) + index=notation.indexOf(pos,index+1); + if(index == -1) + return false; + + if(white==COMPUTER) + index=62-index; + + if(side==PLAYER) + board[index/2]=(king ? KING1 : MAN1); + else + board[index/2]=(king ? KING2 : MAN2); + } + return true; +} + + +PdnMove* PdnGame::getMove(int i) +{ + if(im_moves.count()) + qDebug("PdnGame::getMove(%u) m_moves.count()=%u", + i, m_moves.count()); + + PdnMove* m = new PdnMove(""); + m_moves.append(m); + return m; +} + + +QString PdnGame::toString() +{ + QString fen; + QString moves; + + /* + * fen + */ + if(!movesCount()) { + qDebug("FEN tag with lots of errors."); + QString string1; + QString string2; + QString notation; + + if(pdnType.toInt() == ENGLISH) + notation=QString(ENOTATION); + else + notation=QString(RNOTATION); + + for(int i=0; i<32; i++) { + int index=i*2; + if(white==COMPUTER) index=62-index; + + QString pos; + + switch(board[i]) { + case KING1: + pos.append('K'); + case MAN1: + pos.append(notation.mid(index,2).trimmed()); + if(string1.length()) string1.append(','); + string1.append(pos); + break; + case KING2: + pos.append('K'); + case MAN2: + pos.append(notation.mid(index,2).trimmed()); + if(string2.length()) string2.append(','); + string2.append(pos); + default: + break; + } + } + if(white==PLAYER) + fen.append("W:W"+string1+":B"+string2+"."); + else + fen.append("B:W"+string2+":B"+string1+"."); + } + + /* + * moves + */ + unsigned int count = 1; + foreach(PdnMove* move, m_moves) { + moves += QString("%1. %2 %3%4%5\n") + .arg(count) + .arg(move->m_first) + .arg(move->m_comfirst.length() ? "{"+move->m_comfirst+"} " : "") + .arg(move->m_second) + .arg(move->m_comsecond.length() ? " {"+move->m_comsecond+"}" : ""); + count++; + } + + + /* + * create format and write tags+fen+moves. + */ + QString str; + + if(pdnEvent.length()) str.append("[Event \""+pdnEvent+"\"]\n"); + if(pdnSite.length()) str.append("[Site \"" +pdnSite +"\"]\n"); + if(pdnDate.length()) str.append("[Date \"" +pdnDate +"\"]\n"); + if(pdnRound.length()) str.append("[Round \""+pdnRound+"\"]\n"); + if(pdnWhite.length()) str.append("[White \""+pdnWhite+"\"]\n"); + if(pdnBlack.length()) str.append("[Black \""+pdnBlack+"\"]\n"); + + if(fen.length()) { + str.append("[SetUp \"1\"]\n"); + str.append("[FEN \""+fen+"\"]\n\n"); + } + + str.append("[Result \""+pdnResult+"\"]\n"); + str.append("[GameType \""+pdnType+"\"]\n"); + str.append(moves); + str.append(pdnResult+"\n"); + + return str; +} + diff --git a/retroshare-gui/src/games/qcheckers/pdn.h b/retroshare-gui/src/games/qcheckers/pdn.h new file mode 100644 index 000000000..8110fd655 --- /dev/null +++ b/retroshare-gui/src/games/qcheckers/pdn.h @@ -0,0 +1,125 @@ +/*************************************************************************** + * Copyright (C) 2002-2003 Andi Peredri * + * andi@ukr.net * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 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., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#ifndef PDN_H +#define PDN_H + + +#include +#include + + +#define ENOTATION "1 2 3 4 5 6 7 8 9 1011121314151617181920212223242526272829303132" +//#define ENOTATION "32313029282726252423222120191817161514131211109 8 7 6 5 4 3 2 1 " +#define RNOTATION "b8d8f8h8a7c7e7g7b6d6f6h6a5c5e5g5b4d4f4h4a3c3e3g3b2d2f2h2a1c1e1g1" + +#define ENGLISH 21 +#define RUSSIAN 25 + + +class PdnMove; +class PdnGame; + + +// Portable Draughts Notation Format File parser +class Pdn +{ +public: + Pdn(); + virtual ~Pdn(); + + int count() const { return m_database.count(); } + PdnGame* game(int i) { return m_database.at(i); } + PdnGame* newGame(); + + void clear() { m_database.clear(); } + // parent is needed to display a progress dialog. + bool open(const QString& filename, QWidget* parent, + const QString& label, QString& text_to_log); + bool save(const QString& filename); + +private: + QList m_database; +}; + + +/* + * m_first, m_second are mandatary. + * comments are optional. + */ +class PdnMove +{ +public: + PdnMove(QString whole_line_of_move); + + QString m_first, m_comfirst; + QString m_second, m_comsecond; +}; + + +/* + * represents each game in a pdn-file. + */ +class PdnGame +{ +public: + PdnGame(const QString& game_string, QString& text_to_log); + ~PdnGame(); + + enum Tag { Date, Site, Type, Event, Round, White, Black,Result }; + + int item(int i) const { return board[i]; } + void setItem(int i, int set) { board[i]=set; } + + bool isWhite() const { return white; } + void setWhite(bool set) { white=set; } + + void set(Tag tag, const QString& string); + QString get(Tag tag) const; + + int movesCount() const { return m_moves.count(); } + PdnMove* getMove(int i); + PdnMove* addMove(); + void clearMoves() { m_moves.clear(); } + + QString toString(); + +private: + bool parse(const QString& game_string, QString& log_txt); + bool parse(const QString& string, bool side); + bool parse_moves(const QString& moves_line); + +private: + bool white; + int board[32]; + QString pdnDate; + QString pdnSite; + QString pdnType; + QString pdnEvent; + QString pdnRound; + QString pdnWhite; + QString pdnBlack; + QString pdnResult; + QList m_moves; +}; + + +#endif + diff --git a/retroshare-gui/src/games/qcheckers/player.h b/retroshare-gui/src/games/qcheckers/player.h new file mode 100644 index 000000000..eb62f8f79 --- /dev/null +++ b/retroshare-gui/src/games/qcheckers/player.h @@ -0,0 +1,75 @@ +/*************************************************************************** + * Copyright (C) 2004-2005 by Artur Wiebe * + * wibix@gmx.de * + * * + * 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., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#ifndef _PLAYER_H_ +#define _PLAYER_H_ + +#include + + +class Checkers; +class Field; + + +class myPlayer : public QObject +{ + Q_OBJECT + +public: + myPlayer(const QString& name, bool white) + : m_name(name), m_white(white), m_opponent(0) {} + + // information + bool isWhite() const { return m_white; } + void setWhite(bool b) { m_white = b; } + // + const QString& name() const { return m_name; } + void setName(const QString& n) { m_name = n; } + // + virtual bool isHuman() const { return false; } + + // + virtual void yourTurn(const Checkers* game) = 0; + // return false on incorrect course. + // set select to true to select the select, or unselect. + // QString contains error msg. + virtual bool fieldClicked(int, bool*,QString&) { return true; } + // computerplayer terminates his thinking thread. + // humanplayer + // networkplayer disconnects from the server. + virtual void stop() = 0; + + void setOpponent(myPlayer* o) { m_opponent=o; } + myPlayer* opponent() const { return m_opponent; } + +signals: + // emitted when move is done, provides the complete board converted to + // string. + void moveDone(const QString&); + +private: + QString m_name; + bool m_white; + + myPlayer* m_opponent; +}; + + +#endif diff --git a/retroshare-gui/src/games/qcheckers/qcheckers.pro b/retroshare-gui/src/games/qcheckers/qcheckers.pro new file mode 100644 index 000000000..22a6ba53a --- /dev/null +++ b/retroshare-gui/src/games/qcheckers/qcheckers.pro @@ -0,0 +1,39 @@ +TEMPLATE = lib +CONFIG += staticlib +DESTDIR = lib + +HEADERS = pdn.h \ + checkers.h echeckers.h rcheckers.h \ + field.h toplevel.h view.h history.h board.h \ + newgamedlg.h \ + common.h \ + player.h humanplayer.h computerplayer.h + + +SOURCES = pdn.cc \ + checkers.cc echeckers.cc rcheckers.cc \ + field.cc toplevel.cc view.cc history.cc board.cc \ + newgamedlg.cc \ + humanplayer.cc computerplayer.cc + +RESOURCES = qcheckers.qrc + + +TARGET = qcheckers +#PREFIX = $$system(grep 'define PREFIX' common.h | cut -d'"' -f2) +#SHARE_PATH = $$system(grep 'define SHARE_PATH' common.h | cut -d'"' -f2) + +TRANSLATIONS = i18n/kcheckers_de.ts i18n/kcheckers_fr.ts +# i18n/kcheckers_ru.ts + +target.path = $$PREFIX/bin +INSTALLS += target + + +# +# This hack is needed for i18n support. +# +share.path += $$PREFIX/share/kcheckers +share.files += kcheckers.pdn COPYING AUTHORS ChangeLog README themes i18n/* +INSTALLS += share + diff --git a/retroshare-gui/src/games/qcheckers/qcheckers.qrc b/retroshare-gui/src/games/qcheckers/qcheckers.qrc new file mode 100644 index 000000000..74bccb5f3 --- /dev/null +++ b/retroshare-gui/src/games/qcheckers/qcheckers.qrc @@ -0,0 +1,29 @@ + + + icons/biglogo.png + icons/fileopen.png + icons/filesave.png + icons/stop.png + icons/dialog.png + icons/undo.png + icons/redo.png + icons/exit.png + icons/info.png + icons/next.png + icons/context.png + icons/logo.png + icons/paused.png + icons/freeplace.png + icons/clear.png + icons/continue.png + + icons/theme/frame.png + icons/theme/kingwhite.png + icons/theme/manwhite.png + icons/theme/tile2.png + icons/theme/kingblack.png + icons/theme/manblack.png + icons/theme/tile1.png + + + diff --git a/retroshare-gui/src/games/qcheckers/rcheckers.cc b/retroshare-gui/src/games/qcheckers/rcheckers.cc new file mode 100644 index 000000000..c24ba138d --- /dev/null +++ b/retroshare-gui/src/games/qcheckers/rcheckers.cc @@ -0,0 +1,553 @@ +/*************************************************************************** + * Copyright (C) 2002-2003 Andi Peredri * + * andi@ukr.net * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 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., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +// +// Russian Checkers + + +#include "rcheckers.h" + + +/////////////////////////////////////////////////// +// +// Player Functions +// +/////////////////////////////////////////////////// + + +bool RCheckers::go1(int from,int field) +{ + from=internal(from); + field=internal(field); + + to=field; + + if(checkCapture1()) + { + bool capture=false; + switch(board[from]) + { + case MAN1: + if(manCapture1(from,UL,capture)) return true; + if(manCapture1(from,UR,capture)) return true; + if(manCapture1(from,DL,capture)) return true; + if(manCapture1(from,DR,capture)) return true; + return false; + case KING1: + if(kingCapture1(from,UL,capture)) return true; + if(kingCapture1(from,UR,capture)) return true; + if(kingCapture1(from,DL,capture)) return true; + if(kingCapture1(from,DR,capture)) return true; + return false; + } + } + else + { + switch(board[from]) + { + case MAN1: + if((to==(from-6))||(to==(from-5))) + { + board[from]=FREE; + if(to<10) board[to]=KING1; + else board[to]=MAN1; + return true; + } + return false; + case KING1: + for(int i=from-6;;i-=6) + { + if(i==to) + { + board[from]=FREE; + board[to]=KING1; + return true; + } + else if(board[i]==FREE) continue; + else break; + } + for(int i=from-5;;i-=5) + { + if(i==to) + { + board[from]=FREE; + board[to]=KING1; + return true; + } + else if(board[i]==FREE) continue; + else break; + } + for(int i=from+5;;i+=5) + { + if(i==to) + { + board[from]=FREE; + board[to]=KING1; + return true; + } + else if(board[i]==FREE) continue; + else break; + } + for(int i=from+6;;i+=6) + { + if(i==to) + { + board[from]=FREE; + board[to]=KING1; + return true; + } + else if(board[i]==FREE) continue; + else break; + } + return false; + } + } + return false; +} + + + +bool RCheckers::checkCapture1() const +{ + for(int i=6;i<48;i++) + if(checkCapture1(i)) + return true; + + return false; +} + + +bool RCheckers::checkCapture1(int i) const +{ + switch(board[i]) + { + case MAN1: + if(board[i-6]==MAN2 || board[i-6]==KING2) + if(board[i-12]==FREE) return true; + if(board[i-5]==MAN2 || board[i-5]==KING2) + if(board[i-10]==FREE) return true; + if(board[i+5]==MAN2 || board[i+5]==KING2) + if(board[i+10]==FREE) return true; + if(board[i+6]==MAN2 || board[i+6]==KING2) + if(board[i+12]==FREE) return true; + break; + case KING1: + int k; + for(k=i-6;board[k]==FREE;k-=6); + if(board[k]==MAN2 || board[k]==KING2) + if(board[k-6]==FREE) return true; + + for(k=i-5;board[k]==FREE;k-=5); + if(board[k]==MAN2 || board[k]==KING2) + if(board[k-5]==FREE) return true; + + for(k=i+5;board[k]==FREE;k+=5); + if(board[k]==MAN2 || board[k]==KING2) + if(board[k+5]==FREE) return true; + + for(k=i+6;board[k]==FREE;k+=6); + if(board[k]==MAN2 || board[k]==KING2) + if(board[k+6]==FREE) return true; + } + + return false; +} + + +/* ORIG func aw +bool RCheckers::checkCapture1() +{ + for(int i=6;i<48;i++) + { + switch(board[i]) + { + case MAN1: + if(board[i-6]==MAN2 || board[i-6]==KING2) + if(board[i-12]==FREE) return true; + if(board[i-5]==MAN2 || board[i-5]==KING2) + if(board[i-10]==FREE) return true; + if(board[i+5]==MAN2 || board[i+5]==KING2) + if(board[i+10]==FREE) return true; + if(board[i+6]==MAN2 || board[i+6]==KING2) + if(board[i+12]==FREE) return true; + break; + case KING1: + int k; + for(k=i-6;board[k]==FREE;k-=6); + if(board[k]==MAN2 || board[k]==KING2) + if(board[k-6]==FREE) return true; + + for(k=i-5;board[k]==FREE;k-=5); + if(board[k]==MAN2 || board[k]==KING2) + if(board[k-5]==FREE) return true; + + for(k=i+5;board[k]==FREE;k+=5); + if(board[k]==MAN2 || board[k]==KING2) + if(board[k+5]==FREE) return true; + + for(k=i+6;board[k]==FREE;k+=6); + if(board[k]==MAN2 || board[k]==KING2) + if(board[k+6]==FREE) return true; + } + } + return false; +} +*/ + + +// Return TRUE if a course of the player true +// Return FALSE if a course of the player incorrect + +bool RCheckers::manCapture1(int from,int direction,bool &capture) +{ + int i=from+direction; + if(board[i]==MAN2 || board[i]==KING2) + { + int k=i+direction; + if(board[k]==FREE) + { + bool next=false; + int save=board[i]; + board[from]=FREE; + board[i]=NONE; + + if(k<10) + { + board[k]=KING1; + if(kingCapture1(k,direction+11,next)) + { + board[i]=FREE; + return true; + } + } + else + { + board[k]=MAN1; + if(direction==UL || direction==DR) + { + if(manCapture1(k,UR,next)) {board[i]=FREE;return true;} + if(manCapture1(k,DL,next)) {board[i]=FREE;return true;} + } + else + { + if(manCapture1(k,UL,next)) {board[i]=FREE;return true;} + if(manCapture1(k,DR,next)) {board[i]=FREE;return true;} + } + if(manCapture1(k,direction,next)) {board[i]=FREE;return true;} + } + + if((!next) && k==to) {board[i]=FREE;return true;} + + board[k]=FREE; + board[i]=save; + board[from]=MAN1; + capture=true; + } + } + return false; +} + + +bool RCheckers::kingCapture1(int from,int direction,bool &capture) +{ + int i; + for(i=from+direction;board[i]==FREE;i+=direction); + + if(board[i]==MAN2 || board[i]==KING2) + { + int k=i+direction; + if(board[k]==FREE) + { + bool next=false; + int save=board[i]; + board[from]=FREE; + board[i]=NONE; + + for(;board[k]==FREE;k+=direction) + { + board[k]=KING1; + if(direction==UL || direction==DR) + { + if(kingCapture1(k,UR,next)) {board[i]=FREE;return true;} + if(kingCapture1(k,DL,next)) {board[i]=FREE;return true;} + } + else + { + if(kingCapture1(k,UL,next)) {board[i]=FREE;return true;} + if(kingCapture1(k,DR,next)) {board[i]=FREE;return true;} + } + board[k]=FREE; + } + + board[k-=direction]=KING1; + if(kingCapture1(k,direction,next)) {board[i]=FREE;return true;} + board[k]=FREE; + + if(!next) + for(;k!=i;k-=direction) + if(k==to) {board[i]=FREE;board[k]=KING1;return true;} + + board[i]=save; + board[from]=KING1; + capture=true; + } + } + return false; +} + + +//////////////////////////////////////////////////// +// +// Computer Functions +// +//////////////////////////////////////////////////// + + +void RCheckers::kingMove2(int from,int &resMax) +{ + board[from]=FREE; + for(int i=from-6;board[i]==FREE;i-=6) + { + board[i]=KING2; + turn(resMax); + board[i]=FREE; + } + for(int i=from-5;board[i]==FREE;i-=5) + { + board[i]=KING2; + turn(resMax); + board[i]=FREE; + } + for(int i=from+5;board[i]==FREE;i+=5) + { + board[i]=KING2; + turn(resMax); + board[i]=FREE; + } + for(int i=from+6;board[i]==FREE;i+=6) + { + board[i]=KING2; + turn(resMax); + board[i]=FREE; + } + board[from]=KING2; +} + + +bool RCheckers::checkCapture2() const +{ + for(int i=6;i<48;i++) + { + switch(board[i]) + { + case MAN2: + if(board[i-6]==MAN1 || board[i-6]==KING1) + if(board[i-12]==FREE) return true; + if(board[i-5]==MAN1 || board[i-5]==KING1) + if(board[i-10]==FREE) return true; + if(board[i+5]==MAN1 || board[i+5]==KING1) + if(board[i+10]==FREE) return true; + if(board[i+6]==MAN1 || board[i+6]==KING1) + if(board[i+12]==FREE) return true; + break; + case KING2: + int k; + for(k=i-6;board[k]==FREE;k-=6); + if(board[k]==MAN1 || board[k]==KING1) + if(board[k-6]==FREE) return true; + + for(k=i-5;board[k]==FREE;k-=5); + if(board[k]==MAN1 || board[k]==KING1) + if(board[k-5]==FREE) return true; + + for(k=i+5;board[k]==FREE;k+=5); + if(board[k]==MAN1 || board[k]==KING1) + if(board[k+5]==FREE) return true; + + for(k=i+6;board[k]==FREE;k+=6); + if(board[k]==MAN1 || board[k]==KING1) + if(board[k+6]==FREE) return true; + } + } + return false; +} + + +// Return TRUE if it is possible to capture +// Return FALSE if it is impossible to capture + +bool RCheckers::manCapture2(int from,int &resMax) +{ + bool capture=false; + + int i=from-6; + if(board[i]==MAN1 || board[i]==KING1) + { + int k=from-12; + if(board[k]==FREE) + { + int save=board[i]; + board[from]=FREE; + board[i]=NONE; + board[k]=MAN2; + resMax--; + if(!manCapture2(k,resMax)) turn(resMax,true); + resMax++; + board[k]=FREE; + board[i]=save; + board[from]=MAN2; + capture=true; + } + } + + i=from-5; + if(board[i]==MAN1 || board[i]==KING1) + { + int k=from-10; + if(board[k]==FREE) + { + int save=board[i]; + board[from]=FREE; + board[i]=NONE; + board[k]=MAN2; + resMax--; + if(!manCapture2(k,resMax)) turn(resMax,true); + resMax++; + board[k]=FREE; + board[i]=save; + board[from]=MAN2; + capture=true; + } + } + + i=from+5; + if(board[i]==MAN1 || board[i]==KING1) + { + int k=from+10; + if(board[k]==FREE) + { + int save=board[i]; + board[from]=FREE; + board[i]=NONE; + resMax--; + if(from>32) + { + board[k]=KING2; + if(!kingCapture2(k,UL,resMax)) turn(resMax,true); + } + else + { + board[k]=MAN2; + if(!manCapture2(k,resMax)) turn(resMax,true); + } + resMax++; + board[k]=FREE; + board[i]=save; + board[from]=MAN2; + capture=true; + } + } + + i=from+6; + if(board[i]==MAN1 || board[i]==KING1) + { + int k=from+12; + if(board[k]==FREE) + { + int save=board[i]; + board[from]=FREE; + board[i]=NONE; + resMax--; + if(from>32) + { + board[k]=KING2; + if(!kingCapture2(k,UR,resMax)) turn(resMax,true); + } + else + { + board[k]=MAN2; + if(!manCapture2(k,resMax)) turn(resMax,true); + } + resMax++; + board[k]=FREE; + board[i]=save; + board[from]=MAN2; + capture=true; + } + } + + if(capture) return true; + return false; +} + + +bool RCheckers::kingCapture2(int from,int direction,int &resMax) +{ + int i; + for(i=from+direction;board[i]==FREE;i+=direction); + + if(board[i]==MAN1 || board[i]==KING1) + { + int k=i+direction; + if(board[k]==FREE) + { + bool capture=false; + int save=board[i]; + board[from]=FREE; + board[i]=NONE; + resMax--; + + for(;board[k]==FREE;k+=direction) + { + board[k]=KING2; + if(direction==UL || direction==DR) + { + if(kingCapture2(k,UR,resMax)) capture=true; + if(kingCapture2(k,DL,resMax)) capture=true; + } + else + { + if(kingCapture2(k,UL,resMax)) capture=true; + if(kingCapture2(k,DR,resMax)) capture=true; + } + board[k]=FREE; + } + + board[k-=direction]=KING2; + if(kingCapture2(k,direction,resMax)) capture=true; + board[k]=FREE; + + if(!capture) + for(;k!=i;k-=direction) + { + board[k]=KING2; + turn(resMax,true); + board[k]=FREE; + } + + resMax++; + board[i]=save; + board[from]=KING2; + return true; + } + } + return false; +} + + diff --git a/retroshare-gui/src/games/qcheckers/rcheckers.h b/retroshare-gui/src/games/qcheckers/rcheckers.h new file mode 100644 index 000000000..dcb11a6f4 --- /dev/null +++ b/retroshare-gui/src/games/qcheckers/rcheckers.h @@ -0,0 +1,59 @@ +/*************************************************************************** + * Copyright (C) 2002-2003 Andi Peredri * + * andi@ukr.net * + * Copyright (C) 2004-2005 Artur Wiebe * + * wibix@gmx.de * + * * + * 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., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#ifndef RCHECKERS_H +#define RCHECKERS_H + +#include "checkers.h" +#include "pdn.h" + + +class RCheckers:public Checkers +{ + +public: + virtual bool go1(int,int); + + + virtual int type() const { return RUSSIAN; } + + virtual bool checkCapture1() const; + virtual bool checkCapture2() const; + +protected: + virtual bool checkCapture1(int) const; + +private: + + void kingMove2(int,int &); + + bool manCapture1(int,int,bool &); + bool kingCapture1(int,int,bool &); + + bool manCapture2(int,int &); + bool kingCapture2(int,int,int &); + +}; + +#endif + + diff --git a/retroshare-gui/src/games/qcheckers/themes/marble/frame.png b/retroshare-gui/src/games/qcheckers/themes/marble/frame.png new file mode 100644 index 000000000..4c65e86d5 Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/themes/marble/frame.png differ diff --git a/retroshare-gui/src/games/qcheckers/themes/marble/kingblack.png b/retroshare-gui/src/games/qcheckers/themes/marble/kingblack.png new file mode 100644 index 000000000..b6a596a4f Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/themes/marble/kingblack.png differ diff --git a/retroshare-gui/src/games/qcheckers/themes/marble/kingwhite.png b/retroshare-gui/src/games/qcheckers/themes/marble/kingwhite.png new file mode 100644 index 000000000..64fc42f1a Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/themes/marble/kingwhite.png differ diff --git a/retroshare-gui/src/games/qcheckers/themes/marble/manblack.png b/retroshare-gui/src/games/qcheckers/themes/marble/manblack.png new file mode 100644 index 000000000..32372efee Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/themes/marble/manblack.png differ diff --git a/retroshare-gui/src/games/qcheckers/themes/marble/manwhite.png b/retroshare-gui/src/games/qcheckers/themes/marble/manwhite.png new file mode 100644 index 000000000..6262d38f1 Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/themes/marble/manwhite.png differ diff --git a/retroshare-gui/src/games/qcheckers/themes/marble/theme b/retroshare-gui/src/games/qcheckers/themes/marble/theme new file mode 100644 index 000000000..120b87409 --- /dev/null +++ b/retroshare-gui/src/games/qcheckers/themes/marble/theme @@ -0,0 +1 @@ +Marble diff --git a/retroshare-gui/src/games/qcheckers/themes/marble/tile1.png b/retroshare-gui/src/games/qcheckers/themes/marble/tile1.png new file mode 100644 index 000000000..5e41ce8e3 Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/themes/marble/tile1.png differ diff --git a/retroshare-gui/src/games/qcheckers/themes/marble/tile2.png b/retroshare-gui/src/games/qcheckers/themes/marble/tile2.png new file mode 100644 index 000000000..94f4d42a0 Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/themes/marble/tile2.png differ diff --git a/retroshare-gui/src/games/qcheckers/themes/simple_big/frame.png b/retroshare-gui/src/games/qcheckers/themes/simple_big/frame.png new file mode 100644 index 000000000..932e11319 Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/themes/simple_big/frame.png differ diff --git a/retroshare-gui/src/games/qcheckers/themes/simple_big/kingblack.png b/retroshare-gui/src/games/qcheckers/themes/simple_big/kingblack.png new file mode 100644 index 000000000..856878b34 Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/themes/simple_big/kingblack.png differ diff --git a/retroshare-gui/src/games/qcheckers/themes/simple_big/kingwhite.png b/retroshare-gui/src/games/qcheckers/themes/simple_big/kingwhite.png new file mode 100644 index 000000000..e50d6ddf8 Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/themes/simple_big/kingwhite.png differ diff --git a/retroshare-gui/src/games/qcheckers/themes/simple_big/manblack.png b/retroshare-gui/src/games/qcheckers/themes/simple_big/manblack.png new file mode 100644 index 000000000..0963e2911 Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/themes/simple_big/manblack.png differ diff --git a/retroshare-gui/src/games/qcheckers/themes/simple_big/manwhite.png b/retroshare-gui/src/games/qcheckers/themes/simple_big/manwhite.png new file mode 100644 index 000000000..09fea5f20 Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/themes/simple_big/manwhite.png differ diff --git a/retroshare-gui/src/games/qcheckers/themes/simple_big/theme b/retroshare-gui/src/games/qcheckers/themes/simple_big/theme new file mode 100644 index 000000000..5aaa68e8c --- /dev/null +++ b/retroshare-gui/src/games/qcheckers/themes/simple_big/theme @@ -0,0 +1 @@ +Simple Big diff --git a/retroshare-gui/src/games/qcheckers/themes/simple_big/tile1.png b/retroshare-gui/src/games/qcheckers/themes/simple_big/tile1.png new file mode 100644 index 000000000..54e0f001d Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/themes/simple_big/tile1.png differ diff --git a/retroshare-gui/src/games/qcheckers/themes/simple_big/tile2.png b/retroshare-gui/src/games/qcheckers/themes/simple_big/tile2.png new file mode 100644 index 000000000..9091400a9 Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/themes/simple_big/tile2.png differ diff --git a/retroshare-gui/src/games/qcheckers/themes/simple_small/frame.png b/retroshare-gui/src/games/qcheckers/themes/simple_small/frame.png new file mode 100644 index 000000000..f7e8e4e18 Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/themes/simple_small/frame.png differ diff --git a/retroshare-gui/src/games/qcheckers/themes/simple_small/kingblack.png b/retroshare-gui/src/games/qcheckers/themes/simple_small/kingblack.png new file mode 100644 index 000000000..e6ce1c2bf Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/themes/simple_small/kingblack.png differ diff --git a/retroshare-gui/src/games/qcheckers/themes/simple_small/kingwhite.png b/retroshare-gui/src/games/qcheckers/themes/simple_small/kingwhite.png new file mode 100644 index 000000000..7cf9614b1 Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/themes/simple_small/kingwhite.png differ diff --git a/retroshare-gui/src/games/qcheckers/themes/simple_small/manblack.png b/retroshare-gui/src/games/qcheckers/themes/simple_small/manblack.png new file mode 100644 index 000000000..92bc5e29f Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/themes/simple_small/manblack.png differ diff --git a/retroshare-gui/src/games/qcheckers/themes/simple_small/manwhite.png b/retroshare-gui/src/games/qcheckers/themes/simple_small/manwhite.png new file mode 100644 index 000000000..54ac91600 Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/themes/simple_small/manwhite.png differ diff --git a/retroshare-gui/src/games/qcheckers/themes/simple_small/theme b/retroshare-gui/src/games/qcheckers/themes/simple_small/theme new file mode 100644 index 000000000..bddb41245 --- /dev/null +++ b/retroshare-gui/src/games/qcheckers/themes/simple_small/theme @@ -0,0 +1 @@ +Simple Small diff --git a/retroshare-gui/src/games/qcheckers/themes/simple_small/tile1.png b/retroshare-gui/src/games/qcheckers/themes/simple_small/tile1.png new file mode 100644 index 000000000..1f5f4b269 Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/themes/simple_small/tile1.png differ diff --git a/retroshare-gui/src/games/qcheckers/themes/simple_small/tile2.png b/retroshare-gui/src/games/qcheckers/themes/simple_small/tile2.png new file mode 100644 index 000000000..63f60d237 Binary files /dev/null and b/retroshare-gui/src/games/qcheckers/themes/simple_small/tile2.png differ diff --git a/retroshare-gui/src/games/qcheckers/toplevel.cc b/retroshare-gui/src/games/qcheckers/toplevel.cc new file mode 100644 index 000000000..c7048045f --- /dev/null +++ b/retroshare-gui/src/games/qcheckers/toplevel.cc @@ -0,0 +1,574 @@ +/*************************************************************************** + * Copyright (C) 2002-2003 Andi Peredri * + * andi@ukr.net * + * Copyright (C) 2004-2005 Artur Wiebe * + * wibix@gmx.de * + * * + * 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., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "pdn.h" +#include "toplevel.h" +#include "newgamedlg.h" +#include "view.h" +#include "common.h" + +#define CFG_THEME_PATH CFG_KEY"ThemePath" +#define CFG_FILENAME CFG_KEY"Filename" +#define CFG_KEEPDIALOG CFG_KEY"ShowKeepDialog" +#define CFG_NOTATION CFG_KEY"Notation" +#define CFG_NOT_ABOVE CFG_KEY"NotationAbove" +#define CFG_NOT_FONT CFG_KEY"NotationFont" +#define CFG_CLEAR_LOG CFG_KEY"ClearLogOnNewRound" + + +myTopLevel::myTopLevel() +{ + setWindowTitle(APPNAME); + setWindowIcon(QIcon(":/icons/biglogo.png")); + + m_newgame = new myNewGameDlg(this); + make_central_widget(); + make_actions(); + restore_settings(); + + /* + * new computer game. + */ + m_view->newGame(m_newgame->rules(), m_newgame->freePlacement(), + m_newgame->name(), + m_newgame->isWhite(), m_newgame->opponent(), + m_newgame->opponentName(), m_newgame->skill()); + + if(layout()) + layout()->setSizeConstraint(QLayout::SetFixedSize); +} + + +void myTopLevel::make_actions() +{ + // game menu actions + gameNew = new QAction(QIcon(":/icons/logo.png"), tr("&New..."), this); + gameNew->setShortcut(tr("CTRL+N", "File|New")); + connect(gameNew, SIGNAL(triggered()), this, SLOT(slot_new_game())); + + gameNextRound = new QAction(QIcon(":/icons/next.png"), + tr("&Next Round"), this); + connect(gameNextRound, SIGNAL(triggered()), + this, SLOT(slot_next_round())); + + gameStop = new QAction(QIcon(":/icons/stop.png"), tr("&Stop"), this); + connect(gameStop, SIGNAL(triggered()), m_view, SLOT(slotStopGame())); + + gameOpen = new QAction(QIcon(":/icons/fileopen.png"), tr("&Open..."), + this); + gameOpen->setShortcut(tr("CTRL+O", "File|Open")); + connect(gameOpen, SIGNAL(triggered()), this, SLOT(slot_open_game())); + + gameSave = new QAction(QIcon(":/icons/filesave.png"), tr("&Save..."), + this); + gameSave->setShortcut(tr("CTRL+S", "File|Save")); + connect(gameSave, SIGNAL(triggered()), this, SLOT(slot_save_game())); + + QAction* gameQuit = new QAction(QIcon(":/icons/exit.png"), tr("&Quit"), + this); + gameQuit->setShortcut(tr("CTRL+Q", "File|Quit")); + connect(gameQuit, SIGNAL(triggered()), + this, SLOT(close())); +// QApplication::instance(), SLOT(quit())); + + // view menu actions + viewNotation = new QAction(tr("&Show Notation"), this); + viewNotation->setCheckable(true); + connect(viewNotation, SIGNAL(toggled(bool)), + this, SLOT(slot_notation(bool))); + + viewNotationAbove = new QAction(tr("Show notation &above men"), this); + viewNotationAbove->setCheckable(true); + connect(viewNotationAbove, SIGNAL(toggled(bool)), + this, SLOT(slot_notation(bool))); + + // settings menu + settingsKeep = new QAction(tr("&Confirm aborting current game"), this); + settingsKeep->setCheckable(true); + // + settingsClearLog = new QAction(tr("Clear &log on new round"), this); + settingsClearLog->setCheckable(true); + connect(settingsClearLog, SIGNAL(toggled(bool)), + m_view, SLOT(slotClearLog(bool))); + // + QAction* settingsNotationFont = new QAction(tr("&Notation font..."), + this); + connect(settingsNotationFont, SIGNAL(triggered()), + this, SLOT(slot_notation_font())); + + // help menu actions + QAction* helpRules = new QAction(tr("&Rules of Play"), this); + helpRules->setShortcut(tr("F1", "Help|Help")); + connect(helpRules, SIGNAL(triggered()), this, SLOT(slot_help())); + + QAction* helpAbout = new QAction(QIcon(":/icons/logo.png"), + tr("&About")+" "APPNAME, this); + connect(helpAbout, SIGNAL(triggered()), this, SLOT(slot_about())); + + QAction* helpAboutQt = new QAction(tr("About &Qt"), this); + connect(helpAboutQt, SIGNAL(triggered()), qApp, SLOT(aboutQt())); + + + /* + * toolbar + */ + QToolBar* tb = addToolBar(tr("&Toolbar")); + tb->setMovable(false); + tb->addAction(gameNew); + tb->addAction(gameOpen); + tb->addAction(gameSave); + tb->addSeparator(); + tb->addAction(gameNextRound); + tb->addAction(gameStop); + + + /* + * menus + */ + QMenu* gameMenu = menuBar()->addMenu(tr("&Game")); + gameMenu->addAction(gameNew); + gameMenu->addAction(gameOpen); + gameMenu->addAction(gameSave); + gameMenu->addSeparator(); + gameMenu->addAction(gameNextRound); + gameMenu->addAction(gameStop); + gameMenu->addSeparator(); + gameMenu->addAction(gameQuit); + + viewMenu = menuBar()->addMenu(tr("&View")); + viewMenu->addAction(tb->toggleViewAction()); + viewMenu->addSeparator(); + viewMenu->addAction(viewNotation); + viewMenu->addAction(viewNotationAbove); + + QMenu* settingsMenu = menuBar()->addMenu(tr("&Settings")); + settingsMenu->addAction(settingsKeep); + settingsMenu->addSeparator(); + settingsMenu->addAction(settingsNotationFont); + settingsMenu->addSeparator(); + settingsMenu->addAction(settingsClearLog); + + QMenu* helpMenu = menuBar()->addMenu(tr("&Help")); + helpMenu->addAction(helpRules); + helpMenu->addSeparator(); + helpMenu->addAction(helpAbout); + helpMenu->addAction(helpAboutQt); + + + /* + * THEMES. create a default theme. + */ + QActionGroup* themes_grp = new QActionGroup(this); + themes_grp->setExclusive(true); + + QAction* default_theme = new QAction(tr(DEFAULT_THEME), themes_grp); + default_theme->setCheckable(true); + m_themes[default_theme] = DEFAULT_THEME; + default_theme->setChecked(true); + set_theme(default_theme);//FIXME TODO + themes_grp->addAction(default_theme); + + viewMenu->addSeparator(); + viewMenu->addAction(default_theme); + read_themes(themes_grp, + viewMenu,QDir::homePath()+"/"USER_PATH"/"THEME_DIR); + //TODO-hardcoded + read_themes(themes_grp, + viewMenu, PREFIX"/share/kcheckers/"THEME_DIR); + + connect(themes_grp, SIGNAL(triggered(QAction*)), + this, SLOT(set_theme(QAction*))); +} + + +void myTopLevel::read_themes(QActionGroup* menu_grp, QMenu* menu, + const QString& path) +{ + QDir sharedir(path); + QStringList themes = sharedir.entryList(QDir::Dirs|QDir::Readable); + themes.removeAll("."); + themes.removeAll(".."); + + for(QStringList::iterator it=themes.begin(); it!=themes.end(); ++it) { + sharedir.cd(*it); + + QString theme_dir = sharedir.absolutePath(); + QString errtext; + + QStringList files + = sharedir.entryList(QDir::Files|QDir::Readable); + + // all files are there. + if(files.count()!=8 || + files.indexOf(THEME_TILE1) == -1 || + files.indexOf(THEME_TILE2) == -1 || + files.indexOf(THEME_FRAME) == -1 || + files.indexOf(THEME_MANBLACK) == -1 || + files.indexOf(THEME_MANWHITE) == -1 || + files.indexOf(THEME_KINGBLACK) == -1 || + files.indexOf(THEME_KINGWHITE) == -1 || + files.indexOf(THEME_FILE) == -1) { + // TODO not translated. + errtext += "Wrong number of files. "; + } + files.removeAll(THEME_FILE); + + // check pic size. + QSize size = QPixmap(theme_dir+"/"+files[0]).size(); + if(size.width()>MAX_TILE_SIZE || size.height()>MAX_TILE_SIZE) + // TODO not translated. + errtext += "Picture(s) too big. "; + + if(size.width()==0 || size.height()==0) + // TODO not translated. + errtext += "Width/Height is zero. "; + + // check pics all the same size. + foreach(QString file, files) { + if(QPixmap(theme_dir+"/"+file).size() != size) { + // TODO not translated. + errtext += "Pictures are different in size. "; + break; + } + } + + if(errtext.length()) { + // TODO not translated. + qWarning() << endl << "Theme in" + << sharedir.absolutePath() << endl << errtext; + + } else { + QString themename = sharedir.dirName(); + + /*TODO + QFile file(theme_dir+"/"+THEME_FILE); + if(file.open(QFile::ReadOnly)) { + QTextStream ts(&file); + if(!ts.atEnd()) + themename = ts.readLine(); + // try go get locale theme name + // TODO + QString locale = QString("[%1]=").arg(QTextCodec::locale()); + while(!ts.atEnd()) { + QString line = ts.readLine(); + if(line.startsWith(locale)) { + themename = line.mid(locale.length()); + break; + } + } + file.close(); + } + */ + // + QAction* action = new QAction(themename, this); + menu_grp->addAction(action); + menu->addAction(action); + action->setCheckable(true); + m_themes[action] = theme_dir; + } + + sharedir.cdUp(); + } +} + + +void myTopLevel::restore_settings() +{ + QSettings cfg(APPNAME, APPNAME); + + QString theme_path = cfg.value(CFG_THEME_PATH, DEFAULT_THEME) + .toString(); + for(myThemeMap::iterator it = m_themes.begin(); it!=m_themes.end();it++) + if(it.value() == theme_path) { + it.key()->setChecked(true); + set_theme(it.key()); + break; + } + + filename = cfg.value(CFG_FILENAME).toString(); + + viewNotation->setChecked(cfg.value(CFG_NOTATION, false).toBool()); + viewNotationAbove->setChecked(cfg.value(CFG_NOT_ABOVE, true).toBool()); + slot_notation(true); // here: arg is ignored by the function + + bool clear_log = cfg.value(CFG_CLEAR_LOG, true).toBool(); + settingsClearLog->setChecked(clear_log); + m_view->slotClearLog(clear_log); + + // + settingsKeep->setChecked(cfg.value(CFG_KEEPDIALOG, true).toBool()); + + QFont cfont; + if(cfont.fromString(cfg.value(CFG_NOT_FONT, "").toString())) + m_view->setNotationFont(cfont); + + // new game + m_newgame->readSettings(&cfg); +} + + +void myTopLevel::make_central_widget() +{ + m_view = new myView(this); + + connect(m_view, SIGNAL(working(bool)), + this, SLOT(slot_working(bool))); + + setCentralWidget(m_view); +} + + +void myTopLevel::warning(const QString& text) +{ + QMessageBox::warning(this, tr("Error")+" - "APPNAME, text); +} + + +void myTopLevel::information(const QString& caption, const QString& text) +{ + QDialog* dlg = new QDialog(this); + dlg->setModal(true); + dlg->setWindowTitle(caption+" - "APPNAME); + + // logo left + QLabel* logo = new QLabel(dlg); + logo->setPixmap(QPixmap(":/icons/dialog.png")); + + // text editor + QTextEdit* te = new QTextEdit(text, dlg); + te->setReadOnly(true); + te->setMinimumWidth(m_view->width()-100); + te->setMinimumHeight(m_view->height()-200); + + // close button + QPushButton* button = new QPushButton(tr("&Close"), dlg); + connect(button, SIGNAL(clicked()), dlg, SLOT(accept())); + + // Layout. + QHBoxLayout* hb = new QHBoxLayout(); + hb->addWidget(logo, 0, Qt::AlignTop); + hb->addWidget(te, 1); + + QHBoxLayout* hb_button = new QHBoxLayout(); + hb_button->addStretch(); + hb_button->addWidget(button); + + QVBoxLayout* vb = new QVBoxLayout(dlg); + vb->addLayout(hb, 1); + vb->addSpacing(5); + vb->addLayout(hb_button); + + // go + dlg->exec(); + delete dlg; +} + + +void myTopLevel::slot_save_game() +{ + QString fn = QFileDialog::getSaveFileName(this, + tr("Save Game")+" - "APPNAME, filename, "PDN Files (*."EXT")"); + if(!fn.isEmpty()) { + if(fn.right(3)!=EXT) + fn += "."EXT; + + if(m_view->savePdn(fn)) + filename = fn; + else + warning(tr("Could not save: ")+filename); + } +} + + +void myTopLevel::slot_open_game() +{ + QString fn = QFileDialog::getOpenFileName(this, + tr("Open Game")+" - "APPNAME, filename, "PDN Files (*."EXT")"); + if(!fn.isEmpty()) + open(fn); +} + + +void myTopLevel::open(const QString& fn) +{ + if(m_view->openPdn(fn)) + filename = fn; +} + + +void myTopLevel::closeEvent(QCloseEvent* e) +{ + if(!keep_game()) { + store_settings(); + e->accept(); + } else { + e->ignore(); + } +} + + +void myTopLevel::store_settings() +{ + QSettings config(APPNAME, APPNAME); + + for(myThemeMap::iterator it=m_themes.begin(); it!=m_themes.end(); it++) + if(it.key()->isChecked()) { + config.setValue(CFG_THEME_PATH, it.value()); + break; + } + + config.setValue(CFG_FILENAME, filename); + + config.setValue(CFG_NOTATION, viewNotation->isChecked()); + config.setValue(CFG_NOT_ABOVE, viewNotationAbove->isChecked()); + + config.setValue(CFG_KEEPDIALOG, settingsKeep->isChecked()); + config.setValue(CFG_NOT_FONT, m_view->notationFont().toString()); + config.setValue(CFG_CLEAR_LOG, settingsClearLog->isChecked()); + + // new game + m_newgame->writeSettings(&config); +} + + +void myTopLevel::set_theme(QAction* action) +{ + QString path = m_themes[action]; + m_view->setTheme(path); +} + + +void myTopLevel::slot_help() +{ + QString text = + tr("

    In the beginning of game you have 12 checkers (men). " + "The men move forward only. The men can capture:" + "

      " + "
    • by jumping forward only (english rules);" + "
    • by jumping forward or backward (russian rules)." + "
    " + "

    A man which reaches the far side of the board becomes a king. " + "The kings move forward or backward:" + "

      " + "
    • to one square only (english rules);" + "
    • to any number of squares (russian rules)." + "
    " + "

    The kings capture by jumping forward or backward. " + "Whenever a player is able to make a capture he must do so."); + + information(tr("Rules of Play"), text); +} + + +void myTopLevel::slot_about() +{ + QString text = + APPNAME", a board game.
    Version "VERSION"

    " + COPYRIGHT"
    " + ""HOMEPAGE"

    " + "Contributors:
    "CONTRIBS"

    " + "This program is distributed under the terms " + "of the GNU General Public License."; + + information(tr("About"), text); +} + + +void myTopLevel::slot_new_game() +{ + if(keep_game()) + return; + + if(m_newgame->exec()==QDialog::Accepted) { + m_view->newGame(m_newgame->rules(), m_newgame->freePlacement(), + m_newgame->name(), + m_newgame->isWhite(), m_newgame->opponent(), + m_newgame->opponentName(), m_newgame->skill()); + } +} + + +void myTopLevel::slot_working(bool working) +{ + bool disable = !working; + + gameNew->setEnabled(disable); + gameSave->setEnabled(disable); + + gameNextRound->setEnabled(disable);// FIXME !m_view->isAborted()); + gameOpen->setEnabled(disable); + gameStop->setEnabled(!disable); + + m_view->setEnabled(disable); +} + + +bool myTopLevel::keep_game() +{ + if(!settingsKeep->isChecked() || m_view->isAborted()) + return false; + + int answer = QMessageBox::question(this, tr("Abort Game?")+" - "APPNAME, + tr("Current game will be lost if you continue.\n" + "Do you really want to discard it?"), + QMessageBox::Yes, QMessageBox::No); + + if(answer == QMessageBox::Yes) + return false; + + return true; +} + + +void myTopLevel::slot_next_round() +{ + if(!keep_game()) + m_view->slotNextRound(); +} + + +void myTopLevel::slot_notation_font() +{ + bool ok; + QFont font = QFontDialog::getFont(&ok, m_view->notationFont(), this); + if(ok) + m_view->setNotationFont(font); +} + + +void myTopLevel::slot_notation(bool) +{ + m_view->setNotation(viewNotation->isChecked(), + viewNotationAbove->isChecked()); +} + diff --git a/retroshare-gui/src/games/qcheckers/toplevel.h b/retroshare-gui/src/games/qcheckers/toplevel.h new file mode 100644 index 000000000..684dd6553 --- /dev/null +++ b/retroshare-gui/src/games/qcheckers/toplevel.h @@ -0,0 +1,104 @@ +/*************************************************************************** + * Copyright (C) 2002-2003 Andi Peredri * + * andi@ukr.net * + * Copyright (C) 2004-2005 Artur Wiebe * + * wibix@gmx.de * + * * + * 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., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifndef _TOPLEVEL_H_ +#define _TOPLEVEL_H_ + +#include +#include +#include + + +class myView; +class myNewGameDlg; + + +class myTopLevel : public QMainWindow +{ + Q_OBJECT + +public: + myTopLevel(); + + void open(const QString& filename); + +protected: + void closeEvent(QCloseEvent*); + +private slots: + void slot_help(); + void slot_about(); + + void slot_new_game(); + void slot_open_game(); + void slot_save_game(); + void slot_next_round(); + + void slot_notation(bool); + void slot_notation_font(); + + void slot_working(bool); + + void set_theme(QAction*); + + void warning(const QString& text); + + +private: + void make_actions(); + void make_central_widget(); + void restore_settings(); + void store_settings(); + + // add themes to this menu. + void read_themes(QActionGroup*, QMenu*, const QString& path); + + void information(const QString& caption, const QString& text); + + // returns true if the user wishes to keep current game + bool keep_game(); + +private: + QMenu* viewMenu; + // + QAction* gameNew; + QAction* gameStop; + QAction* gameOpen; + QAction* gameSave; + QAction* gameNextRound; + // + QAction* viewNotation; + QAction* viewNotationAbove; + // + QAction* settingsKeep; + QAction* settingsClearLog; + + QString filename; // PDN File Name + + myView* m_view; + myNewGameDlg* m_newgame; + + typedef QMap myThemeMap; + myThemeMap m_themes; +}; + +#endif + diff --git a/retroshare-gui/src/games/qcheckers/view.cc b/retroshare-gui/src/games/qcheckers/view.cc new file mode 100644 index 000000000..3628e8c8b --- /dev/null +++ b/retroshare-gui/src/games/qcheckers/view.cc @@ -0,0 +1,587 @@ +/*************************************************************************** + * Copyright (C) 2004-2005 Artur Wiebe * + * wibix@gmx.de * + * * + * 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., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include +#include +#include +#include + +#include "pdn.h" +#include "echeckers.h" +#include "rcheckers.h" +#include "view.h" +#include "common.h" +#include "history.h" +#include "newgamedlg.h" + +#include "player.h" +#include "humanplayer.h" +#include "computerplayer.h" + + +#define MAX_CMD_LEN 80 +#define MOVE_PAUSE 1000 + +// this class is used to note differencies between moves. +class myDiff { +public: + myDiff(int pos, int from, int to) + : m_pos(pos), m_from(from), m_to(to) {} + int m_pos; + int m_from; + int m_to; +}; + + +myView::myView(QWidget* parent) + : QFrame(parent) +{ + /* + * board & info + */ + m_board = new myBoard(this); + connect(m_board, SIGNAL(fieldClicked(int)), + this, SLOT(slot_click(int))); + + m_history = new myHistory(this); + connect(m_history, SIGNAL(previewGame(int)), + this, SLOT(slot_preview_game(int))); + connect(m_history, SIGNAL(applyMoves(const QString&)), + this, SLOT(slot_apply_moves(const QString&))); + connect(m_history, SIGNAL(newMode(bool, bool)), + this, SLOT(slot_new_mode(bool, bool))); + connect(this, SIGNAL(working(bool)), + m_history, SLOT(slotWorking(bool))); + + QHBoxLayout* hb = new QHBoxLayout(0); + hb->addWidget(m_board); + hb->addSpacing(5); + hb->addWidget(m_history); + + + /* + * + */ + m_log = new QTextEdit(this); + m_log->setFixedHeight(100); //FIXME + m_log->setReadOnly(true); + + + /* + * it's the final layout. + */ + QVBoxLayout* vb = new QVBoxLayout(this); + vb->addLayout(hb); + vb->addWidget(m_log); + vb->setSizeConstraint(QLayout::SetFixedSize); + + + /* + * game init + */ + m_player = m_current = 0; +} + + +myView::~myView() +{ + if(m_player) { + delete m_player; + delete m_player->opponent(); + } +} + + +void myView::setEnabled(bool b) +{ + m_board->setEnabled(b); + if(b) + setCursor(Qt::ArrowCursor); // should be m_board bound. + else + setCursor(Qt::WaitCursor); +} + + +void myView::setTheme(const QString& path) +{ + m_board->setTheme(path, m_player ? m_player->isWhite() : true); + m_history->setFixedHeight(m_board->height()); +} + + +void myView::newGame(int rules, bool freeplace, + const QString& name, bool is_white, + int opponent, const QString& opp_name, int skill) +{ + m_freeplace_from = -1; + + if(m_player) { + delete m_player; + delete m_player->opponent(); + } + + m_board->setColorWhite(is_white); + + // create players + myPlayer* plr = new myHumanPlayer(name, is_white, false); + myPlayer* opp = 0; + if(opponent==HUMAN) + opp = new myHumanPlayer(opp_name, !is_white, true); + else + opp = new myComputerPlayer(opp_name, !is_white, skill); + + emit working(true); + + + /* + * set up player stuff. slots/signals. + */ + m_player = plr; + + plr->setOpponent(opp); + opp->setOpponent(plr); + + plr->disconnect(); + opp->disconnect(); + + connect(plr, SIGNAL(moveDone(const QString&)), + this, SLOT(slot_move_done(const QString&))); + + connect(opp, SIGNAL(moveDone(const QString&)), + this, SLOT(slot_move_done(const QString&))); + + + /* + * create game board. + */ + m_board->setGame(rules); + + m_board->reset(); + m_history->clear(); + + begin_game(1, freeplace); +} + + +void myView::begin_game(unsigned int round, bool freeplace) +{ + if(m_clear_log) + m_log->clear(); + + m_board->adjustNotation(m_player->isWhite()); + + m_history->newPdn(APPNAME" Game", freeplace); + m_history->setTag(PdnGame::Type, QString::number(m_board->type())); + m_history->setTag(PdnGame::Date, + QDate::currentDate().toString("yyyy.MM.dd")); + m_history->setTag(PdnGame::Result, "*"); + m_history->setTag(PdnGame::Round, QString::number(round)); + + + /* + * go! + */ + myPlayer* last_player = get_first_player()->opponent(); + + m_game_over = false; + m_aborted = false; + m_current = last_player; + + // setup names + if(m_player->isWhite()) { + m_history->setTag(PdnGame::White, m_player->name()); + m_history->setTag(PdnGame::Black, m_player->opponent()->name()); + } else { + m_history->setTag(PdnGame::White, m_player->opponent()->name()); + m_history->setTag(PdnGame::Black, m_player->name()); + } + + if(m_history->isFreePlacement()) + emit working(false); + else + slot_move_done(m_board->game()->toString(false)); +} + + +bool myView::check_game_over() +{ + if(m_game_over) // no further checks + return true; + + m_game_over = true; + + bool player_can = m_board->game()->checkMove1() + || m_board->game()->checkCapture1(); + bool opp_can = m_board->game()->checkMove2() + || m_board->game()->checkCapture2(); + + // player cannot go but opponent can -> player lost. + if(/*FIXME*/m_player==m_current && !player_can && opp_can) { + you_won(false); + return m_game_over; + } + // player can go but opponent cannot -> player won. + if(/*FIXME*/m_player!=m_current && player_can && !opp_can) { + you_won(true); + return m_game_over; + } + // neither of the player can go -> draw. + if(!player_can && !opp_can) { + add_log(myView::System, tr("Drawn game.")); + m_history->setTag(PdnGame::Result, "1/2-1/2"); + return m_game_over; + } + + m_game_over = false; + return m_game_over; +} + + +void myView::slot_click(int field_num) +{ + if(m_game_over || m_aborted) + return; + + if(m_history->isPaused()) { + if(m_history->isFreePlacement()) { + // FIXME - hightlight fields + if(m_freeplace_from < 0) { + m_freeplace_from = field_num; + m_board->selectField(field_num, true); + } else { + m_board->selectField(m_freeplace_from, false); + m_board->doFreeMove(m_freeplace_from, + field_num); + m_freeplace_from = -1; + } + } + } else { + bool select = false; + QString err_msg; + + if(!m_current->fieldClicked(field_num, &select, err_msg)) { + add_log(myView::Warning, m_current->name()+": " + + (err_msg.length() + ? err_msg + : tr("Invalid move."))); + } else { + m_board->selectField(field_num, select); + } + } +} + + +void myView::slotNextRound() +{ + if(m_aborted) + return; + + m_player->setWhite(!m_player->isWhite()); + m_player->opponent()->setWhite(!m_player->isWhite()); + + m_board->setColorWhite(m_player->isWhite()); + m_board->reset(); + + unsigned int round = m_history->getTag(PdnGame::Round).toUInt() + 1; + begin_game(round, m_history->isFreePlacement()); +} + + +void myView::slotStopGame() +{ + m_player->stop(); + m_player->opponent()->stop(); +} + + +void myView::stop_game(const QString& msg) +{ + m_game_over = true; + m_aborted = true; + + QString text(tr("Game aborted.")+(!msg.isEmpty() ? "\n"+msg : "")); + add_log(myView::System, text); + + emit working(false); +} + + +void myView::slot_move_done(const QString& board_str) +{ + if(m_history->isPaused()) // FIXME - ??? + return; + + perform_jumps(m_board->game()->toString(false), board_str); + + // show who is next? + m_current = m_current->opponent(); + m_history->setCurrent(m_current->name()); + + if(!m_current->isHuman()) { + emit working(true); + } else { + emit working(false); + } + + if(m_current->opponent()->isHuman() && !m_current->isHuman()) + QTimer::singleShot(MOVE_PAUSE, this, + SLOT(slot_move_done_step_two())); + else + slot_move_done_step_two(); +} + +void myView::slot_move_done_step_two() +{ + // + m_current->yourTurn(m_board->game()); + + if(check_game_over()) + emit working(false); +} + + +void myView::you_won(bool yes) +{ + if(yes&&m_player->isWhite() || !yes&&!m_player->isWhite()) { + m_history->setTag(PdnGame::Result, "1-0"); // white wins + add_log(myView::System, tr("White wins!")); + } else { + m_history->setTag(PdnGame::Result, "0-1"); // black wins + add_log(myView::System, tr("Black wins!")); + } + + emit working(false); +} + + +bool myView::openPdn(const QString& fn) +{ + emit working(false); + + m_current->stop(); + + QString log_text; + if(!m_history->openPdn(fn, log_text)) { + return false; + } + + if(log_text.length()) { + add_log(myView::System, tr("Opened:")+" "+fn); + add_log(myView::Error, log_text.trimmed()); + add_log(myView::Warning, tr("Warning! Some errors occured.")); + } + + return true; +} + + +bool myView::savePdn(const QString& fn) +{ + if(!m_history->savePdn(fn)) { + qDebug() << __PRETTY_FUNCTION__ << "failed."; + return false; + } + add_log(myView::System, tr("Saved:")+" "+fn); + return true; +} + + +void myView::slot_new_mode(bool paused, bool freeplace) +{ + if(paused) { + if(freeplace) + m_board->setCursor(Qt::PointingHandCursor); + else + m_board->setCursor(Qt::ForbiddenCursor); + } else { + m_board->setCursor(Qt::ArrowCursor); + } + + // resume game: ask info for who is next, black or white.XXX FIXME TODO + if(!paused) { + myPlayer* next = 0; + if(m_history->moveCount()%2==0) + next = get_first_player(); + else + next = get_first_player()->opponent(); + + m_current = next->opponent(); + slot_move_done(m_board->game()->toString(false)); + } +} + + +void myView::slot_preview_game(int rules) +{ + if(rules!=RUSSIAN && rules!=ENGLISH) { + qDebug() << __PRETTY_FUNCTION__ << rules << "Wrong game type."; + return; + } + + m_board->setGame(rules); + + if(m_player->isWhite() && rules==RUSSIAN) { + m_player->setName(m_history->getTag(PdnGame::White)); + m_player->opponent()->setName(m_history->getTag(PdnGame::Black)); + } else { + m_player->setName(m_history->getTag(PdnGame::Black)); + m_player->opponent()->setName(m_history->getTag(PdnGame::White)); + } + + // FIXME + m_player->setWhite(rules==RUSSIAN);// FIXME TODO + m_player->opponent()->setWhite(!m_player->isWhite()); + m_board->setColorWhite(m_player->isWhite()); + m_board->adjustNotation(m_player->isWhite()); +} + + +void myView::slot_apply_moves(const QString& moves) +{ + QStringList move_list= moves.split(MOVE_SPLIT, QString::SkipEmptyParts); + + m_board->reset(); + + bool white_player = get_first_player()->isWhite(); + foreach(QString move, move_list) { + m_board->doMove(move, white_player); + white_player = !white_player; + } + + // set current player who pulls next. assume is white. + m_current = (m_player->isWhite() ? m_player : m_player->opponent()); + if(!white_player) + m_current = m_current->opponent(); + m_history->setCurrent(m_current->name()); +} + + +void myView::add_log(enum LogType type, const QString& text) +{ + QString str = text; + str = str.replace('<', "<"); + str = str.replace('>', ">"); + + QString tag_b, tag_e; + switch(type) { + case Error: tag_b="

      "; tag_e="
    "; break; + case Warning: tag_b=""; tag_e=""; break; + case System: tag_b=""; tag_e=""; break; + default: break; + } + + m_log->append(tag_b + str + tag_e); + + m_log->ensureCursorVisible(); +} + + +void myView::perform_jumps(const QString& from_board, const QString& to_board) +{ + if(from_board==to_board) { + return; + } + + QString new_to_board = to_board; + + //qDebug("F:%s\nT:%s", from_board.latin1(), new_to_board.latin1()); + + // diff + QList diff_list; + + // collect information + for(int i=0; i<32; i++) { + if(from_board[2*i]!=new_to_board[2*i] + || from_board[2*i+1]!=new_to_board[2*i+1]) { + myDiff* diff = new myDiff(i, + from_board.mid(2*i, 2).toInt(), + new_to_board.mid(2*i, 2).toInt()); + diff_list.append(diff); + + //qDebug(">%d: %d->%d", diff->m_pos, diff->m_from, diff->m_to); + } + } + + int from_pos = -1; + int to_pos = -1; + bool captured = (diff_list.count()>2); + + int man = -1; + // find the dest. first: so we have the man moved. + foreach(myDiff* diff, diff_list) { + if(diff->m_to!=FREE) { + man = diff->m_to; + to_pos = diff->m_pos; + break; + } + } + + int king = -1; + switch(man) { + case MAN1: king=KING1; break; + case KING1: king=MAN1; break; + case MAN2: king=KING2; break; + case KING2: king=MAN2; break; + } + // find src. + foreach(myDiff* diff, diff_list) { + if(diff->m_to==FREE) { + if(diff->m_from==man || diff->m_from==king) { + from_pos = diff->m_pos; + break; + } + } + } + + /* + qDebug(" to_pos=%d with man/king=%d from=%d", to_pos, man, + from_pos); + */ + + // finally - animate :) + QString move = m_board->doMove(from_pos, to_pos, m_current->isWhite()); + m_history->appendMove(move.replace("?", captured ? "x" : "-" ), ""); + + qDeleteAll(diff_list); +} + +void myView::setNotation(bool enabled, bool show_above) +{ + // TODO - intermediate function - remove somehow! + m_board->setNotation(enabled, show_above); +} + + +void myView::setNotationFont(const QFont& f) +{ + // TODO - intermediate function - remove somehow! + m_board->setNotationFont(f); +} + + +myPlayer* myView::get_first_player() const +{ + bool white = m_board->type()==RUSSIAN ? true : false; + // it is white. + if((white && m_player->isWhite()) || (!white && !m_player->isWhite())) + return m_player; + return m_player->opponent(); +} + + diff --git a/retroshare-gui/src/games/qcheckers/view.h b/retroshare-gui/src/games/qcheckers/view.h new file mode 100644 index 000000000..7330325d6 --- /dev/null +++ b/retroshare-gui/src/games/qcheckers/view.h @@ -0,0 +1,122 @@ +/*************************************************************************** + * Copyright (C) 2004-2005 Artur Wiebe * + * wibix@gmx.de * + * * + * 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., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#ifndef _VIEW_H_ +#define _VIEW_H_ + + +#include +#include +#include +#include + + +#include "board.h" + + +class Pdn; +class myPlayer; +class myHistory; + + +class myView : public QFrame +{ + Q_OBJECT + +public: + myView(QWidget* parent); + ~myView(); + + void newGame(int rules, bool free_place, + const QString& name, bool is_white, + int opponent, const QString& opp_name, int skill); + bool openPdn(const QString& fn); + bool savePdn(const QString& fn); + + void setTheme(const QString& theme_path); + + bool isAborted() const { return m_aborted; } + + void setNotation(bool enabled, bool show_above); + void setNotationFont(const QFont& f); + QFont notationFont() const { return m_board->font(); } + +public slots: + virtual void setEnabled(bool); + + void slotClearLog(bool b) { m_clear_log = b; } + + void slotStopGame(); + void slotNextRound(); + +signals: + void working(bool); + +private slots: + void slot_click(int); + + void slot_move_done(const QString& board_str); + void slot_move_done_step_two(); + + void slot_preview_game(int game_type); + void slot_apply_moves(const QString& moves); + void slot_new_mode(bool paused, bool freeplace); + +private: + void begin_game(unsigned int round, bool freeplacement); + + void perform_jumps(const QString& from_board, const QString& to_board); + bool extract_move(const QString& move, int* from_num, int* to_num); + + void stop_game(const QString&); + void you_won(bool really); + bool check_game_over(); + + enum LogType { + None, + Error, + Warning, + System, + User, + Opponent, + }; + void add_log(enum LogType type, const QString& text); + + myPlayer* get_first_player() const; + +private: + bool m_clear_log; + + bool m_game_over;// need this to avoid multiple calls to isGameOver() + bool m_aborted; + + myPlayer* m_player; + myPlayer* m_current; + + myBoard* m_board; + myHistory* m_history; + QTextEdit* m_log; + + int m_freeplace_from; +}; + + +#endif + diff --git a/retroshare-gui/src/gui/ApplicationWindow.cpp b/retroshare-gui/src/gui/ApplicationWindow.cpp new file mode 100644 index 000000000..00dd1c2ce --- /dev/null +++ b/retroshare-gui/src/gui/ApplicationWindow.cpp @@ -0,0 +1,219 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, 2007 crypton + * + * 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 +#include +#include +#include +#include +#include +#include + +#include +#include "ApplicationWindow.h" + +#include "Preferences/PreferencesWindow.h" +#include "Settings/gsettingswin.h" +#include "util/rsversion.h" + +#include "rsiface/rsiface.h" + +#include "gui/connect/InviteDialog.h" +#include "gui/connect/AddFriendDialog.h" + + +#define FONT QFont(tr("Arial"), 8) + +/* Images for toolbar icons */ +#define IMAGE_NETWORK ":/images/network32.png" +#define IMAGE_PEERS ":/images/peers_24x24.png" +#define IMAGE_SEARCH ":/images/filefind.png" +#define IMAGE_TRANSFERS ":/images/ktorrent.png" +#define IMAGE_FILES ":/images/folder_green.png" +#define IMAGE_CHANNELS ":/images/konsole.png" +#define IMAGE_PREFERENCES ":/images/settings16.png" +#define IMAGE_CHAT ":/images/chats_24x24.png" +#define IMAGE_RETROSHARE ":/images/RetroShare16.png" +#define IMAGE_ABOUT ":/images/informations_24x24.png" +#define IMAGE_STATISTIC ":/images/utilities-system-monitor.png" +#define IMAGE_MESSAGES ":/images/evolution.png" +#define IMAGE_BWGRAPH ":/images/ksysguard.png" +#define IMAGE_RSM32 ":/images/rsmessenger32.png" +#define IMAGE_RSM16 ":/images/rsmessenger16.png" +#define IMAGE_CLOSE ":/images/close_normal.png" + +/* Keys for UI Preferences */ +#define UI_PREF_PROMPT_ON_QUIT "UIOptions/ConfirmOnQuit" +/* uncomment this for release version */ +#define RS_RELEASE_VERSION 1 + +/** Constructor */ +ApplicationWindow::ApplicationWindow(QWidget* parent, Qt::WFlags flags) + : QMainWindow(parent, flags) +{ + /* Invoke the Qt Designer generated QObject setup routine */ + ui.setupUi(this); + + setWindowTitle(tr("RetroShare %1").arg(retroshareVersion())); + + // Setting icons + this->setWindowIcon(QIcon(QString::fromUtf8(":/images/RetroShare16.png"))); + loadStyleSheet("Default"); + + + /* Create the config pages and actions */ + QActionGroup *grp = new QActionGroup(this); + + + ui.stackPages->add(exampleDialog = new ExampleDialog(ui.stackPages), + createPageAction(QIcon(IMAGE_MESSAGES), tr("Example Application"), grp)); + + //ui.stackPages->add(groupsDialog = new GroupsDialog(ui.stackPages), + // createPageAction(QIcon(), tr("Groups"), grp)); + + //ui.stackPages->add(new StatisticDialog(ui.stackPages), + // createPageAction(QIcon(IMAGE_STATISTIC), tr("Statistics"), grp)); + + statusBar()->addWidget(new QLabel(tr("Application Users: 0 Files: 0 "))); + statusBar()->addPermanentWidget(new QLabel(tr("Down: 0.0 Up: 0.0 "))); + statusBar()->addPermanentWidget(new QLabel(tr("Connections: 0/45 "))); + + /* Create the toolbar */ + ui.toolBar->addActions(grp->actions()); + ui.toolBar->addSeparator(); + connect(grp, SIGNAL(triggered(QAction *)), ui.stackPages, SLOT(showPage(QAction *))); + + /* Create and bind the messenger button */ + //addAction(new QAction(QIcon(IMAGE_RSM32), tr("Messenger"), ui.toolBar), SLOT(showMessengerWindow())); + + + +} + +/** Creates a new action associated with a config page. */ +QAction* ApplicationWindow::createPageAction(QIcon img, QString text, QActionGroup *group) +{ + QAction *action = new QAction(img, text, group); + action->setCheckable(true); + action->setFont(FONT); + return action; +} + +/** Adds the given action to the toolbar and hooks its triggered() signal to + * the specified slot (if given). */ +void ApplicationWindow::addAction(QAction *action, const char *slot) +{ + action->setFont(FONT); + ui.toolBar->addAction(action); + connect(action, SIGNAL(triggered()), this, slot); +} + +/** Overloads the default show so we can load settings */ +void ApplicationWindow::show() +{ + + if (!this->isVisible()) { + QMainWindow::show(); + } else { + QMainWindow::activateWindow(); + setWindowState(windowState() & ~Qt::WindowMinimized | Qt::WindowActive); + QMainWindow::raise(); + } +} + + +/** Shows the config dialog with focus set to the given page. */ +void ApplicationWindow::show(Page page) +{ + /* Show the dialog. */ + show(); + + /* Set the focus to the specified page. */ + ui.stackPages->setCurrentIndex((int)page); +} + + +/** Destructor. */ +ApplicationWindow::~ApplicationWindow() +{ + delete exampleDialog; +} + +/** Create and bind actions to events. Setup for initial + * tray menu configuration. */ +void ApplicationWindow::createActions() +{ +} + +void ApplicationWindow::closeEvent(QCloseEvent *e) +{ + hide(); + e->ignore(); +} + + +void ApplicationWindow::updateMenu() +{ + toggleVisibilityAction->setText(isVisible() ? tr("Hide") : tr("Show")); +} + +void ApplicationWindow::toggleVisibility(QSystemTrayIcon::ActivationReason e) +{ + if(e == QSystemTrayIcon::Trigger || e == QSystemTrayIcon::DoubleClick){ + if(isHidden()){ + show(); + if(isMinimized()){ + if(isMaximized()){ + showMaximized(); + }else{ + showNormal(); + } + } + raise(); + activateWindow(); + }else{ + hide(); + } + } +} + +void ApplicationWindow::toggleVisibilitycontextmenu() +{ + if (isVisible()) + hide(); + else + show(); +} + + + +void ApplicationWindow::loadStyleSheet(const QString &sheetName) +{ + QFile file(":/qss/" + sheetName.toLower() + ".qss"); + file.open(QFile::ReadOnly); + QString styleSheet = QLatin1String(file.readAll()); + + + qApp->setStyleSheet(styleSheet); + +} + + diff --git a/retroshare-gui/src/gui/ApplicationWindow.h b/retroshare-gui/src/gui/ApplicationWindow.h new file mode 100644 index 000000000..31aa6396e --- /dev/null +++ b/retroshare-gui/src/gui/ApplicationWindow.h @@ -0,0 +1,114 @@ +/**************************************************************** + * RShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 _ApplicationWindow_H +#define _ApplicationWindow_H + +#include +#include +#include + +#include "ExampleDialog.h" +#include "Settings/gsettingswin.h" + +#include "ui_ApplicationWindow.h" + +#include "../config/rsharesettings.h" + +class ApplicationWindow : public QMainWindow +{ + Q_OBJECT + +public: + /** Main dialog pages. */ + enum Page { + Graph = 0, /** Network Graph */ + Channels = 1, /** Channels page. */ + SharedDirectories = 2, /** Shared Directories page. */ + Search = 3, /** Search page. */ + Transfers = 4, /** Transfers page. */ + Chat = 5, /** Chat page. */ + Messages = 6, /** Messages page. */ + Statistics = 8 /** Statistic page. */ + + }; + + /** Default Constructor */ + ApplicationWindow(QWidget *parent = 0, Qt::WFlags flags = 0); + + /** Destructor. */ + ~ApplicationWindow(); + + /* A Bit of a Hack... but public variables for + * the dialogs, so we can add them to the + * Notify Class... + */ + + ExampleDialog *exampleDialog; + //ChannelsDialog *channelsDialog; + //GroupsDialog *groupsDialog; + //StatisticDialog *statisticDialog; + +public slots: + /** Called when this dialog is to be displayed */ + void show(); + /** Shows the config dialog with focus set to the given page. */ + void show(Page page); + + + +private slots: + + void updateMenu(); + + void toggleVisibility(QSystemTrayIcon::ActivationReason e); + void toggleVisibilitycontextmenu(); + +protected: + void closeEvent(QCloseEvent *); + + +private slots: + + + +private: + + /** Create the actions on the tray menu or menubar */ + void createActions(); + + /** Creates a new action for a config page. */ + QAction* createPageAction(QIcon img, QString text, QActionGroup *group); + /** Adds a new action to the toolbar. */ + void addAction(QAction *action, const char *slot = 0); + + void loadStyleSheet(const QString &sheetName); + + QSystemTrayIcon *trayIcon; + QAction *toggleVisibilityAction; + QMenu *menu; + + /** Qt Designer generated object */ + Ui::ApplicationWindow ui; +}; + +#endif + diff --git a/retroshare-gui/src/gui/ApplicationWindow.ui b/retroshare-gui/src/gui/ApplicationWindow.ui new file mode 100644 index 000000000..f229e7bcc --- /dev/null +++ b/retroshare-gui/src/gui/ApplicationWindow.ui @@ -0,0 +1,1608 @@ + + ApplicationWindow + + + + 0 + 0 + 724 + 613 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 120 + 120 + 120 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 10 + 36 + 106 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 120 + 120 + 120 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 212 + 208 + 200 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + + + 120 + 120 + 120 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 120 + 120 + 120 + + + + + + + 139 + 139 + 139 + + + + + + + 120 + 120 + 120 + + + + + + + 255 + 255 + 255 + + + + + + + 120 + 120 + 120 + + + + + + + 240 + 240 + 240 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 10 + 36 + 106 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + + + Arial + 10 + 50 + false + false + false + false + + + + Qt::CustomContextMenu + + + RetroShare + + + + 24 + 24 + + + + Qt::ToolButtonTextUnderIcon + + + + + 1 + + + 1 + + + + + Qt::Vertical + + + + true + + + 0 + + + + Home + + + + 0 + + + 0 + + + + + + 70 + 16777215 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 0 + + + 0 + + + + + + 4 + 5 + 0 + 0 + + + + + 64 + 0 + + + + + 70 + 16777215 + + + + 1 + + + 0 + + + + + 0 + 0 + 68 + 255 + + + + General + + + + 9 + + + 6 + + + + + Qt::NonModal + + + + 0 + 0 + 0 + 0 + + + + + 48 + 32 + + + + + 32 + 32 + + + + + + + :/images/exit_24x24.png + + + + 24 + 24 + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + 0 + + + 7 + + + + + + 0 + 0 + 0 + 0 + + + + + 48 + 32 + + + + + 32 + 32 + + + + + + + :/images/invite-friend24.png + + + + 24 + 24 + + + + + + + + + 0 + 0 + 0 + 0 + + + + + 48 + 32 + + + + + 32 + 32 + + + + + + + :/images/add-friend24.png + + + + 24 + 24 + + + + + + + + + 0 + 0 + 0 + 0 + + + + + 48 + 32 + + + + + 32 + 32 + + + + + + + :/images/settings.png + + + + 24 + 24 + + + + + + + + + 0 + 0 + 0 + 0 + + + + + 48 + 32 + + + + + 32 + 32 + + + + + + + :/images/add-share24.png + + + + 24 + 24 + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + 0 + 0 + 96 + 26 + + + + Advanced + + + + + + + + + + + 0 + + + 0 + + + + + + 14 + 31 + + + + + 14 + 32 + + + + + + + :/images/hide_toolbox_frame.png + + + + 16 + 31 + + + + true + + + + + + + Qt::Vertical + + + + 14 + 191 + + + + + + + + + + + 120 + 0 + + + + + 120 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 120 + 120 + 120 + + + + + + + 160 + 160 + 160 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 10 + 36 + 106 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 120 + 120 + 120 + + + + + + + 160 + 160 + 160 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 212 + 208 + 200 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + + + 120 + 120 + 120 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 120 + 120 + 120 + + + + + + + 160 + 160 + 160 + + + + + + + 120 + 120 + 120 + + + + + + + 255 + 255 + 255 + + + + + + + 120 + 120 + 120 + + + + + + + 240 + 240 + 240 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 10 + 36 + 106 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + + + 50 + false + + + + Qt::NoContextMenu + + + + + + + + + + 7 + 7 + 0 + 0 + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + Qt::NoContextMenu + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 0 + + + 0 + + + + + true + + + true + + + QTextBrowser { + background-color: rgb(192,192,192); + + } + + + + + + + + + + + 0 + + + 6 + + + + + + 18 + 18 + + + + + 18 + 18 + + + + true + + + QPushButton + { + border-image: url(:/images/console-small-up.png) + } + + QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + + } + + QPushButton:pressed { + border-image: url(:/images/console-small-down.png) + } + + + + + + + true + + + false + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 10 + 20 + + + + + + + + + 0 + 18 + + + + + 16777215 + 18 + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 4 + 20 + + + + + + + + + + + + Qt::NoContextMenu + + + true + + + Qt::TopToolBarArea + + + Qt::Horizontal + + + + 24 + 24 + + + + Qt::ToolButtonTextUnderIcon + + + 4 + + + + + + MainPageStack + QStackedPageWidget +
    gui/mainpagestack.h
    +
    +
    + + tabWidget + addfriendButton + invitefriendButton + addshareButton + optionsButton + quitButton + textBrowser + lineEdit + btnToggleConsole + btntoggletoolbox + + + + + +
    diff --git a/retroshare-gui/src/gui/ChannelsDialog.cpp b/retroshare-gui/src/gui/ChannelsDialog.cpp new file mode 100644 index 000000000..ea36a06a2 --- /dev/null +++ b/retroshare-gui/src/gui/ChannelsDialog.cpp @@ -0,0 +1,415 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 "rshare.h" +#include "ChannelsDialog.h" +#include "msgs/ChanMsgDialog.h" +#include "msgs/ChanCreateDialog.h" + +#include "rsiface/rsiface.h" +#include + +#include +#include +#include +#include +#include +#include + +/* Images for context menu icons */ +#define IMAGE_MESSAGE ":/images/folder-draft.png" +#define IMAGE_MESSAGEREPLY ":/images/mail_reply.png" +#define IMAGE_MESSAGEREMOVE ":/images/mail_delete.png" +#define IMAGE_DOWNLOAD ":/images/start.png" +#define IMAGE_DOWNLOADALL ":/images/startall.png" + +/** Constructor */ +ChannelsDialog::ChannelsDialog(QWidget *parent) +: MainPage(parent) +{ + /* Invoke the Qt Designer generated object setup routine */ + ui.setupUi(this); + + connect( ui.msgWidget, SIGNAL( customContextMenuRequested( QPoint ) ), this, SLOT( messageslistWidgetCostumPopupMenu( QPoint ) ) ); + connect( ui.msgList, SIGNAL( customContextMenuRequested( QPoint ) ), this, SLOT( msgfilelistWidgetCostumPopupMenu( QPoint ) ) ); + connect( ui.msgWidget, SIGNAL( itemClicked ( QTreeWidgetItem *, int) ), this, SLOT( updateChannels ( QTreeWidgetItem *, int) ) ); + + /* hide the Tree +/- */ + ui.msgWidget -> setRootIsDecorated( false ); + ui.msgList -> setRootIsDecorated( false ); + + + /* Hide platform specific features */ +#ifdef Q_WS_WIN + +#endif +} + +void ChannelsDialog::messageslistWidgetCostumPopupMenu( QPoint point ) +{ + + QMenu contextMnu( this ); + QMouseEvent *mevent = new QMouseEvent( QEvent::MouseButtonPress, point, Qt::RightButton, Qt::RightButton, Qt::NoModifier ); + + newMsgAct = new QAction(QIcon(IMAGE_MESSAGE), tr( "New Message" ), this ); + connect( newMsgAct , SIGNAL( triggered() ), this, SLOT( newmessage() ) ); + + newChanAct = new QAction(QIcon(IMAGE_MESSAGE), tr( "New Channel" ), this ); + connect( newChanAct , SIGNAL( triggered() ), this, SLOT( newchannel() ) ); + + subChanAct = new QAction(QIcon(IMAGE_MESSAGEREPLY), tr( "Subscribe To Channel" ), this ); + connect( subChanAct , SIGNAL( triggered() ), this, SLOT( subscribechannel() ) ); + + unsubChanAct = new QAction(QIcon(IMAGE_MESSAGEREMOVE), tr( "Unsubscribe To Channel" ), this ); + connect( unsubChanAct , SIGNAL( triggered() ), this, SLOT( unsubscribechannel() ) ); + + delChanAct = new QAction(QIcon(IMAGE_MESSAGEREMOVE), tr( "Delete Your Channel" ), this ); + connect( delChanAct , SIGNAL( triggered() ), this, SLOT( deletechannel() ) ); + + contextMnu.clear(); + contextMnu.addAction( newMsgAct); + contextMnu.addAction( newChanAct); + contextMnu.addAction( subChanAct); + contextMnu.addAction( unsubChanAct); + contextMnu.addAction( delChanAct); + contextMnu.exec( mevent->globalPos() ); +} + + +void ChannelsDialog::msgfilelistWidgetCostumPopupMenu( QPoint point ) +{ + + QMenu contextMnu( this ); + QMouseEvent *mevent = new QMouseEvent( QEvent::MouseButtonPress, point, Qt::RightButton, Qt::RightButton, Qt::NoModifier ); + + getRecAct = new QAction(QIcon(IMAGE_DOWNLOAD), tr( "Download" ), this ); + connect( getRecAct , SIGNAL( triggered() ), this, SLOT( getcurrentrecommended() ) ); + + getAllRecAct = new QAction(QIcon(IMAGE_DOWNLOADALL), tr( "Download All" ), this ); + connect( getAllRecAct , SIGNAL( triggered() ), this, SLOT( getallrecommended() ) ); + + + contextMnu.clear(); + contextMnu.addAction( getRecAct); + contextMnu.addAction( getAllRecAct); + contextMnu.exec( mevent->globalPos() ); +} + +void ChannelsDialog::newmessage() +{ + static ChanMsgDialog *createChanMsgDialog = new ChanMsgDialog(false); + + /* fill it in */ + std::cerr << "ChannelsDialog::newmessage()" << std::endl; + createChanMsgDialog->newMsg(); + createChanMsgDialog->show(); +} + +void ChannelsDialog::newchannel() +{ + /* put msg on msgBoard, and switch to it. */ + static ChanCreateDialog *createChanDialog = new ChanCreateDialog(); + + /* fill it in */ + std::cerr << "ChannelsDialog::newchannel()" << std::endl; + createChanDialog->newChan(); + createChanDialog->show(); + +} + +void ChannelsDialog::subscribechannel() +{ + /* more work */ + +} + +void ChannelsDialog::unsubscribechannel() +{ + /* more work */ + +} + + +void ChannelsDialog::deletechannel() +{ + /* more work */ + +} + + +void ChannelsDialog::getcurrentrecommended() +{ + + +} + + +void ChannelsDialog::getallrecommended() +{ + + +} + +void ChannelsDialog::insertChannels() +{ + rsiface->lockData(); /* Lock Interface */ + + /* get a link to the table */ + QTreeWidget *msgWidget = ui.msgWidget; + + QList items; + + std::map::const_iterator it2; + std::list::const_iterator it; + + const std::map &ourChans = rsiface->getOurChannels(); + + for(it2 = ourChans.begin(); it2 != ourChans.end(); it2++) + { + for(it = it2 -> second.msglist.begin(); it != it2 -> second.msglist.end(); it++) + { + /* make a widget per friend */ + QTreeWidgetItem *item = new QTreeWidgetItem((QTreeWidget*)0); + + /* So Text should be: + * as above. */ + + { + std::ostringstream out; + out << "@" << it -> ts; + item -> setText(0, QString::fromStdString(out.str())); + } + + { + std::ostringstream out; + out << it2 -> second.rank; // "5"; // RANK + item -> setText(1, QString::fromStdString(out.str())); + } + + { + std::ostringstream out; + out << "Broadcast on " << it2 -> second.chanName; + item -> setText(2, QString::fromStdString(out.str())); + } + + item -> setText(3, QString::fromStdString(it->title)); + item -> setText(4, QString::fromStdString(it->msg)); + + { + std::ostringstream out; + out << it -> size; + item -> setText(5, QString::fromStdString(out.str())); + } + + { + std::ostringstream out; + out << it -> count; + item -> setText(6, QString::fromStdString(out.str())); + } + + item -> setText(7, "CHAN"); + { + std::ostringstream out; + out << it2 -> first; + item -> setText(8, QString::fromStdString(out.str())); + } + { + std::ostringstream out; + out << it -> msgId; + item -> setText(9, QString::fromStdString(out.str())); + } + + + /* add to the list */ + items.append(item); + } + } + + + const std::map &chans = rsiface->getChannels(); + + for(it2 = chans.begin(); it2 != chans.end(); it2++) + { + for(it = it2 -> second.msglist.begin(); it != it2 -> second.msglist.end(); it++) + { + /* make a widget per friend */ + QTreeWidgetItem *item = new QTreeWidgetItem((QTreeWidget*)0); + + /* So Text should be: + * as above. */ + + { + std::ostringstream out; + out << "@" << it -> ts; + item -> setText(0, QString::fromStdString(out.str())); + } + + { + std::ostringstream out; + out << it2 -> second.rank; // "5"; // RANK + item -> setText(1, QString::fromStdString(out.str())); + } + + { + std::ostringstream out; + out << "Broadcast on " << it2 -> second.chanName; + item -> setText(2, QString::fromStdString(out.str())); + } + + item -> setText(3, QString::fromStdString(it->title)); + item -> setText(4, QString::fromStdString(it->msg)); + + { + std::ostringstream out; + out << it -> size; + item -> setText(5, QString::fromStdString(out.str())); + } + + { + std::ostringstream out; + out << it -> count; + item -> setText(6, QString::fromStdString(out.str())); + } + + item -> setText(7, "CHAN"); + { + std::ostringstream out; + out << it2 -> first; + item -> setText(8, QString::fromStdString(out.str())); + } + { + std::ostringstream out; + out << it -> msgId; + item -> setText(9, QString::fromStdString(out.str())); + } + + + + /* add to the list */ + items.append(item); + } + } + + /* add the items in! */ + msgWidget->clear(); + msgWidget->insertTopLevelItems(0, items); + + rsiface->unlockData(); /* UnLock Interface */ +} + +void ChannelsDialog::updateChannels( QTreeWidgetItem * item, int column ) +{ + std::cerr << "ChannelsDialog::insertMsgTxtAndFiles()" << std::endl; + insertMsgTxtAndFiles(); +} + + +void ChannelsDialog::insertMsgTxtAndFiles() +{ + /* Locate the current Message */ + QTreeWidget *msglist = ui.msgWidget; + + std::cerr << "ChannelsDialog::insertMsgTxtAndFiles()" << std::endl; + + /* get its Ids */ + std::string chid; + std::string mid; + + QTreeWidgetItem *qtwi = msglist -> currentItem(); + if (!qtwi) + { + /* blank it */ + ui.msgText->setText(""); + ui.msgList->clear(); + return; + } + else + { + chid = qtwi -> text(8).toStdString(); + mid = qtwi -> text(9).toStdString(); + } + + std::cerr << "chId: " << chid << std::endl; + std::cerr << "mId: " << mid << std::endl; + + /* get Message */ + rsiface->lockData(); /* Lock Interface */ + + const MessageInfo *mi = NULL; + mi = rsiface->getChannelMsg(chid, mid); + if (!mi) + { + rsiface->unlockData(); /* Unlock Interface */ + return; + } + + const std::list &recList = mi->files; + std::list::const_iterator it; + + /* get a link to the table */ + QTreeWidget *tree = ui.msgList; + + /* get the MessageInfo */ + + tree->clear(); + tree->setColumnCount(5); + + QList items; + for(it = recList.begin(); it != recList.end(); it++) + { + /* make a widget per person */ + QTreeWidgetItem *item = new QTreeWidgetItem((QTreeWidget*)0); + /* (0) Filename */ + item -> setText(0, QString::fromStdString(it->fname)); + + /* (1) Size */ + { + std::ostringstream out; + out << it->size; + item -> setText(1, QString::fromStdString(out.str())); + } + /* (2) Rank */ + { + std::ostringstream out; + out << it->rank; + item -> setText(2, QString::fromStdString(out.str())); + } + + item -> setText(3, QString::fromStdString(it->path)); + + /* add to the list */ + items.append(item); + } + + /* add the items in! */ + tree->insertTopLevelItems(0, items); + + + /* add the Msg */ + ui.msgText->setText(QString::fromStdString(mi -> msg)); + + rsiface->unlockData(); /* Unlock Interface */ + +} + + + diff --git a/retroshare-gui/src/gui/ChannelsDialog.h b/retroshare-gui/src/gui/ChannelsDialog.h new file mode 100644 index 000000000..cfa2df710 --- /dev/null +++ b/retroshare-gui/src/gui/ChannelsDialog.h @@ -0,0 +1,85 @@ +/**************************************************************** + * RShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 _CHANNELSDIALOG_H +#define _CHANNELSDIALOG_H + +#include + +//#include + +#include "mainpage.h" +#include "ui_ChannelsDialog.h" + +class ChannelsDialog : public MainPage +{ + Q_OBJECT + +public: + /** Default Constructor */ + ChannelsDialog(QWidget *parent = 0); + /** Default Destructor */ + + + void insertChannels(); + void insertMsgTxtAndFiles(); + + +private slots: + + /** Create the context popup menu and it's submenus */ + void messageslistWidgetCostumPopupMenu( QPoint point ); + void msgfilelistWidgetCostumPopupMenu(QPoint); + +void updateChannels ( QTreeWidgetItem * item, int column ); + + // Fns for MsgList + void newmessage(); + void newchannel(); + void subscribechannel(); + void unsubscribechannel(); + void deletechannel(); + + // Fns for recommend List +void getcurrentrecommended(); +void getallrecommended(); + +private: + + /** Define the popup menus for the Context menu */ + QMenu* contextMnu; + + /** Defines the actions for the context menu */ + QAction* newMsgAct; + QAction* newChanAct; + QAction* subChanAct; + QAction* unsubChanAct; + QAction* delChanAct; + + QAction* getRecAct; + QAction* getAllRecAct; + + /** Qt Designer generated object */ + Ui::ChannelsDialog ui; +}; + +#endif + diff --git a/retroshare-gui/src/gui/ChannelsDialog.ui b/retroshare-gui/src/gui/ChannelsDialog.ui new file mode 100644 index 000000000..ee53479ed --- /dev/null +++ b/retroshare-gui/src/gui/ChannelsDialog.ui @@ -0,0 +1,659 @@ + + ChannelsDialog + + + + 0 + 0 + 555 + 310 + + + + + 5 + 7 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 192 + 192 + 192 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + 104 + 104 + 104 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 104 + 104 + 104 + + + + + + + 255 + 255 + 255 + + + + + + + 104 + 104 + 104 + + + + + + + 240 + 240 + 240 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + Arial + 8 + 50 + false + false + false + false + + + + Qt::DefaultContextMenu + + + + 1 + + + 1 + + + + + Qt::Horizontal + + + + + 0 + + + 0 + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Messages</span></p></body></html> + + + + + + + Qt::CustomContextMenu + + + true + + + 10 + + + + Date + + + + + Rank + + + + + From + + + + + Title + + + + + Msg + + + + + Count + + + + + Size + + + + + Type + + + + + Rs[Cert/Chan]IdSize + + + + + RsMsgId + + + + + + + + + Qt::Vertical + + + + + 0 + + + 0 + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Message Text</span></p></body></html> + + + + + + + + + + + + 0 + + + 0 + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Recommended Files</span></p></body></html> + + + + + + + Qt::CustomContextMenu + + + + + + + + + + + + + diff --git a/retroshare-gui/src/gui/ChatDialog.cpp b/retroshare-gui/src/gui/ChatDialog.cpp new file mode 100644 index 000000000..d223b78af --- /dev/null +++ b/retroshare-gui/src/gui/ChatDialog.cpp @@ -0,0 +1,443 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 + +#include "rshare.h" +#include "ChatDialog.h" + +#include "rsiface/rsiface.h" +#include "chat/PopupChatDialog.h" +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +/** Constructor */ +ChatDialog::ChatDialog(QWidget *parent) +: MainPage(parent) +{ + /* Invoke the Qt Designer generated object setup routine */ + ui.setupUi(this); + + connect(ui.lineEdit, SIGNAL(returnPressed( ) ), this, SLOT(sendMsg( ) )); + + connect(ui.colorChatButton, SIGNAL(clicked()), this, SLOT(setColor())); + + connect(ui.textboldChatButton, SIGNAL(clicked()), this, SLOT(textBold())); + + connect(ui.textunderlineChatButton, SIGNAL(clicked()), this, SLOT(textUnderline())); + + connect(ui.textitalicChatButton, SIGNAL(clicked()), this, SLOT(textItalic())); + + connect( ui.msgSendList, SIGNAL( customContextMenuRequested( QPoint ) ), this, SLOT( msgSendListCostumPopupMenu( QPoint ) ) ); + +// connect(ui.msgSendList, SIGNAL(itemChanged( QTreeWidgetItem *, int ) ), +// this, SLOT(toggleSendItem( QTreeWidgetItem *, int ) )); + + loadInitMsg(); + + /* hide the Tree +/- */ + ui.msgSendList -> setRootIsDecorated( false ); + + /* to hide the header */ + ui.msgSendList->header()->hide(); + + /* Hide platform specific features */ +#ifdef Q_WS_WIN + +#endif +} + +void ChatDialog::msgSendListCostumPopupMenu( QPoint point ) +{ + + QMenu contextMnu( this ); + QMouseEvent *mevent = new QMouseEvent( QEvent::MouseButtonPress, point, Qt::RightButton, Qt::RightButton, Qt::NoModifier ); + + privchatAct = new QAction(QIcon(), tr( "Chat" ), this ); + connect( privchatAct , SIGNAL( triggered() ), this, SLOT( privchat() ) ); + + contextMnu.clear(); + contextMnu.addAction( privchatAct); + contextMnu.exec( mevent->globalPos() ); +} +int ChatDialog::loadInitMsg() +{ + std::ostringstream out; + + //out << std::endl; + //out << std::endl; + //out << std::endl; + out << " Welcome to:"; + out << "
    " << std::endl; + out << " Retroshare's group chat.
    "; + + QString txt = QString::fromStdString(out.str()); + ui.msgText->setHtml(txt); + + return 1; +} + + + +void ChatDialog::insertChat() +{ + rsiface->lockData(); /* Lock Interface */ + + /* get a link to the table */ + QTextEdit *msgWidget = ui.msgText; + std::list newchat = rsiface->getChatNew(); + std::list::iterator it; + + rsiface->unlockData(); /* Unlock Interface */ + +static std::string lastChatName(""); +static int lastChatTime = 0; + + + /* determine how many spaces to add */ + int n = msgWidget->width(); + /* now spaces = (width - txt width) / (pixel / space) + */ + + //std::cerr << "Width is : " << n << std::endl; + n -= 256; /* 220 pixels for name */ + if (n > 0) + { + n = 2 + n / 10; + } + else + { + n = 1; + } + n = 1 + n / 2; /* shrink it! */ + + //std::cerr << "Space count : " << n << std::endl; + + std::string spaces(" "); + + + /* add in lines at the bottom */ + int ts = time(NULL); + for(it = newchat.begin(); it != newchat.end(); it++) + { + /* are they private? */ + if (it->chatflags & RS_CHAT_PRIVATE) + { + PopupChatDialog *pcd = getPrivateChat(it->rsid, it->name, true); + pcd->addChatMsg(&(*it)); + continue; + } + + std::ostringstream out; + QString currenttxt = msgWidget->toHtml(); + + if ((it->name == lastChatName) && (ts - lastChatTime < 60)) + { + /* no name */ + } + else + { +#if defined(Q_OS_WIN) + /* nothing */ + //out << "
    " << std::endl; +#else + out << "
    " << std::endl; +#endif + for(int i = 0; i < n; i++) + { + out << spaces; + } + QString timestamp = "(" + QDateTime::currentDateTime().toString("hh:mm:ss") + ") "; + QString name = QString::fromStdString(it->name); + //QString line = "" + timestamp + + // " " + name + " \n
    "; + QString line = "" + timestamp + + " " + name + " \n
    "; + + out << line.toStdString(); + } + + out << it -> msg; + + /* This might be WIN32 only - or maybe Qt4.2.2 only - but need it for windows at the mom */ +#if defined(Q_OS_WIN) + //out << "
    "; + //out << "
    " << std::endl; + + out << std::endl; +#else + out << std::endl; +#endif + + lastChatName = it -> name; + lastChatTime = ts; + + /* add it everytime */ + QString extra = QString::fromStdString(out.str()); + currenttxt += extra; + + msgWidget->setHtml(currenttxt); + + //std::cerr << " Added Text: " << std::endl; + //std::cerr << out.str() << std::endl; + QScrollBar *qsb = msgWidget->verticalScrollBar(); + qsb -> setValue(qsb->maximum()); + } +} + + + + +void ChatDialog::sendMsg() +{ + QLineEdit *lineWidget = ui.lineEdit; + + ChatInfo ci; + ci.msg = lineWidget->text().toStdString(); + ci.chatflags = RS_CHAT_PUBLIC; + + rsicontrol -> ChatSend(ci); + lineWidget -> setText(QString("")); + + /* redraw send list */ + insertSendList(); + + +} + +void ChatDialog::insertSendList() +{ + rsiface->lockData(); /* Lock Interface */ + + std::map::const_iterator it; + const std::map &friends = + rsiface->getFriendMap(); + + /* get a link to the table */ + QTreeWidget *sendWidget = ui.msgSendList; + + /* remove old items ??? */ + sendWidget->clear(); + sendWidget->setColumnCount(1); + + QList items; + for(it = friends.begin(); it != friends.end(); it++) + { + /* if offline, don't add */ + if ((it -> second.connectString == "Online" ) || + (it -> second.connectString == "Yourself")) + { + /* ok */ + } + else + { + continue; + } + + /* make a widget per friend */ + QTreeWidgetItem *item = new QTreeWidgetItem((QTreeWidget*)0); + + + /* add all the labels */ + /* (0) Person */ + item -> setText(0, QString::fromStdString(it->second.name)); + /* () Org */ + //item -> setText(1, QString::fromStdString(it->second.org)); + /* () Location */ + //item -> setText(2, QString::fromStdString(it->second.loc)); + /* () Country */ + //item -> setText(3, QString::fromStdString(it->second.country)); + /*{ + std::ostringstream out; + out << it->second.id; + item -> setText(4, QString::fromStdString(out.str())); + }*/ + + //item -> setText(5, "Friend"); + + //item -> setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled); + item -> setFlags(Qt::ItemIsUserCheckable); + + item -> setCheckState(0, Qt::Checked); + /**** NOT SELECTABLE AT THE MOMENT + if (it ->second.inChat) + { + item -> setCheckState(0, Qt::Checked); + } + else + { + item -> setCheckState(0, Qt::Unchecked); + } + ************/ + + + /* add to the list */ + items.append(item); + } + + /* add the items in! */ + sendWidget->insertTopLevelItems(0, items); + + rsiface->unlockData(); /* UnLock Interface */ + + sendWidget->update(); /* update display */ +} + + +/* to toggle the state */ + + +void ChatDialog::toggleSendItem( QTreeWidgetItem *item, int col ) +{ + std::cerr << "ToggleSendItem()" << std::endl; + + /* extract id */ + std::string id = (item -> text(4)).toStdString(); + + /* get state */ + bool inChat = (Qt::Checked == item -> checkState(0)); /* alway column 0 */ + + /* call control fns */ + + rsicontrol -> SetInChat(id, inChat); + return; +} + +void ChatDialog::setColor() +{ + QColor col = QColorDialog::getColor(Qt::green, this); + if (col.isValid()) { + + ui.colorChatButton->setPalette(QPalette(col)); + QTextCharFormat fmt; + fmt.setForeground(col); + mergeFormatOnWordOrSelection(fmt); + colorChanged(col); + } +} + +void ChatDialog::textBold() +{ + QTextCharFormat fmt; + fmt.setFontWeight(ui.textboldChatButton->isChecked() ? QFont::Bold : QFont::Normal); + mergeFormatOnWordOrSelection(fmt); +} + +void ChatDialog::textUnderline() +{ + QTextCharFormat fmt; + fmt.setFontUnderline(ui.textunderlineChatButton->isChecked()); + mergeFormatOnWordOrSelection(fmt); +} + +void ChatDialog::textItalic() +{ + QTextCharFormat fmt; + fmt.setFontItalic(ui.textitalicChatButton->isChecked()); + mergeFormatOnWordOrSelection(fmt); +} + +void ChatDialog::currentCharFormatChanged(const QTextCharFormat &format) +{ + fontChanged(format.font()); + colorChanged(format.foreground().color()); +} + +void ChatDialog::mergeFormatOnWordOrSelection(const QTextCharFormat &format) +{ + QTextCursor cursor = ui.msgText->textCursor(); + if (!cursor.hasSelection()) + cursor.select(QTextCursor::WordUnderCursor); + cursor.mergeCharFormat(format); + ui.msgText->mergeCurrentCharFormat(format); +} + +void ChatDialog::fontChanged(const QFont &f) +{ + //comboFont->setCurrentIndex(comboFont->findText(QFontInfo(f).family())); + //comboSize->setCurrentIndex(comboSize->findText(QString::number(f.pointSize()))); + ui.textboldChatButton->setChecked(f.bold()); + ui.textunderlineChatButton->setChecked(f.italic()); + ui.textitalicChatButton->setChecked(f.underline()); +} + + + +void ChatDialog::colorChanged(const QColor &c) +{ + QPixmap pix(16, 16); + pix.fill(c); + ui.colorChatButton->setIcon(pix); +} + + +void ChatDialog::privchat() +{ + +} + + + +PopupChatDialog *ChatDialog::getPrivateChat(std::string id, std::string name, bool show) +{ + /* see if it exists already */ + PopupChatDialog *popupchatdialog = NULL; + + std::map::iterator it; + if (chatDialogs.end() != (it = chatDialogs.find(id))) + { + /* exists already */ + popupchatdialog = it->second; + } + else + { + popupchatdialog = new PopupChatDialog(id, name); + chatDialogs[id] = popupchatdialog; + } + + if (show) + { + popupchatdialog->show(); + } + + return popupchatdialog; + +} + +void ChatDialog::clearOldChats() +{ + /* nothing yet */ + +} + + diff --git a/retroshare-gui/src/gui/ChatDialog.h b/retroshare-gui/src/gui/ChatDialog.h new file mode 100644 index 000000000..36ba4140c --- /dev/null +++ b/retroshare-gui/src/gui/ChatDialog.h @@ -0,0 +1,97 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 _CHATDIALOG_H +#define _CHATDIALOG_H + +#include "mainpage.h" +#include "ui_ChatDialog.h" + +#include "chat/PopupChatDialog.h" + +class QAction; +class QTextEdit; +class QTextCharFormat; + +class ChatDialog : public MainPage +{ + Q_OBJECT + +public: + /** Default Constructor */ + ChatDialog(QWidget *parent = 0); + /** Default Destructor */ + +void insertChat(); +PopupChatDialog *getPrivateChat(std::string id, std::string name, bool show); +void clearOldChats(); + +int loadInitMsg(); + +private slots: + +void toggleSendItem( QTreeWidgetItem *item, int col ); + + /** Create the context popup menu and it's submenus */ + void msgSendListCostumPopupMenu( QPoint point ); + + void setColor(); + + void textBold(); + void textUnderline(); + void textItalic(); + + void currentCharFormatChanged(const QTextCharFormat &format); + + void insertSendList(); + void sendMsg(); + + void privchat(); + +private: + + void mergeFormatOnWordOrSelection(const QTextCharFormat &format); + void fontChanged(const QFont &f); + + void colorChanged(const QColor &c); + + QAction *actionTextBold; + QAction *actionTextUnderline; + QAction *actionTextItalic; + + /** Define the popup menus for the Context menu */ + QMenu* contextMnu; + /** Defines the actions for the context menu */ + QAction* privchatAct; + + QTreeView *msgSendList; + + + std::map chatDialogs; + + + + /** Qt Designer generated object */ + Ui::ChatDialog ui; +}; + +#endif + diff --git a/retroshare-gui/src/gui/ChatDialog.ui b/retroshare-gui/src/gui/ChatDialog.ui new file mode 100644 index 000000000..c7b8ac988 --- /dev/null +++ b/retroshare-gui/src/gui/ChatDialog.ui @@ -0,0 +1,880 @@ + + ChatDialog + + + + 0 + 0 + 455 + 303 + + + + + 7 + 7 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 192 + 192 + 192 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + 104 + 104 + 104 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 104 + 104 + 104 + + + + + + + 255 + 255 + 255 + + + + + + + 104 + 104 + 104 + + + + + + + 240 + 240 + 240 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + Arial + 8 + 50 + false + false + false + false + + + + Qt::NoContextMenu + + + + + + + + + + 1 + + + 1 + + + + + Qt::Vertical + + + + Qt::Horizontal + + + + + 0 + + + 0 + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + + 181 + 20 + + + + + + + + 0 + + + 6 + + + + + + + + :/images/chat.png + + + + + + + + 10 + 75 + true + + + + Live Group Chat: + + + + + + + + + + + + 7 + 3 + 0 + 0 + + + + false + + + true + + + + + + + + + 0 + + + 0 + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 41 + 20 + + + + + + + + 0 + + + 6 + + + + + + 5 + 0 + 0 + 0 + + + + + 10 + 75 + true + + + + Users: + + + + + + + + + + :/images/peers_16x16.png + + + + + + + + + + + + 13 + 13 + 0 + 0 + + + + + 20 + 0 + + + + Qt::CustomContextMenu + + + true + + + + + + + + + + 0 + + + 6 + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + + 321 + 20 + + + + + + + + + 24 + 24 + + + + + 24 + 24 + + + + + + + :/images/edit-underline.png + + + true + + + + + + + + 24 + 24 + + + + + 24 + 24 + + + + + + + :/images/edit-italic.png + + + true + + + + + + + + 24 + 24 + + + + + 24 + 24 + + + + + + + :/images/edit-bold.png + + + true + + + + + + + + 24 + 24 + + + + + 24 + 24 + + + + + + + + + + + + + + 7 + 3 + 0 + 0 + + + + + 0 + 40 + + + + + 9 + + + + + + + + + + + + lineEdit + textboldChatButton + textunderlineChatButton + textitalicChatButton + colorChatButton + msgText + msgSendList + + + + + + diff --git a/retroshare-gui/src/gui/ConnectionsDialog.cpp b/retroshare-gui/src/gui/ConnectionsDialog.cpp new file mode 100644 index 000000000..e8d7a311d --- /dev/null +++ b/retroshare-gui/src/gui/ConnectionsDialog.cpp @@ -0,0 +1,406 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 +#include + +#include "rshare.h" +#include "common/vmessagebox.h" +#include "ConnectionsDialog.h" +#include "connect/ConnectDialog.h" +#include "authdlg/AuthorizationDialog.h" +#include "rsiface/rsiface.h" +#include "rsiface/rstypes.h" +#include + + +#include +#include +#include +#include +#include +#include +#include + +/* Images for context menu icons */ +#define IMAGE_LOADCERT ":/images/loadcert16.png" +#define IMAGE_PEERDETAILS ":/images/peerdetails_16x16.png" +#define IMAGE_AUTH ":/images/encrypted16.png" +/* Images for Status icons */ +#define IMAGE_AUTHED ":/images/dauthed.png" +#define IMAGE_DENIED ":/images/ddeny.png" + +RsCertId getNeighRsCertId(QTreeWidgetItem *i); + +/** Constructor */ +ConnectionsDialog::ConnectionsDialog(QWidget *parent) +: MainPage(parent), connectdialog(NULL) +{ + /* Invoke the Qt Designer generated object setup routine */ + ui.setupUi(this); + + connect( ui.connecttreeWidget, SIGNAL( customContextMenuRequested( QPoint ) ), this, SLOT( connecttreeWidgetCostumPopupMenu( QPoint ) ) ); + + /* create a single connect dialog */ + connectdialog = new ConnectDialog(); + + /* hide the Tree +/- */ + ui.connecttreeWidget -> setRootIsDecorated( false ); + + /* Set header resize modes and initial section sizes */ + QHeaderView * _header = ui.connecttreeWidget->header () ; + _header->setResizeMode (0, QHeaderView::Custom); + _header->setResizeMode (1, QHeaderView::Interactive); + _header->setResizeMode (2, QHeaderView::Interactive); + _header->setResizeMode (3, QHeaderView::Interactive); + _header->setResizeMode (4, QHeaderView::Interactive); + _header->setResizeMode (5, QHeaderView::Interactive); + _header->setResizeMode (6, QHeaderView::Interactive); + _header->setResizeMode (7, QHeaderView::Interactive); + _header->setResizeMode (8, QHeaderView::Interactive); + _header->setResizeMode (9, QHeaderView::Interactive); + _header->setResizeMode (10, QHeaderView::Interactive); + + _header->resizeSection ( 0, 25 ); + _header->resizeSection ( 1, 100 ); + _header->resizeSection ( 2, 100 ); + _header->resizeSection ( 3, 100 ); + _header->resizeSection ( 4, 100 ); + _header->resizeSection ( 5, 200); + _header->resizeSection ( 6, 100 ); + _header->resizeSection ( 7, 100 ); + _header->resizeSection ( 8, 100 ); + _header->resizeSection ( 9, 100 ); + + + /* Hide platform specific features */ +#ifdef Q_WS_WIN + +#endif +} + +void ConnectionsDialog::connecttreeWidgetCostumPopupMenu( QPoint point ) +{ + + QMenu contextMnu( this ); + QMouseEvent *mevent = new QMouseEvent( QEvent::MouseButtonPress, point, Qt::RightButton, Qt::RightButton, Qt::NoModifier ); + + peerdetailsAct = new QAction(QIcon(IMAGE_PEERDETAILS), tr( "Peer Details / Authenticate " ), this ); + connect( peerdetailsAct , SIGNAL( triggered() ), this, SLOT( peerdetails() ) ); + + //authAct = new QAction(QIcon(IMAGE_AUTH), tr( "Authenticate" ), this ); + //connect( authAct , SIGNAL( triggered() ), this, SLOT( peerdetails() ) ); + + loadcertAct = new QAction(QIcon(IMAGE_LOADCERT), tr( "Load Certificate" ), this ); + connect( loadcertAct , SIGNAL( triggered() ), this, SLOT( loadneighbour() ) ); + + + contextMnu.clear(); + contextMnu.addAction( peerdetailsAct); + //contextMnu.addAction( authAct); + contextMnu.addAction( loadcertAct); + contextMnu.exec( mevent->globalPos() ); +} + +/** Shows Peer Information/Auth Dialog */ +void ConnectionsDialog::peerdetails() +{ + std::cerr << "ConnectionsDialog::peerdetails()" << std::endl; + + QTreeWidgetItem *wi = getCurrentNeighbour(); + if (!wi) + return; + + RsCertId id = getNeighRsCertId(wi); + std::ostringstream out; + out << id; + + showpeerdetails(out.str()); +} + +/** Shows Peer Information/Auth Dialog */ +void ConnectionsDialog::showpeerdetails(std::string id) +{ + std::cerr << "ConnectionsDialog::showpeerdetails()" << std::endl; + if ((connectdialog) && (connectdialog -> loadPeer(id))) + { + connectdialog->show(); + } +} + +/** Shows Connect Dialog */ +void ConnectionsDialog::showAuthDialog() +{ + static AuthorizationDialog *authorizationdialog = new AuthorizationDialog(); + QTreeWidgetItem *wi = getCurrentNeighbour(); + if (!wi) + return; + + RsCertId id = getNeighRsCertId(wi); + std::ostringstream out; + out << id; + authorizationdialog->setAuthCode(out.str(), wi->text(9).toStdString()); + authorizationdialog->show(); +} + + + + +/** Open a QFileDialog to browse for a pem/pqi file. */ +void ConnectionsDialog::loadcert() +{ + /* Create a new input dialog, which allows users to create files, too */ + QFileDialog *dialog = new QFileDialog(this, tr("Select a pem/pqi File")); + //dialog->setDirectory(QFileInfo(ui.lineTorConfig->text()).absoluteDir()); + //dialog->selectFile(QFileInfo(ui.lineTorConfig->text()).fileName()); + dialog->setFileMode(QFileDialog::AnyFile); + dialog->setReadOnly(false); + + /* Prompt the user to select a file or create a new one */ + if (!dialog->exec() || dialog->selectedFiles().isEmpty()) { + return; + } + QString filename = QDir::convertSeparators(dialog->selectedFiles().at(0)); + + /* Check if the file exists */ + QFile torrcFile(filename); + if (!QFileInfo(filename).exists()) { + /* The given file does not exist. Should we create it? */ + int response = VMessageBox::question(this, + tr("File Not Found"), + tr("%1 does not exist. Would you like to create it?") + .arg(filename), + VMessageBox::Yes, VMessageBox::No); + + if (response == VMessageBox::No) { + /* Don't create it. Just bail. */ + return; + } + /* Attempt to create the specified file */ + if (!torrcFile.open(QIODevice::WriteOnly)) { + VMessageBox::warning(this, + tr("Failed to Create File"), + tr("Unable to create %1 [%2]").arg(filename) + .arg(torrcFile.errorString()), + VMessageBox::Ok); + return; + } + } + //ui.lineTorConfig->setText(filename); +} + + + +#include + +/* get the list of Neighbours from the RsIface. */ +void ConnectionsDialog::insertConnect() +{ + rsiface->lockData(); /* Lock Interface */ + + std::map::const_iterator it; + const std::map &neighs = + rsiface->getNeighbourMap(); + + /* get a link to the table */ + QTreeWidget *connectWidget = ui.connecttreeWidget; + + /* remove old items ??? */ + connectWidget->clear(); + connectWidget->setColumnCount(11); + + QList items; + for(it = neighs.begin(); it != neighs.end(); it++) + { + /* make a widget per friend */ + QTreeWidgetItem *item = new QTreeWidgetItem((QTreeWidget*)0); + + /* add all the labels */ + + /* (0) Status Icon */ + item -> setText(0, ""); + + /* (1) Accept/Deny */ + item -> setText(1, QString::fromStdString(it->second.acceptString)); + /* (2) Trust Level */ + item -> setText(2, QString::fromStdString(it->second.trustString)); + /* (3) Last Connect */ + item -> setText(3, QString::fromStdString(it->second.lastConnect)); + /* (4) Person */ + item -> setText(4, QString::fromStdString(it->second.name)); + + /* (5) Peer Address */ + item -> setText(5, QString::fromStdString(it->second.peerAddress)); + + /* Others */ + item -> setText(6, QString::fromStdString(it->second.org)); + item -> setText(7, QString::fromStdString(it->second.loc)); + item -> setText(8, QString::fromStdString(it->second.country)); + + + { + std::ostringstream out; + out << it -> second.id; + item -> setText(9, QString::fromStdString(out.str())); + } + + item -> setText(10, QString::fromStdString(it->second.authCode)); + + + /* change background */ + int i; + if (it->second.acceptString == "Accept") + { + if (it->second.lastConnect != "Never") + { + /* bright green */ + for(i = 1; i < 11; i++) + { + item -> setBackground(i,QBrush(Qt::darkGreen)); + item -> setIcon(0,(QIcon(IMAGE_AUTHED))); + } + } + else + { + for(i = 1; i < 11; i++) + { + item -> setBackground(i,QBrush(Qt::darkGreen)); + item -> setIcon(0,(QIcon(IMAGE_AUTHED))); + } + } + } + else + { + if (it->second.trustLvl > 3) + { + for(i = 1; i < 11; i++) + { + item -> setBackground(i,QBrush(Qt::cyan)); + item -> setIcon(0,(QIcon(IMAGE_DENIED))); + } + } + else if (it->second.lastConnect != "Never") + { + for(i = 1; i < 11; i++) + { + item -> setBackground(i,QBrush(Qt::yellow)); + item -> setIcon(0,(QIcon(IMAGE_DENIED))); + } + } + else + { + for(i = 1; i < 11; i++) + { + item -> setBackground(i,QBrush(Qt::gray)); + item -> setIcon(0,(QIcon(IMAGE_DENIED))); + } + } + } + + + /* add to the list */ + items.append(item); + } + + /* add the items in! */ + connectWidget->insertTopLevelItems(0, items); + + rsiface->unlockData(); /* UnLock Interface */ + + connectWidget->update(); /* update display */ + +} + +QTreeWidgetItem *ConnectionsDialog::getCurrentNeighbour() +{ + /* get the current, and extract the Id */ + + /* get a link to the table */ + QTreeWidget *connectWidget = ui.connecttreeWidget; + QTreeWidgetItem *item = connectWidget -> currentItem(); + if (!item) + { + std::cerr << "Invalid Current Item" << std::endl; + return NULL; + } + + /* Display the columns of this item. */ + std::ostringstream out; + out << "CurrentNeighbourItem: " << 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(); + return item; +} + +/* Utility Fns */ +RsCertId getNeighRsCertId(QTreeWidgetItem *i) +{ + RsCertId id = (i -> text(9)).toStdString(); + return id; +} + +/* So from the Neighbours Dialog we can call the following control Functions: + * (1) Load Certificate NeighLoadCertificate(std::string file) + * (2) Neigh Auth NeighAuthFriend(id, code) + * (3) Neigh Add NeighAddFriend(id) + * + * All of these rely on the finding of the current Id. + */ + +std::string ConnectionsDialog::loadneighbour() +{ + std::cerr << "ConnectionsDialog::loadneighbour()" << std::endl; + QString fileName = QFileDialog::getOpenFileName(this, tr("Select Certificate"), "", + tr("Certificates (*.pqi *.pem)")); + + std::string file = fileName.toStdString(); + std::string id; + if (file != "") + { + rsicontrol->NeighLoadCertificate(file, id); + } + return id; +} + +void ConnectionsDialog::addneighbour() +{ + QTreeWidgetItem *c = getCurrentNeighbour(); + std::cerr << "ConnectionsDialog::addneighbour()" << std::endl; + /* + rsServer->NeighAddFriend(getNeighRsCertId(c)); + */ +} + +void ConnectionsDialog::authneighbour() +{ + QTreeWidgetItem *c = getCurrentNeighbour(); + std::cerr << "ConnectionsDialog::authneighbour()" << std::endl; + /* + RsAuthId code; + rsServer->NeighAuthFriend(getNeighRsCertId(c), code); + */ +} + diff --git a/retroshare-gui/src/gui/ConnectionsDialog.h b/retroshare-gui/src/gui/ConnectionsDialog.h new file mode 100644 index 000000000..3a03b3e57 --- /dev/null +++ b/retroshare-gui/src/gui/ConnectionsDialog.h @@ -0,0 +1,88 @@ +/**************************************************************** + * RShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 _CONNECTIONSDIALOG_H +#define _CONNECTIONSDIALOG_H + +#include + +//#include + +#include "mainpage.h" +#include "ui_ConnectionsDialog.h" + +#include "connect/ConnectDialog.h" + + +class ConnectionsDialog : public MainPage +{ + Q_OBJECT + +public: + /** Default Constructor */ + ConnectionsDialog(QWidget *parent = 0); + /** Default Destructor */ + + void insertConnect(); + void showpeerdetails(std::string id); + +public slots: + std::string loadneighbour(); + /* void loadneighbour(); */ + +private slots: + + void showAuthDialog(); + + void peerdetails(); + /** Create the context popup menu and it's submenus */ + void connecttreeWidgetCostumPopupMenu( QPoint point ); + + /** Called when user clicks "Load Cert" to choose location of a Cert file */ + void loadcert(); + + void authneighbour(); + void addneighbour(); + +private: + + +QTreeWidgetItem *getCurrentNeighbour(); + + /** Define the popup menus for the Context menu */ + QMenu* contextMnu; + /** Defines the actions for the context menu */ + QAction* peerdetailsAct; + QAction* authAct; + QAction* loadcertAct; + + /* connection dialog */ + ConnectDialog *connectdialog; + + QTreeWidget *connecttreeWidget; + + /** Qt Designer generated object */ + Ui::ConnectionsDialog ui; +}; + +#endif + diff --git a/retroshare-gui/src/gui/ConnectionsDialog.ui b/retroshare-gui/src/gui/ConnectionsDialog.ui new file mode 100644 index 000000000..b9f431e32 --- /dev/null +++ b/retroshare-gui/src/gui/ConnectionsDialog.ui @@ -0,0 +1,671 @@ + + ConnectionsDialog + + + + 0 + 0 + 510 + 289 + + + + + 7 + 7 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 192 + 192 + 192 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + 104 + 104 + 104 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 104 + 104 + 104 + + + + + + + 255 + 255 + 255 + + + + + + + 104 + 104 + 104 + + + + + + + 240 + 240 + 240 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + Arial + 10 + 50 + false + false + false + false + + + + true + + + Qt::NoContextMenu + + + + 1 + + + 1 + + + + + 0 + + + 0 + + + + + 0 + + + 6 + + + + + + + + :/images/network16.png + + + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + 7 + 7 + 0 + 0 + + + + + Arial + 8 + 50 + false + false + false + false + + + + Qt::CustomContextMenu + + + false + + + false + + + 0 + + + + 16 + 16 + + + + true + + + + # + + + + + Accept + + + + + Trust + + + + + Last Contact + + + + + Name + + + + + Peer Address + + + + + Organisation + + + + + Location + + + + + Country + + + + + Cert Id + + + + + Auth Code + + + + + + + + + + + + + diff --git a/retroshare-gui/src/gui/DLListDelegate.cpp b/retroshare-gui/src/gui/DLListDelegate.cpp new file mode 100644 index 000000000..0561122c2 --- /dev/null +++ b/retroshare-gui/src/gui/DLListDelegate.cpp @@ -0,0 +1,193 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006,2007 crypton + * + * 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 +#include +#include +#include +#include + +#include "DLListDelegate.h" + +DLListDelegate::DLListDelegate(QObject *parent) : QAbstractItemDelegate(parent) +{ + ; +} + +DLListDelegate::~DLListDelegate(void) +{ + ; +} + +void DLListDelegate::paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const +{ + QString byteUnits[4] = {tr("B"), tr("KB"), tr("MB"), tr("GB")}; + QStyleOptionViewItem opt = option; + QStyleOptionProgressBarV2 newopt; + QRect pixmapRect; + QPixmap pixmap; + qlonglong fileSize; + double progress, dlspeed, multi; + int minutes, hours, days; + qlonglong remaining; + QString temp , status; + qlonglong completed; + + //set text color + QVariant value = index.data(Qt::TextColorRole); + if(value.isValid() && qvariant_cast(value).isValid()) { + opt.palette.setColor(QPalette::Text, qvariant_cast(value)); + } + QPalette::ColorGroup cg = option.state & QStyle::State_Enabled ? QPalette::Normal : QPalette::Disabled; + if(option.state & QStyle::State_Selected){ + painter->setPen(opt.palette.color(cg, QPalette::HighlightedText)); + } else { + painter->setPen(opt.palette.color(cg, QPalette::Text)); + } + + // draw the background color + if(index.column() != PROGRESS) { + if(option.showDecorationSelected && (option.state & QStyle::State_Selected)) { + if(cg == QPalette::Normal && !(option.state & QStyle::State_Active)) { + cg = QPalette::Inactive; + } + painter->fillRect(option.rect, option.palette.brush(cg, QPalette::Highlight)); + } else { + value = index.data(Qt::BackgroundColorRole); + if(value.isValid() && qvariant_cast(value).isValid()) { + painter->fillRect(option.rect, qvariant_cast(value)); + } + } + } + switch(index.column()) { + case SIZE: + fileSize = index.data().toLongLong(); + if(fileSize < 0){ + temp = "Unknown"; + } else { + multi = 1.0; + for(int i = 0; i < 5; ++i) { + if (fileSize < 1024) { + fileSize = index.data().toLongLong(); + temp.sprintf("%.2f ", fileSize / multi); + temp += byteUnits[i]; + break; + } + fileSize /= 1024; + multi *= 1024.0; + } + } + painter->drawText(option.rect, Qt::AlignCenter, temp); + break; + case REMAINING: + remaining = index.data().toLongLong(); + minutes = remaining / 60; + hours = minutes / 60; + minutes = minutes - hours * 60; + days = hours / 24; + hours = hours - days * 24; + if(days > 0) { + temp.clear(); + temp.sprintf("%dd %2dh %dm", days, hours, minutes); + } else if(hours > 0 || days > 0) { + temp.clear(); + temp.sprintf("%dh %dm", hours, minutes); + } else if(minutes > 0 || hours > 0) { + temp.clear(); + temp.sprintf("%dm", minutes); + } else { + temp = "Unknown"; + } + painter->drawText(option.rect, Qt::AlignCenter, temp); + break; + case COMPLETED: + completed = index.data().toLongLong(); + if(completed < 0){ + temp = "Unknown"; + } else { + multi = 1.0; + for(int i = 0; i < 5; ++i) { + if (completed < 1024) { + completed = index.data().toLongLong(); + temp.sprintf("%.2f ", completed / multi); + temp += byteUnits[i]; + break; + } + completed /= 1024; + multi *= 1024.0; + } + } + painter->drawText(option.rect, Qt::AlignCenter, temp); + break; + case DLSPEED: + dlspeed = index.data().toDouble(); + temp.clear(); + temp.sprintf("%.2f", dlspeed/1024.); + temp += " KB/s"; + painter->drawText(option.rect, Qt::AlignCenter, temp); + break; + case PROGRESS: + progress = index.data().toDouble(); + temp.clear(); + temp.sprintf("%.2f", progress); + temp += "%"; + newopt.rect = opt.rect; + //newopt.text = temp; + newopt.maximum = 100; + newopt.minimum = 0; + newopt.progress = (int)progress; + newopt.state |= QStyle::State_Enabled; + newopt.textVisible = false; + QApplication::style()->drawControl(QStyle::CE_ProgressBar, &newopt, + painter); + //We prefer to display text manually to control color/font/boldness + if (option.state & QStyle::State_Selected){ + opt.palette.setColor(QPalette::Text, QColor("grey")); + painter->setPen(opt.palette.color(cg, QPalette::Text)); + } + painter->drawText(option.rect, Qt::AlignCenter, newopt.text); + break; + case NAME: + // decoration + value = index.data(Qt::DecorationRole); + pixmap = qvariant_cast(value).pixmap(option.decorationSize, option.state & QStyle::State_Enabled ? QIcon::Normal : QIcon::Disabled, option.state & QStyle::State_Open ? QIcon::On : QIcon::Off); + pixmapRect = (pixmap.isNull() ? QRect(0, 0, 0, 0): QRect(QPoint(0, 0), option.decorationSize)); + if (pixmapRect.isValid()){ + QPoint p = QStyle::alignedRect(option.direction, Qt::AlignLeft, pixmap.size(), option.rect).topLeft(); + painter->drawPixmap(p, pixmap); + } + painter->drawText(option.rect.translated(pixmap.size().width(), 0), Qt::AlignLeft, index.data().toString()); + break; + default: + painter->drawText(option.rect, Qt::AlignCenter, index.data().toString()); + } +} + +QSize DLListDelegate::sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index) const +{ + QVariant value = index.data(Qt::FontRole); + QFont fnt = value.isValid() ? qvariant_cast(value) : option.font; + QFontMetrics fontMetrics(fnt); + const QString text = index.data(Qt::DisplayRole).toString(); + QRect textRect = QRect(0, 0, 0, fontMetrics.lineSpacing() * (text.count(QLatin1Char('\n')) + 1)); + return textRect.size(); +} + diff --git a/retroshare-gui/src/gui/DLListDelegate.h b/retroshare-gui/src/gui/DLListDelegate.h new file mode 100644 index 000000000..a5dfff2e5 --- /dev/null +++ b/retroshare-gui/src/gui/DLListDelegate.h @@ -0,0 +1,65 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006,2007 crypton + * + * 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 DLLISTDELEGATE_H +#define DLLISTDELEGATE_H + +#include + +// Defines for download list list columns +#define NAME 0 +#define SIZE 1 +#define PROGRESS 2 +#define DLSPEED 3 +#define SOURCES 4 +#define STATUS 5 +#define COMPLETED 6 +#define REMAINING 7 +#define ID 8 + + +#define MAX_CHAR_TMP 128 + +class QModelIndex; +class QPainter; +class QStyleOptionProgressBarV2; +class QProgressBar; +class QApplication; + + +class DLListDelegate: public QAbstractItemDelegate { + + Q_OBJECT + + public: + DLListDelegate(QObject *parent=0); + ~DLListDelegate(); + void paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const; + QSize sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index) const; + + private: + + public slots: + + signals: +}; +#endif + diff --git a/retroshare-gui/src/gui/ExampleDialog.cpp b/retroshare-gui/src/gui/ExampleDialog.cpp new file mode 100644 index 000000000..bd57b7694 --- /dev/null +++ b/retroshare-gui/src/gui/ExampleDialog.cpp @@ -0,0 +1,277 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006,2007 crypton + * + * 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 +#include +#include "common/vmessagebox.h" + +#include "rshare.h" +#include "ExampleDialog.h" +#include "rsiface/rsiface.h" + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + + +/* Images for context menu icons */ +#define IMAGE_REMOVEFRIEND ":/images/removefriend16.png" +#define IMAGE_EXPIORTFRIEND ":/images/exportpeers_16x16.png" +#define IMAGE_CHAT ":/images/chat.png" +/* Images for Status icons */ +#define IMAGE_ONLINE ":/images/donline.png" +#define IMAGE_OFFLINE ":/images/dhidden.png" + +/** Constructor */ +ExampleDialog::ExampleDialog(QWidget *parent) +: MainPage(parent) +{ + /* Invoke the Qt Designer generated object setup routine */ + ui.setupUi(this); + + connect( ui.peertreeWidget, SIGNAL( customContextMenuRequested( QPoint ) ), this, SLOT( peertreeWidgetCostumPopupMenu( QPoint ) ) ); + + /* hide the Tree +/- */ + ui.peertreeWidget -> setRootIsDecorated( false ); + + /* Set header resize modes and initial section sizes */ + QHeaderView * _header = ui.peertreeWidget->header () ; + _header->setResizeMode (0, QHeaderView::Custom); + _header->setResizeMode (1, QHeaderView::Interactive); + _header->setResizeMode (2, QHeaderView::Interactive); + _header->setResizeMode (3, QHeaderView::Interactive); + _header->setResizeMode (4, QHeaderView::Interactive); + _header->setResizeMode (5, QHeaderView::Interactive); + _header->setResizeMode (6, QHeaderView::Interactive); + _header->setResizeMode (7, QHeaderView::Interactive); + _header->setResizeMode (8, QHeaderView::Interactive); + _header->setResizeMode (9, QHeaderView::Interactive); + _header->setResizeMode (10, QHeaderView::Interactive); + _header->setResizeMode (11, QHeaderView::Interactive); + + _header->resizeSection ( 0, 25 ); + _header->resizeSection ( 1, 100 ); + _header->resizeSection ( 2, 100 ); + _header->resizeSection ( 3, 100 ); + _header->resizeSection ( 4, 100 ); + _header->resizeSection ( 5, 200 ); + _header->resizeSection ( 6, 100 ); + _header->resizeSection ( 7, 100 ); + _header->resizeSection ( 8, 100 ); + _header->resizeSection ( 9, 100 ); + _header->resizeSection ( 10, 100 ); + + + /* Hide platform specific features */ +#ifdef Q_WS_WIN + +#endif +} + +void ExampleDialog::peertreeWidgetCostumPopupMenu( QPoint point ) +{ + + QMenu contextMnu( this ); + QMouseEvent *mevent = new QMouseEvent( QEvent::MouseButtonPress, point, Qt::RightButton, Qt::RightButton, Qt::NoModifier ); + + voteupAct = new QAction(QIcon(IMAGE_EXPIORTFRIEND), tr( "Vote Up" ), this ); + connect( voteupAct , SIGNAL( triggered() ), this, SLOT( voteup() ) ); + + votedownAct = new QAction(QIcon(IMAGE_REMOVEFRIEND), tr( "Vote Down" ), this ); + connect( votedownAct , SIGNAL( triggered() ), this, SLOT( votedown() ) ); + + contextMnu.clear(); + contextMnu.addAction(voteupAct); + contextMnu.addSeparator(); + contextMnu.addAction(votedownAct); + contextMnu.exec( mevent->globalPos() ); +} + + + +/* get the list of peers from the RsIface. */ +void ExampleDialog::insertExample() +{ + rsiface->lockData(); /* Lock Interface */ + + std::map::const_iterator it; + const std::map &friends = + rsiface->getFriendMap(); + + /* get a link to the table */ + QTreeWidget *peerWidget = ui.peertreeWidget; + + /* remove old items ??? */ + peerWidget->clear(); + peerWidget->setColumnCount(12); + + + + QList items; + for(it = friends.begin(); it != friends.end(); it++) + { + /* make a widget per friend */ + QTreeWidgetItem *item = new QTreeWidgetItem((QTreeWidget*)0); + + /* add all the labels */ + /* First 5 (1-5) Key Items */ + /* () Status Icon */ + item -> setText(0, ""); + + /* (0) Status */ + item -> setText(1, QString::fromStdString( + it->second.statusString)); + + /* (1) Person */ + item -> setText(2, QString::fromStdString(it->second.name)); + + /* (2) Auto Connect */ + item -> setText(3, QString::fromStdString( + it->second.connectString)); + + /* (3) Trust Level */ + item -> setText(4, QString::fromStdString(it->second.trustString)); + /* (4) Peer Address */ + item -> setText(5, QString::fromStdString(it->second.peerAddress)); + + /* less important ones */ + /* () Last Contact */ + item -> setText(6, QString::fromStdString(it->second.lastConnect)); + + /* () Org */ + item -> setText(7, QString::fromStdString(it->second.org)); + /* () Location */ + item -> setText(8, QString::fromStdString(it->second.loc)); + /* () Country */ + item -> setText(9, QString::fromStdString(it->second.country)); + + + /* Hidden ones: */ + /* () RsCertId */ + { + std::ostringstream out; + out << it -> second.id; + item -> setText(10, QString::fromStdString(out.str())); + } + + /* () AuthCode */ + item -> setText(11, QString::fromStdString(it->second.authCode)); + + /* change background */ + int i; + if (it->second.statusString == "Online") + { + /* bright green */ + for(i = 1; i < 12; i++) + { + item -> setBackground(i,QBrush(Qt::green)); + item -> setIcon(0,(QIcon(IMAGE_ONLINE))); + } + } + else + { + if (it->second.lastConnect != "Never") + { + for(i = 1; i < 12; i++) + { + item -> setBackground(i,QBrush(Qt::lightGray)); + item -> setIcon(0,(QIcon(IMAGE_OFFLINE))); + } + } + else + { + for(i = 1; i < 12; i++) + { + item -> setBackground(i,QBrush(Qt::gray)); + item -> setIcon(0,(QIcon(IMAGE_OFFLINE))); + } + } + } + + + + /* add to the list */ + items.append(item); + } + + /* add the items in! */ + peerWidget->insertTopLevelItems(0, items); + + rsiface->unlockData(); /* UnLock Interface */ + + peerWidget->update(); /* update display */ +} + +QTreeWidgetItem *ExampleDialog::getCurrentLine() +{ + /* get the current, and extract the Id */ + + /* get a link to the table */ + QTreeWidget *peerWidget = ui.peertreeWidget; + QTreeWidgetItem *item = peerWidget -> currentItem(); + if (!item) + { + std::cerr << "Invalid Current Item" << std::endl; + return NULL; + } + + /* 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(); + return item; +} + +void ExampleDialog::voteup() +{ + QTreeWidgetItem *c = getCurrentLine(); + std::cerr << "ExampleDialog::voteup()" << std::endl; +} + +void ExampleDialog::votedown() +{ + QTreeWidgetItem *c = getCurrentLine(); + std::cerr << "ExampleDialog::votedown()" << std::endl; + + /* need to get the input address / port */ + /* + std::string addr; + unsigned short port; + rsServer->FriendSetAddress(getPeerRsCertId(c), addr, port); + */ +} + + + diff --git a/retroshare-gui/src/gui/ExampleDialog.h b/retroshare-gui/src/gui/ExampleDialog.h new file mode 100644 index 000000000..9dbbc4004 --- /dev/null +++ b/retroshare-gui/src/gui/ExampleDialog.h @@ -0,0 +1,72 @@ +/**************************************************************** + * RShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 _EXAMPLEDIALOG_H +#define _EXAMPLEDIALOG_H + +#include + +//#include + +#include "mainpage.h" +#include "ui_ExampleDialog.h" + + +class ExampleDialog : public MainPage +{ + Q_OBJECT + +public: + /** Default Constructor */ + ExampleDialog(QWidget *parent = 0); + /** Default Destructor */ + + void insertExample(); + +private slots: + /** Create the context popup menu and it's submenus */ + void peertreeWidgetCostumPopupMenu( QPoint point ); + + void voteup(); + void votedown(); + +private: + + /* Worker Functions */ + /* (1) Update Display */ + + /* (2) Utility Fns */ + QTreeWidgetItem *getCurrentLine(); + + /** Define the popup menus for the Context menu */ + QMenu* contextMnu; + /** Defines the actions for the context menu */ + QAction* voteupAct; + QAction* votedownAct; + + QTreeWidget *exampletreeWidget; + + /** Qt Designer generated object */ + Ui::ExampleDialog ui; +}; + +#endif + diff --git a/retroshare-gui/src/gui/ExampleDialog.ui b/retroshare-gui/src/gui/ExampleDialog.ui new file mode 100644 index 000000000..541050e46 --- /dev/null +++ b/retroshare-gui/src/gui/ExampleDialog.ui @@ -0,0 +1,643 @@ + + ExampleDialog + + + + 0 + 0 + 436 + 261 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 192 + 192 + 192 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + 104 + 104 + 104 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 104 + 104 + 104 + + + + + + + 255 + 255 + 255 + + + + + + + 104 + 104 + 104 + + + + + + + 240 + 240 + 240 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + Arial + 8 + 50 + false + false + false + false + + + + Qt::NoContextMenu + + + + 1 + + + 1 + + + + + 0 + + + 0 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + 0 + + + 6 + + + + + + + + :/images/peers_16x16.png + + + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Friends</span></p></body></html> + + + + + + + + + Qt::CustomContextMenu + + + false + + + + 16 + 16 + + + + true + + + true + + + + # + + + + + Status + + + + + Person + + + + + Auto Connect + + + + + Trust Level + + + + + Peer Address + + + + + Last Contact + + + + + Organisation + + + + + Location + + + + + Country + + + + + Person Id + + + + + Auth Code + + + + + + + + + + + + + diff --git a/retroshare-gui/src/gui/GenCertDialog.cpp b/retroshare-gui/src/gui/GenCertDialog.cpp new file mode 100644 index 000000000..7baa349b1 --- /dev/null +++ b/retroshare-gui/src/gui/GenCertDialog.cpp @@ -0,0 +1,203 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 +#include "GenCertDialog.h" +#include "config/rsharesettings.h" +#include +#include +#include + +/* Define the format used for displaying the date and time */ +#define DATETIME_FMT "MMM dd hh:mm:ss" + + + +/** Default constructor */ +GenCertDialog::GenCertDialog(RsInit *conf, QWidget *parent, Qt::WFlags flags) + : QDialog(parent, flags), rsConfig(conf) +{ + /* Invoke Qt Designer generated QObject setup routine */ + ui.setupUi(this); + + WidgetBackgroundImage::setBackgroundImage(ui.loginLabel, ":images/new-account.png", WidgetBackgroundImage::AdjustHeight); + + + connect(ui.genButton, SIGNAL(clicked()), this, SLOT(genPerson())); + connect(ui.selectButton, SIGNAL(clicked()), this, SLOT(selectFriend())); + connect(ui.friendBox, SIGNAL(stateChanged(int)), this, SLOT(checkChanged(int))); + + ui.genName->setFocus(Qt::OtherFocusReason); + +} + +/** Destructor. */ +//GenCertDialog::~GenCertDialog() +//{ +//} + + +/** + Overloads the default show() slot so we can set opacity*/ + +void GenCertDialog::show() +{ + //loadSettings(); + if(!this->isVisible()) { + QWidget::show(); + + } +} + +void GenCertDialog::closeEvent (QCloseEvent * event) +{ + + + QDialog::closeEvent(event); +} + +void GenCertDialog::closeinfodlg() +{ + close(); +} + +void GenCertDialog::genPerson() +{ + + /* Check the data from the GUI. */ + std::string genName = ui.genName->text().toStdString(); + std::string genOrg = ui.genOrg->text().toStdString(); + std::string genLoc = ui.genLoc->text().toStdString(); + std::string genCountry = ui.genCountry->text().toStdString(); + std::string passwd = ui.genPasswd->text().toStdString(); + std::string passwd2 = ui.genPasswd2->text().toStdString(); + std::string err; + + if (genName.length() >= 3) + { + /* name passes basic test */ + } + else + { + /* Message Dialog */ + QMessageBox::StandardButton sb = QMessageBox::warning ( NULL, + "Generate ID Failure", + "Your Name is too short (3+ characters)", + QMessageBox::Ok); + return; + } + + if ((passwd.length() >= 4) && (passwd == passwd2)) + { + /* passwd passes basic test */ + } + else + { + /* Message Dialog */ + QMessageBox::StandardButton sb = QMessageBox::warning ( NULL, + "Generate ID Failure", + "Your password is too short, or don't match", + QMessageBox::Ok); + + ui.genPasswd->setText(""); + ui.genPasswd2->setText(""); + + return; + } + + bool okGen = RsGenerateCertificate(rsConfig, genName, genOrg, genLoc, genCountry, passwd, err); + + if (okGen) + { + /* complete the process */ + loadCertificates(); + } + else + { + /* Message Dialog */ + QMessageBox::StandardButton sb = QMessageBox::warning ( NULL, + "Generate ID Failure", + "Failed to Generate your new Certificate!", + QMessageBox::Ok); + } +} + + + + + +void GenCertDialog::selectFriend() +{ + + /* still need to find home (first) */ + + QString fileName = QFileDialog::getOpenFileName(this, tr("Select Trusted Friend"), "", + tr("Certificates (*.pqi *.pem)")); + + std::string fname, userName; + fname = fileName.toStdString(); + if (ValidateTrustedUser(rsConfig, fname, userName)) + { + ui.genFriend -> setText(QString::fromStdString(userName)); + } + else + { + ui.genFriend -> setText(""); + } +} + + +void GenCertDialog::checkChanged(int i) +{ + if (i) + { + selectFriend(); + } + else + { + /* invalidate selection */ + std::string fname = ""; + std::string userName = ""; + ValidateTrustedUser(rsConfig, fname, userName); + ui.genFriend -> setText(""); + } +} + + +void GenCertDialog::loadCertificates() +{ + bool autoSave = false; + /* Final stage of loading */ + if (LoadCertificates(rsConfig, autoSave)) + { + close(); + } + else + { + /* some error msg */ + QMessageBox::StandardButton sb = QMessageBox::warning ( NULL, + "Generate ID Failure", + "Failed to Load your new Certificate!", + QMessageBox::Ok); + } +} + diff --git a/retroshare-gui/src/gui/GenCertDialog.h b/retroshare-gui/src/gui/GenCertDialog.h new file mode 100644 index 000000000..9155c0114 --- /dev/null +++ b/retroshare-gui/src/gui/GenCertDialog.h @@ -0,0 +1,71 @@ +/**************************************************************** + * RShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 _GENCERTDIALOG_H +#define _GENCERTDIALOG_H + +#include "rsiface/rsiface.h" + +#include "ui_GenCertDialog.h" + + + +class GenCertDialog : public QDialog +{ + Q_OBJECT + +public: + /** Default constructor */ + GenCertDialog(RsInit *config, QWidget *parent = 0, Qt::WFlags flags = 0); + /** Default destructor */ + + //~GenCertDialog(); + +public slots: + /** Overloaded QWidget.show */ + void show(); + +protected: + void closeEvent (QCloseEvent * event); + +private slots: + + void closeinfodlg(); + void genPerson(); + //void loadPerson(); + void selectFriend(); + void checkChanged(int i); + +private: + + /** Loads the saved connectidialog settings */ + // void loadSettings(); + void loadCertificates(); + + /** Qt Designer generated object */ + Ui::GenCertDialog ui; + + RsInit *rsConfig; +}; + +#endif + diff --git a/retroshare-gui/src/gui/GenCertDialog.ui b/retroshare-gui/src/gui/GenCertDialog.ui new file mode 100644 index 000000000..19afe5a70 --- /dev/null +++ b/retroshare-gui/src/gui/GenCertDialog.ui @@ -0,0 +1,1191 @@ + + GenCertDialog + + + + 0 + 0 + 395 + 385 + + + + + + + + + 16 + 16 + 16 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 160 + 160 + 160 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + + + 16 + 16 + 16 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 160 + 160 + 160 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + + + 104 + 104 + 104 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 160 + 160 + 160 + + + + + + + 104 + 104 + 104 + + + + + + + 255 + 255 + 255 + + + + + + + 104 + 104 + 104 + + + + + + + 240 + 240 + 240 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + + + Arial + 8 + 50 + false + false + false + false + + + + Qt::NoContextMenu + + + RetroShare setup + + + :/images/RetroShare16.png + + + + 9 + + + 6 + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + 0 + 0 + 0 + + + + + + + 212 + 208 + 200 + + + + + + + 255 + 255 + 255 + + + + + + + 234 + 229 + 220 + + + + + + + 128 + 128 + 128 + + + + + + + 141 + 139 + 133 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 212 + 208 + 200 + + + + + + + 64 + 64 + 64 + + + + + + + 10 + 36 + 106 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 232 + 232 + 232 + + + + + + + + + 0 + 0 + 0 + + + + + + + 212 + 208 + 200 + + + + + + + 255 + 255 + 255 + + + + + + + 234 + 229 + 220 + + + + + + + 128 + 128 + 128 + + + + + + + 141 + 139 + 133 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 212 + 208 + 200 + + + + + + + 64 + 64 + 64 + + + + + + + 212 + 208 + 200 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 232 + 232 + 232 + + + + + + + + + 106 + 104 + 100 + + + + + + + 212 + 208 + 200 + + + + + + + 255 + 255 + 255 + + + + + + + 233 + 231 + 227 + + + + + + + 128 + 128 + 128 + + + + + + + 141 + 139 + 133 + + + + + + + 106 + 104 + 100 + + + + + + + 255 + 255 + 255 + + + + + + + 106 + 104 + 100 + + + + + + + 212 + 208 + 200 + + + + + + + 212 + 208 + 200 + + + + + + + 0 + 0 + 0 + + + + + + + 10 + 36 + 106 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 232 + 232 + 232 + + + + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16pt;">Generate a new profile</span><br /><br />Please fill in the information which will<br />allow your RetroShare to connect to</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Friends.</p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + 100 + + + + + + + 0 + + + 6 + + + + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Organisation:</p></body></html> + + + + + + + Qt::Horizontal + + + + + + + Password (Again) + + + + + + + QLineEdit::Password + + + + + + + Location: + + + + + + + Qt::Horizontal + + + + + + + + + + Qt::Horizontal + + + + + + + Load Trusted Certificate (Optional) + + + + + + + + + + Qt::Horizontal + + + + 211 + 20 + + + + + + + + QLineEdit::Password + + + + + + + Password + + + + + + + 0 + + + 6 + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + + + + + + + true + + + + + + + Select File + + + + + + + + + Country: + + + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + + + + + + + Generate New Certificate + + + + + + + + + + + + genName + genPasswd + genPasswd2 + genOrg + genLoc + genCountry + friendBox + genFriend + selectButton + genButton + + + + + + diff --git a/retroshare-gui/src/gui/HelpDialog.cpp b/retroshare-gui/src/gui/HelpDialog.cpp new file mode 100644 index 000000000..2c386fe4e --- /dev/null +++ b/retroshare-gui/src/gui/HelpDialog.cpp @@ -0,0 +1,73 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 "HelpDialog.h" +#include "rsiface/rsiface.h" + +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include + +/* Images for context menu icons */ +#define IMAGE_DOWNLOAD ":/images/start.png" + +/** Constructor */ +HelpDialog::HelpDialog(QWidget *parent) +: MainPage(parent) +{ + /* Invoke the Qt Designer generated object setup routine */ + ui.setupUi(this); + + //QFile licenseFile(QLatin1String(":/images/COPYING")); + QFile licenseFile(QLatin1String(":/help/licence.html")); + if (licenseFile.open(QIODevice::ReadOnly | QIODevice::Text)) { + QTextStream in(&licenseFile); + ui.license->setText(in.readAll()); + } + QFile authorsFile(QLatin1String(":/help/authors.html")); + if (authorsFile.open(QIODevice::ReadOnly | QIODevice::Text)) { + QTextStream in(&authorsFile); + ui.authors->setText(in.readAll()); + } + QFile thanksFile(QLatin1String(":/help/thanks.html")); + if (thanksFile.open(QIODevice::ReadOnly | QIODevice::Text)) { + QTextStream in(&thanksFile); + ui.thanks->setText(in.readAll()); + } + + + /* Hide platform specific features */ +#ifdef Q_WS_WIN + +#endif +} + + diff --git a/retroshare-gui/src/gui/HelpDialog.h b/retroshare-gui/src/gui/HelpDialog.h new file mode 100644 index 000000000..831992da6 --- /dev/null +++ b/retroshare-gui/src/gui/HelpDialog.h @@ -0,0 +1,51 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 _HELPDIALOG_H +#define _HELPDIALOG_H + +#include + + +#include "mainpage.h" +#include "ui_HelpDialog.h" + +#include "rsiface/rstypes.h" + +class HelpDialog : public MainPage +{ + Q_OBJECT + +public: + /** Default Constructor */ + HelpDialog(QWidget *parent = 0); + /** Default Destructor */ + +private slots: + +private: + /** Qt Designer generated object */ + Ui::HelpDialog ui; + +}; + +#endif + diff --git a/retroshare-gui/src/gui/HelpDialog.ui b/retroshare-gui/src/gui/HelpDialog.ui new file mode 100644 index 000000000..13f084104 --- /dev/null +++ b/retroshare-gui/src/gui/HelpDialog.ui @@ -0,0 +1,797 @@ + + HelpDialog + + + + 0 + 0 + 720 + 501 + + + + + 7 + 7 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 192 + 192 + 192 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + 104 + 104 + 104 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 104 + 104 + 104 + + + + + + + 255 + 255 + 255 + + + + + + + 104 + 104 + 104 + + + + + + + 240 + 240 + 240 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + Arial + 8 + 50 + false + false + false + false + + + + Qt::NoContextMenu + + + + 0 + + + 0 + + + + + 0 + + + + About + + + + 9 + + + 6 + + + + + Qt::Horizontal + + + + 81 + 20 + + + + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.wiki.sourceforge.net/help_tab"><span style=" text-decoration: underline; color:#0000ff;">This Page in the retroshare Wiki</span></a><br /><br />The About/Help Tab is regularly updated from the Wiki page.<br /><br />External Links to more information:<br /></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.sourceforge.net"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Webpage</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.wiki.sourceforge.net/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Wiki</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://sourceforge.net/projects/retroshare/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Project Page</span></a></li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.lunamutt.com"><span style=" text-decoration: underline; color:#0000ff;">Lunamutt Homepage.</span></a></li></ul></body></html> + + + true + + + + + + + + + + :/images/retrosharelogo1.png + + + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:xx-large; font-weight:600; color:#0000ff;">About RetroShare.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-weight:600;">Retroshare is a private and secure decentralised commmunication platform.<br />You can use it chat, send messages and share files with your friends.</span><br /><br />This is just a placeholder page for the moment. You can<br />improve retroshare's in-built help (this text) by<br />updating the retroshare wiki: </p></body></html> + + + + + + + + Authors + + + + 9 + + + 6 + + + + + false + + + QTextEdit::NoWrap + + + true + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-size:19pt; font-weight:600; color:#0000ff;">The RetroShare Team:</span><br /> <br /><span style=" font-size:9pt; color:#0000ff;">defnax</span>: Lead GUI developer <br /><span style=" font-size:9pt; color:#0000ff;">drbob7</span>: Lead Core developer. <br /> <br /><span style=" font-size:9pt; color:#0000ff;">bmeck</span> : Our new web-developer. Joined retroshare a couple <br />of weeks ago, and already starting on an exciting new <br />design for the web-page. <br /> <br /><span style=" font-size:9pt; color:#0000ff;">noragen</span> : Developer from the SIM-IM project. Working on a retroshare plugin to SIM-IM. <br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">kernelpanix</span> : Gui and skin developer</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">libris</span><span style=" font-size:9pt;">:</span> core developer</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-size:9pt; color:#0000ff;">kashif: </span><span style=" color:#000000;">core developer</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt; color:#000000;"><span style=" font-size:8pt;"><br /></span><span style=" color:#0000ff;">agent725</span><span style=" font-size:8pt;">: Manages the 'local' Retroshare release, <br />and beta-testing retroshare on a large scale. <br /> <br /></span><span style=" color:#0000ff;">the_mgt</span><span style=" font-size:8pt;">: Maintains the Gentoo and generic linux <br />installation/compilation scripts. </span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">notdefine:</span> Maintains the .rpm, .deb installation/compilation scripts.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">zhouk</span>: developer</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + false + + + Qt::TextBrowserInteraction + + + + + + + + Thanks to + + + + 9 + + + 6 + + + + + false + + + QTextEdit::NoWrap + + + true + + + false + + + Qt::TextBrowserInteraction + + + + + + + + Translation + + + + 9 + + + 6 + + + + + false + + + true + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Translators:</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">French</span>:Temet</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Polish: </span>Jarek</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Serbian</span>: Kunalagon Umuhanik &lt;kunalagon@gmail.com&gt;</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Swedish:</span> dnylander</p></body></html> + + + false + + + Qt::TextSelectableByMouse + + + + + + + + License Agreement + + + + 9 + + + 6 + + + + + false + + + QTextEdit::WidgetWidth + + + false + + + Qt::TextBrowserInteraction + + + + + + + + + + + 0 + + + 0 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + 0 + + + 6 + + + + + + + + :/images/info16.png + + + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">About/Help</span></p></body></html> + + + + + + + + + + + translation + authors + license + tabWidget + thanks + textBrowser + + + + + + diff --git a/retroshare-gui/src/gui/LogoBar.cpp b/retroshare-gui/src/gui/LogoBar.cpp new file mode 100644 index 000000000..0ee7e96b0 --- /dev/null +++ b/retroshare-gui/src/gui/LogoBar.cpp @@ -0,0 +1,105 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 "LogoBar.h" + +#include +#include + + +#include + +LogoBar::LogoBar(QWidget * parent) + : QFrame(parent) { + + init(); +} + +LogoBar::~LogoBar() { +} + +void LogoBar::init() { + setFrameShape(QFrame::NoFrame); + + + + //LogoButton + _logoButton = new RetroStyleLabel(this); + _logoButton->setPixmaps( + QPixmap(":/images/logobar/rslogo2.png"), //Start + QPixmap(), //End + QPixmap(), //Fill + + QPixmap(":/images/logobar/rslogo2.png"), //Start + QPixmap(), //End + QPixmap() //Fill + ); + _logoButton->setMaximumSize(QSize(110, 65)); + _logoButton->setMinimumSize(QSize(110, 65)); + connect(_logoButton, SIGNAL(clicked()), SLOT(logoButtonClickedSlot())); + + //FillLabel1 + RetroStyleLabel * FillLabel1 = new RetroStyleLabel(this); + FillLabel1->setPixmaps( + QPixmap(), //Start + QPixmap(), //End + QPixmap(":/images/logobar/logo_bar_fill.png"), //Fill + + QPixmap(), //Start + QPixmap(), //End + QPixmap(":/images/logobar/logo_bar_fill.png") //Fill + ); + + //FillLabel2 + RetroStyleLabel * FillLabel2 = new RetroStyleLabel(this); + FillLabel2->setPixmaps( + QPixmap(), //Start + QPixmap(), //End + QPixmap(":/images/logobar/logo_bar_fill.png"), //Fill + + QPixmap(), //Start + QPixmap(), //End + QPixmap(":/images/logobar/logo_bar_fill.png") //Fill + ); + + QGridLayout * layout = new QGridLayout(this); + layout->setMargin(0); + layout->setSpacing(0); + + layout->addWidget(FillLabel1, 0, 0); + layout->addWidget(_logoButton, 0, 1); + layout->addWidget(FillLabel2, 0, 2); + + +} + +void LogoBar::setEnabledLogoButton(bool enable) { + _logoButton->setEnabled(enable); +} + + +void LogoBar::logoButtonClickedSlot() { + logoButtonClicked(); +} + + + + diff --git a/retroshare-gui/src/gui/LogoBar.h b/retroshare-gui/src/gui/LogoBar.h new file mode 100644 index 000000000..0b5bfb6f9 --- /dev/null +++ b/retroshare-gui/src/gui/LogoBar.h @@ -0,0 +1,79 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 LOGOBAR_H +#define LOGOBAR_H + +#include + +#include + +class RetroStyleLabel; + +class QString; +class QIcon; + +/** + * logo bar inside the login window. + * + * + * + * + * + * + * + */ +class LogoBar : public QFrame { + Q_OBJECT +public: + + LogoBar(QWidget * parent); + + ~LogoBar(); + + void setEnabledLogoButton(bool enable); + + + +Q_SIGNALS: + + void logoButtonClicked(); + + + +private Q_SLOTS: + + void logoButtonClickedSlot(); + + + +private: + + void init(); + + + + RetroStyleLabel * _logoButton; + + +}; + +#endif //LOGOBAR_H diff --git a/retroshare-gui/src/gui/MainWindow.cpp b/retroshare-gui/src/gui/MainWindow.cpp new file mode 100644 index 000000000..a47bc566e --- /dev/null +++ b/retroshare-gui/src/gui/MainWindow.cpp @@ -0,0 +1,589 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, 2007 crypton + * + * 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 +#include +#include +#include +#include +#include +#include + +#include +#include "MainWindow.h" +#include "MessengerWindow.h" +#include "HelpDialog.h" + +#include "games/qbackgammon/bgwindow.h" +#include "toplevel.h" +#include "defaultgui.h" +#include "global.h" +#include "translator.h" + + + +#include "Preferences/PreferencesWindow.h" +#include "Settings/gsettingswin.h" +#include "util/rsversion.h" + +#include "rsiface/rsiface.h" + +#include "gui/connect/InviteDialog.h" +#include "gui/connect/AddFriendDialog.h" + + +#define FONT QFont(tr("Arial"), 8) + +/* Images for toolbar icons */ +#define IMAGE_NETWORK ":/images/network32.png" +#define IMAGE_PEERS ":/images/peers_24x24.png" +#define IMAGE_SEARCH ":/images/filefind.png" +#define IMAGE_TRANSFERS ":/images/ktorrent.png" +#define IMAGE_FILES ":/images/folder_green.png" +#define IMAGE_CHANNELS ":/images/konsole.png" +#define IMAGE_PREFERENCES ":/images/settings16.png" +#define IMAGE_CHAT ":/images/chats_24x24.png" +#define IMAGE_RETROSHARE ":/images/rstray3.png" +#define IMAGE_ABOUT ":/images/informations_24x24.png" +#define IMAGE_STATISTIC ":/images/utilities-system-monitor.png" +#define IMAGE_MESSAGES ":/images/evolution.png" +#define IMAGE_BWGRAPH ":/images/ksysguard.png" +#define IMAGE_RSM32 ":/images/rsmessenger32.png" +#define IMAGE_RSM16 ":/images/rsmessenger16.png" +#define IMAGE_CLOSE ":/images/close_normal.png" +#define IMAGE_SMPLAYER ":/images/smplayer_icon32.png" + +/* Keys for UI Preferences */ +#define UI_PREF_PROMPT_ON_QUIT "UIOptions/ConfirmOnQuit" +/* uncomment this for release version */ + +#define RS_RELEASE_VERSION 1 + +/* TEST (1) * friends/neighbours: okay for 16 hours! */ +/* TEST (2) * all but transfer/sharedfiles: crashed in under 8 hours! */ +/* TEST (3) * friends/neighbour/msg/channels: crashed in under 8 hours */ +/* TEST (4) * friends/neighbour/channels: crashes */ +/* TEST (5) * all but msg/channels: short term okay*/ +/* TEST (5) * all but channels: stable longterm! */ + +/** Constructor */ +MainWindow::MainWindow(QWidget* parent, Qt::WFlags flags) + : QMainWindow(parent, flags) +{ + /* Invoke the Qt Designer generated QObject setup routine */ + ui.setupUi(this); + + setWindowTitle(tr("RetroShare %1").arg(retroshareVersion())); + + /* Hide Console frame */ + showConsoleFrame(false); + connect(ui.btnToggleConsole, SIGNAL(toggled(bool)), this, SLOT(showConsoleFrame(bool))); + + /* Hide ToolBox frame */ + showToolboxFrame(true); + + // Setting icons + this->setWindowIcon(QIcon(QString::fromUtf8(":/images/rstray3.png"))); + + /* Create all the dialogs of which we only want one instance */ + _bandwidthGraph = new BandwidthGraph(); + messengerWindow = new MessengerWindow(); + messengerWindow->hide(); + applicationWindow = new ApplicationWindow(); + applicationWindow->hide(); + + /** General ToolBox**/ + connect(ui.addfriendButton, SIGNAL(clicked( bool ) ), this , SLOT( addFriend() ) ); + connect(ui.invitefriendButton, SIGNAL(clicked( bool ) ), this , SLOT( inviteFriend() ) ); + connect(ui.addshareButton, SIGNAL(clicked( bool ) ), this , SLOT( addSharedDirectory() ) ); + connect(ui.optionsButton, SIGNAL(clicked( bool )), this, SLOT( showPreferencesWindow()) ); + + /** Games ToolBox*/ + connect(ui.qbackgammonButton, SIGNAL(clicked( bool )), this, SLOT( startgammon()) ); + connect(ui.qcheckersButton, SIGNAL(clicked( bool )), this, SLOT( startqcheckers()) ); + + + ui.addfriendButton->setToolTip(tr("Add a Friend")); + ui.invitefriendButton->setToolTip(tr("Invite a Friend")); + ui.addshareButton->setToolTip(tr("Add a Share")); + ui.optionsButton->setToolTip(tr("Options")); + + /** adjusted quit behaviour: trigger a warning that can be switched off in the saved + config file RetroShare.conf */ + ui.quitButton->setToolTip(tr("Quit")); + //connect(ui.quitButton, SIGNAL(clicked()), qApp, SLOT(quit())); + connect(ui.quitButton, SIGNAL(clicked()), this, SLOT(doQuit())); + loadStyleSheet("Default"); + + + + /* Create the config pages and actions */ + QActionGroup *grp = new QActionGroup(this); + + ui.stackPages->add(networkDialog = new NetworkDialog(ui.stackPages), + createPageAction(QIcon(IMAGE_NETWORK), tr("Network"), grp)); + + ui.stackPages->add(peersDialog = new PeersDialog(ui.stackPages), + createPageAction(QIcon(IMAGE_PEERS), tr("Friends"), grp)); + + ui.stackPages->add(searchDialog = new SearchDialog(ui.stackPages), + createPageAction(QIcon(IMAGE_SEARCH), tr("Search"), grp)); + + ui.stackPages->add(transfersDialog = new TransfersDialog(ui.stackPages), + createPageAction(QIcon(IMAGE_TRANSFERS), tr("Transfers"), grp)); + + ui.stackPages->add(sharedfilesDialog = new SharedFilesDialog(ui.stackPages), + createPageAction(QIcon(IMAGE_FILES), tr("Files"), grp)); + + ui.stackPages->add(chatDialog = new ChatDialog(ui.stackPages), + createPageAction(QIcon(IMAGE_CHAT), tr("Chat"), grp)); + + ui.stackPages->add(messagesDialog = new MessagesDialog(ui.stackPages), + createPageAction(QIcon(IMAGE_MESSAGES), tr("Messages"), grp)); + +#ifdef RS_RELEASE_VERSION + channelsDialog = NULL; +#else + ui.stackPages->add(channelsDialog = new ChannelsDialog(ui.stackPages), + createPageAction(QIcon(IMAGE_CHANNELS), tr("Channels"), grp)); +#endif + + ui.stackPages->add(new HelpDialog(ui.stackPages), + createPageAction(QIcon(IMAGE_ABOUT), tr("About/Help"), grp)); + + //ui.stackPages->add(groupsDialog = new GroupsDialog(ui.stackPages), + // createPageAction(QIcon(), tr("Groups"), grp)); + + //ui.stackPages->add(new StatisticDialog(ui.stackPages), + // createPageAction(QIcon(IMAGE_STATISTIC), tr("Statistics"), grp)); + + /* also an empty list of chat windows */ + peersDialog->setChatDialog(chatDialog); + messengerWindow->setChatDialog(chatDialog); + + /* Create the toolbar */ + ui.toolBar->addActions(grp->actions()); + ui.toolBar->addSeparator(); + connect(grp, SIGNAL(triggered(QAction *)), ui.stackPages, SLOT(showPage(QAction *))); + + /* Create and bind the messenger button */ + addAction(new QAction(QIcon(IMAGE_RSM32), tr("Messenger"), ui.toolBar), SLOT(showMessengerWindow())); + + + addAction(new QAction(QIcon(IMAGE_SMPLAYER), tr("SMPlayer"), ui.toolBar), SLOT(showsmplayer())); + + + +#ifdef RS_RELEASE_VERSION +#else + addAction(new QAction(QIcon(IMAGE_PEERS), tr("Apps"), ui.toolBar), SLOT(showApplWindow())); +#endif + +#ifdef NO_MORE_OPTIONS_OR_SS + + /* Create and bind the Preferences button */ + addAction(new QAction(QIcon(IMAGE_PREFERENCES), tr("Options"), ui.toolBar), + SLOT(showSettings())); + + + + +#endif + + + + /* Select the first action */ + grp->actions()[0]->setChecked(true); + + /* Create the actions that will go in the tray menu */ + createActions(); + + statusBar()->addWidget(new QLabel(tr("Users: 0 Files: 0 "))); + statusBar()->addPermanentWidget(new QLabel(tr("Down: 0.0 Up: 0.0 "))); + statusBar()->addPermanentWidget(new QLabel(tr("Connections: 0/45 "))); + +/****** + * This is an annoying warning I get all the time... + * (no help!) + * + * + if (!QSystemTrayIcon::isSystemTrayAvailable()) + QMessageBox::warning(0, tr("System tray is unavailable"), + tr("System tray unavailable")); +******/ + + // Tray icon Menu + menu = new QMenu(this); + QObject::connect(menu, SIGNAL(aboutToShow()), this, SLOT(updateMenu())); + toggleVisibilityAction = + menu->addAction(QIcon(IMAGE_RETROSHARE), tr("Show/Hide"), this, SLOT(toggleVisibilitycontextmenu())); + menu->addSeparator(); + menu->addAction(_messengerwindowAct); + /* bandwidth only in development version */ +#ifdef RS_RELEASE_VERSION +#else + menu->addAction(_bandwidthAct); +#endif + menu->addAction(_prefsAct); + menu->addSeparator(); + menu->addAction(tr("Minimize"), this, SLOT(showMinimized())); + menu->addAction(tr("Maximize"), this, SLOT(showMaximized())); + menu->addSeparator(); + menu->addAction(QIcon(IMAGE_CLOSE), tr("&Quit"), this, SLOT(doQuit())); + // End of Icon Menu + + // Create the tray icon + trayIcon = new QSystemTrayIcon(this); + trayIcon->setToolTip(tr("RetroShare")); + trayIcon->setContextMenu(menu); + trayIcon->setIcon(QIcon(IMAGE_RETROSHARE)); + + connect(trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, + SLOT(toggleVisibility(QSystemTrayIcon::ActivationReason))); + trayIcon->show(); + + +} + +/** Creates a new action associated with a config page. */ +QAction* MainWindow::createPageAction(QIcon img, QString text, QActionGroup *group) +{ + QAction *action = new QAction(img, text, group); + action->setCheckable(true); + action->setFont(FONT); + return action; +} + +/** Adds the given action to the toolbar and hooks its triggered() signal to + * the specified slot (if given). */ +void MainWindow::addAction(QAction *action, const char *slot) +{ + action->setFont(FONT); + ui.toolBar->addAction(action); + connect(action, SIGNAL(triggered()), this, slot); +} + +/** Overloads the default show so we can load settings */ +void MainWindow::show() +{ + + if (!this->isVisible()) { + QMainWindow::show(); + } else { + QMainWindow::activateWindow(); + setWindowState(windowState() & ~Qt::WindowMinimized | Qt::WindowActive); + QMainWindow::raise(); + } +} + + +/** Shows the config dialog with focus set to the given page. */ +void MainWindow::show(Page page) +{ + /* Show the dialog. */ + show(); + + /* Set the focus to the specified page. */ + ui.stackPages->setCurrentIndex((int)page); +} + + + +/***** TOOL BAR FUNCTIONS *****/ + +/** Add a Friend ShortCut */ +void MainWindow::addFriend() +{ + /* call load Certificate */ +#if 0 + std::string id; + if (connectionsDialog) + { + id = connectionsDialog->loadneighbour(); + } + + /* call make Friend */ + if (id != "") + { + connectionsDialog->showpeerdetails(id); + } + virtual int NeighLoadPEMString(std::string pem, std::string &id) = 0; +#else + + static AddFriendDialog *addDialog = + new AddFriendDialog(networkDialog, this); + + std::string invite = ""; + addDialog->setInfo(invite); + addDialog->show(); +#endif +} + + +/** Add a Friend ShortCut */ +void MainWindow::inviteFriend() +{ + static InviteDialog *inviteDialog = new InviteDialog(this); + + std::string invite = rsicontrol->NeighGetInvite(); + inviteDialog->setInfo(invite); + inviteDialog->show(); + + +} + +/** Shows Preferences */ +void MainWindow::addSharedDirectory() +{ + /* Same Code as in Preferences Window (add Share) */ + + QString qdir = QFileDialog::getExistingDirectory(this, tr("Add Shared Directory"), "", + QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); + + /* add it to the server */ + std::string dir = qdir.toStdString(); + if (dir != "") + { + rsicontrol -> ConfigAddSharedDir(dir); + rsicontrol -> ConfigSave(); + } + +} + +/** Shows Preferences */ +void MainWindow::showPreferencesWindow() +{ + static PreferencesWindow* preferencesWindow = new PreferencesWindow(this); + preferencesWindow->show(); +} + +/** Shows Options */ +void MainWindow::showSettings() +{ + static GSettingsWin *win = new GSettingsWin(this); + if (win->isHidden()) + win->setNewPage(0); + win->show(); + win->activateWindow(); +} + +/** Shows Messenger window */ +void MainWindow::showMessengerWindow() +{ + messengerWindow->show(); +} + + +/** Shows Application window */ +void MainWindow::showApplWindow() +{ + applicationWindow->show(); +} + +/** Destructor. */ +MainWindow::~MainWindow() +{ + delete _prefsAct; + delete _bandwidthGraph; + delete _messengerwindowAct; +} + +/** Create and bind actions to events. Setup for initial + * tray menu configuration. */ +void MainWindow::createActions() +{ + + _prefsAct = new QAction(QIcon(IMAGE_PREFERENCES), tr("Options"), this); + connect(_prefsAct, SIGNAL(triggered()), this, SLOT(showPreferencesWindow())); + + _bandwidthAct = new QAction(QIcon(IMAGE_BWGRAPH), tr("Bandwidth Graph"), this); + connect(_bandwidthAct, SIGNAL(triggered()), + _bandwidthGraph, SLOT(showWindow())); + + _messengerwindowAct = new QAction(QIcon(IMAGE_RSM16), tr("Open Messenger"), this); + connect(_messengerwindowAct, SIGNAL(triggered()),this, SLOT(showMessengerWindow())); + + + connect(ui.btntoggletoolbox, SIGNAL(toggled(bool)), this, SLOT(showToolboxFrame(bool))); + +} + +/** If the user attempts to quit the app, a check-warning is issued. This warning can be + turned off for future quit events. +*/ +void MainWindow::doQuit() +{ + RshareSettings rsharesettings; + QString key (UI_PREF_PROMPT_ON_QUIT); + bool doConfirm = rsharesettings.value(key, QVariant(true)).toBool(); + if (doConfirm) + { + ConfirmQuitDialog * confirm = new ConfirmQuitDialog; + confirm->exec(); + // save configuration setting + if (confirm->reminderCheckBox->checkState() == Qt::Checked) + { + rsharesettings.setValue(key, QVariant(false)); + } + + if (confirm->result() == QDialog::Accepted) + { + qApp->quit(); + } else { + delete confirm; + } + + } else { + qApp->quit(); + } +} + +void MainWindow::closeEvent(QCloseEvent *e) +{ + static bool firstTime = true; + + if (trayIcon->isVisible()) { + if (firstTime) + { +/***** + QMessageBox::information(this, tr("RetroShare System tray"), + tr("Application will continue running. Quit using context menu in the system tray")); +*****/ + firstTime = false; + } + hide(); + e->ignore(); + } + +} + + +void MainWindow::updateMenu() +{ + toggleVisibilityAction->setText(isVisible() ? tr("Hide") : tr("Show")); +} + +void MainWindow::toggleVisibility(QSystemTrayIcon::ActivationReason e) +{ + if(e == QSystemTrayIcon::Trigger || e == QSystemTrayIcon::DoubleClick){ + if(isHidden()){ + show(); + if(isMinimized()){ + if(isMaximized()){ + showMaximized(); + }else{ + showNormal(); + } + } + raise(); + activateWindow(); + }else{ + hide(); + } + } +} + +void MainWindow::toggleVisibilitycontextmenu() +{ + if (isVisible()) + hide(); + else + show(); +} + + +/** +Toggles the Console pane on and off, changes toggle button text + */ +void MainWindow::showConsoleFrame(bool show) +{ + if (show) { + ui.frmConsole->setVisible(true); + ui.btnToggleConsole->setChecked(true); + ui.btnToggleConsole->setToolTip(tr("Hide Console")); + } else { + ui.frmConsole->setVisible(false); + ui.btnToggleConsole->setChecked(false); + ui.btnToggleConsole->setToolTip(tr("Show Console")); + } +} + +/** + Toggles the ToolBox on and off, changes toggle button text + */ +void MainWindow::showToolboxFrame(bool show) +{ + if (show) { + ui.toolboxframe->setVisible(true); + ui.btntoggletoolbox->setChecked(true); + ui.btntoggletoolbox->setToolTip(tr("Hide ToolBox")); + ui.btntoggletoolbox->setIcon(QIcon(tr(":images/hide_toolbox_frame.png"))); + } else { + ui.toolboxframe->setVisible(false); + ui.btntoggletoolbox->setChecked(false); + ui.btntoggletoolbox->setToolTip(tr("Show ToolBox")); + ui.btntoggletoolbox->setIcon(QIcon(tr(":images/show_toolbox_frame.png"))); + } +} + + + +void MainWindow::loadStyleSheet(const QString &sheetName) +{ + QFile file(":/qss/" + sheetName.toLower() + ".qss"); + file.open(QFile::ReadOnly); + QString styleSheet = QLatin1String(file.readAll()); + + + qApp->setStyleSheet(styleSheet); + +} + +void MainWindow::startgammon() +{ + BgWindow *bgWindow = new BgWindow(this); + bgWindow->show(); + + +} + +void MainWindow::startqcheckers() +{ + myTopLevel* top = new myTopLevel(); + top->show(); + +} + + +/** Shows smplayer */ +void MainWindow::showsmplayer() +{ + static DefaultGui* smplayer = 0; + + if (!smplayer) { + global_init( "smplayer" ); + translator->load( pref->language ); + + smplayer = new DefaultGui(this); + } + + smplayer->show(); +} diff --git a/retroshare-gui/src/gui/MainWindow.h b/retroshare-gui/src/gui/MainWindow.h new file mode 100644 index 000000000..de09e1961 --- /dev/null +++ b/retroshare-gui/src/gui/MainWindow.h @@ -0,0 +1,180 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006,2007 The RetroShare Team + * + * 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 _MainWindow_H +#define _MainWindow_H + +#include +#include +#include +#include + + +#include "NetworkDialog.h" +#include "PeersDialog.h" +#include "SearchDialog.h" +#include "TransfersDialog.h" +#include "MessagesDialog.h" +#include "ChannelsDialog.h" +#include "ChatDialog.h" +#include "SharedFilesDialog.h" +#include "StatisticDialog.h" +#include "MessengerWindow.h" +#include "ApplicationWindow.h" + +#include "Preferences/PreferencesWindow.h" +#include "Settings/gsettingswin.h" +#include "bwgraph/bwgraph.h" +#include "games/qbackgammon/bgwindow.h" +#include "toplevel.h" + +#include "Preferences/ConfirmQuitDialog.h" + +#include "ui_MainWindow.h" + +#include "../config/rsharesettings.h" + +class MainWindow : public QMainWindow +{ + Q_OBJECT + +public: + /** Main dialog pages. */ + enum Page { + Network = 0, /** Network page. */ + Friends = 1, /** Peers page. */ + SharedDirectories = 2, /** Shared Directories page. */ + Search = 3, /** Search page. */ + Transfers = 4, /** Transfers page. */ + Chat = 5, /** Chat page. */ + Messages = 6, /** Messages page. */ + Channels = 7, /** Channels page. */ + Statistics = 8 /** Statistic page. */ + + }; + + /** Default Constructor */ + MainWindow(QWidget *parent = 0, Qt::WFlags flags = 0); + + /** Destructor. */ + ~MainWindow(); + + /* A Bit of a Hack... but public variables for + * the dialogs, so we can add them to the + * Notify Class... + */ + + NetworkDialog *networkDialog; + PeersDialog *peersDialog; + SearchDialog *searchDialog; + TransfersDialog *transfersDialog; + ChatDialog *chatDialog; + MessagesDialog *messagesDialog; + ChannelsDialog *channelsDialog; + SharedFilesDialog *sharedfilesDialog; + //GroupsDialog *groupsDialog; + //StatisticDialog *statisticDialog; + MessengerWindow *messengerWindow; + ApplicationWindow *applicationWindow; + + +public slots: + /** Called when this dialog is to be displayed */ + void show(); + /** Shows the config dialog with focus set to the given page. */ + void show(Page page); + + void startgammon(); + void startqcheckers(); + + +private slots: + + void updateMenu(); + + void toggleVisibility(QSystemTrayIcon::ActivationReason e); + void toggleVisibilitycontextmenu(); + + + /** Toolbar fns. */ + void addFriend(); + void inviteFriend(); + void addSharedDirectory(); + void showPreferencesWindow(); + void showMessengerWindow(); + void showApplWindow(); + void showsmplayer(); + + void showSettings(); + + + /** Called when console button is toggled */ + void showConsoleFrame(bool show); + + /** Called when console button is toggled */ + void showToolboxFrame(bool show); + + /** Called when user attempts to quit via quit button*/ + void doQuit(); + + +protected: + void closeEvent(QCloseEvent *); + + +private slots: + + + +private: + + /** Create the actions on the tray menu or menubar */ + void createActions(); + + + /** Defines the actions for the tray menu */ + QAction* _prefsAct; + QAction* _bandwidthAct; + QAction* _messengerwindowAct; + + /** A BandwidthGraph object which handles monitoring RetroShare bandwidth usage */ + BandwidthGraph* _bandwidthGraph; + + PreferencesWindow* _preferencesWindow; + + + /** Creates a new action for a config page. */ + QAction* createPageAction(QIcon img, QString text, QActionGroup *group); + /** Adds a new action to the toolbar. */ + void addAction(QAction *action, const char *slot = 0); + + void loadStyleSheet(const QString &sheetName); + + QSystemTrayIcon *trayIcon; + QAction *toggleVisibilityAction; + QMenu *menu; + + /** Qt Designer generated object */ + Ui::MainWindow ui; +}; + +#endif + diff --git a/retroshare-gui/src/gui/MainWindow.ui b/retroshare-gui/src/gui/MainWindow.ui new file mode 100644 index 000000000..487c8b37f --- /dev/null +++ b/retroshare-gui/src/gui/MainWindow.ui @@ -0,0 +1,1687 @@ + + MainWindow + + + + 0 + 0 + 800 + 600 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 120 + 120 + 120 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 10 + 36 + 106 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 120 + 120 + 120 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 212 + 208 + 200 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + + + 120 + 120 + 120 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 120 + 120 + 120 + + + + + + + 139 + 139 + 139 + + + + + + + 120 + 120 + 120 + + + + + + + 255 + 255 + 255 + + + + + + + 120 + 120 + 120 + + + + + + + 240 + 240 + 240 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 10 + 36 + 106 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + + + Arial + 10 + 50 + false + false + false + false + + + + Qt::CustomContextMenu + + + RetroShare + + + + 24 + 24 + + + + Qt::ToolButtonTextUnderIcon + + + + + 1 + + + 1 + + + + + Qt::Vertical + + + + true + + + + + + + 0 + + + + Home + + + + 0 + + + 0 + + + + + + 74 + 16777215 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 0 + + + 0 + + + + + + 4 + 5 + 0 + 0 + + + + + 70 + 0 + + + + + 74 + 16777215 + + + + + 30 + true + + + + QToolBox::tab { +background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #E1E1E1, stop: 0.4 #DDDDDD, stop: 0.5 #D8D8D8, stop: 1.0 #D3D3D3); + +border-radius: 5px; +color: darkgray; +} +QToolBox::tab:selected { +font: bold; +color: black; +} + + + 1 + + + 0 + + + + + 0 + 0 + 72 + 265 + + + + General + + + + 9 + + + 6 + + + + + Qt::NonModal + + + + 0 + 0 + 0 + 0 + + + + + 48 + 32 + + + + + 32 + 32 + + + + + + + :/images/exit_24x24.png + + + + 24 + 24 + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + 0 + + + 7 + + + + + + 0 + 0 + 0 + 0 + + + + + 48 + 32 + + + + + 32 + 32 + + + + + + + :/images/invite-friend24.png + + + + 24 + 24 + + + + + + + + + 0 + 0 + 0 + 0 + + + + + 48 + 32 + + + + + 32 + 32 + + + + + + + :/images/add-friend24.png + + + + 24 + 24 + + + + + + + + + 0 + 0 + 0 + 0 + + + + + 48 + 32 + + + + + 32 + 32 + + + + + + + :/images/settings.png + + + + 24 + 24 + + + + + + + + + 0 + 0 + 0 + 0 + + + + + 48 + 32 + + + + + 32 + 32 + + + + + + + :/images/add-share24.png + + + + 24 + 24 + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + 0 + 0 + 72 + 30 + + + + Games + + + + + 10 + 60 + 41 + 41 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt; font-weight:600;">QCheckers</span></p></body></html> + + + + + + :/icons/biglogo.png + + + + 32 + 32 + + + + + + + 10 + 10 + 41 + 41 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt; font-weight:600; color:#000000;">QBackgammon</span></p></body></html> + + + + + + :/images/kbackgammon.png + + + + 32 + 32 + + + + + + + + + + + + + 0 + + + 0 + + + + + + 14 + 31 + + + + + 14 + 32 + + + + + + + :/images/hide_toolbox_frame.png + + + + 16 + 31 + + + + true + + + + + + + Qt::Vertical + + + + 14 + 191 + + + + + + + + + + + 120 + 0 + + + + + 120 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 120 + 120 + 120 + + + + + + + 160 + 160 + 160 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 10 + 36 + 106 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 120 + 120 + 120 + + + + + + + 160 + 160 + 160 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 212 + 208 + 200 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + + + 120 + 120 + 120 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 120 + 120 + 120 + + + + + + + 160 + 160 + 160 + + + + + + + 120 + 120 + 120 + + + + + + + 255 + 255 + 255 + + + + + + + 120 + 120 + 120 + + + + + + + 240 + 240 + 240 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 10 + 36 + 106 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + + + 50 + false + + + + Qt::NoContextMenu + + + + + + + + + + 7 + 7 + 0 + 0 + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + Qt::NoContextMenu + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 0 + + + 0 + + + + + true + + + true + + + QTextBrowser { + background-color: rgb(192,192,192); + + } + + + + + + + + + + + 0 + + + 6 + + + + + + 18 + 18 + + + + + 18 + 18 + + + + true + + + QPushButton + { + border-image: url(:/images/console-small-up.png) + } + + QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + + } + + QPushButton:pressed { + border-image: url(:/images/console-small-down.png) + } + + + + + + + true + + + false + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 10 + 20 + + + + + + + + + 0 + 18 + + + + + 16777215 + 18 + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 4 + 20 + + + + + + + + + + + + Qt::NoContextMenu + + + true + + + Qt::TopToolBarArea + + + Qt::Horizontal + + + + 24 + 24 + + + + Qt::ToolButtonTextUnderIcon + + + 4 + + + + + + MainPageStack + QStackedPageWidget +
    gui/mainpagestack.h
    +
    +
    + + tabWidget + addfriendButton + invitefriendButton + addshareButton + optionsButton + quitButton + textBrowser + lineEdit + btnToggleConsole + btntoggletoolbox + + + + + + +
    diff --git a/retroshare-gui/src/gui/MessagesDialog.cpp b/retroshare-gui/src/gui/MessagesDialog.cpp new file mode 100644 index 000000000..3d2558236 --- /dev/null +++ b/retroshare-gui/src/gui/MessagesDialog.cpp @@ -0,0 +1,537 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 "rshare.h" +#include "MessagesDialog.h" +#include "msgs/ChanMsgDialog.h" +#include "gui/toaster/MessageToaster.h" + + +#include "rsiface/rsiface.h" +#include + +#include +#include +#include +#include +#include +#include +#include + +/* Images for context menu icons */ +#define IMAGE_MESSAGE ":/images/folder-draft.png" +#define IMAGE_MESSAGEREPLY ":/images/mail_reply.png" +#define IMAGE_MESSAGEREMOVE ":/images/mail_delete.png" +#define IMAGE_DOWNLOAD ":/images/start.png" +#define IMAGE_DOWNLOADALL ":/images/startall.png" + + +/** Constructor */ +MessagesDialog::MessagesDialog(QWidget *parent) +: MainPage(parent) +{ + /* Invoke the Qt Designer generated object setup routine */ + ui.setupUi(this); + + connect( ui.msgWidget, SIGNAL( customContextMenuRequested( QPoint ) ), this, SLOT( messageslistWidgetCostumPopupMenu( QPoint ) ) ); + connect( ui.msgList, SIGNAL( customContextMenuRequested( QPoint ) ), this, SLOT( msgfilelistWidgetCostumPopupMenu( QPoint ) ) ); + connect( ui.msgWidget, SIGNAL( itemClicked ( QTreeWidgetItem *, int) ), this, SLOT( updateMessages ( QTreeWidgetItem *, int) ) ); + connect( ui.listWidget, SIGNAL( currentRowChanged ( int) ), this, SLOT( changeBox ( int) ) ); + + + connect(ui.newmessageButton, SIGNAL(clicked()), this, SLOT(newmessage())); + connect(ui.removemessageButton, SIGNAL(clicked()), this, SLOT(removemessage())); + + + mCurrCertId = ""; + mCurrMsgId = ""; + + /* hide the Tree +/- */ + ui.msgList -> setRootIsDecorated( false ); + + + /* Hide platform specific features */ +#ifdef Q_WS_WIN + +#endif +} + +void MessagesDialog::messageslistWidgetCostumPopupMenu( QPoint point ) +{ + + QMenu contextMnu( this ); + QMouseEvent *mevent = new QMouseEvent( QEvent::MouseButtonPress, point, Qt::RightButton, Qt::RightButton, Qt::NoModifier ); + + newmsgAct = new QAction(QIcon(IMAGE_MESSAGE), tr( "New Message" ), this ); + connect( newmsgAct , SIGNAL( triggered() ), this, SLOT( newmessage() ) ); + + replytomsgAct = new QAction(QIcon(IMAGE_MESSAGEREPLY), tr( "Reply to Message" ), this ); + connect( replytomsgAct , SIGNAL( triggered() ), this, SLOT( replytomessage() ) ); + + removemsgAct = new QAction(QIcon(IMAGE_MESSAGEREMOVE), tr( "Remove Message" ), this ); + connect( removemsgAct , SIGNAL( triggered() ), this, SLOT( removemessage() ) ); + + + + contextMnu.clear(); + contextMnu.addAction( newmsgAct); + contextMnu.addAction( replytomsgAct); + contextMnu.addAction( removemsgAct); + contextMnu.exec( mevent->globalPos() ); +} + + +void MessagesDialog::msgfilelistWidgetCostumPopupMenu( QPoint point ) +{ + + QMenu contextMnu( this ); + QMouseEvent *mevent = new QMouseEvent( QEvent::MouseButtonPress, point, Qt::RightButton, Qt::RightButton, Qt::NoModifier ); + +// getRecAct = new QAction(QIcon(IMAGE_DOWNLOAD), tr( "Download" ), this ); +// connect( getRecAct , SIGNAL( triggered() ), this, SLOT( getcurrentrecommended() ) ); + + getAllRecAct = new QAction(QIcon(IMAGE_DOWNLOADALL), tr( "Download All" ), this ); + connect( getAllRecAct , SIGNAL( triggered() ), this, SLOT( getallrecommended() ) ); + + + contextMnu.clear(); +// contextMnu.addAction( getRecAct); + contextMnu.addAction( getAllRecAct); + contextMnu.exec( mevent->globalPos() ); +} + +void MessagesDialog::newmessage() +{ + ChanMsgDialog *nMsgDialog = new ChanMsgDialog(true); + + /* fill it in */ + //std::cerr << "MessagesDialog::newmessage()" << std::endl; + nMsgDialog->newMsg(); + nMsgDialog->show(); + + /* window will destroy itself! */ +} + +void MessagesDialog::replytomessage() +{ + /* put msg on msgBoard, and switch to it. */ + + +} + + +/* download the recommendations... */ +void MessagesDialog::getcurrentrecommended() +{ + + +} + +void MessagesDialog::getallrecommended() +{ + /* get Message */ + rsiface->lockData(); /* Lock Interface */ + + const MessageInfo *mi = + rsiface->getMessage(mCurrCertId, mCurrMsgId); + if (!mi) + { + rsiface->unlockData(); /* Unlock Interface */ + return; + } + + const std::list &recList = mi->files; + std::list::const_iterator it; + + std::list fnames; + std::list hashes; + std::list sizes; + + for(it = recList.begin(); it != recList.end(); it++) + { + fnames.push_back(it->fname); + hashes.push_back(it->hash); + sizes.push_back(it->size); + } + + rsiface->unlockData(); /* Unlock Interface */ + + /* now do requests */ + std::list::const_iterator fit; + std::list::const_iterator hit; + std::list::const_iterator sit; + + for(fit = fnames.begin(), hit = hashes.begin(), sit = sizes.begin(); + fit != fnames.end(); fit++, hit++, sit++) + { + rsicontrol -> FileRequest(*fit, *hit, *sit, ""); + } +} + +void MessagesDialog::changeBox( int newrow ) +{ + //std::cerr << "MessagesDialog::changeBox()" << std::endl; + insertMessages(); + insertMsgTxtAndFiles(); +} + +void MessagesDialog::insertMessages() +{ + rsiface->lockData(); /* Lock Interface */ + + std::list::const_iterator it; + const std::list &msgs = rsiface->getMessages(); + + /* get a link to the table */ + QTreeWidget *msgWidget = ui.msgWidget; + + /* get the MsgId of the current one ... */ + + + std::string cid; + std::string mid; + + bool oldSelected = getCurrentMsg(cid, mid); + QTreeWidgetItem *newSelected = NULL; + + /* remove old items ??? */ + + int listrow = ui.listWidget -> currentRow(); + + //std::cerr << "MessagesDialog::insertMessages()" << std::endl; + //std::cerr << "Current Row: " << listrow << std::endl; + + /* check the mode we are in */ + unsigned int msgbox = 0; + switch(listrow) + { + case 3: + msgbox = RS_MSG_SENTBOX; + break; + case 2: + msgbox = RS_MSG_DRAFTBOX; + break; + case 1: + msgbox = RS_MSG_OUTBOX; + break; + case 0: + default: + msgbox = RS_MSG_INBOX; + break; + } + + QList items; + for(it = msgs.begin(); it != msgs.end(); it++) + { + /* check the message flags, to decide which + * group it should go in... + * + * InBox + * OutBox + * Drafts + * Sent + * + * FLAGS = OUTGOING. + * -> Outbox/Drafts/Sent + * + SENT -> Sent + * + IN_PROGRESS -> Draft. + * + nuffing -> Outbox. + * FLAGS = INCOMING = (!OUTGOING) + * -> + NEW -> Bold. + * + */ + + if ((it -> msgflags & RS_MSG_BOXMASK) != msgbox) + { + //std::cerr << "Msg from other box: " << it->msgflags; + //std::cerr << std::endl; + continue; + } + /* make a widget per friend */ + QTreeWidgetItem *item = new QTreeWidgetItem((QTreeWidget*)0); + + /* So Text should be: + * (1) Msg / Broadcast + * (1b) Person / Channel Name + * (2) Rank + * (3) Date + * (4) Title + * (5) Msg + * (6) File Count + * (7) File Total + */ + + // Date First.... (for sorting) + { + QDateTime qtime; + qtime.setTime_t(it->ts); + QString timestamp = qtime.toString("yyyy-MM-dd hh:mm:ss"); + item -> setText(0, timestamp); + } + + // From .... + { + std::ostringstream out; + out << it -> srcname; + item -> setText(1, QString::fromStdString(out.str())); + } + + item -> setText(2, QString::fromStdString(it->title)); + + // No of Files. + { + std::ostringstream out; + out << it -> count; + item -> setText(3, QString::fromStdString(out.str())); + } + + // Size. + // Msg. + // Rank + { + std::ostringstream out; + out << it -> size; + item -> setText(4, QString::fromStdString(out.str())); + } + + /* strip out the \n and \r symbols */ + std::string tmsg = it -> msg; + for(int i = 0; i < tmsg.length(); i++) + { + if ((tmsg[i] == '\n') || + (tmsg[i] == '\r')) + { + tmsg[i] = ' '; + } + } + item -> setText(5, QString::fromStdString(tmsg)); + + { + std::ostringstream out; + out << "5"; // RANK + item -> setText(6, QString::fromStdString(out.str())); + } + + { + std::ostringstream out; + out << it -> id; + item -> setText(7, QString::fromStdString(out.str())); + } + + { + std::ostringstream out; + out << it -> msgId; + item -> setText(8, QString::fromStdString(out.str())); + if ((oldSelected) && (mid == out.str())) + { + newSelected = item; + } + } + + if (it -> msgflags & RS_MSG_NEW) + { + for(int i = 0; i < 10; i++) + { + QFont qf = item->font(i); + qf.setBold(true); + item->setFont(i, qf); + + //std::cerr << "Setting Item BOLD!" << std::endl; + } + } + + /* add to the list */ + items.append(item); + } + + /* add the items in! */ + msgWidget->clear(); + msgWidget->insertTopLevelItems(0, items); + + if (newSelected) + { + msgWidget->setCurrentItem(newSelected); + } + + rsiface->unlockData(); /* UnLock Interface */ +} + +void MessagesDialog::updateMessages( QTreeWidgetItem * item, int column ) +{ + //std::cerr << "MessagesDialog::insertMsgTxtAndFiles()" << std::endl; + insertMsgTxtAndFiles(); +} + + +void MessagesDialog::insertMsgTxtAndFiles() +{ + /* Locate the current Message */ + QTreeWidget *msglist = ui.msgWidget; + + //std::cerr << "MessagesDialog::insertMsgTxtAndFiles()" << std::endl; + + + /* get its Ids */ + std::string cid; + std::string mid; + + QTreeWidgetItem *qtwi = msglist -> currentItem(); + if (!qtwi) + { + /* blank it */ + ui.msgText->setText(""); + ui.msgList->clear(); + return; + } + else + { + cid = qtwi -> text(7).toStdString(); + mid = qtwi -> text(8).toStdString(); + } + + /* Save the Data.... for later */ + + mCurrCertId = cid; + mCurrMsgId = mid; + + /* get Message */ + rsiface->lockData(); /* Lock Interface */ + + const MessageInfo *mi = NULL; + mi = rsiface->getMessage(cid, mid); + if (!mi) + { + rsiface->unlockData(); /* Unlock Interface */ + return; + } + + const std::list &recList = mi->files; + std::list::const_iterator it; + + /* get a link to the table */ + QTreeWidget *tree = ui.msgList; + + /* get the MessageInfo */ + + tree->clear(); + tree->setColumnCount(5); + + QList items; + for(it = recList.begin(); it != recList.end(); it++) + { + /* make a widget per person */ + QTreeWidgetItem *item = new QTreeWidgetItem((QTreeWidget*)0); + /* (0) Filename */ + item -> setText(0, QString::fromStdString(it->fname)); + //std::cerr << "Msg FileItem(" << it->fname.length() << ") :" << it->fname << std::endl; + + /* (1) Size */ + { + std::ostringstream out; + out << it->size; + item -> setText(1, QString::fromStdString(out.str())); + } + /* (2) Rank */ + { + std::ostringstream out; + out << it->rank; + item -> setText(2, QString::fromStdString(out.str())); + } + + item -> setText(3, QString::fromStdString(it->hash)); + + /* add to the list */ + items.append(item); + } + + /* add the items in! */ + tree->insertTopLevelItems(0, items); + + + /* add the Msg */ + std::string msgtext = "Title: " + mi -> title; + msgtext += "\nHdr: " + mi -> header; + msgtext += "\n-----------------\n" + mi -> msg; + + ui.msgText->setText(QString::fromStdString(msgtext)); + + rsiface->unlockData(); /* Unlock Interface */ + + + /* finally mark message as read! */ + rsicontrol -> MessageRead(mid); +} + + +bool MessagesDialog::getCurrentMsg(std::string &cid, std::string &mid) +{ + /* Locate the current Message */ + QTreeWidget *msglist = ui.msgWidget; + + //std::cerr << "MessagesDialog::getCurrentMsg()" << std::endl; + + /* get its Ids */ + QTreeWidgetItem *qtwi = msglist -> currentItem(); + if (qtwi) + { + cid = qtwi -> text(7).toStdString(); + mid = qtwi -> text(8).toStdString(); + return true; + } + return false; +} + + +void MessagesDialog::removemessage() +{ + //std::cerr << "MessagesDialog::removemessage()" << std::endl; + std::string cid, mid; + if (!getCurrentMsg(cid, mid)) + { + //std::cerr << "MessagesDialog::removemessage()"; + //std::cerr << " No Message selected" << std::endl; + return; + } + + rsicontrol -> MessageDelete(mid); + + return; +} + + +void MessagesDialog::markMsgAsRead() +{ + //std::cerr << "MessagesDialog::markMsgAsRead()" << std::endl; + std::string cid, mid; + if (!getCurrentMsg(cid, mid)) + { + //std::cerr << "MessagesDialog::markMsgAsRead()"; + //std::cerr << " No Message selected" << std::endl; + return; + } + + rsicontrol -> MessageRead(mid); + + return; +} + + diff --git a/retroshare-gui/src/gui/MessagesDialog.h b/retroshare-gui/src/gui/MessagesDialog.h new file mode 100644 index 000000000..32932fe1f --- /dev/null +++ b/retroshare-gui/src/gui/MessagesDialog.h @@ -0,0 +1,86 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 _MESSAGESDIALOG_H +#define _MESSAGESDIALOG_H + +#include + +#include "mainpage.h" +#include "ui_MessagesDialog.h" + +class MessagesDialog : public MainPage +{ + Q_OBJECT + +public: + /** Default Constructor */ + MessagesDialog(QWidget *parent = 0); + /** Default Destructor */ + + + void insertMessages(); + void insertMsgTxtAndFiles(); + + +private slots: + + /** Create the context popup menu and it's submenus */ + void messageslistWidgetCostumPopupMenu( QPoint point ); + void msgfilelistWidgetCostumPopupMenu(QPoint); + +void changeBox( int newrow ); +void updateMessages ( QTreeWidgetItem * item, int column ); + + void newmessage(); + + void replytomessage(); + + void removemessage(); + void markMsgAsRead(); + + void getcurrentrecommended(); + void getallrecommended(); + +private: + + bool getCurrentMsg(std::string &cid, std::string &mid); + + std::string mCurrCertId; + std::string mCurrMsgId; + + /** Define the popup menus for the Context menu */ + QMenu* contextMnu; + + /** Defines the actions for the context menu */ + QAction* newmsgAct; + QAction* replytomsgAct; + QAction* removemsgAct; + + QAction* getRecAct; + QAction* getAllRecAct; + + /** Qt Designer generated object */ + Ui::MessagesDialog ui; +}; + +#endif + diff --git a/retroshare-gui/src/gui/MessagesDialog.ui b/retroshare-gui/src/gui/MessagesDialog.ui new file mode 100644 index 000000000..b97ab41fd --- /dev/null +++ b/retroshare-gui/src/gui/MessagesDialog.ui @@ -0,0 +1,873 @@ + + MessagesDialog + + + + 0 + 0 + 519 + 343 + + + + + 5 + 7 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 192 + 192 + 192 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + 104 + 104 + 104 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 104 + 104 + 104 + + + + + + + 255 + 255 + 255 + + + + + + + 104 + 104 + 104 + + + + + + + 240 + 240 + 240 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + Arial + 8 + 50 + false + false + false + false + + + + Qt::DefaultContextMenu + + + + 4 + + + 1 + + + + + + 24 + 24 + + + + + 24 + 24 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">remove selected message</p></body></html> + + + QPushButton +{ +border-image: url(:/images/deletemail24.png); +} + +QPushButton:hover +{ +border-image: url(:/images/deletemail-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/deletemail-pressed.png); +} + + + + + + + 24 + 24 + + + + + + + + Qt::Horizontal + + + + + 160 + 16777215 + + + + 1 + + + 0 + + + QListView::Fixed + + + 0 + + + + 100 + 16 + + + + 0 + + + false + + + false + + + + Inbox + + + :/images/folder-inbox.png + + + + + Outbox + + + :/images/folder-outbox.png + + + + + Draft + + + :/images/folder-draft.png + + + + + Sent + + + :/images/folder-sent.png + + + + + + Qt::Vertical + + + + Qt::Vertical + + + + Qt::CustomContextMenu + + + 16 + + + true + + + 6 + + + + Date + + + + + From + + + + + Title + + + + + Count + + + + + Size + + + + + Msg + + + + + + + + + 0 + + + 0 + + + + + Qt::CustomContextMenu + + + + + + + 0 + + + 6 + + + + + + + + :/images/attachment.png + + + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Recommended Files</span></p></body></html> + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + 24 + 24 + + + + + 24 + 24 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">reply to selected message</p></body></html> + + + +QPushButton +{ +border-image: url(:/images/replymail24.png); +} + +QPushButton:hover +{ +border-image: url(:/images/replymail24-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/replymail-pressed.png); +} + + + + + + + + 24 + 24 + + + + + + + + + 24 + 24 + + + + + 24 + 24 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">New Message</p></body></html> + + + QPushButton +{ +border-image: url(:/images/folder-draft24.png); +} +QPushButton:hover +{ +border-image: url(:/images/folder-draft24-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/folder-draft24-pressed.png); +} + + + + + + + + 24 + 24 + + + + false + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + newmessageButton + replymessageButton + removemessageButton + listWidget + msgWidget + msgText + msgList + + + + + + diff --git a/retroshare-gui/src/gui/MessengerWindow.cpp b/retroshare-gui/src/gui/MessengerWindow.cpp new file mode 100644 index 000000000..fd8277c2c --- /dev/null +++ b/retroshare-gui/src/gui/MessengerWindow.cpp @@ -0,0 +1,454 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 +#include +#include "common/vmessagebox.h" + +#include "rshare.h" +#include "MessengerWindow.h" +#include "rsiface/rsiface.h" +#include "chat/PopupChatDialog.h" +#include "msgs/ChanMsgDialog.h" +#include "ChatDialog.h" +#include "connect/ConfCertDialog.h" +#include "util/PixmapMerging.h" +#include "LogoBar.h" +#include "util/Widget.h" + +#include +#include + + +#include +#include +#include +#include +#include +#include +#include + + +/* Images for context menu icons */ +#define IMAGE_REMOVEFRIEND ":/images/removefriend16.png" +#define IMAGE_EXPIORTFRIEND ":/images/exportpeers_16x16.png" +#define IMAGE_CHAT ":/images/chat.png" +#define IMAGE_SENDMESSAGE ":/images/message-mail.png" +/* Images for Status icons */ +#define IMAGE_ONLINE ":/images/donline.png" +#define IMAGE_OFFLINE ":/images/dhidden.png" +/* Images for Status icons */ +#define IMAGE_ON ":/images/contract_hover.png" +#define IMAGE_OFF ":/images/expand_hover.png" + + +/** Constructor */ +MessengerWindow::MessengerWindow(QWidget * parent) +: QWidget(parent) +{ + /* Invoke the Qt Designer generated object setup routine */ + ui.setupUi(this); + + + connect( ui.messengertreeWidget, SIGNAL( customContextMenuRequested( QPoint ) ), this, SLOT( messengertreeWidgetCostumPopupMenu( QPoint ) ) ); + + connect( ui.avatarButton, SIGNAL(clicked()), SLOT(changeAvatarClicked())); + + /* to hide the header */ + ui.messengertreeWidget->header()->hide(); + + /* Set header resize modes and initial section sizes */ + ui.messengertreeWidget->setColumnCount(1); + + QHeaderView * _header = ui.messengertreeWidget->header () ; + _header->setResizeMode (0, QHeaderView::Interactive); + //_header->setResizeMode (1, QHeaderView::Interactive); + //_header->setResizeMode (2, QHeaderView::Interactive); + //_header->setResizeMode (3, QHeaderView::Interactive); + + _header->resizeSection ( 0, 200 ); + + //LogoBar + _rsLogoBarmessenger = NULL; + _rsLogoBarmessenger = new LogoBar(ui.logoframe); + Widget::createLayout(ui.logoframe)->addWidget(_rsLogoBarmessenger); + + + ui.statuscomboBox->setMinimumWidth(20); + ui.messagecomboBox->setMinimumWidth(20); + ui.searchlineEdit->setMinimumWidth(20); + + + /* Hide platform specific features */ +#ifdef Q_WS_WIN + +#endif +} + +void MessengerWindow::messengertreeWidgetCostumPopupMenu( QPoint point ) +{ + + QMenu contextMnu( this ); + QMouseEvent *mevent = new QMouseEvent( QEvent::MouseButtonPress, point, Qt::RightButton, Qt::RightButton, Qt::NoModifier ); + + chatAct = new QAction(QIcon(IMAGE_CHAT), tr( "Chat" ), this ); + connect( chatAct , SIGNAL( triggered() ), this, SLOT( chatfriend2() ) ); + + sendMessageAct = new QAction(QIcon(IMAGE_SENDMESSAGE), tr( "Send Message" ), this ); + connect( sendMessageAct , SIGNAL( triggered() ), this, SLOT( sendMessage() ) ); + + connectfriendAct = new QAction( tr( "Connect To Friend" ), this ); + connect( connectfriendAct , SIGNAL( triggered() ), this, SLOT( connectfriend2() ) ); + + /************ Do we want these options here??? + * + * + configurefriendAct = new QAction( tr( "Configure Friend" ), this ); + connect( configurefriendAct , SIGNAL( triggered() ), this, SLOT( configurefriend2() ) ); + + exportfriendAct = new QAction(QIcon(IMAGE_EXPIORTFRIEND), tr( "Export Friend" ), this ); + connect( exportfriendAct , SIGNAL( triggered() ), this, SLOT( exportfriend2() ) ); + + removefriendAct = new QAction(QIcon(IMAGE_REMOVEFRIEND), tr( "Remove Friend" ), this ); + connect( removefriendAct , SIGNAL( triggered() ), this, SLOT( removefriend2() ) ); + * + * + *********/ + + contextMnu.clear(); + contextMnu.addAction( chatAct); + contextMnu.addAction( sendMessageAct); + contextMnu.addSeparator(); + contextMnu.addAction( connectfriendAct); + + /**** Do we want these options here??? + * + * + contextMnu.addAction( configurefriendAct); + contextMnu.addAction( exportfriendAct); + contextMnu.addAction( removefriendAct); + * + * + ****/ + + contextMnu.exec( mevent->globalPos() ); +} + + + +/* get the list of peers from the RsIface. */ +void MessengerWindow::insertPeers() +{ + rsiface->lockData(); /* Lock Interface */ + + std::map::const_iterator it; + const std::map &friends = + rsiface->getFriendMap(); + + /* get a link to the table */ + QTreeWidget *peerWidget = ui.messengertreeWidget; + + /* remove old items ??? */ + peerWidget->clear(); + peerWidget->setColumnCount(1); + + + /* have two lists: online / offline */ + QList online_items; + QList offline_items; + + + for(it = friends.begin(); it != friends.end(); it++) + { + /* make a widget per friend */ + QTreeWidgetItem *item = new QTreeWidgetItem((QTreeWidget*)0); + + /* add all the labels */ + /* (0) Person */ + item -> setText(0, QString::fromStdString(it->second.name)); + /* (1) Org */ + //item -> setText(1, QString::fromStdString(it->second.org)); + /* (2) Location */ + //item -> setText(2, QString::fromStdString(it->second.loc)); + /* (3) Country */ + //item -> setText(3, QString::fromStdString(it->second.country)); + + + /* Hidden ones: */ + /* () RsCertId */ + { + std::ostringstream out; + out << it -> second.id; + item -> setText(4, QString::fromStdString(out.str())); + } + + /* add to the list */ + if (it->second.statusString == "Online") + { + online_items.append(item); + item -> setIcon(0,(QIcon(IMAGE_ONLINE))); + } + else + { + offline_items.append(item); + item -> setIcon(0,(QIcon(IMAGE_OFFLINE))); + } + } + + /* make parent items (TODO) */ + /* add the items in! */ + + if (online_items.size() > 0) + { + QTreeWidgetItem *item = new QTreeWidgetItem((QTreeWidget*)0); + + /* add all the labels */ + /* (0) Person */ + item -> setText(0, "Online"); + item -> addChildren(online_items); + item -> setIcon(0,(QIcon(IMAGE_ON))); + peerWidget->addTopLevelItem(item); + peerWidget->expandItem(item); + } + + if (offline_items.size() > 0) + { + QTreeWidgetItem *item = new QTreeWidgetItem((QTreeWidget*)0); + + /* add all the labels */ + /* (0) Person */ + item -> setText(0, "Offline"); + item -> addChildren(offline_items); + + peerWidget->addTopLevelItem(item); + peerWidget->expandItem(item); + item -> setIcon(0,(QIcon(IMAGE_OFF))); + } + + rsiface->unlockData(); /* UnLock Interface */ + + peerWidget->update(); /* update display */ +} + + +/* Utility Fns */ +std::string getMessengerPeerRsCertId(QTreeWidgetItem *i) +{ + std::string id = (i -> text(4)).toStdString(); + return id; +} + + +/** Open a QFileDialog to browse for export a file. */ +void MessengerWindow::exportfriend2() +{ + +} + +void MessengerWindow::removefriend2() +{ + +} + + +void MessengerWindow::allowfriend2() +{ + +} + + +void MessengerWindow::connectfriend2() +{ + bool isOnline; + QTreeWidgetItem *i = getCurrentPeer(isOnline); + if (!i) + return; + + if (isOnline) + { + std::cerr << "MessengerWindow::connectfriend2() Already online" << std::endl; + } + else + { + std::cerr << "MessengerWindow::connectfriend2() Trying" << std::endl; + rsicontrol->FriendConnectAttempt(getMessengerPeerRsCertId(i)); + } +} + +void MessengerWindow::setaddressfriend2() +{ + +} + +void MessengerWindow::trustfriend2() +{ + +} + + + +/* GUI stuff -> don't do anything directly with Control */ +void MessengerWindow::configurefriend2() +{ + +} + + +/** Overloads the default show */ +void MessengerWindow::show() +{ + + if (!this->isVisible()) { + QWidget::show(); + } else { + QWidget::activateWindow(); + setWindowState(windowState() & ~Qt::WindowMinimized | Qt::WindowActive); + QWidget::raise(); + } +} + +void MessengerWindow::closeEvent (QCloseEvent * event) +{ + hide(); + event->ignore(); +} + + + +void MessengerWindow::setChatDialog(ChatDialog *cd) +{ + chatDialog = cd; +} + + + + +void MessengerWindow::chatfriend2() +{ + bool isOnline; + QTreeWidgetItem *i = getCurrentPeer(isOnline); + if (!i) + return; + + std::string name = (i -> text(0)).toStdString(); + std::string id = (i -> text(4)).toStdString(); + + if (!isOnline) + { + /* info dialog */ + QMessageBox::StandardButton sb = QMessageBox::question ( NULL, + "Friend Not Online", + "Your Friend is offline \nDo You want to send them a Message instead", + (QMessageBox::Yes | QMessageBox::No )); + if (sb == QMessageBox::Yes) + { + rsicontrol -> ClearInMsg(); + rsicontrol -> SetInMsg(id, true); + + /* create a message */ + ChanMsgDialog *nMsgDialog = new ChanMsgDialog(true); + + nMsgDialog->newMsg(); + nMsgDialog->show(); + } + return; + } + + /* must reference ChatDialog */ + if (chatDialog) + { + chatDialog->getPrivateChat(id, name, true); + } +} + +void MessengerWindow::sendMessage() +{ + bool isOnline; + std::cerr << "SharedFilesDialog::msgfriend()" << std::endl; + + QTreeWidgetItem *i = getCurrentPeer(isOnline); + + if (!i) + return; + + //std::string status = (i -> text(0)).toStdString(); + std::string name = (i -> text(0)).toStdString(); + std::string id = (i -> text(4)).toStdString(); + + rsicontrol -> ClearInMsg(); + rsicontrol -> SetInMsg(id, true); + + /* create a message */ + ChanMsgDialog *nMsgDialog = new ChanMsgDialog(true); + + nMsgDialog->newMsg(); + nMsgDialog->show(); +} + + +QTreeWidgetItem *MessengerWindow::getCurrentPeer(bool &isOnline) +{ + /* get the current, and extract the Id */ + + /* get a link to the table */ + QTreeWidget *peerWidget = ui.messengertreeWidget; + QTreeWidgetItem *item = peerWidget -> currentItem(); + if (!item) + { + std::cerr << "Invalid Current Item" << std::endl; + return NULL; + } + + /* check if parent is online or offline */ + QTreeWidgetItem *parent = item->parent(); + if ((!parent) || + (parent == peerWidget->invisibleRootItem())) + { + std::cerr << "Selected Parent Invalid Item" << std::endl; + return NULL; + } + + isOnline = (parent->text(0) == "Online"); + + return item; +} + +void MessengerWindow::changeAvatarClicked() +{ + + updateAvatar(); +} + + +void MessengerWindow::updateAvatar() +{ + std::string backgroundPixmapFilename = ":/images/retrosharelogo1.png"; + std::string foregroundPixmapData = ":/images/nopic.png"; + //std::string foregroundPixmapData = _cUserProfile->getUserProfile().getIcon().getData(); + + ui.avatarButton->setIcon(PixmapMerging::merge(foregroundPixmapData, backgroundPixmapFilename)); +} + + +LogoBar & MessengerWindow::getLogoBar() const { + return *_rsLogoBarmessenger; +} + diff --git a/retroshare-gui/src/gui/MessengerWindow.h b/retroshare-gui/src/gui/MessengerWindow.h new file mode 100644 index 000000000..e52a283a3 --- /dev/null +++ b/retroshare-gui/src/gui/MessengerWindow.h @@ -0,0 +1,110 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 _MESSENGERWINDOW_H +#define _MESSENGERWINDOW_H +#include + +#include "mainpage.h" +#include "ui_MessengerWindow.h" + +class LogoBar; +class ChatDialog; + +class MessengerWindow : public QWidget +{ + Q_OBJECT + +public: + /** Default Constructor */ + MessengerWindow(QWidget *parent = 0); + /** Default Destructor */ + + void insertPeers(); + void setChatDialog(ChatDialog *cd); + + +public slots: + /** Called when this dialog is to be displayed */ + void show(); + + LogoBar & getLogoBar() const; + +protected: + void closeEvent (QCloseEvent * event); + + +private slots: + + /** Create the context popup menu and it's submenus */ + void messengertreeWidgetCostumPopupMenu( QPoint point ); + + /** Export friend in Friends Dialog */ + void exportfriend2(); + /** Remove friend */ + void removefriend2(); + /** start a chat with a friend **/ + void chatfriend2(); + + void sendMessage(); + + void configurefriend2(); + + /** RsServer Friend Calls */ + void allowfriend2(); + void connectfriend2(); + void setaddressfriend2(); + void trustfriend2(); + + void changeAvatarClicked(); + void updateAvatar(); + + +private: + + /* Worker Functions */ + /* (1) Update Display */ + + /* (2) Utility Fns */ + QTreeWidgetItem *getCurrentPeer(bool &isOnline); + + ChatDialog *chatDialog; + + /** Define the popup menus for the Context menu */ + QMenu* contextMnu; + /** Defines the actions for the context menu */ + QAction* chatAct; + QAction* sendMessageAct; + QAction* connectfriendAct; + QAction* configurefriendAct; + QAction* exportfriendAct; + QAction* removefriendAct; + + QTreeView *messengertreeWidget; + + LogoBar * _rsLogoBarmessenger; + + /** Qt Designer generated object */ + Ui::MessengerWindow ui; +}; + +#endif + diff --git a/retroshare-gui/src/gui/MessengerWindow.ui b/retroshare-gui/src/gui/MessengerWindow.ui new file mode 100644 index 000000000..9fe9514f2 --- /dev/null +++ b/retroshare-gui/src/gui/MessengerWindow.ui @@ -0,0 +1,665 @@ + + MessengerWindow + + + + 0 + 0 + 238 + 482 + + + + + + + + + 0 + 0 + 0 + + + + + + + 244 + 244 + 244 + + + + + + + 244 + 244 + 244 + + + + + + + 241 + 239 + 226 + + + + + + + 140 + 140 + 140 + + + + + + + 163 + 163 + 163 + + + + + + + 0 + 0 + 0 + + + + + + + 244 + 244 + 244 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 236 + 243 + 246 + + + + + + + 106 + 106 + 106 + + + + + + + 197 + 231 + 246 + + + + + + + 0 + 0 + 0 + + + + + + + 232 + 232 + 232 + + + + + + + + + 0 + 0 + 0 + + + + + + + 244 + 244 + 244 + + + + + + + 244 + 244 + 244 + + + + + + + 241 + 239 + 226 + + + + + + + 140 + 140 + 140 + + + + + + + 163 + 163 + 163 + + + + + + + 0 + 0 + 0 + + + + + + + 244 + 244 + 244 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 236 + 243 + 246 + + + + + + + 106 + 106 + 106 + + + + + + + 244 + 244 + 244 + + + + + + + 0 + 0 + 0 + + + + + + + 232 + 232 + 232 + + + + + + + + + 122 + 122 + 122 + + + + + + + 244 + 244 + 244 + + + + + + + 244 + 244 + 244 + + + + + + + 244 + 244 + 244 + + + + + + + 140 + 140 + 140 + + + + + + + 163 + 163 + 163 + + + + + + + 122 + 122 + 122 + + + + + + + 244 + 244 + 244 + + + + + + + 122 + 122 + 122 + + + + + + + 244 + 244 + 244 + + + + + + + 236 + 243 + 246 + + + + + + + 0 + 0 + 0 + + + + + + + 197 + 231 + 246 + + + + + + + 0 + 0 + 0 + + + + + + + 232 + 232 + 232 + + + + + + + + + + + Qt::NoContextMenu + + + :/images/rstray3.png + + + QWidget#MessengerWindow { +background-color: #ECF3F6; background-image:url(:/images/backgroundimage.png); +background-position: top right; +background-repeat: no-repeat +} + + + + 0 + + + 0 + + + + + 4 + + + 6 + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click to change your avatar</p></body></html> + + + :/images/retrosharelogo1.png + + + + 70 + 70 + + + + true + + + + + + + 4 + + + 6 + + + + + false + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Change your Status and your display</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">picture here.</p></body></html> + + + QComboBox::NoInsert + + + true + + + 0 + + + + Online + + + :/images/donline.png + + + + + Busy + + + :/images/dbusy.png + + + + + Be right Back + + + :/images/dbrb.png + + + + + Away + + + :/images/daway.png + + + + + In a Call + + + :/images/dphone.png + + + + + Out of lunch + + + :/images/dlunch.png + + + + + Apear Offline + + + :/images/dhidden.png + + + + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Share a personal message with your contacts</p></body></html> + + + true + + + + + + + + + + + QFrame::NoFrame + + + QFrame::Raised + + + + + + + 9 + + + 6 + + + + + Qt::CustomContextMenu + + + + 18 + 18 + + + + 0 + + + + + + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Add a Friend</p></body></html> + + + + + + :/images/dadd.png + + + + 22 + 22 + + + + Qt::ToolButtonTextBesideIcon + + + true + + + + + + + + + statuscomboBox + messagecomboBox + searchlineEdit + addIMAccountButton + messengertreeWidget + avatarButton + + + + + + diff --git a/retroshare-gui/src/gui/NetworkDialog.cpp b/retroshare-gui/src/gui/NetworkDialog.cpp new file mode 100644 index 000000000..ee6299480 --- /dev/null +++ b/retroshare-gui/src/gui/NetworkDialog.cpp @@ -0,0 +1,424 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 +#include + +#include "rshare.h" +#include "common/vmessagebox.h" +#include "NetworkDialog.h" +#include "connect/ConnectDialog.h" +#include "authdlg/AuthorizationDialog.h" +#include "rsiface/rsiface.h" +#include "rsiface/rstypes.h" +#include + + +#include +#include +#include +#include +#include +#include +#include + +/* Images for context menu icons */ +#define IMAGE_LOADCERT ":/images/loadcert16.png" +#define IMAGE_PEERDETAILS ":/images/peerdetails_16x16.png" +#define IMAGE_AUTH ":/images/encrypted16.png" +/* Images for Status icons */ +#define IMAGE_AUTHED ":/images/dauthed.png" +#define IMAGE_DENIED ":/images/ddeny.png" + +RsCertId getNeighRsCertId(QTreeWidgetItem *i); + +/** Constructor */ +NetworkDialog::NetworkDialog(QWidget *parent) +: MainPage(parent), connectdialog(NULL) +{ + /* Invoke the Qt Designer generated object setup routine */ + ui.setupUi(this); + + connect( ui.connecttreeWidget, SIGNAL( customContextMenuRequested( QPoint ) ), this, SLOT( connecttreeWidgetCostumPopupMenu( QPoint ) ) ); + + /* create a single connect dialog */ + connectdialog = new ConnectDialog(); + + /* hide the Tree +/- */ + ui.connecttreeWidget -> setRootIsDecorated( false ); + + /* Set header resize modes and initial section sizes */ + QHeaderView * _header = ui.connecttreeWidget->header () ; + _header->setResizeMode (0, QHeaderView::Custom); + _header->setResizeMode (1, QHeaderView::Interactive); + _header->setResizeMode (2, QHeaderView::Interactive); + _header->setResizeMode (3, QHeaderView::Interactive); + _header->setResizeMode (4, QHeaderView::Interactive); + _header->setResizeMode (5, QHeaderView::Interactive); + _header->setResizeMode (6, QHeaderView::Interactive); + _header->setResizeMode (7, QHeaderView::Interactive); + _header->setResizeMode (8, QHeaderView::Interactive); + _header->setResizeMode (9, QHeaderView::Interactive); + _header->setResizeMode (10, QHeaderView::Interactive); + + _header->resizeSection ( 0, 25 ); + _header->resizeSection ( 1, 100 ); + _header->resizeSection ( 2, 100 ); + _header->resizeSection ( 3, 100 ); + _header->resizeSection ( 4, 100 ); + _header->resizeSection ( 5, 200); + _header->resizeSection ( 6, 100 ); + _header->resizeSection ( 7, 100 ); + _header->resizeSection ( 8, 100 ); + _header->resizeSection ( 9, 100 ); + + + /* Hide platform specific features */ +#ifdef Q_WS_WIN + +#endif +} + +void NetworkDialog::connecttreeWidgetCostumPopupMenu( QPoint point ) +{ + + QMenu contextMnu( this ); + QMouseEvent *mevent = new QMouseEvent( QEvent::MouseButtonPress, point, Qt::RightButton, Qt::RightButton, Qt::NoModifier ); + + peerdetailsAct = new QAction(QIcon(IMAGE_PEERDETAILS), tr( "Peer Details / Authenticate " ), this ); + connect( peerdetailsAct , SIGNAL( triggered() ), this, SLOT( peerdetails() ) ); + + //authAct = new QAction(QIcon(IMAGE_AUTH), tr( "Authenticate" ), this ); + //connect( authAct , SIGNAL( triggered() ), this, SLOT( peerdetails() ) ); + + loadcertAct = new QAction(QIcon(IMAGE_LOADCERT), tr( "Load Certificate" ), this ); + connect( loadcertAct , SIGNAL( triggered() ), this, SLOT( loadneighbour() ) ); + + + contextMnu.clear(); + contextMnu.addAction( peerdetailsAct); + //contextMnu.addAction( authAct); + contextMnu.addAction( loadcertAct); + contextMnu.exec( mevent->globalPos() ); +} + +/** Shows Peer Information/Auth Dialog */ +void NetworkDialog::peerdetails() +{ + std::cerr << "ConnectionsDialog::peerdetails()" << std::endl; + + QTreeWidgetItem *wi = getCurrentNeighbour(); + if (!wi) + return; + + RsCertId id = getNeighRsCertId(wi); + std::ostringstream out; + out << id; + + showpeerdetails(out.str()); +} + +/** Shows Peer Information/Auth Dialog */ +void NetworkDialog::showpeerdetails(std::string id) +{ + std::cerr << "ConnectionsDialog::showpeerdetails()" << std::endl; + if ((connectdialog) && (connectdialog -> loadPeer(id))) + { + connectdialog->show(); + } +} + +/** Shows Connect Dialog */ +void NetworkDialog::showAuthDialog() +{ + static AuthorizationDialog *authorizationdialog = new AuthorizationDialog(); + QTreeWidgetItem *wi = getCurrentNeighbour(); + if (!wi) + return; + + RsCertId id = getNeighRsCertId(wi); + std::ostringstream out; + out << id; + authorizationdialog->setAuthCode(out.str(), wi->text(9).toStdString()); + authorizationdialog->show(); +} + + + + +/** Open a QFileDialog to browse for a pem/pqi file. */ +void NetworkDialog::loadcert() +{ + /* Create a new input dialog, which allows users to create files, too */ + QFileDialog *dialog = new QFileDialog(this, tr("Select a pem/pqi File")); + //dialog->setDirectory(QFileInfo(ui.lineTorConfig->text()).absoluteDir()); + //dialog->selectFile(QFileInfo(ui.lineTorConfig->text()).fileName()); + dialog->setFileMode(QFileDialog::AnyFile); + dialog->setReadOnly(false); + + /* Prompt the user to select a file or create a new one */ + if (!dialog->exec() || dialog->selectedFiles().isEmpty()) { + return; + } + QString filename = QDir::convertSeparators(dialog->selectedFiles().at(0)); + + /* Check if the file exists */ + QFile torrcFile(filename); + if (!QFileInfo(filename).exists()) { + /* The given file does not exist. Should we create it? */ + int response = VMessageBox::question(this, + tr("File Not Found"), + tr("%1 does not exist. Would you like to create it?") + .arg(filename), + VMessageBox::Yes, VMessageBox::No); + + if (response == VMessageBox::No) { + /* Don't create it. Just bail. */ + return; + } + /* Attempt to create the specified file */ + if (!torrcFile.open(QIODevice::WriteOnly)) { + VMessageBox::warning(this, + tr("Failed to Create File"), + tr("Unable to create %1 [%2]").arg(filename) + .arg(torrcFile.errorString()), + VMessageBox::Ok); + return; + } + } + //ui.lineTorConfig->setText(filename); +} + + + +#include + +/* get the list of Neighbours from the RsIface. */ +void NetworkDialog::insertConnect() +{ + rsiface->lockData(); /* Lock Interface */ + + std::map::const_iterator it; + const std::map &neighs = + rsiface->getNeighbourMap(); + + /* get a link to the table */ + QTreeWidget *connectWidget = ui.connecttreeWidget; + QTreeWidgetItem *oldSelect = getCurrentNeighbour(); + QTreeWidgetItem *newSelect = NULL; + std::string oldId; + if (oldSelect) + { + oldId = (oldSelect -> text(9)).toStdString(); + } + + /* remove old items ??? */ + connectWidget->clear(); + connectWidget->setColumnCount(11); + + QList items; + for(it = neighs.begin(); it != neighs.end(); it++) + { + /* make a widget per friend */ + QTreeWidgetItem *item = new QTreeWidgetItem((QTreeWidget*)0); + + /* add all the labels */ + + /* (0) Status Icon */ + item -> setText(0, ""); + + /* (1) Accept/Deny */ + item -> setText(1, QString::fromStdString(it->second.acceptString)); + /* (2) Trust Level */ + item -> setText(2, QString::fromStdString(it->second.trustString)); + /* (3) Last Connect */ + item -> setText(3, QString::fromStdString(it->second.lastConnect)); + /* (4) Person */ + item -> setText(4, QString::fromStdString(it->second.name)); + + /* (5) Peer Address */ + item -> setText(5, QString::fromStdString(it->second.peerAddress)); + + /* Others */ + item -> setText(6, QString::fromStdString(it->second.org)); + item -> setText(7, QString::fromStdString(it->second.loc)); + item -> setText(8, QString::fromStdString(it->second.country)); + + + { + std::ostringstream out; + out << it -> second.id; + item -> setText(9, QString::fromStdString(out.str())); + if ((oldSelect) && (oldId == out.str())) + { + newSelect = item; + } + } + + item -> setText(10, QString::fromStdString(it->second.authCode)); + + + /* change background */ + int i; + if (it->second.acceptString == "Accept") + { + if (it->second.lastConnect != "Never") + { + /* bright green */ + for(i = 1; i < 11; i++) + { + item -> setBackground(i,QBrush(Qt::darkGreen)); + item -> setIcon(0,(QIcon(IMAGE_AUTHED))); + } + } + else + { + for(i = 1; i < 11; i++) + { + item -> setBackground(i,QBrush(Qt::darkGreen)); + item -> setIcon(0,(QIcon(IMAGE_AUTHED))); + } + } + } + else + { + if (it->second.trustLvl > 3) + { + for(i = 1; i < 11; i++) + { + item -> setBackground(i,QBrush(Qt::cyan)); + item -> setIcon(0,(QIcon(IMAGE_DENIED))); + } + } + else if (it->second.lastConnect != "Never") + { + for(i = 1; i < 11; i++) + { + item -> setBackground(i,QBrush(Qt::yellow)); + item -> setIcon(0,(QIcon(IMAGE_DENIED))); + } + } + else + { + for(i = 1; i < 11; i++) + { + item -> setBackground(i,QBrush(Qt::gray)); + item -> setIcon(0,(QIcon(IMAGE_DENIED))); + } + } + } + + + /* add to the list */ + items.append(item); + } + + /* add the items in! */ + connectWidget->insertTopLevelItems(0, items); + if (newSelect) + { + connectWidget->setCurrentItem(newSelect); + } + + rsiface->unlockData(); /* UnLock Interface */ + + connectWidget->update(); /* update display */ +} + +QTreeWidgetItem *NetworkDialog::getCurrentNeighbour() +{ + /* get the current, and extract the Id */ + + /* get a link to the table */ + QTreeWidget *connectWidget = ui.connecttreeWidget; + QTreeWidgetItem *item = connectWidget -> currentItem(); + if (!item) + { + std::cerr << "Invalid Current Item" << std::endl; + return NULL; + } + + /* Display the columns of this item. */ + +/**** NO NEED ANYMORE + std::ostringstream out; + out << "CurrentNeighbourItem: " << 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(); +*****************/ + + return item; +} + +/* Utility Fns */ +RsCertId getNeighRsCertId(QTreeWidgetItem *i) +{ + RsCertId id = (i -> text(9)).toStdString(); + return id; +} + +/* So from the Neighbours Dialog we can call the following control Functions: + * (1) Load Certificate NeighLoadCertificate(std::string file) + * (2) Neigh Auth NeighAuthFriend(id, code) + * (3) Neigh Add NeighAddFriend(id) + * + * All of these rely on the finding of the current Id. + */ + +std::string NetworkDialog::loadneighbour() +{ + std::cerr << "ConnectionsDialog::loadneighbour()" << std::endl; + QString fileName = QFileDialog::getOpenFileName(this, tr("Select Certificate"), "", + tr("Certificates (*.pqi *.pem)")); + + std::string file = fileName.toStdString(); + std::string id; + if (file != "") + { + rsicontrol->NeighLoadCertificate(file, id); + } + return id; +} + +void NetworkDialog::addneighbour() +{ + QTreeWidgetItem *c = getCurrentNeighbour(); + std::cerr << "ConnectionsDialog::addneighbour()" << std::endl; + /* + rsServer->NeighAddFriend(getNeighRsCertId(c)); + */ +} + +void NetworkDialog::authneighbour() +{ + QTreeWidgetItem *c = getCurrentNeighbour(); + std::cerr << "ConnectionsDialog::authneighbour()" << std::endl; + /* + RsAuthId code; + rsServer->NeighAuthFriend(getNeighRsCertId(c), code); + */ +} + diff --git a/retroshare-gui/src/gui/NetworkDialog.h b/retroshare-gui/src/gui/NetworkDialog.h new file mode 100644 index 000000000..460fc2adb --- /dev/null +++ b/retroshare-gui/src/gui/NetworkDialog.h @@ -0,0 +1,88 @@ +/**************************************************************** + * RShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 _CONNECTIONSDIALOG_H +#define _CONNECTIONSDIALOG_H + +#include + +//#include + +#include "mainpage.h" +#include "ui_NetworkDialog.h" + +#include "connect/ConnectDialog.h" + + +class NetworkDialog : public MainPage +{ + Q_OBJECT + +public: + /** Default Constructor */ + NetworkDialog(QWidget *parent = 0); + /** Default Destructor */ + + void insertConnect(); + void showpeerdetails(std::string id); + +public slots: + std::string loadneighbour(); + /* void loadneighbour(); */ + +private slots: + + void showAuthDialog(); + + void peerdetails(); + /** Create the context popup menu and it's submenus */ + void connecttreeWidgetCostumPopupMenu( QPoint point ); + + /** Called when user clicks "Load Cert" to choose location of a Cert file */ + void loadcert(); + + void authneighbour(); + void addneighbour(); + +private: + + +QTreeWidgetItem *getCurrentNeighbour(); + + /** Define the popup menus for the Context menu */ + QMenu* contextMnu; + /** Defines the actions for the context menu */ + QAction* peerdetailsAct; + QAction* authAct; + QAction* loadcertAct; + + /* connection dialog */ + ConnectDialog *connectdialog; + + QTreeWidget *connecttreeWidget; + + /** Qt Designer generated object */ + Ui::NetworkDialog ui; +}; + +#endif + diff --git a/retroshare-gui/src/gui/NetworkDialog.ui b/retroshare-gui/src/gui/NetworkDialog.ui new file mode 100644 index 000000000..be97ae6c1 --- /dev/null +++ b/retroshare-gui/src/gui/NetworkDialog.ui @@ -0,0 +1,671 @@ + + NetworkDialog + + + + 0 + 0 + 510 + 289 + + + + + 7 + 7 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 192 + 192 + 192 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + 104 + 104 + 104 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 104 + 104 + 104 + + + + + + + 255 + 255 + 255 + + + + + + + 104 + 104 + 104 + + + + + + + 240 + 240 + 240 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + Arial + 10 + 50 + false + false + false + false + + + + true + + + Qt::NoContextMenu + + + + 1 + + + 1 + + + + + 0 + + + 0 + + + + + 0 + + + 6 + + + + + + + + :/images/network16.png + + + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + 7 + 7 + 0 + 0 + + + + + Arial + 8 + 50 + false + false + false + false + + + + Qt::CustomContextMenu + + + false + + + false + + + 0 + + + + 16 + 16 + + + + true + + + + # + + + + + Accept + + + + + Trust + + + + + Last Contact + + + + + Name + + + + + Peer Address + + + + + Organisation + + + + + Location + + + + + Country + + + + + Cert Id + + + + + Auth Code + + + + + + + + + + + + + diff --git a/retroshare-gui/src/gui/PeersDialog.cpp b/retroshare-gui/src/gui/PeersDialog.cpp new file mode 100644 index 000000000..6d2e588bd --- /dev/null +++ b/retroshare-gui/src/gui/PeersDialog.cpp @@ -0,0 +1,480 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006,2007 crypton + * + * 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 +#include +#include "common/vmessagebox.h" + +#include "rshare.h" +#include "PeersDialog.h" +#include "rsiface/rsiface.h" +#include "chat/PopupChatDialog.h" +#include "msgs/ChanMsgDialog.h" +#include "ChatDialog.h" +#include "connect/ConfCertDialog.h" + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + + +/* Images for context menu icons */ +#define IMAGE_REMOVEFRIEND ":/images/removefriend16.png" +#define IMAGE_EXPIORTFRIEND ":/images/exportpeers_16x16.png" +#define IMAGE_CHAT ":/images/chat.png" +#define IMAGE_MSG ":/images/message.png" +/* Images for Status icons */ +#define IMAGE_ONLINE ":/images/donline.png" +#define IMAGE_OFFLINE ":/images/dhidden.png" + +/** Constructor */ +PeersDialog::PeersDialog(QWidget *parent) +: MainPage(parent), chatDialog(NULL) +{ + /* Invoke the Qt Designer generated object setup routine */ + ui.setupUi(this); + + connect( ui.peertreeWidget, SIGNAL( customContextMenuRequested( QPoint ) ), this, SLOT( peertreeWidgetCostumPopupMenu( QPoint ) ) ); + + /* hide the Tree +/- */ + ui.peertreeWidget -> setRootIsDecorated( false ); + + /* Set header resize modes and initial section sizes */ + QHeaderView * _header = ui.peertreeWidget->header () ; + _header->setResizeMode (0, QHeaderView::Custom); + _header->setResizeMode (1, QHeaderView::Interactive); + _header->setResizeMode (2, QHeaderView::Interactive); + _header->setResizeMode (3, QHeaderView::Interactive); + _header->setResizeMode (4, QHeaderView::Interactive); + _header->setResizeMode (5, QHeaderView::Interactive); + _header->setResizeMode (6, QHeaderView::Interactive); + _header->setResizeMode (7, QHeaderView::Interactive); + _header->setResizeMode (8, QHeaderView::Interactive); + _header->setResizeMode (9, QHeaderView::Interactive); + _header->setResizeMode (10, QHeaderView::Interactive); + _header->setResizeMode (11, QHeaderView::Interactive); + + _header->resizeSection ( 0, 25 ); + _header->resizeSection ( 1, 100 ); + _header->resizeSection ( 2, 100 ); + _header->resizeSection ( 3, 100 ); + _header->resizeSection ( 4, 100 ); + _header->resizeSection ( 5, 200 ); + _header->resizeSection ( 6, 100 ); + _header->resizeSection ( 7, 100 ); + _header->resizeSection ( 8, 100 ); + _header->resizeSection ( 9, 100 ); + _header->resizeSection ( 10, 100 ); + + + /* Hide platform specific features */ +#ifdef Q_WS_WIN + +#endif +} + +void PeersDialog::setChatDialog(ChatDialog *cd) +{ + chatDialog = cd; +} + + +void PeersDialog::peertreeWidgetCostumPopupMenu( QPoint point ) +{ + + QMenu contextMnu( this ); + QMouseEvent *mevent = new QMouseEvent( QEvent::MouseButtonPress, point, Qt::RightButton, Qt::RightButton, Qt::NoModifier ); + + chatAct = new QAction(QIcon(IMAGE_CHAT), tr( "Chat" ), this ); + connect( chatAct , SIGNAL( triggered() ), this, SLOT( chatfriend() ) ); + + msgAct = new QAction(QIcon(IMAGE_MSG), tr( "Message Friend" ), this ); + connect( msgAct , SIGNAL( triggered() ), this, SLOT( msgfriend() ) ); + + connectfriendAct = new QAction( tr( "Connect To Friend" ), this ); + connect( connectfriendAct , SIGNAL( triggered() ), this, SLOT( connectfriend() ) ); + + configurefriendAct = new QAction( tr( "Configure Friend" ), this ); + connect( configurefriendAct , SIGNAL( triggered() ), this, SLOT( configurefriend() ) ); + + exportfriendAct = new QAction(QIcon(IMAGE_EXPIORTFRIEND), tr( "Export Friend" ), this ); + connect( exportfriendAct , SIGNAL( triggered() ), this, SLOT( exportfriend() ) ); + + removefriendAct = new QAction(QIcon(IMAGE_REMOVEFRIEND), tr( "Remove Friend" ), this ); + connect( removefriendAct , SIGNAL( triggered() ), this, SLOT( removefriend() ) ); + + + contextMnu.clear(); + contextMnu.addAction( chatAct); + contextMnu.addAction( msgAct); + contextMnu.addSeparator(); + contextMnu.addAction( connectfriendAct); + contextMnu.addSeparator(); + contextMnu.addAction( configurefriendAct); + contextMnu.addAction( exportfriendAct); + contextMnu.addAction( removefriendAct); + contextMnu.exec( mevent->globalPos() ); +} + + + +/* get the list of peers from the RsIface. */ +void PeersDialog::insertPeers() +{ + rsiface->lockData(); /* Lock Interface */ + + std::map::const_iterator it; + const std::map &friends = + rsiface->getFriendMap(); + + /* get a link to the table */ + QTreeWidget *peerWidget = ui.peertreeWidget; + QTreeWidgetItem *oldSelect = getCurrentPeer(); + QTreeWidgetItem *newSelect = NULL; + std::string oldId; + if (oldSelect) + { + oldId = (oldSelect -> text(10)).toStdString(); + } + + /* remove old items ??? */ + peerWidget->clear(); + peerWidget->setColumnCount(12); + + + + QList items; + for(it = friends.begin(); it != friends.end(); it++) + { + /* make a widget per friend */ + QTreeWidgetItem *item = new QTreeWidgetItem((QTreeWidget*)0); + + /* add all the labels */ + /* First 5 (1-5) Key Items */ + /* () Status Icon */ + item -> setText(0, ""); + + /* (0) Status */ + item -> setText(1, QString::fromStdString( + it->second.statusString)); + + /* (1) Person */ + item -> setText(2, QString::fromStdString(it->second.name)); + + /* (2) Auto Connect */ + item -> setText(3, QString::fromStdString( + it->second.connectString)); + + /* (3) Trust Level */ + item -> setText(4, QString::fromStdString(it->second.trustString)); + /* (4) Peer Address */ + item -> setText(5, QString::fromStdString(it->second.peerAddress)); + + /* less important ones */ + /* () Last Contact */ + item -> setText(6, QString::fromStdString(it->second.lastConnect)); + + /* () Org */ + item -> setText(7, QString::fromStdString(it->second.org)); + /* () Location */ + item -> setText(8, QString::fromStdString(it->second.loc)); + /* () Country */ + item -> setText(9, QString::fromStdString(it->second.country)); + + + /* Hidden ones: */ + /* () RsCertId */ + { + std::ostringstream out; + out << it -> second.id; + item -> setText(10, QString::fromStdString(out.str())); + if ((oldSelect) && (oldId == out.str())) + { + newSelect = item; + } + } + + /* () AuthCode */ + item -> setText(11, QString::fromStdString(it->second.authCode)); + + /* change background */ + int i; + if (it->second.statusString == "Online") + { + /* bright green */ + for(i = 1; i < 12; i++) + { + item -> setBackground(i,QBrush(Qt::green)); + item -> setIcon(0,(QIcon(IMAGE_ONLINE))); + } + } + else + { + if (it->second.lastConnect != "Never") + { + for(i = 1; i < 12; i++) + { + item -> setBackground(i,QBrush(Qt::lightGray)); + item -> setIcon(0,(QIcon(IMAGE_OFFLINE))); + } + } + else + { + for(i = 1; i < 12; i++) + { + item -> setBackground(i,QBrush(Qt::gray)); + item -> setIcon(0,(QIcon(IMAGE_OFFLINE))); + } + } + } + + + + /* add to the list */ + items.append(item); + } + + /* add the items in! */ + peerWidget->insertTopLevelItems(0, items); + if (newSelect) + { + peerWidget->setCurrentItem(newSelect); + } + + + rsiface->unlockData(); /* UnLock Interface */ + + peerWidget->update(); /* update display */ +} + +/* Utility Fns */ +std::string getPeerRsCertId(QTreeWidgetItem *i) +{ + std::string id = (i -> text(10)).toStdString(); + return id; +} + +/** Open a QFileDialog to browse for export a file. */ +void PeersDialog::exportfriend() +{ + QTreeWidgetItem *c = getCurrentPeer(); + std::cerr << "PeersDialog::exportfriend()" << std::endl; + if (!c) + { + std::cerr << "PeersDialog::exportfriend() Noone Selected -- sorry" << std::endl; + return; + } + + std::string id = getPeerRsCertId(c); + QString fileName = QFileDialog::getSaveFileName(this, tr("Save Certificate"), "", + tr("Certificates (*.pqi)")); + + std::string file = fileName.toStdString(); + if (file != "") + { + std::cerr << "PeersDialog::exportfriend() Saving to: " << file << std::endl; + std::cerr << std::endl; + rsicontrol->FriendSaveCertificate(id, file); + } + +} + +void PeersDialog::chatfriend() +{ + QTreeWidgetItem *i = getCurrentPeer(); + + if (!i) + return; + + std::string status = (i -> text(1)).toStdString(); + std::string name = (i -> text(2)).toStdString(); + std::string id = (i -> text(10)).toStdString(); + + if (status != "Online") + { + /* info dialog */ + QMessageBox::StandardButton sb = QMessageBox::question ( NULL, + "Friend Not Online", + "Your Friend is offline \nDo you want to send them a Message instead", + (QMessageBox::Yes | QMessageBox::No)); + if (sb == QMessageBox::Yes) + { + msgfriend(); + } + return; + } + + /* must reference ChatDialog */ + if (chatDialog) + { + chatDialog->getPrivateChat(id, name, true); + } +} + +void PeersDialog::msgfriend() +{ + std::cerr << "SharedFilesDialog::msgfriend()" << std::endl; + + QTreeWidgetItem *i = getCurrentPeer(); + + if (!i) + return; + + std::string status = (i -> text(1)).toStdString(); + std::string name = (i -> text(2)).toStdString(); + std::string id = (i -> text(10)).toStdString(); + + rsicontrol -> ClearInMsg(); + rsicontrol -> SetInMsg(id, true); + + /* create a message */ + ChanMsgDialog *nMsgDialog = new ChanMsgDialog(true); + + nMsgDialog->newMsg(); + nMsgDialog->show(); +} + + +QTreeWidgetItem *PeersDialog::getCurrentPeer() +{ + /* get the current, and extract the Id */ + + /* get a link to the table */ + QTreeWidget *peerWidget = ui.peertreeWidget; + QTreeWidgetItem *item = peerWidget -> currentItem(); + if (!item) + { + std::cerr << "Invalid Current Item" << std::endl; + return NULL; + } + + /* 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(); + return item; +} + +/* So from the Peers Dialog we can call the following control Functions: + * (1) Remove Current. FriendRemove(id) + * (2) Allow/DisAllow. FriendStatus(id, accept) + * (2) Connect. FriendConnectAttempt(id, accept) + * (3) Set Address. FriendSetAddress(id, str, port) + * (4) Set Trust. FriendTrustSignature(id, bool) + * (5) Configure (GUI Only) -> 3/4 + * + * All of these rely on the finding of the current Id. + */ + + +void PeersDialog::removefriend() +{ + QTreeWidgetItem *c = getCurrentPeer(); + std::cerr << "PeersDialog::removefriend()" << std::endl; + if (!c) + { + std::cerr << "PeersDialog::removefriend() Noone Selected -- sorry" << std::endl; + return; + } + rsicontrol->FriendRemove(getPeerRsCertId(c)); +} + + +void PeersDialog::allowfriend() +{ + QTreeWidgetItem *c = getCurrentPeer(); + std::cerr << "PeersDialog::allowfriend()" << std::endl; + /* + bool accept = true; + rsServer->FriendStatus(getPeerRsCertId(c), accept); + */ +} + + +void PeersDialog::connectfriend() +{ + QTreeWidgetItem *c = getCurrentPeer(); + std::cerr << "PeersDialog::connectfriend()" << std::endl; + rsicontrol->FriendConnectAttempt(getPeerRsCertId(c)); +} + +void PeersDialog::setaddressfriend() +{ + QTreeWidgetItem *c = getCurrentPeer(); + std::cerr << "PeersDialog::setaddressfriend()" << std::endl; + + /* need to get the input address / port */ + /* + std::string addr; + unsigned short port; + rsServer->FriendSetAddress(getPeerRsCertId(c), addr, port); + */ +} + +void PeersDialog::trustfriend() +{ + QTreeWidgetItem *c = getCurrentPeer(); + std::cerr << "PeersDialog::trustfriend()" << std::endl; + /* + bool trust = true; + rsServer->FriendTrust(getPeerRsCertId(c), trust); + */ +} + + + +/* GUI stuff -> don't do anything directly with Control */ +void PeersDialog::configurefriend() +{ + /* display Dialog */ + std::cerr << "PeersDialog::configurefriend()" << std::endl; + QTreeWidgetItem *c = getCurrentPeer(); + + + static ConfCertDialog *confdialog = new ConfCertDialog(); + + + if (!c) + return; + + /* set the Id */ + std::string id = getPeerRsCertId(c); + + confdialog -> loadId(id); + confdialog -> show(); +} + + + diff --git a/retroshare-gui/src/gui/PeersDialog.h b/retroshare-gui/src/gui/PeersDialog.h new file mode 100644 index 000000000..752232433 --- /dev/null +++ b/retroshare-gui/src/gui/PeersDialog.h @@ -0,0 +1,101 @@ +/**************************************************************** + * RShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 _PEERSDIALOG_H +#define _PEERSDIALOG_H + +#include + +//#include + +#include "mainpage.h" +#include "ui_PeersDialog.h" + + +class ChatDialog; + +class PeersDialog : public MainPage +{ + Q_OBJECT + +public: + /** Default Constructor */ + PeersDialog(QWidget *parent = 0); + /** Default Destructor */ + + void insertPeers(); + + void setChatDialog(ChatDialog *cd); + + + + +private slots: + + /** Create the context popup menu and it's submenus */ + void peertreeWidgetCostumPopupMenu( QPoint point ); + + /** Export friend in Friends Dialog */ + void exportfriend(); + /** Remove friend */ + void removefriend(); + /** start a chat with a friend **/ + void chatfriend(); + void msgfriend(); + + void configurefriend(); + + /** RsServer Friend Calls */ + void allowfriend(); + void connectfriend(); + void setaddressfriend(); + void trustfriend(); + + +private: + + /* Worker Functions */ + /* (1) Update Display */ + + /* (2) Utility Fns */ + QTreeWidgetItem *getCurrentPeer(); + + ChatDialog *chatDialog; + + + /** Define the popup menus for the Context menu */ + QMenu* contextMnu; + /** Defines the actions for the context menu */ + QAction* chatAct; + QAction* msgAct; + QAction* connectfriendAct; + QAction* configurefriendAct; + QAction* exportfriendAct; + QAction* removefriendAct; + + QTreeWidget *peertreeWidget; + + /** Qt Designer generated object */ + Ui::PeersDialog ui; +}; + +#endif + diff --git a/retroshare-gui/src/gui/PeersDialog.ui b/retroshare-gui/src/gui/PeersDialog.ui new file mode 100644 index 000000000..6572e7210 --- /dev/null +++ b/retroshare-gui/src/gui/PeersDialog.ui @@ -0,0 +1,643 @@ + + PeersDialog + + + + 0 + 0 + 436 + 261 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 192 + 192 + 192 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + 104 + 104 + 104 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 104 + 104 + 104 + + + + + + + 255 + 255 + 255 + + + + + + + 104 + 104 + 104 + + + + + + + 240 + 240 + 240 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + Arial + 8 + 50 + false + false + false + false + + + + Qt::NoContextMenu + + + + 1 + + + 1 + + + + + 0 + + + 0 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + 0 + + + 6 + + + + + + + + :/images/peers_16x16.png + + + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Friends</span></p></body></html> + + + + + + + + + Qt::CustomContextMenu + + + false + + + + 16 + 16 + + + + true + + + true + + + + # + + + + + Status + + + + + Person + + + + + Auto Connect + + + + + Trust Level + + + + + Peer Address + + + + + Last Contact + + + + + Organisation + + + + + Location + + + + + Country + + + + + Person Id + + + + + Auth Code + + + + + + + + + + + + + diff --git a/retroshare-gui/src/gui/Preferences/ConfirmQuitDialog.cpp b/retroshare-gui/src/gui/Preferences/ConfirmQuitDialog.cpp new file mode 100644 index 000000000..0a2aa9dbc --- /dev/null +++ b/retroshare-gui/src/gui/Preferences/ConfirmQuitDialog.cpp @@ -0,0 +1,26 @@ +/**************************************************************** +* RetroShare is distributed under the following license: +* +* Copyright (C) 2006, 2007 The RetroShare Team +* +* 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 "ConfirmQuitDialog.h" + +ConfirmQuitDialog::ConfirmQuitDialog(QWidget * parent) : QDialog(parent) +{ + setupUi(this); +} diff --git a/retroshare-gui/src/gui/Preferences/ConfirmQuitDialog.h b/retroshare-gui/src/gui/Preferences/ConfirmQuitDialog.h new file mode 100644 index 000000000..59504033f --- /dev/null +++ b/retroshare-gui/src/gui/Preferences/ConfirmQuitDialog.h @@ -0,0 +1,37 @@ +/**************************************************************** +* RetroShare is distributed under the following license: +* +* Copyright (C) 2006, 2007 The RetroShare Team +* +* 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 _ConfirmQuitDialog_h +#define _ConfirmQuitDialog_h_ + +#include +#include "ui_ConfirmQuitDialog.h" + +class ConfirmQuitDialog : public QDialog, public Ui::ConfirmQuitDialog +{ + Q_OBJECT + public: + ConfirmQuitDialog(QWidget * parent = 0); + + private slots: + +}; + +#endif diff --git a/retroshare-gui/src/gui/Preferences/ConfirmQuitDialog.ui b/retroshare-gui/src/gui/Preferences/ConfirmQuitDialog.ui new file mode 100644 index 000000000..a0525c91b --- /dev/null +++ b/retroshare-gui/src/gui/Preferences/ConfirmQuitDialog.ui @@ -0,0 +1,237 @@ + + ConfirmQuitDialog + + + + 0 + 0 + 500 + 160 + + + + + 1 + 1 + 0 + 0 + + + + + 500 + 160 + + + + Exit RetroShare + + + :/images/RetroShare16.png + + + true + + + + + 0 + 0 + 500 + 155 + + + + + 0 + + + 6 + + + + + 0 + + + 6 + + + + + 5 + + + 6 + + + + + + 0 + 0 + 0 + 0 + + + + + 48 + 48 + + + + true + + + + + + :/images/informations_24x24.png + + + true + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + Qt::ApplicationModal + + + + 200 + 50 + + + + true + + + You are about to exit the RetroShare application and therefore stop all transfers. <br><br>Are you sure you want to stop and exit RetroShare? + + + Qt::AutoText + + + false + + + Qt::AlignJustify|Qt::AlignTop + + + true + + + 6 + + + + + + + + + 5 + + + 6 + + + + + + 0 + 0 + + + + Do not show this message again. + + + + + + + Qt::Horizontal + + + + 80 + 20 + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::No|QDialogButtonBox::NoButton|QDialogButtonBox::Yes + + + + + + + + + + + + + + buttonBox + accepted() + ConfirmQuitDialog + accept() + + + 462 + 160 + + + 157 + 274 + + + + + buttonBox + rejected() + ConfirmQuitDialog + reject() + + + 462 + 160 + + + 286 + 274 + + + + + diff --git a/retroshare-gui/src/gui/Preferences/CryptographyDialog.cpp b/retroshare-gui/src/gui/Preferences/CryptographyDialog.cpp new file mode 100644 index 000000000..854391b17 --- /dev/null +++ b/retroshare-gui/src/gui/Preferences/CryptographyDialog.cpp @@ -0,0 +1,56 @@ +/**************************************************************** + * RShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 +#include "CryptographyDialog.h" + + +/** Constructor */ +CryptographyDialog::CryptographyDialog(QWidget *parent) +: ConfigPage(parent) +{ + /* Invoke the Qt Designer generated object setup routine */ + ui.setupUi(this); + + /* Create RshareSettings object */ + _settings = new RshareSettings(); + + /* Hide platform specific features */ +#ifdef Q_WS_WIN + +#endif +} + +/** Saves the changes on this page */ +bool +CryptographyDialog::save(QString &errmsg) +{ + +} + +/** Loads the settings for this page */ +void +CryptographyDialog::load() +{ + +} + diff --git a/retroshare-gui/src/gui/Preferences/CryptographyDialog.h b/retroshare-gui/src/gui/Preferences/CryptographyDialog.h new file mode 100644 index 000000000..74a45bae6 --- /dev/null +++ b/retroshare-gui/src/gui/Preferences/CryptographyDialog.h @@ -0,0 +1,58 @@ +/**************************************************************** + * RShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 _CRYPTOGRAPHYDIALOG_H +#define _CRYPTOGRAPHYDIALOG_H + +#include + +#include + +#include "configpage.h" +#include "ui_CryptographyDialog.h" + +class CryptographyDialog : public ConfigPage +{ + Q_OBJECT + +public: + /** Default Constructor */ + CryptographyDialog(QWidget *parent = 0); + /** Default Destructor */ + + /** Saves the changes on this page */ + bool save(QString &errmsg); + /** Loads the settings for this page */ + void load(); + +private slots: + + +private: + /** A RshareSettings object used for saving/loading settings */ + RshareSettings* _settings; + + /** Qt Designer generated object */ + Ui::CryptographyDialog ui; +}; + +#endif + diff --git a/retroshare-gui/src/gui/Preferences/CryptographyDialog.ui b/retroshare-gui/src/gui/Preferences/CryptographyDialog.ui new file mode 100644 index 000000000..32dc36e96 --- /dev/null +++ b/retroshare-gui/src/gui/Preferences/CryptographyDialog.ui @@ -0,0 +1,938 @@ + + CryptographyDialog + + + + 0 + 0 + 617 + 332 + + + + + 7 + 7 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 192 + 192 + 192 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + 104 + 104 + 104 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 104 + 104 + 104 + + + + + + + 255 + 255 + 255 + + + + + + + 104 + 104 + 104 + + + + + + + 240 + 240 + 240 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + Arial + 8 + 50 + false + false + false + false + + + + Qt::NoContextMenu + + + + + 0 + 0 + 611 + 51 + + + + RSA Key Size + + + + + 10 + 20 + 54 + 25 + + + + Key Size: + + + + + + 120 + 20 + 481 + 23 + + + + 16384 + + + 384 + + + 1024 + + + + + + + 0 + 200 + 611 + 51 + + + + Rijndael Mode + + + + + 120 + 20 + 83 + 18 + + + + CBC + + + + + + 210 + 20 + 71 + 18 + + + + ECB + + + + + + 300 + 20 + 83 + 18 + + + + CFB + + + + + + 10 + 20 + 61 + 25 + + + + Mode: + + + + + + + 0 + 250 + 611 + 51 + + + + Rijndael Padding + + + + + 120 + 20 + 83 + 18 + + + + PKCS7 + + + + + + 210 + 20 + 83 + 18 + + + + Zeros + + + + + + 300 + 20 + 83 + 18 + + + + ANSIX923 + + + + + + 400 + 20 + 83 + 18 + + + + ISO10126 + + + + + + 10 + 20 + 61 + 25 + + + + Padding: + + + + + + + 0 + 100 + 611 + 51 + + + + Rijndael Feedback Size + + + + + 120 + 20 + 83 + 18 + + + + 128 Bits + + + + + + 210 + 20 + 83 + 18 + + + + 192 Bits + + + + + + 300 + 20 + 83 + 18 + + + + 256 Bits + + + + + + 10 + 20 + 82 + 25 + + + + Feedback Size: + + + + + + + 0 + 50 + 611 + 51 + + + + Rijndael Block size + + + + + 120 + 20 + 83 + 18 + + + + 128 Bits + + + + + + 230 + 50 + 83 + 18 + + + + 192 Bits + + + + + + 240 + 60 + 83 + 18 + + + + 192 Bits + + + + + + 210 + 20 + 83 + 18 + + + + 192 Bits + + + + + + 300 + 20 + 83 + 18 + + + + 256 Bits + + + + + + 10 + 20 + 61 + 25 + + + + Block Size: + + + + + + + 0 + 150 + 611 + 51 + + + + Rijndael Key Size + + + + + 120 + 20 + 83 + 18 + + + + 128 Bits + + + + + + 300 + 20 + 83 + 18 + + + + 256 Bits + + + + + + 210 + 20 + 83 + 18 + + + + 192 Bits + + + + + + 10 + 20 + 54 + 25 + + + + Key Size: + + + + + + spinBoxkeysize + radioButton + radioButton_4 + radioButton_9 + radioButton_2 + radioButton_5 + radioButton_10 + radioButton_3 + radioButton_6 + radioButton_11 + radioButton_12 + radioButton_13 + radioButton_14 + radioButton_15 + radioButton_16 + radioButton_17 + radioButton_18 + radioButton_8 + radioButton_7 + + + + + + diff --git a/retroshare-gui/src/gui/Preferences/DirectoriesDialog.cpp b/retroshare-gui/src/gui/Preferences/DirectoriesDialog.cpp new file mode 100644 index 000000000..1bd708d7c --- /dev/null +++ b/retroshare-gui/src/gui/Preferences/DirectoriesDialog.cpp @@ -0,0 +1,130 @@ +/**************************************************************** + * RShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 +#include "rsiface/rsiface.h" +#include "DirectoriesDialog.h" + + +/** Constructor */ +DirectoriesDialog::DirectoriesDialog(QWidget *parent) +: ConfigPage(parent) +{ + /* Invoke the Qt Designer generated object setup routine */ + ui.setupUi(this); + + /* Create RshareSettings object */ + _settings = new RshareSettings(); + + connect(ui.addButton, SIGNAL(clicked( bool ) ), this , SLOT( addShareDirectory() ) ); + connect(ui.removeButton, SIGNAL(clicked( bool ) ), this , SLOT( removeShareDirectory() ) ); + connect(ui.incomingButton, SIGNAL(clicked( bool ) ), this , SLOT( setIncomingDirectory() ) ); + + /* Hide platform specific features */ +#ifdef Q_WS_WIN + +#endif +} + +/** Saves the changes on this page */ +bool +DirectoriesDialog::save(QString &errmsg) +{ + + return true; +} + +/** Loads the settings for this page */ +void DirectoriesDialog::load() +{ + + /* get the shared directories */ + rsiface->lockData(); /* Lock Interface */ + + std::list::const_iterator it; + const std::list &dirs = rsiface->getConfig().sharedDirList; + + /* get a link to the table */ + QListWidget *listWidget = ui.dirList; + + /* remove old items ??? */ + listWidget->clear(); + + for(it = dirs.begin(); it != dirs.end(); it++) + { + /* (0) Dir Name */ + listWidget->addItem(QString::fromStdString(*it)); + } + + ui.incomingDir->setText(QString::fromStdString(rsiface->getConfig().incomingDir)); + + rsiface->unlockData(); /* UnLock Interface */ + + listWidget->update(); /* update display */ + + +} + +void DirectoriesDialog::addShareDirectory() +{ + + /* select a dir + */ + QString qdir = QFileDialog::getExistingDirectory(this, tr("Add Shared Directory"), "", + QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); + + /* add it to the server */ + std::string dir = qdir.toStdString(); + if (dir != "") + { + rsicontrol -> ConfigAddSharedDir(dir); + load(); + } +} + +void DirectoriesDialog::removeShareDirectory() +{ + /* id current dir */ + /* ask for removal */ + QListWidget *listWidget = ui.dirList; + QListWidgetItem *qdir = listWidget -> currentItem(); + if (qdir) + { + rsicontrol -> ConfigRemoveSharedDir( qdir->text().toStdString()); + load(); + } +} + +void DirectoriesDialog::setIncomingDirectory() +{ + QString qdir = QFileDialog::getExistingDirectory(this, tr("Add Shared Directory"), "", + QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); + + std::string dir = qdir.toStdString(); + if (dir != "") + { + rsicontrol->ConfigSetIncomingDir(dir); + } + load(); +} + + diff --git a/retroshare-gui/src/gui/Preferences/DirectoriesDialog.h b/retroshare-gui/src/gui/Preferences/DirectoriesDialog.h new file mode 100644 index 000000000..14e380edf --- /dev/null +++ b/retroshare-gui/src/gui/Preferences/DirectoriesDialog.h @@ -0,0 +1,61 @@ +/**************************************************************** + * RShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 _DIRECTORIESDIALOG_H +#define _DIRECTORIESDIALOG_H + +#include + +#include + +#include "configpage.h" +#include "ui_DirectoriesDialog.h" + +class DirectoriesDialog : public ConfigPage +{ + Q_OBJECT + +public: + /** Default Constructor */ + DirectoriesDialog(QWidget *parent = 0); + /** Default Destructor */ + + /** Saves the changes on this page */ + bool save(QString &errmsg); + /** Loads the settings for this page */ + void load(); + +private slots: + + void addShareDirectory(); + void removeShareDirectory(); + void setIncomingDirectory(); + +private: + /** A RshareSettings object used for saving/loading settings */ + RshareSettings* _settings; + + /** Qt Designer generated object */ + Ui::DirectoriesDialog ui; +}; + +#endif + diff --git a/retroshare-gui/src/gui/Preferences/DirectoriesDialog.ui b/retroshare-gui/src/gui/Preferences/DirectoriesDialog.ui new file mode 100644 index 000000000..46d505a2a --- /dev/null +++ b/retroshare-gui/src/gui/Preferences/DirectoriesDialog.ui @@ -0,0 +1,682 @@ + + DirectoriesDialog + + + + 0 + 0 + 470 + 313 + + + + + 7 + 7 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 192 + 192 + 192 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + 104 + 104 + 104 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 104 + 104 + 104 + + + + + + + 255 + 255 + 255 + + + + + + + 104 + 104 + 104 + + + + + + + 240 + 240 + 240 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + Arial + 10 + 50 + false + false + false + false + + + + true + + + Qt::NoContextMenu + + + + + 0 + 200 + 441 + 81 + + + + Other Directories + + + + + 10 + 30 + 421 + 34 + + + + + 0 + + + 6 + + + + + true + + + + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Incoming Files</span></p></body></html> + + + + + + + + 31 + 31 + + + + + 31 + 31 + + + + + + + :/images/directoryselect_24x24_shadow.png + + + + 24 + 24 + + + + + + + + + + + 0 + 0 + 441 + 200 + + + + Shared Directories + + + + + 10 + 20 + 381 + 171 + + + + + + + 400 + 20 + 34 + 34 + + + + + 34 + 34 + + + + + 34 + 34 + + + + + + + :/images/directoryadd_24x24_shadow.png + + + + 24 + 24 + + + + + + + 400 + 60 + 34 + 34 + + + + + 34 + 34 + + + + + 34 + 34 + + + + + + + :/images/directoryremove_24x24_shadow.png + + + + 24 + 24 + + + + + + + incomingDir + incomingButton + dirList + addButton + removeButton + + + + + + diff --git a/retroshare-gui/src/gui/Preferences/GeneralDialog.cpp b/retroshare-gui/src/gui/Preferences/GeneralDialog.cpp new file mode 100644 index 000000000..d0d4520fb --- /dev/null +++ b/retroshare-gui/src/gui/Preferences/GeneralDialog.cpp @@ -0,0 +1,114 @@ +/**************************************************************** + * RShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 "rshare.h" +#include "GeneralDialog.h" + + +/** Constructor */ +GeneralDialog::GeneralDialog(QWidget *parent) +: ConfigPage(parent) +{ + /* Invoke the Qt Designer generated object setup routine */ + ui.setupUi(this); + + /* Create RshareSettings object */ + _settings = new RshareSettings(); + + connect(ui.styleSheetCombo, SIGNAL(clicked()), this, SLOT(loadStyleSheet())); + + /* Populate combo boxes */ + foreach (QString code, LanguageSupport::languageCodes()) { + ui.cmboLanguage->addItem(QIcon(":/images/flags/" + code + ".png"), + LanguageSupport::languageName(code), + code); + } + foreach (QString style, QStyleFactory::keys()) { + ui.cmboStyle->addItem(style, style.toLower()); + } + + ui.styleSheetCombo->setCurrentIndex(ui.styleSheetCombo->findText("Default")); + loadStyleSheet("Default"); + loadqss(); + +} + +/** Destructor */ +GeneralDialog::~GeneralDialog() +{ + delete _settings; +} + +/** Saves the changes on this page */ +bool +GeneralDialog::save(QString &errmsg) +{ + Q_UNUSED(errmsg); + QString languageCode = + LanguageSupport::languageCode(ui.cmboLanguage->currentText()); + + _settings->setLanguageCode(languageCode); + _settings->setInterfaceStyle(ui.cmboStyle->currentText()); + + /* Set to new style */ + Rshare::setStyle(ui.cmboStyle->currentText()); + return true; +} + +/** Loads the settings for this page */ +void +GeneralDialog::load() +{ + int index = ui.cmboLanguage->findData(_settings->getLanguageCode()); + ui.cmboLanguage->setCurrentIndex(index); + + index = ui.cmboStyle->findData(Rshare::style().toLower()); + ui.cmboStyle->setCurrentIndex(index); +} + +void GeneralDialog::on_styleSheetCombo_activated(const QString &sheetName) +{ + loadStyleSheet(sheetName); +} + +void GeneralDialog::loadStyleSheet(const QString &sheetName) +{ + //QFile file(":/qss/" + sheetName.toLower() + ".qss"); + QFile file(QApplication::applicationDirPath() + "/qss/" + sheetName.toLower() + ".qss"); + file.open(QFile::ReadOnly); + QString styleSheet = QLatin1String(file.readAll()); + + + qApp->setStyleSheet(styleSheet); + +} + +void GeneralDialog::loadqss() +{ + + QFileInfoList slist = QDir(QApplication::applicationDirPath() + "/qss/").entryInfoList(); + foreach(QFileInfo st, slist) + { + if(st.fileName() != "." && st.fileName() != ".." && st.isFile()) + ui.styleSheetCombo->addItem(st.fileName().remove(".qss")); + } + +} diff --git a/retroshare-gui/src/gui/Preferences/GeneralDialog.h b/retroshare-gui/src/gui/Preferences/GeneralDialog.h new file mode 100644 index 000000000..d9a77affc --- /dev/null +++ b/retroshare-gui/src/gui/Preferences/GeneralDialog.h @@ -0,0 +1,67 @@ +/**************************************************************** + * RShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 _GENERALDIALOG_H +#define _GENERALDIALOG_H +#include +#include +#include +#include + +#include +#include + +#include "configpage.h" +#include "ui_GeneralDialog.h" + +class GeneralDialog : public ConfigPage +{ + Q_OBJECT + +public: + /** Default Constructor */ + GeneralDialog(QWidget *parent = 0); + /** Default Destructor */ + ~GeneralDialog(); + /** Saves the changes on this page */ + bool save(QString &errmsg); + /** Loads the settings for this page */ + void load(); + + +private slots: + + void on_styleSheetCombo_activated(const QString &styleSheetName); + + +private: + /** A VidaliaSettings object used for saving/loading settings */ + RshareSettings* _settings; + + void loadStyleSheet(const QString &sheetName); + void loadqss(); + + /** Qt Designer generated object */ + Ui::GeneralDialog ui; +}; + +#endif + diff --git a/retroshare-gui/src/gui/Preferences/GeneralDialog.ui b/retroshare-gui/src/gui/Preferences/GeneralDialog.ui new file mode 100644 index 000000000..534b7ef73 --- /dev/null +++ b/retroshare-gui/src/gui/Preferences/GeneralDialog.ui @@ -0,0 +1,749 @@ + + GeneralDialog + + + + 0 + 0 + 466 + 405 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 192 + 192 + 192 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + 104 + 104 + 104 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 104 + 104 + 104 + + + + + + + 255 + 255 + 255 + + + + + + + 104 + 104 + 104 + + + + + + + 240 + 240 + 240 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + Arial + 10 + 50 + false + false + false + false + + + + Qt::NoContextMenu + + + + + 0 + 80 + 441 + 55 + + + + Qt::NoContextMenu + + + + + + Style + + + + + 10 + 24 + 341 + 26 + + + + + 0 + + + 6 + + + + + + 150 + 0 + + + + Qt::NoContextMenu + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose RetroShare's interface style</p></body></html> + + + false + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + 0 + 0 + 441 + 75 + + + + Qt::NoContextMenu + + + Language + + + + + 10 + 44 + 341 + 26 + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + + 300 + 16 + + + + + + + + + 150 + 0 + + + + Qt::NoContextMenu + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose the language used in RetroShare</p></body></html> + + + false + + + + 24 + 16 + + + + + + + + + + 10 + 27 + 591 + 17 + + + + Qt::NoContextMenu + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + + + + + + + 0 + 140 + 441 + 61 + + + + Style Sheet + + + + + 11 + 20 + 341 + 25 + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + + 181 + 20 + + + + + + + + + 150 + 0 + + + + + + + + + + + 0 + 210 + 441 + 61 + + + + Login + + + + + 10 + 20 + 151 + 31 + + + + Remove Auto Login + + + + + + cmboLanguage + cmboStyle + styleSheetCombo + autoButton + + + + + + diff --git a/retroshare-gui/src/gui/Preferences/LogDialog.cpp b/retroshare-gui/src/gui/Preferences/LogDialog.cpp new file mode 100644 index 000000000..1ab0801ee --- /dev/null +++ b/retroshare-gui/src/gui/Preferences/LogDialog.cpp @@ -0,0 +1,58 @@ +/**************************************************************** + * RShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 +#include "LogDialog.h" + + +/** Constructor */ +LogDialog::LogDialog(QWidget *parent) +: ConfigPage(parent) +{ + /* Invoke the Qt Designer generated object setup routine */ + ui.setupUi(this); + + /* Create RshareSettings object */ + _settings = new RshareSettings(); + + /* Hide platform specific features */ +#ifdef Q_WS_WIN + +#endif +} + +/** Saves the changes on this page */ +bool +LogDialog::save(QString &errmsg) +{ + + return true; +} + + + +/** Loads the settings for this page */ +void +LogDialog::load() +{ + +} diff --git a/retroshare-gui/src/gui/Preferences/LogDialog.h b/retroshare-gui/src/gui/Preferences/LogDialog.h new file mode 100644 index 000000000..7aa0d893d --- /dev/null +++ b/retroshare-gui/src/gui/Preferences/LogDialog.h @@ -0,0 +1,58 @@ +/**************************************************************** + * RShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 _LOGDIALOG_H +#define _LOGDIALOG_H + +#include + +#include + +#include "configpage.h" +#include "ui_LogDialog.h" + +class LogDialog : public ConfigPage +{ + Q_OBJECT + +public: + /** Default Constructor */ + LogDialog(QWidget *parent = 0); + /** Default Destructor */ + + /** Saves the changes on this page */ + bool save(QString &errmsg); + /** Loads the settings for this page */ + void load(); + +private slots: + + +private: + /** A RshareSettings object used for saving/loading settings */ + RshareSettings* _settings; + + /** Qt Designer generated object */ + Ui::LogDialog ui; +}; + +#endif + diff --git a/retroshare-gui/src/gui/Preferences/LogDialog.ui b/retroshare-gui/src/gui/Preferences/LogDialog.ui new file mode 100644 index 000000000..83771dd02 --- /dev/null +++ b/retroshare-gui/src/gui/Preferences/LogDialog.ui @@ -0,0 +1,732 @@ + + LogDialog + + + + 0 + 0 + 440 + 311 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 192 + 192 + 192 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + 104 + 104 + 104 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 104 + 104 + 104 + + + + + + + 255 + 255 + 255 + + + + + + + 104 + 104 + 104 + + + + + + + 240 + 240 + 240 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + Arial + 8 + 50 + false + false + false + false + + + + Qt::NoContextMenu + + + + + 0 + 0 + 441 + 311 + + + + true + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> + +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="ABOUT"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">About RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShare is a private peer to peer communication platform created by Dr. Bob.This program enables you to securely share files and chat with your friends (and no-one else!).</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, and the latest release go to http://www.lunamutt.com.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="START"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Quick Start Guide to RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If this is your first time using Retroshare, it is recommended that you readthis guide for instructions on how to get started. The first step is:<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Connecting to Your Friends</span></a>. Once you have managed this you can <a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">Download Files</span></a> and<a href="#START-SHARE"><span style=" text-decoration: underline; color:#0000ff;">Share with Others</span></a></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Some of the key concepts related to ensuring your sharing remains private aredescribed in the <a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">Frequently Asked Questions</span></a>. Some Key security questions are:<a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">What is a Web of Trust?</span></a>, <a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">Should I Sign this Certificate?</span></a>, and finally<a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">What does "Trust" Mean?</span></a>.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is also worthwhile reading the <a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">GUI Overview</span></a>which describes the featureson available through the User Interface.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Connecting to your Friends </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">There are four steps to connecting to a Friend:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"> </p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Get Friend's Certificate </li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Load Certificate </li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Sign Certificate </li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect to Friend.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The instructions might initially appear long and daunting, however thesesteps are required to ensure that your sharing is private and secure.These steps are only required a couple of times, to add new friends, and become quite straight forward after the first time.</p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (1) EXCHANGE CERTIFICATES </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Before you can connect, you need send your certificate to your friend, and get your friends certificate. Follow these steps to get your certificate:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"> </p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab </li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on Your Certificate to Select it. </li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on the "Export Friend" Button to bring up a file save dialog. </li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select directory to save the certificate to. </li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Enter desired filename. (with a file type of .pqi), and Click OK. </li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Email this File to your Friend. (It is recommended you put the certificate in a zip file before sending, as some email programs don't transmit the file correctly). </li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Ask your friend to do the same. </li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Once you have received your friend's certificate, removed it from the zip file and saved it to disk, you can proceed to step (2).</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Note: This exchange of certificates is only necessary to get you started.Once you are connected to some friends the exchange of certificates becomeautomated by the autoDiscovery system. See<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">GUI: Connecting</span></a> for more information.------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (2) LOAD YOUR FRIEND'S CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"> </p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab </li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Import Friend" </li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select your friends certificate file, then click "Okay". Their certificate should appear in the top window of the "Connect" Tab.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (3) SIGN CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"> </p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select their Certificate by clicking on their name. </li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Configure Friend" Button. This will bring up a configuration window. which allows you to look at the details of the certificate. </li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click the "Sign Certificate" button near the bottom of the "Certificate Configuration" Window. </li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Now close the window by clicking on the "Done" button. </li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Your Friends certificate should now say "Trusted (S)", indicating it is ready for connections.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can only share with "Trusted" Peers. You must sign your Friend'scertificate to prove that you know the certificate belongs to your Friend. Do not sign any/all certificates - only the people youtrust. For more information see: <br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br />------------------------------------------------------------------------<br /><br /> <br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (4) AUTOCONNECT TO PEER </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Finally You need to activate the connection: </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"> </p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click in the Box, next to your friends Name. </li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> A Tick should appear in the box, a connection will be started. </li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> The "Offline" will change to "Online" when you have successfully connected.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Remember: Your initial connection attempts will fail, until your friend has signed your certificate and ticked the Auto-Connect Box.This ensures that both peers trust each other, and stops random peopleaccessing your files.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>. <br />------------------------------------------------------------------------<br /><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-DOWNLOAD"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Downloading Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have connected to friends, you can download their shared files.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can search for the files you want using either:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) File Listing Tab: This gives you a directory view of the files being shared by your peers. Double clickon the directory name (not the arrow) to diplay its subdirectories and files.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 1: This can take up to 5 seconds to fetch the information for your peer.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 2: If the directory is empty, or the person is offline, then the request will silently fail.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Search Tab: Retroshare also allows you to search your peers computers for filenames. Enter yourterm(s) in the search box at the top of the TAB and click the "Search" button. This willsearch all of the peers that you are currently connected to.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 3: If any matching files are found they will be displayed within 5 - 10 seconds.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have found the files you want, Select the file(s), and click "Download" to begin the download process.If you click over the "File Transfer" TAB, the status of the files will appear.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 4: The files can take up to 10 seconds to appear in the transfer window.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-SHARING"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Sharing Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can specify which files you want to share in the "Config" Tab.In the "Share Directories" section, click the "Add Directory" Button, and select the directory you want to share.The files and subdirectories will become available for you peers.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can remove a directory from the Shared Directories List by clicking onthe directory name in the list, and then clicking "Remove Directory".</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="GUI"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Gui Overview (Tab Description) </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The GUI is divided up into several sections which can be accessed by clicking on the Tabs along the top of the main window. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"> </p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect: Manage Connections and Friends. (<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">getting started</span></a> and <a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>) </li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Listing: A directory view of available files. (<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>) </li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Search: Search for available files. (<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>) </li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Messages: For Sending/Recving Message. (Coming Soon) </li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Channels: A broadcast/subscription system. (Coming Soon) </li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Transfer: Listing of Current and completed Transfers. </li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Config: Specify of share diectories and IP Addresses. (<a href="#GUI-CONFIG"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>) </li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> About: Help and other Information. </li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Chat: Accessed by the clicking on the "Chat" button.</li></ul> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Connect Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Connect TAB consists of two windows. The upper windowshows a list of your friends. This window indicates each friendscurrent trust level, as well as their connection state.The "Trust_Lvl" Column indicates if the certificate has beenAuthenticated using the web of trust. You can only connect to "Trusted" certificates. Tick the "Auto_Connect" box to connect to your trusted friends.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The lower window provides a list of the friends of your friends.This window shows the neighbour's name and how long ago they attempted to connect to you. This window is automatically populatedby the autoDiscovery system, and should be used to expand yourretroShare network. A word of warning: Do not automatically trust (or sign) anyonethat appears in this window. First verify by some other means (email/phone)that certificate belongs to the person you think it does.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use the "Neighbour List" window to expand your friend list. Select the desired entry in the lower window by clicking on it, then click the "Add to Friends" Button to move it to the upper window.Likewise the "Remove from Friends" button moved a person from the upper window to the lower window.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The "Configure Friend" Button opens a Certificate Configuration window.This window can be used to examine the certificate details, sign the certificate or manually change the peer's IP Address.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">See Also:<br /><a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Getting Started: Connecting to your friends</span></a>.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>.<br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONFIG"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Config Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Configuration Tab allows you to select the share directories, as well as the directory that downloaded files are saved to.<br />See <a href="#STARTUP-SHARING"><span style=" text-decoration: underline; color:#0000ff;">Sharing you Files</span></a> for details. </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Config Tab also allows you to control the IP Address and Portused by RetroShare. Under most cirumstances you do not need to changethese setting. If you are behind a firewall and can setup a forwarded port, the selected IP Address and Port should be specified here.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="FAQ"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Frequently Asked Questions </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">How does the security/privacy work? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShares uses a Web of Trust Authentication system to ensurethat your "friends" are your friends, and uses SSL to encryptthe communcications between peers. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What is a Web of Trust? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Web of Trust relies on a collection of peers to identify eachother. Look it up on the Web!</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-TRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What does "Trust" Mean in RetroShare?</span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Anyone can generate a certificate, with any name on it. So howdo you know that the certificate that claims to be from "Joe Bloggs"is really from your mate Joe. This is the "AuthenticationProblem". RetroShare uses a Web of Trust to Authenticate your peers.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-SIGN"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Should I Sign this Certificate? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should only sign a certificate if you are completely surethat it comes from the "right" person. If you sign a certificateyou are "Authenticating" the person to yourself and others.If you sign certificates that you haven't checked, then you aredestroying your own privacy and security.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">How do you verify a certificate? Use an alternative method ofcommunication to send the certificate: E.g. email or USB stick. This will improve you confidence that the certificate belongsto the correct person. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><span style=" font-size:small;"> </span><a name="FAQ-CONNECT"></a><span style=" font-size:small;">W</span><span style=" font-size:small;">hy won't it Connect?</span><span style=" font-size:small;"> </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A connection can fail for a number of reasons:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) Failed Authentication. Have both peers signed each otherscertificates? </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Firewalls. If both peers are behind firewalls then they cannotconnect directly. RetroShare has a built in proxy system to circumventfirewalls - However this can only function if both peers can connect to a common third party that is not behind a firewall. Thisis the most likely reason for initial connections to fail. The only solution to find a common friend that isn't firewalled (know anyone with Broadband?)</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(3) IP Addresses are wrong. You can manually examine and change these using the Certificate configuration.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +</body></html> + + + + + + + + diff --git a/retroshare-gui/src/gui/Preferences/PreferencesWindow.cpp b/retroshare-gui/src/gui/Preferences/PreferencesWindow.cpp new file mode 100644 index 000000000..7f13bf74d --- /dev/null +++ b/retroshare-gui/src/gui/Preferences/PreferencesWindow.cpp @@ -0,0 +1,190 @@ +/**************************************************************** + * RShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 +#include +#include "PreferencesWindow.h" + +#include "rsiface/rsiface.h" + + +#define FONT QFont(tr("Arial"), 8) + +/* Images for toolbar icons */ +#define IMAGE_PREFERENCES ":/images/locale.png" +#define IMAGE_WEBCACHES ":/images/webcache_24x24.png" +#define IMAGE_DIRECTORIES ":/images/folder_doments.png" +#define IMAGE_CRYPTOGRAPHY ":/images/cryptography_24x24.png" +#define IMAGE_LOG ":/images/log_24x24.png" +#define IMAGE_ABOUT ":/images/informations_24x24.png" +#define IMAGE_SAVE ":/images/media-floppy.png" + + +/** Constructor */ +PreferencesWindow::PreferencesWindow(QWidget *parent, Qt::WFlags flags) +: QMainWindow(parent, flags) +{ + /* Invoke the Qt Designer generated QObject setup routine */ + ui.setupUi(this); + + /* Create the config pages and actions */ + QActionGroup *grp = new QActionGroup(this); + ui.stackPages->add(new GeneralDialog(ui.stackPages), + createPageAction(QIcon(IMAGE_PREFERENCES), tr("General"), grp)); + + ui.stackPages->add(new ServerDialog(ui.stackPages), + createPageAction(QIcon(IMAGE_WEBCACHES), tr("Server"), grp)); + + ui.stackPages->add(new DirectoriesDialog(ui.stackPages), + createPageAction(QIcon(IMAGE_DIRECTORIES), tr("Directories"), grp)); + + //ui.stackPages->add(new CryptographyDialog(ui.stackPages), + // createPageAction(QIcon(IMAGE_CRYPTOGRAPHY), tr("Cryptography"), grp)); + + ui.stackPages->add(new LogDialog(ui.stackPages), + createPageAction(QIcon(IMAGE_ABOUT), tr("About"), grp)); + + + /* Create the toolbar */ + ui.toolBar->addActions(grp->actions()); + ui.toolBar->addSeparator(); + connect(grp, SIGNAL(triggered(QAction *)), ui.stackPages, SLOT(showPage(QAction *))); + + /* Create and bind the Save button */ + //addAction(new QAction(QIcon(IMAGE_SAVE), tr("Save"), ui.toolBar), + // SLOT(saveChanges())); + + /* Select the first action */ + grp->actions()[0]->setChecked(true); + setFixedSize(QSize(480, 450)); + + connect(ui.okButton, SIGNAL(clicked( bool )), this, SLOT( saveChanges()) ); + connect(ui.cancelprefButton, SIGNAL(clicked( bool )), this, SLOT( cancelpreferences()) ); + +} + +/** Creates a new action associated with a config page. */ +QAction* +PreferencesWindow::createPageAction(QIcon img, QString text, QActionGroup *group) +{ + QAction *action = new QAction(img, text, group); + action->setCheckable(true); + action->setFont(FONT); + return action; +} + +/** Adds the given action to the toolbar and hooks its triggered() signal to + * the specified slot (if given). */ +void +PreferencesWindow::addAction(QAction *action, const char *slot) +{ + action->setFont(FONT); + ui.toolBar->addAction(action); + connect(action, SIGNAL(triggered()), this, slot); +} + +/** Overloads the default show so we can load settings */ +void +PreferencesWindow::show() +{ + /* Load saved settings */ + loadSettings(); + + if (!this->isVisible()) { + QMainWindow::show(); + } else { + QMainWindow::activateWindow(); + setWindowState(windowState() & ~Qt::WindowMinimized | Qt::WindowActive); + QMainWindow::raise(); + } +} + +/** Shows the config dialog with focus set to the given page. */ +void +PreferencesWindow::show(Page page) +{ + /* Show the dialog. */ + show(); + + /* Set the focus to the specified page. */ + ui.stackPages->setCurrentIndex((int)page); +} + + +/** Loads the saved PreferencesWindow settings. */ +void +PreferencesWindow::loadSettings() +{ + /* Call each config page's load() method to load its data */ + foreach (ConfigPage *page, ui.stackPages->pages()) { + page->load(); + } +} + + +/** Saves changes made to settings. */ +void +PreferencesWindow::saveChanges() +{ + QString errmsg; + + /* Call each config page's save() method to save its data */ + foreach (ConfigPage *page, ui.stackPages->pages()) { + if (!page->save(errmsg)) { + /* Display the offending page */ + ui.stackPages->setCurrentPage(page); + + /* Show the user what went wrong */ + QMessageBox::warning(this, + tr("Error Saving Configuration"), errmsg, + QMessageBox::Ok, QMessageBox::NoButton); + + /* Don't process the rest of the pages */ + return; + } + } + + /* call to RsIface save function.... */ + rsicontrol -> ConfigSave(); + + QMainWindow::close(); +} + +/** Cancel and close the Preferences Window. */ +void +PreferencesWindow::cancelpreferences() +{ + + QMainWindow::close(); +} + +void PreferencesWindow::closeEvent (QCloseEvent * event) +{ + hide(); + event->ignore(); +} + + + + + diff --git a/retroshare-gui/src/gui/Preferences/PreferencesWindow.h b/retroshare-gui/src/gui/Preferences/PreferencesWindow.h new file mode 100644 index 000000000..5fe34d88c --- /dev/null +++ b/retroshare-gui/src/gui/Preferences/PreferencesWindow.h @@ -0,0 +1,89 @@ +/**************************************************************** + * RShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 _PreferencesWindow_H +#define _PreferencesWindow_H + +#include +#include + + +#include "GeneralDialog.h" +#include "DirectoriesDialog.h" +#include "ServerDialog.h" +#include "CryptographyDialog.h" +#include "LogDialog.h" + + + +#include "ui_PreferencesWindow.h" + +class PreferencesWindow : public QMainWindow +{ + Q_OBJECT + +public: + /** Preferences dialog pages. */ + enum Page { + General = 0, /** Preferences page. */ + Directories = 1, /** Directories page. */ + Server = 2, /** Server page. */ + Cryptography = 3, /** Cryptography page. */ + About = 4 /** About page. */ + + }; + + /** Default Constructor */ + PreferencesWindow(QWidget *parent = 0, Qt::WFlags flags = 0); + /** Default destructor */ + //~PreferencesWindow(); + +protected: + void closeEvent (QCloseEvent * event); + +public slots: + /** Called when this dialog is to be displayed */ + void show(); + /** Shows the config dialog with focus set to the given page. */ + void show(Page page); + +private slots: + + /** Called when user clicks "Save Settings" */ + void saveChanges(); + /**void preferences();*/ + + void cancelpreferences(); + +private: + /** Loads the current configuration settings */ + void loadSettings(); + /** Creates a new action for a config page. */ + QAction* createPageAction(QIcon img, QString text, QActionGroup *group); + /** Adds a new action to the toolbar. */ + void addAction(QAction *action, const char *slot = 0); + + /** Qt Designer generated object */ + Ui::PreferencesWindow ui; +}; + +#endif + diff --git a/retroshare-gui/src/gui/Preferences/PreferencesWindow.ui b/retroshare-gui/src/gui/Preferences/PreferencesWindow.ui new file mode 100644 index 000000000..cc6aeb3f1 --- /dev/null +++ b/retroshare-gui/src/gui/Preferences/PreferencesWindow.ui @@ -0,0 +1,1090 @@ + + PreferencesWindow + + + + 0 + 0 + 426 + 324 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 120 + 120 + 120 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 10 + 36 + 106 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 120 + 120 + 120 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 212 + 208 + 200 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + + + 120 + 120 + 120 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 120 + 120 + 120 + + + + + + + 139 + 139 + 139 + + + + + + + 120 + 120 + 120 + + + + + + + 255 + 255 + 255 + + + + + + + 120 + 120 + 120 + + + + + + + 240 + 240 + 240 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 10 + 36 + 106 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + + + Arial + 10 + 50 + false + false + false + false + + + + Qt::NoContextMenu + + + Options + + + :/images/rstray3.png + + + + 32 + 32 + + + + Qt::ToolButtonTextUnderIcon + + + + + 6 + + + 3 + + + + + 0 + + + 6 + + + + + + 75 + 0 + + + + Cancel + + + + + + + + 75 + 0 + + + + OK + + + false + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 120 + 120 + 120 + + + + + + + 160 + 160 + 160 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 10 + 36 + 106 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 120 + 120 + 120 + + + + + + + 160 + 160 + 160 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 212 + 208 + 200 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + + + 120 + 120 + 120 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 120 + 120 + 120 + + + + + + + 160 + 160 + 160 + + + + + + + 120 + 120 + 120 + + + + + + + 255 + 255 + 255 + + + + + + + 120 + 120 + 120 + + + + + + + 240 + 240 + 240 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 10 + 36 + 106 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + + Qt::NoContextMenu + + + + + + + Qt::Horizontal + + + + + + + + Qt::NoContextMenu + + + true + + + Qt::Horizontal + + + + 24 + 24 + + + + 4 + + + + + + ConfigPageStack + QStackedPageWidget +
    gui/Preferences/configpagestack.h
    +
    +
    + + + + +
    diff --git a/retroshare-gui/src/gui/Preferences/ServerDialog.cpp b/retroshare-gui/src/gui/Preferences/ServerDialog.cpp new file mode 100644 index 000000000..eae96ee81 --- /dev/null +++ b/retroshare-gui/src/gui/Preferences/ServerDialog.cpp @@ -0,0 +1,208 @@ +/**************************************************************** + * RShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 +#include "ServerDialog.h" +#include + +#include "rsiface/rsiface.h" + + + +/** Constructor */ +ServerDialog::ServerDialog(QWidget *parent) +: ConfigPage(parent) +{ + /* Invoke the Qt Designer generated object setup routine */ + ui.setupUi(this); + + /* Create RshareSettings object */ + _settings = new RshareSettings(); + + connect( ui.ManualButton, SIGNAL( toggled( bool ) ), this, SLOT( toggleUPnP( ) ) ); + connect( ui.UPnPButton, SIGNAL( toggled( bool ) ), this, SLOT( toggleUPnP( ) ) ); + + + /* Hide platform specific features */ +#ifdef Q_WS_WIN + +#endif +} + +/** Saves the changes on this page */ +bool +ServerDialog::save(QString &errmsg) +{ + +/* save the server address */ +/* save local address */ +/* save the url for DNS access */ + +/* restart server */ + +/* save all? */ + saveAddresses(); + return true; +} + + +/** Loads the settings for this page */ +void +ServerDialog::load() +{ + /* get the shared directories */ + rsiface->lockData(); /* Lock Interface */ + +/* set local address */ + ui.localAddress->setText(QString::fromStdString(rsiface->getConfig().localAddr)); + ui.localPort -> setValue(rsiface->getConfig().localPort); +/* set the server address */ + ui.extAddress->setText(QString::fromStdString(rsiface->getConfig().extAddr)); + ui.extPort -> setValue(rsiface->getConfig().extPort); +/* set the flags */ + ui.chkFirewall ->setChecked(rsiface->getConfig().firewalled); + ui.chkForwarded ->setChecked(rsiface->getConfig().forwardPort); + + /* now handle networking options */ + if (rsiface->getConfig().DHTActive) + { + ui.DHTButton -> setChecked(true); + } + else + { + ui.noDHTButton -> setChecked(true); + } + + int dhtPeers = rsiface->getConfig().DHTPeers; + if (!dhtPeers) + { + ui.dhtStatus -> setText("DHT Off/Unavailable"); + } + else if (dhtPeers < 20) + { + ui.dhtStatus -> setText("DHT Initialising"); + } + else + { + ui.dhtStatus -> setText("DHT Active"); + } + + switch(rsiface->getConfig().uPnPState) + { + case UPNP_STATE_ACTIVE: + ui.upnpStatus -> setText("Forwarding Active"); + break; + case UPNP_STATE_FAILED_UDP: + ui.upnpStatus -> setText("TCP Active/UDP Failed"); + break; + case UPNP_STATE_FAILED_TCP: + ui.upnpStatus -> setText("Forwarding Failed"); + break; + case UPNP_STATE_READY: + ui.upnpStatus -> setText("uPnP Ready"); + break; + case UPNP_STATE_UNAVAILABILE: + ui.upnpStatus -> setText("uPnP Unavailable"); + break; + case UPNP_STATE_UNINITIALISED: + default: + ui.upnpStatus -> setText("uPnP Uninitialised"); + break; + + } + ui.upnpStatus->setReadOnly(true); + ui.dhtStatus ->setReadOnly(true); + + if (rsiface->getConfig().uPnPActive) + { + /* flag uPnP */ + ui.UPnPButton->setChecked(true); + /* shouldn't fiddle with port */ + } + else + { + /* noobie */ + ui.ManualButton->setChecked(true); + + } + + ui.totalRate->setValue(rsiface->getConfig().maxDataRate); + ui.indivRate->setValue(rsiface->getConfig().maxIndivDataRate); + + rsiface->unlockData(); /* UnLock Interface */ + + toggleUPnP(); +} + +void ServerDialog::toggleUPnP() +{ + /* switch on the radioButton */ + bool settingChangeable = false; + if (ui.ManualButton->isChecked()) + { + settingChangeable = true; + } + + if (settingChangeable) + { + ui.localAddress->setEnabled(true); + ui.localPort -> setEnabled(true); + ui.extAddress -> setEnabled(true); + ui.extPort -> setEnabled(true); + ui.chkFirewall-> setEnabled(true); + ui.chkForwarded->setEnabled(true); + } + else + { + ui.localAddress->setEnabled(false); + ui.localPort -> setEnabled(false); + ui.extAddress -> setEnabled(false); + ui.extPort -> setEnabled(false); + ui.chkFirewall-> setEnabled(false); + ui.chkForwarded->setEnabled(false); + } +} + +void ServerDialog::saveAddresses() +{ + QString str; + + bool saveAddr = false; + rsicontrol -> NetworkDHTActive(ui.DHTButton->isChecked()); + rsicontrol -> NetworkUPnPActive(ui.UPnPButton->isChecked()); + + if (ui.ManualButton->isChecked()) + { + saveAddr = true; + } + + if (saveAddr) + { + rsicontrol->ConfigSetLocalAddr(ui.localAddress->text().toStdString(), ui.localPort->value()); + rsicontrol->ConfigSetLanConfig(ui.chkFirewall->isChecked(), ui.chkForwarded->isChecked()); + rsicontrol->ConfigSetExtAddr(ui.extAddress->text().toStdString(), ui.extPort->value()); + } + + rsicontrol->ConfigSetDataRates( ui.totalRate->value(), ui.indivRate->value() ); + load(); +} + diff --git a/retroshare-gui/src/gui/Preferences/ServerDialog.h b/retroshare-gui/src/gui/Preferences/ServerDialog.h new file mode 100644 index 000000000..4daa5f0a0 --- /dev/null +++ b/retroshare-gui/src/gui/Preferences/ServerDialog.h @@ -0,0 +1,60 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 _SERVERDIALOG_H +#define _SERVERDIALOG_H + +#include + +#include + +#include "configpage.h" +#include "ui_ServerDialog.h" + +class ServerDialog : public ConfigPage +{ + Q_OBJECT + +public: + /** Default Constructor */ + ServerDialog(QWidget *parent = 0); + /** Default Destructor */ + + /** Saves the changes on this page */ + bool save(QString &errmsg); + /** Loads the settings for this page */ + void load(); + +private slots: + void saveAddresses(); + void toggleUPnP(); + + +private: + /** A RshareSettings object used for saving/loading settings */ + RshareSettings* _settings; + + /** Qt Designer generated object */ + Ui::ServerDialog ui; +}; + +#endif + diff --git a/retroshare-gui/src/gui/Preferences/ServerDialog.ui b/retroshare-gui/src/gui/Preferences/ServerDialog.ui new file mode 100644 index 000000000..827b03135 --- /dev/null +++ b/retroshare-gui/src/gui/Preferences/ServerDialog.ui @@ -0,0 +1,894 @@ + + ServerDialog + + + + 0 + 0 + 419 + 371 + + + + + 7 + 7 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 192 + 192 + 192 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + 104 + 104 + 104 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 104 + 104 + 104 + + + + + + + 255 + 255 + 255 + + + + + + + 104 + 104 + 104 + + + + + + + 240 + 240 + 240 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + Arial + 8 + 50 + false + false + false + false + + + + Qt::NoContextMenu + + + + + 0 + 270 + 411 + 71 + + + + Transfer Rates + + + + + 10 + 20 + 170 + 23 + + + + + 0 + + + 6 + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Total Rate (KB/s) </p></body></html> + + + + + + + 4096 + + + 1 + + + 1 + + + + + + + + + 200 + 20 + 170 + 23 + + + + + 0 + + + 6 + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Per Person </p></body></html> + + + + + + + 1024 + + + 1 + + + 1 + + + + + + + + + + 0 + 40 + 411 + 41 + + + + Firewall/Router Configuration + + + + + 230 + 20 + 161 + 18 + + + + Manual router setup. + + + + + + 10 + 20 + 211 + 18 + + + + Use uPnP to configure router + + + true + + + + + + + 0 + 0 + 411 + 41 + + + + Network Address Configuration (takes effect after restart) + + + + + 10 + 20 + 211 + 18 + + + + Use DHT to locate friends + + + true + + + + + + 230 + 20 + 161 + 18 + + + + Manual IP Addresses + + + + + + + 0 + 80 + 411 + 191 + + + + Server Status And Network Settings + + + + + 110 + 20 + 274 + 159 + + + + + 0 + + + 6 + + + + + + + + + + + 0 + + + 6 + + + + + + + + 65535 + + + 0 + + + 7812 + + + + + + + Port: + + + + + + + + + 0 + + + 6 + + + + + Firewalled + + + + + + + Forwarded Port + + + + + + + + + 0 + + + 6 + + + + + + + + 65535 + + + 0 + + + 7812 + + + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + + + + + + + + + + + 10 + 150 + 91 + 21 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + + + + + + 10 + 30 + 80 + 21 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">DHT Status</p></body></html> + + + + + + 10 + 60 + 80 + 21 + + + + uPnP Status + + + + + + 10 + 90 + 81 + 21 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Local Address:</p></body></html> + + + + + + DHTButton + noDHTButton + UPnPButton + ManualButton + dhtStatus + upnpStatus + localAddress + localPort + chkFirewall + chkForwarded + extAddress + extPort + totalRate + indivRate + + + + + + diff --git a/retroshare-gui/src/gui/Preferences/configpage.h b/retroshare-gui/src/gui/Preferences/configpage.h new file mode 100644 index 000000000..b40c8b56f --- /dev/null +++ b/retroshare-gui/src/gui/Preferences/configpage.h @@ -0,0 +1,42 @@ +/**************************************************************** + * RShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 _CONFIGPAGE_H +#define _CONFIGPAGE_H + +#include + + +class ConfigPage : public QWidget +{ +public: + /** Default Constructor */ + ConfigPage(QWidget *parent = 0) : QWidget(parent) {} + + /** Pure virtual method. Subclassed pages load their config settings here. */ + virtual void load() = 0; + /** Pure virtual method. Subclassed pages save their config settings here + * and return true if everything was saved successfully. */ + virtual bool save(QString &errmsg) = 0; +}; + +#endif + diff --git a/retroshare-gui/src/gui/Preferences/configpagestack.cpp b/retroshare-gui/src/gui/Preferences/configpagestack.cpp new file mode 100644 index 000000000..04fa0726b --- /dev/null +++ b/retroshare-gui/src/gui/Preferences/configpagestack.cpp @@ -0,0 +1,62 @@ +/**************************************************************** + * RShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 +#include "configpagestack.h" + +/** Default constructor. */ +ConfigPageStack::ConfigPageStack(QWidget *parent) +: QStackedWidget(parent) +{ +} + +/** Adds a page to the stack. */ +void +ConfigPageStack::add(ConfigPage *page, QAction *action) +{ + _pages.insert(action, page); + insertWidget(count(), page); +} + +/** Sets the current config page and checks its action. */ +void +ConfigPageStack::setCurrentPage(ConfigPage *page) +{ + foreach (QAction *action, _pages.keys(page)) { + action->setChecked(true); + } + setCurrentWidget(page); +} + +/** Sets the current config page index and checks its action. */ +void +ConfigPageStack::setCurrentIndex(int index) +{ + setCurrentPage((ConfigPage *)widget(index)); +} + +/** Shows the config page associated with the activated action. */ +void +ConfigPageStack::showPage(QAction *pageAction) +{ + setCurrentWidget(_pages.value(pageAction)); +} + diff --git a/retroshare-gui/src/gui/Preferences/configpagestack.h b/retroshare-gui/src/gui/Preferences/configpagestack.h new file mode 100644 index 000000000..46c7e4983 --- /dev/null +++ b/retroshare-gui/src/gui/Preferences/configpagestack.h @@ -0,0 +1,59 @@ +/**************************************************************** + * RShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 _CONFIGPAGESTACK_H +#define _CONFIGPAGESTACK_H + +#include +#include + +#include "configpage.h" + + +class ConfigPageStack : public QStackedWidget +{ + Q_OBJECT + +public: + /** Constructor. */ + ConfigPageStack(QWidget *parent = 0); + + /** Adds a configuration page to the stack. */ + void add(ConfigPage *page, QAction *action); + /** Sets the current config page and checks its action. */ + void setCurrentPage(ConfigPage *page); + /** Sets the current config page index and checks its action. */ + void setCurrentIndex(int index); + + /** Returns a list of all pages in the stack. */ + QList pages() { return _pages.values(); } + +public slots: + /** Displays the page associated with the activated action. */ + void showPage(QAction *pageAction); + +private: + /** Maps an action to a config page. */ + QHash _pages; +}; + +#endif + diff --git a/retroshare-gui/src/gui/SearchDialog.cpp b/retroshare-gui/src/gui/SearchDialog.cpp new file mode 100644 index 000000000..3ea3cc274 --- /dev/null +++ b/retroshare-gui/src/gui/SearchDialog.cpp @@ -0,0 +1,547 @@ +/**************************************************************** + * RShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 "rshare.h" +#include "SearchDialog.h" +#include "rsiface/rsiface.h" +#include "rsiface/rsexpr.h" + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +/* Images for context menu icons */ +#define IMAGE_START ":/images/download.png" +#define IMAGE_REMOVE ":/images/delete.png" +#define IMAGE_REMOVEALL ":/images/deleteall.png" + +/* Key for UI Preferences */ +#define UI_PREF_ADVANCED_SEARCH "UIOptions/AdvancedSearch" + +/* indicies for search results item columns SR_ = Search Result */ +#define SR_NAME_COL 0 +#define SR_SIZE_COL 1 +#define SR_HASH_COL 2 +#define SR_ID_COL 3 +#define SR_SEARCH_ID_COL 4 + +/* indicies for search summary item columns SS_ = Search Summary */ +#define SS_TEXT_COL 0 +#define SS_COUNT_COL 1 +#define SS_SEARCH_ID_COL 2 + +/* static members */ +/* These indices MUST be identical to their equivalent indices in the combobox */ +const int SearchDialog::FILETYPE_IDX_ANY = 0; +const int SearchDialog::FILETYPE_IDX_AUDIO = 1; +const int SearchDialog::FILETYPE_IDX_VIDEO = 2; +const int SearchDialog::FILETYPE_IDX_PICTURE = 3; +const int SearchDialog::FILETYPE_IDX_PROGRAM = 4; +const int SearchDialog::FILETYPE_IDX_ARCHIVE = 5; +const int SearchDialog::FILETYPE_IDX_DOCUMENT = 6; +QMap * SearchDialog::FileTypeExtensionMap = new QMap(); +bool SearchDialog::initialised = false; + +/** Constructor */ +SearchDialog::SearchDialog(QWidget *parent) +: MainPage(parent), + advSearchDialog(NULL), + contextMnu(NULL), contextMnu2(NULL), + nextSearchId(1) +{ + /* Invoke the Qt Designer generated object setup routine */ + ui.setupUi(this); + + /* initialise the filetypes mapping */ + if (!SearchDialog::initialised) + { + initialiseFileTypeMappings(); + } + + /* Advanced search panel specifica */ + RshareSettings rsharesettings; + QString key (UI_PREF_ADVANCED_SEARCH); + bool useAdvanced = rsharesettings.value(key, QVariant(false)).toBool(); + if (useAdvanced) + { + ui.toggleAdvancedSearchBtn->setChecked(true); + ui.SimpleSearchPanel->hide(); + } else { + ui.AdvancedSearchPanel->hide(); + } + + connect(ui.toggleAdvancedSearchBtn, SIGNAL(toggled(bool)), this, SLOT(toggleAdvancedSearchDialog(bool))); + connect(ui.focusAdvSearchDialogBtn, SIGNAL(clicked()), this, SLOT(showAdvSearchDialog())); + + /* End Advanced Search Panel specifics */ + + + connect( ui.searchResultWidget, SIGNAL( customContextMenuRequested( QPoint ) ), this, SLOT( searchtableWidgetCostumPopupMenu( QPoint ) ) ); + + connect( ui.searchSummaryWidget, SIGNAL( customContextMenuRequested( QPoint ) ), this, SLOT( searchtableWidget2CostumPopupMenu( QPoint ) ) ); + + connect( ui.lineEdit, SIGNAL( returnPressed ( void ) ), this, SLOT( searchKeywords( void ) ) ); + connect( ui.pushButtonsearch, SIGNAL( released ( void ) ), this, SLOT( searchKeywords( void ) ) ); + connect( ui.pushButtonDownload, SIGNAL( released ( void ) ), this, SLOT( download( void ) ) ); + //connect( ui.searchSummaryWidget, SIGNAL( itemSelectionChanged ( void ) ), this, SLOT( selectSearchResults( void ) ) ); + + connect ( ui.searchSummaryWidget, SIGNAL( currentItemChanged ( QTreeWidgetItem *, QTreeWidgetItem * ) ), + this, SLOT( selectSearchResults( void ) ) ); + + + /* hide the Tree +/- */ + ui.searchResultWidget -> setRootIsDecorated( false ); + ui.searchSummaryWidget -> setRootIsDecorated( false ); + + /* make it extended selection */ + ui.searchResultWidget -> setSelectionMode(QAbstractItemView::ExtendedSelection); + + + /* Set header resize modes and initial section sizes */ + ui.searchSummaryWidget->setColumnCount(3); + + QHeaderView * _smheader = ui.searchSummaryWidget->header () ; + _smheader->setResizeMode (0, QHeaderView::Interactive); + _smheader->setResizeMode (1, QHeaderView::Interactive); + _smheader->setResizeMode (2, QHeaderView::Interactive); + + _smheader->resizeSection ( 0, 80 ); + _smheader->resizeSection ( 1, 75 ); + _smheader->resizeSection ( 2, 75 ); + + ui.searchResultWidget->setColumnCount(4); + _smheader = ui.searchResultWidget->header () ; + _smheader->setResizeMode (0, QHeaderView::Interactive); + _smheader->setResizeMode (1, QHeaderView::Interactive); + _smheader->setResizeMode (2, QHeaderView::Interactive); + _smheader->setResizeMode (3, QHeaderView::Interactive); + + _smheader->resizeSection ( 0, 200 ); + _smheader->resizeSection ( 1, 75 ); + _smheader->resizeSection ( 2, 75 ); + _smheader->resizeSection ( 3, 75 ); + + +/* Hide platform specific features */ +#ifdef Q_WS_WIN + +#endif +} + +void SearchDialog::initialiseFileTypeMappings() +{ + /* edit these strings to change the range of extensions recognised by the search */ + SearchDialog::FileTypeExtensionMap->insert(FILETYPE_IDX_ANY, ""); + SearchDialog::FileTypeExtensionMap->insert(FILETYPE_IDX_AUDIO, + "aac aif iff m3u mid midi mp3 mpa ogg ra ram wav wma"); + SearchDialog::FileTypeExtensionMap->insert(FILETYPE_IDX_VIDEO, + "3gp asf asx avi mov mp4 mpeg mpg qt rm swf vob wmv"); + SearchDialog::FileTypeExtensionMap->insert(FILETYPE_IDX_PICTURE, + "3dm 3dmf ai bmp drw dxf eps gif ico indd jpe jpeg jpg mng pcx pcc pct pgm pix png psd psp qxd qxprgb sgi svg tga tif tiff xbm xcf"); + SearchDialog::FileTypeExtensionMap->insert(FILETYPE_IDX_PROGRAM, + "app bat cgi com bin exe js pif py pl sh vb ws "); + SearchDialog::FileTypeExtensionMap->insert(FILETYPE_IDX_ARCHIVE, + "7z bz2 gz pkg rar sea sit sitx tar zip"); + SearchDialog::FileTypeExtensionMap->insert(FILETYPE_IDX_DOCUMENT, + "doc odt ott rtf pdf ps txt log msg wpd wps" ); + SearchDialog::initialised = true; +} + +void SearchDialog::searchtableWidgetCostumPopupMenu( QPoint point ) +{ + // block the popup if no results available + if ((ui.searchResultWidget->selectedItems()).size() == 0) return; + + // create the menu as required + if (contextMnu == 0) + { + contextMnu = new QMenu(this); + + downloadAct = new QAction(QIcon(IMAGE_START), tr( "Download" ), this ); + connect( downloadAct , SIGNAL( triggered() ), this, SLOT( download() ) ); + + broadcastonchannelAct = new QAction( tr( "Broadcast on Channel" ), this ); + connect( broadcastonchannelAct , SIGNAL( triggered() ), this, SLOT( broadcastonchannel() ) ); + + recommendtofriendsAct = new QAction( tr( "Recommend to Friends" ), this ); + connect( recommendtofriendsAct , SIGNAL( triggered() ), this, SLOT( recommendtofriends() ) ); + + + contextMnu->clear(); + contextMnu->addAction( downloadAct); + contextMnu->addSeparator(); + contextMnu->addAction( broadcastonchannelAct); + contextMnu->addAction( recommendtofriendsAct); + } + + QMouseEvent *mevent = new QMouseEvent( QEvent::MouseButtonPress, point, + Qt::RightButton, Qt::RightButton, Qt::NoModifier ); + contextMnu->exec( mevent->globalPos() ); +} + + +void SearchDialog::download() +{ + /* should also be able to handle multi-selection */ + QList itemsForDownload = ui.searchResultWidget->selectedItems(); + int numdls = itemsForDownload.size(); + QTreeWidgetItem * item; + bool attemptDownloadLocal = false; + + for (int i = 0; i < numdls; ++i) { + item = itemsForDownload.at(i); + // call the download + if (item->text(SR_ID_COL) != "Local") + { + rsicontrol -> FileRequest((item->text(SR_NAME_COL)).toStdString(), + (item->text(SR_HASH_COL)).toStdString(), + (item->text(SR_SIZE_COL)).toInt(), + ""); + } + else + { + attemptDownloadLocal = true; + } + } + if (attemptDownloadLocal) + { + QMessageBox::information(0, tr("Download Notice"), tr("Skipping Local Files")); + } +} + + +void SearchDialog::broadcastonchannel() +{ + + QMessageBox::warning(0, tr("Sorry"), tr("This function is not yet implemented.")); +} + + +void SearchDialog::recommendtofriends() +{ + QMessageBox::warning(0, tr("Sorry"), tr("This function is not yet implemented.")); + +} + + +/** context menu searchTablewidget2 **/ +void SearchDialog::searchtableWidget2CostumPopupMenu( QPoint point ) +{ + + // block the popup if no results available + if ((ui.searchSummaryWidget->selectedItems()).size() == 0) return; + + // create the menu as required + if (contextMnu2 == 0) + { + contextMnu2 = new QMenu( this ); + + searchRemoveAct = new QAction(QIcon(IMAGE_REMOVE), tr( "Remove" ), this ); + connect( searchRemoveAct , SIGNAL( triggered() ), this, SLOT( searchRemove() ) ); + + searchRemoveAllAct = new QAction(QIcon(IMAGE_REMOVEALL), tr( "Remove All" ), this ); + connect( searchRemoveAllAct , SIGNAL( triggered() ), this, SLOT( searchRemoveall() ) ); + + contextMnu2->clear(); + contextMnu2->addAction( searchRemoveAct); + contextMnu2->addAction( searchRemoveAllAct); + } + + QMouseEvent *mevent2 = new QMouseEvent( QEvent::MouseButtonPress, point, Qt::RightButton, Qt::RightButton, Qt::NoModifier ); + contextMnu2->exec( mevent2->globalPos() ); +} + +/** remove selected search result **/ +void SearchDialog::searchRemove() +{ + /* get the current search id from the summary window */ + QTreeWidgetItem *ci = ui.searchSummaryWidget->currentItem(); + if (!ci) + return; + + /* get the searchId text */ + QString searchId = ci->text(SS_SEARCH_ID_COL); + + std::cerr << "SearchDialog::searchRemove(): searchId: " << searchId.toStdString(); + std::cerr << std::endl; + + /* show only matching searchIds in main window */ + int items = ui.searchResultWidget->topLevelItemCount(); + for(int i = 0; i < items;) + { + /* get item */ + QTreeWidgetItem *ti = ui.searchResultWidget->topLevelItem(i); + if (ti->text(SR_SEARCH_ID_COL) == searchId) + { + /* remove */ + delete (ui.searchResultWidget->takeTopLevelItem(i)); + items--; + } + else + { + /* step to the next */ + i++; + } + } + int sii = ui.searchSummaryWidget->indexOfTopLevelItem(ci); + if (sii != -1) + { + delete (ui.searchSummaryWidget->takeTopLevelItem(sii)); + } + + ui.searchResultWidget->update(); + ui.searchSummaryWidget->update(); +} + +/** remove all search results **/ +void SearchDialog::searchRemoveAll() +{ + /* remove all summaries and results */ + ui.searchSummaryWidget->clear(); + ui.searchResultWidget->clear(); + + //ui.searchResultWidget->update(); + //ui.searchSummaryWidget->update(); +} + +/* ***************************************************************** + Advanced search implementation +*******************************************************************/ +// Event handlers for hide and show events +void SearchDialog::hideEvent(QHideEvent * event) +{ + showAdvSearchDialog(false); + MainPage::hideEvent(event); +} + +void SearchDialog::toggleAdvancedSearchDialog(bool toggled) +{ + // record the users preference for future reference + RshareSettings rsharesettings; + QString key (UI_PREF_ADVANCED_SEARCH); + rsharesettings.setValue(key, QVariant(toggled)); + + showAdvSearchDialog(toggled); +} + +void SearchDialog::showAdvSearchDialog(bool show) +{ + // instantiate if about to show for the first time + if (advSearchDialog == 0 && show) + { + advSearchDialog = new AdvancedSearchDialog(); + connect(advSearchDialog, SIGNAL(search(Expression*)), + this, SLOT(advancedSearch(Expression*))); + } + if (show) { + advSearchDialog->show(); + advSearchDialog->raise(); + advSearchDialog->setFocus(); + } else if (advSearchDialog != 0){ + advSearchDialog->hide(); + } +} + +void SearchDialog::advancedSearch(Expression* expression) +{ + advSearchDialog->hide(); + + /* call to core */ + std::list results; + rsicontrol -> SearchBoolExp(expression, results); + + /* abstraction to allow reusee of tree rendering code */ + resultsToTree((advSearchDialog->getSearchAsString()).toStdString(), results); +} + + + +void SearchDialog::searchKeywords() +{ + QString qTxt = ui.lineEdit->text(); + std::string txt = qTxt.toStdString(); + + std::cerr << "SearchDialog::searchKeywords() : " << txt << std::endl; + + /* extract keywords from lineEdit */ + QStringList qWords = qTxt.split(" ", QString::SkipEmptyParts); + std::list words; + QStringListIterator qWordsIter(qWords); + while (qWordsIter.hasNext()) + { + words.push_back(qWordsIter.next().toStdString()); + } + + if (words.size() < 1) + { + /* ignore */ + return; + } + + /* call to core */ + std::list initialResults; + std::list * finalResults = 0; + + rsicontrol -> SearchKeywords(words, initialResults); + /* which extensions do we use? */ + QString qExt, qName; + int extIndex; + bool matched =false; + FileDetail fd; + + if (ui.FileTypeComboBox->currentIndex() == FILETYPE_IDX_ANY) + { + finalResults = &initialResults; + } else { + finalResults = new std::list; + // amend the text description of the search + txt += " (" + ui.FileTypeComboBox->currentText().toStdString() + ")"; + // collect the extensions to use + QString extStr = SearchDialog::FileTypeExtensionMap->value(ui.FileTypeComboBox->currentIndex()); + QStringList extList = extStr.split(" "); + + // now iterate through the results ignoring those with wrong extensions + std::list::iterator resultsIter; + for (resultsIter = initialResults.begin(); resultsIter != initialResults.end(); resultsIter++) + { + fd = *resultsIter; + // get this file's extension + qName = QString::fromStdString(fd.name); + extIndex = qName.lastIndexOf("."); + if (extIndex >= 0) { + qExt = qName.mid(extIndex+1); + if (qExt != "" ) + { + // does it match? + matched = false; + /* iterate through the requested extensions */ + for (int i = 0; i < extList.size(); ++i) + { + if (qExt.toUpper() == extList.at(i).toUpper()) + { + finalResults->push_back(fd); + matched = true; + } + } + } + } + } + } + + /* abstraction to allow reusee of tree rendering code */ + resultsToTree(txt, *finalResults); +} + +void SearchDialog::resultsToTree(std::string txt, std::list results) +{ + /* translate search results */ + int searchId = nextSearchId++; + std::ostringstream out; + out << searchId; + + std::list::iterator it; + for(it = results.begin(); it != results.end(); it++) + { + QTreeWidgetItem *item = new QTreeWidgetItem(); + item->setText(SR_NAME_COL, QString::fromStdString(it->name)); + item->setText(SR_HASH_COL, QString::fromStdString(it->hash)); + item->setText(SR_ID_COL, QString::fromStdString(it->id)); + item->setText(SR_SEARCH_ID_COL, QString::fromStdString(out.str())); + /* + * to facilitate downlaods we need to save the file size too + */ + QVariant * variant = new QVariant(it->size); + item->setText(SR_SIZE_COL, QString(variant->toString())); + + if (it->id == "Local") + { + /* colour green? */ + item->setBackground(3, QBrush(Qt::green)); + } + else + { + /* colour blue? */ + item->setBackground(3, QBrush(Qt::blue)); + } + ui.searchResultWidget->addTopLevelItem(item); + } + + /* add to the summary as well */ + + QTreeWidgetItem *item = new QTreeWidgetItem(); + item->setText(SS_TEXT_COL, QString::fromStdString(txt)); + std::ostringstream out2; + out2 << results.size(); + + item->setText(SS_COUNT_COL, QString::fromStdString(out2.str())); + item->setText(SS_SEARCH_ID_COL, QString::fromStdString(out.str())); + + ui.searchSummaryWidget->addTopLevelItem(item); + ui.searchSummaryWidget->setCurrentItem(item); + + /* select this search result */ + selectSearchResults(); +} + + +//void QTreeWidget::currentItemChanged ( QTreeWidgetItem * current, QTreeWidgetItem * previous ) [signal] + + +void SearchDialog::selectSearchResults() +{ + /* highlight this search in summary window */ + QTreeWidgetItem *ci = ui.searchSummaryWidget->currentItem(); + if (!ci) + return; + + /* get the searchId text */ + QString searchId = ci->text(SS_SEARCH_ID_COL); + + std::cerr << "SearchDialog::selectSearchResults(): searchId: " << searchId.toStdString(); + std::cerr << std::endl; + + /* show only matching searchIds in main window */ + int items = ui.searchResultWidget->topLevelItemCount(); + for(int i = 0; i < items; i++) + { + /* get item */ + QTreeWidgetItem *ti = ui.searchResultWidget->topLevelItem(i); + if (ti->text(SR_SEARCH_ID_COL) == searchId) + { + ti->setHidden(false); + } + else + { + ti->setHidden(true); + } + } + ui.searchResultWidget->update(); +} + + diff --git a/retroshare-gui/src/gui/SearchDialog.h b/retroshare-gui/src/gui/SearchDialog.h new file mode 100644 index 000000000..475d59b0f --- /dev/null +++ b/retroshare-gui/src/gui/SearchDialog.h @@ -0,0 +1,127 @@ +/**************************************************************** +* RShare is distributed under the following license: +* +* Copyright (C) 2006, crypton +* +* 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 _SEARCHDIALOG_H +#define _SEARCHDIALOG_H + +#include + +#include +#include + +//#include + +#include "mainpage.h" +#include "ui_SearchDialog.h" +#include "advsearch/advancedsearchdialog.h" +#include "../config/rsharesettings.h" + +class FileDetail; + +class SearchDialog : public MainPage +{ + Q_OBJECT + + public: +/** Default Constructor */ + SearchDialog(QWidget *parent = 0); +/** Default Destructor */ + + +private slots: + +/** Create the context popup menu and it's submenus */ + void searchtableWidgetCostumPopupMenu( QPoint point ); + + void searchtableWidget2CostumPopupMenu( QPoint point ); + + void download(); + + void broadcastonchannel(); + + void recommendtofriends(); + + + + void searchRemove(); + + void searchRemoveAll(); + + void searchKeywords(); + +/** management of the adv search dialog object when switching search modes */ + void toggleAdvancedSearchDialog(bool); + void hideEvent(QHideEvent * event); + +/** raises (and if necessary instantiates) the advanced search dialog */ + void showAdvSearchDialog(bool=true); + +/** perform the advanced search */ + void advancedSearch(Expression*); + + void selectSearchResults(); + +private: +/** render the results to the tree widget display */ + void resultsToTree(std::string, std::list); + +/** the advanced search dialog instance */ + AdvancedSearchDialog * advSearchDialog; + +/** Define the popup menus for the Context menu */ + QMenu* contextMnu; + + QMenu* contextMnu2; + +/** Defines the actions for the context menu */ + QAction* downloadAct; + QAction* broadcastonchannelAct; + QAction* recommendtofriendsAct; + + QAction* searchRemoveAct; + QAction* searchRemoveAllAct; + +/** Contains the mapping of filetype combobox to filetype extensions */ + static const int FILETYPE_IDX_ANY; + static const int FILETYPE_IDX_AUDIO; + static const int FILETYPE_IDX_VIDEO; + static const int FILETYPE_IDX_PICTURE; + static const int FILETYPE_IDX_PROGRAM; + static const int FILETYPE_IDX_ARCHIVE; + static const int FILETYPE_IDX_DOCUMENT; + + static QMap * FileTypeExtensionMap; + static bool initialised; + void initialiseFileTypeMappings(); + +/**** +QTreeWidget *searchtableWidget; +QTreeWidget *searchtablewidget2; +****/ + + int nextSearchId; + +/** Qt Designer generated object */ + Ui::SearchDialog ui; +}; + +#endif + diff --git a/retroshare-gui/src/gui/SearchDialog.ui b/retroshare-gui/src/gui/SearchDialog.ui new file mode 100644 index 000000000..7d4deb3c3 --- /dev/null +++ b/retroshare-gui/src/gui/SearchDialog.ui @@ -0,0 +1,1130 @@ + + SearchDialog + + + + 0 + 0 + 516 + 289 + + + + + 1 + 1 + 1 + 1 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 192 + 192 + 192 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + 104 + 104 + 104 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 104 + 104 + 104 + + + + + + + 255 + 255 + 255 + + + + + + + 104 + 104 + 104 + + + + + + + 240 + 240 + 240 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + Arial + 8 + 50 + false + false + false + false + + + + Qt::NoContextMenu + + + + 0 + + + 1 + + + + + 0 + + + 6 + + + + + 0 + + + 6 + + + + + 5 + + + 6 + + + + + + 0 + 0 + 0 + 0 + + + + + 34 + 34 + + + + + 34 + 34 + + + + Toggle advanced searching on and off. + + + + + + :/images/advsearch_24x24.png + + + + 24 + 24 + + + + true + + + + + + + Qt::Vertical + + + + 20 + 0 + + + + + + + + + + + 1 + 1 + 255 + 0 + + + + + 390 + 24 + + + + QFrame::NoFrame + + + QFrame::Raised + + + + 0 + + + 0 + + + + + + 1 + 1 + 0 + 0 + + + + QFrame::NoFrame + + + QFrame::Raised + + + + 0 + + + 0 + + + + + 0 + + + 6 + + + + + QFrame::NoFrame + + + QFrame::Plain + + + <h3>Simple Search:</h3> + + + + + + + Qt::Horizontal + + + + 10 + 20 + + + + + + + + + 0 + 0 + 0 + 0 + + + + Keywords + + + + + + + + 7 + 0 + 3 + 0 + + + + + 558 + 16777215 + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 16 + 32 + + + + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Format</p></body></html> + + + + + + + + Any + + + :/images/FileTypeAny.png + + + + + Audio + + + :/images/FileTypeAudio.png + + + + + Video + + + :/images/FileTypeVideo.png + + + + + Images + + + :/images/FileTypePicture.png + + + + + Programs + + + :/images/FileTypeProgram.png + + + + + Archives + + + :/images/FileTypeArchive.png + + + + + Documents + + + :/images/FileTypeDocument.png + + + + + + + + Qt::Horizontal + + + + 16 + 20 + + + + + + + + + 34 + 34 + + + + + 34 + 34 + + + + Perform simple search + + + + + + :/images/find.png + + + + 24 + 24 + + + + + + + + + + + + + true + + + + 1 + 1 + 0 + 0 + + + + QFrame::NoFrame + + + QFrame::Raised + + + + 0 + + + 0 + + + + + 0 + + + 6 + + + + + <h3>Advanced Search:</h3> + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 50 + 20 + + + + + + + + true + + + + 0 + 0 + 0 + 0 + + + + Show Advanced Search Tool + + + + + + + + + + + + + + + 5 + + + 6 + + + + + + 0 + 0 + 0 + 0 + + + + + 34 + 34 + + + + + 34 + 34 + + + + Download + + + + + + :/images/down_24x24.png + + + + 24 + 24 + + + + + + + + Qt::Vertical + + + + 20 + 0 + + + + + + + + + + + + + 1 + 1 + 0 + 1 + + + + Qt::Horizontal + + + + + 7 + 7 + 1 + 0 + + + + Qt::CustomContextMenu + + + true + + + + Filename + + + + + Size + + + + + Hash + + + + + Sources + + + + + + + 1 + 1 + 0 + 1 + + + + + 0 + 0 + + + + + 0 + 0 + + + + true + + + Qt::CustomContextMenu + + + true + + + + KeyWords + + + + + Results + + + + + Search Id + + + + + + + + + + + + + + + toggleAdvancedSearchBtn + toggled(bool) + SimpleSearchPanel + setHidden(bool) + + + 29 + 35 + + + 72 + 43 + + + + + toggleAdvancedSearchBtn + toggled(bool) + AdvancedSearchPanel + setVisible(bool) + + + 28 + 29 + + + 80 + 64 + + + + + diff --git a/retroshare-gui/src/gui/Settings/DirectoriesPage.cpp b/retroshare-gui/src/gui/Settings/DirectoriesPage.cpp new file mode 100644 index 000000000..746a7bfa8 --- /dev/null +++ b/retroshare-gui/src/gui/Settings/DirectoriesPage.cpp @@ -0,0 +1,54 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 "DirectoriesPage.h" +#include "rshare.h" + +DirectoriesPage::DirectoriesPage(QWidget * parent, Qt::WFlags flags) + : QWidget(parent, flags) +{ + ui.setupUi(this); + setAttribute(Qt::WA_QuitOnClose, false); + + +} + +void +DirectoriesPage::closeEvent (QCloseEvent * event) +{ + QWidget::closeEvent(event); +} + + +/** Saves the changes on this page */ +bool +DirectoriesPage::save(QString &errmsg) +{ + +} + +/** Loads the settings for this page */ +void +DirectoriesPage::load() +{ + +} + diff --git a/retroshare-gui/src/gui/Settings/DirectoriesPage.h b/retroshare-gui/src/gui/Settings/DirectoriesPage.h new file mode 100644 index 000000000..1f5bdf609 --- /dev/null +++ b/retroshare-gui/src/gui/Settings/DirectoriesPage.h @@ -0,0 +1,47 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 DIRECTORIESPAGE_H +# define DIRECTORIESPAGE_H + +# include +# include "ui_DirectoriesPage.h" + +class DirectoriesPage: public QWidget +{ + public: + DirectoriesPage(QWidget * parent = 0, Qt::WFlags flags = 0); + ~DirectoriesPage() {} + + /** Saves the changes on this page */ + bool save(QString &errmsg); + /** Loads the settings for this page */ + void load(); + + private: + + void closeEvent (QCloseEvent * event); + + Ui::DirectoriesPage ui; +}; + +#endif // !GENERALPAGE_H + diff --git a/retroshare-gui/src/gui/Settings/DirectoriesPage.ui b/retroshare-gui/src/gui/Settings/DirectoriesPage.ui new file mode 100644 index 000000000..4d6646b4e --- /dev/null +++ b/retroshare-gui/src/gui/Settings/DirectoriesPage.ui @@ -0,0 +1,630 @@ + + DirectoriesPage + + + + 0 + 0 + 406 + 313 + + + + + 7 + 7 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 192 + 192 + 192 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + 104 + 104 + 104 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 104 + 104 + 104 + + + + + + + 255 + 255 + 255 + + + + + + + 104 + 104 + 104 + + + + + + + 240 + 240 + 240 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + Arial + 10 + 50 + false + false + false + false + + + + true + + + Qt::NoContextMenu + + + + + 10 + 60 + 381 + 200 + + + + Shared Directories + + + + + 340 + 20 + 31 + 31 + + + + + + + :/images/directoryadd_24x24_shadow.png + + + + 24 + 24 + + + + + + + 340 + 60 + 31 + 31 + + + + + + + :/images/directoryremove_24x24_shadow.png + + + + 24 + 24 + + + + + + + 9 + 19 + 321 + 171 + + + + + + + + 10 + 0 + 381 + 61 + + + + Incoming files + + + + + 339 + 21 + 31 + 32 + + + + + + + :/images/directoryselect_24x24_shadow.png + + + + 24 + 24 + + + + + + + 11 + 26 + 321 + 23 + + + + + + + lineEdit_5 + pushButton_6 + listView + pushButton + pushButton_2 + + + + + + diff --git a/retroshare-gui/src/gui/Settings/GeneralPage.cpp b/retroshare-gui/src/gui/Settings/GeneralPage.cpp new file mode 100644 index 000000000..4d024c763 --- /dev/null +++ b/retroshare-gui/src/gui/Settings/GeneralPage.cpp @@ -0,0 +1,85 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 "GeneralPage.h" +#include "rshare.h" + +GeneralPage::GeneralPage(QWidget * parent, Qt::WFlags flags) + : QWidget(parent, flags) +{ + ui.setupUi(this); + setAttribute(Qt::WA_QuitOnClose, false); + setWindowTitle(windowTitle() + QLatin1String(" - Gloster 2")); + + //GConfig config; + //config.loadWidgetInformation(this); + + /* Create RshareSettings object */ + _settings = new RshareSettings(); + + /* Populate combo boxes */ + foreach (QString code, LanguageSupport::languageCodes()) { + ui.cmboLanguage->addItem(QIcon(":/images/flags/" + code + ".png"), + LanguageSupport::languageName(code), + code); + } + foreach (QString style, QStyleFactory::keys()) { + ui.cmboStyle->addItem(style, style.toLower()); + } +} + +void +GeneralPage::closeEvent (QCloseEvent * event) +{ + //GConfig config; + //config.saveWidgetInformation(this); + + QWidget::closeEvent(event); +} + + +/** Saves the changes on this page */ +bool +GeneralPage::save(QString &errmsg) +{ + Q_UNUSED(errmsg); + QString languageCode = + LanguageSupport::languageCode(ui.cmboLanguage->currentText()); + + _settings->setLanguageCode(languageCode); + _settings->setInterfaceStyle(ui.cmboStyle->currentText()); + + /* Set to new style */ + Rshare::setStyle(ui.cmboStyle->currentText()); + return true; +} + +/** Loads the settings for this page */ +void +GeneralPage::load() +{ + int index = ui.cmboLanguage->findData(_settings->getLanguageCode()); + ui.cmboLanguage->setCurrentIndex(index); + + index = ui.cmboStyle->findData(Rshare::style().toLower()); + ui.cmboStyle->setCurrentIndex(index); +} + diff --git a/retroshare-gui/src/gui/Settings/GeneralPage.h b/retroshare-gui/src/gui/Settings/GeneralPage.h new file mode 100644 index 000000000..1567c8c07 --- /dev/null +++ b/retroshare-gui/src/gui/Settings/GeneralPage.h @@ -0,0 +1,56 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 GENERALPAGE_H +# define GENERALPAGE_H + +#include +#include + +#include "config/rsharesettings.h" +#include "lang/languagesupport.h" + +# include +# include "ui_GeneralPage.h" + +class GeneralPage: public QWidget +{ + public: + GeneralPage(QWidget * parent = 0, Qt::WFlags flags = 0); + ~GeneralPage() {} + + /** Saves the changes on this page */ + bool save(QString &errmsg); + /** Loads the settings for this page */ + void load(); + + private: + /** A VidaliaSettings object used for saving/loading settings */ + RshareSettings* _settings; + + + void closeEvent (QCloseEvent * event); + + Ui::GeneralPage ui; +}; + +#endif // !GENERALPAGE_H + diff --git a/retroshare-gui/src/gui/Settings/GeneralPage.ui b/retroshare-gui/src/gui/Settings/GeneralPage.ui new file mode 100644 index 000000000..cf038c283 --- /dev/null +++ b/retroshare-gui/src/gui/Settings/GeneralPage.ui @@ -0,0 +1,184 @@ + + GeneralPage + + + + 0 + 0 + 400 + 364 + + + + Keys manager + + + + + + + + 10 + 80 + 381 + 55 + + + + Qt::NoContextMenu + + + + + + Style + + + + + 10 + 24 + 351 + 24 + + + + + 0 + + + 6 + + + + + + 150 + 0 + + + + Qt::NoContextMenu + + + Choose RetroShare's interface style + + + false + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + 10 + 0 + 381 + 75 + + + + Qt::NoContextMenu + + + Language + + + + + 10 + 27 + 591 + 17 + + + + Qt::NoContextMenu + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + + + + + + 10 + 44 + 351 + 24 + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + + 300 + 16 + + + + + + + + + 150 + 0 + + + + Qt::NoContextMenu + + + Choose the language used in RetroShare + + + false + + + + 24 + 16 + + + + + + + + + + cmboLanguage + cmboStyle + + + + + + diff --git a/retroshare-gui/src/gui/Settings/NetworkPage.cpp b/retroshare-gui/src/gui/Settings/NetworkPage.cpp new file mode 100644 index 000000000..5209ec2bb --- /dev/null +++ b/retroshare-gui/src/gui/Settings/NetworkPage.cpp @@ -0,0 +1,53 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 "NetworkPage.h" +#include "rshare.h" + +NetworkPage::NetworkPage(QWidget * parent, Qt::WFlags flags) + : QWidget(parent, flags) +{ + ui.setupUi(this); + setAttribute(Qt::WA_QuitOnClose, false); + +} + +void +NetworkPage::closeEvent (QCloseEvent * event) +{ + QWidget::closeEvent(event); +} + + +/** Saves the changes on this page */ +bool +NetworkPage::save(QString &errmsg) +{ + +} + +/** Loads the settings for this page */ +void +NetworkPage::load() +{ + +} + diff --git a/retroshare-gui/src/gui/Settings/NetworkPage.h b/retroshare-gui/src/gui/Settings/NetworkPage.h new file mode 100644 index 000000000..40453ddbb --- /dev/null +++ b/retroshare-gui/src/gui/Settings/NetworkPage.h @@ -0,0 +1,47 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 NETWORKPAGE_H +# define NETWORKPAGE_H + +# include +# include "ui_NetworkPage.h" + +class NetworkPage: public QWidget +{ + public: + NetworkPage(QWidget * parent = 0, Qt::WFlags flags = 0); + ~NetworkPage() {} + + /** Saves the changes on this page */ + bool save(QString &errmsg); + /** Loads the settings for this page */ + void load(); + + private: + + void closeEvent (QCloseEvent * event); + + Ui::NetworkPage ui; +}; + +#endif // !NETWROKPAGE_H + diff --git a/retroshare-gui/src/gui/Settings/NetworkPage.ui b/retroshare-gui/src/gui/Settings/NetworkPage.ui new file mode 100644 index 000000000..2a3dd5d94 --- /dev/null +++ b/retroshare-gui/src/gui/Settings/NetworkPage.ui @@ -0,0 +1,592 @@ + + NetworkPage + + + + 0 + 0 + 398 + 389 + + + + + 7 + 7 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 192 + 192 + 192 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + 104 + 104 + 104 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 104 + 104 + 104 + + + + + + + 255 + 255 + 255 + + + + + + + 104 + 104 + 104 + + + + + + + 240 + 240 + 240 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + Arial + 8 + 50 + false + false + false + false + + + + Qt::NoContextMenu + + + + + 10 + 0 + 371 + 81 + + + + Rate Options + + + + + 10 + 20 + 141 + 16 + + + + Max Total Data Rate (KB/S): + + + + + + 10 + 50 + 116 + 16 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Rate per Person (KB/S):</p></body></html> + + + + + + 280 + 50 + 62 + 22 + + + + 1 + + + 256.000000000000000 + + + 5.000000000000000 + + + + + + 280 + 20 + 62 + 22 + + + + 1 + + + 356.000000000000000 + + + 20.000000000000000 + + + + + + doubleSpinBox + doubleSpinBox_2 + + + + + + diff --git a/retroshare-gui/src/gui/Settings/ServerPage.cpp b/retroshare-gui/src/gui/Settings/ServerPage.cpp new file mode 100644 index 000000000..fbcb2655c --- /dev/null +++ b/retroshare-gui/src/gui/Settings/ServerPage.cpp @@ -0,0 +1,52 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 "ServerPage.h" +#include "rshare.h" + +ServerPage::ServerPage(QWidget * parent, Qt::WFlags flags) + : QWidget(parent, flags) +{ + ui.setupUi(this); + setAttribute(Qt::WA_QuitOnClose, false); +} + +void +ServerPage::closeEvent (QCloseEvent * event) +{ + QWidget::closeEvent(event); +} + + +/** Saves the changes on this page */ +bool +ServerPage::save(QString &errmsg) +{ + +} + +/** Loads the settings for this page */ +void +ServerPage::load() +{ + +} + diff --git a/retroshare-gui/src/gui/Settings/ServerPage.h b/retroshare-gui/src/gui/Settings/ServerPage.h new file mode 100644 index 000000000..8c0672435 --- /dev/null +++ b/retroshare-gui/src/gui/Settings/ServerPage.h @@ -0,0 +1,47 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 SERVERPAGE_H +# define SERVERPAGE_H + +# include +# include "ui_ServerPage.h" + +class ServerPage: public QWidget +{ + public: + ServerPage(QWidget * parent = 0, Qt::WFlags flags = 0); + ~ServerPage() {} + + /** Saves the changes on this page */ + bool save(QString &errmsg); + /** Loads the settings for this page */ + void load(); + + private: + + void closeEvent (QCloseEvent * event); + + Ui::ServerPage ui; +}; + +#endif // !SERVERPAGE_H + diff --git a/retroshare-gui/src/gui/Settings/ServerPage.ui b/retroshare-gui/src/gui/Settings/ServerPage.ui new file mode 100644 index 000000000..9128f72ab --- /dev/null +++ b/retroshare-gui/src/gui/Settings/ServerPage.ui @@ -0,0 +1,701 @@ + + ServerPage + + + + 0 + 0 + 399 + 389 + + + + + 7 + 7 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 192 + 192 + 192 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + 104 + 104 + 104 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 104 + 104 + 104 + + + + + + + 255 + 255 + 255 + + + + + + + 104 + 104 + 104 + + + + + + + 240 + 240 + 240 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + Arial + 8 + 50 + false + false + false + false + + + + Qt::NoContextMenu + + + + + 10 + 160 + 181 + 23 + + + + Change + Restart Server + + + + + + 10 + 0 + 381 + 101 + + + + Server Settings + + + + + 12 + 61 + 80 + 21 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Adress:</p></body></html> + + + + + + 12 + 21 + 66 + 21 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + + + + + + 98 + 10 + 271 + 81 + + + + + 0 + + + 6 + + + + + 0 + + + 6 + + + + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + + + + + + + 65535 + + + 1 + + + 7812 + + + + + + + + + 0 + + + 6 + + + + + 65535 + + + 1 + + + 7812 + + + + + + + Port: + + + + + + + + + + + + + + + 10 + 100 + 381 + 51 + + + + Misc + + + + + 10 + 20 + 131 + 18 + + + + behinde Firewall + + + + + + 130 + 20 + 151 + 18 + + + + Forwarded External Port + + + + + + lineEdit + spinBox_2 + lineEdit_2 + spinBox_3 + checkBox + checkBox_2 + pushButton + + + + + + diff --git a/retroshare-gui/src/gui/Settings/gsettingswin.cpp b/retroshare-gui/src/gui/Settings/gsettingswin.cpp new file mode 100644 index 000000000..65b282001 --- /dev/null +++ b/retroshare-gui/src/gui/Settings/gsettingswin.cpp @@ -0,0 +1,85 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 "GeneralPage.h" +#include "DirectoriesPage.h" +#include "ServerPage.h" +#include "NetworkPage.h" +#include "gsettingswin.h" + +GSettingsWin::GSettingsWin(QWidget * parent, Qt::WFlags flags) + : QDialog(parent, flags) +{ + setupUi(this); + setAttribute(Qt::WA_QuitOnClose, false); + setModal(false); + //setWindowTitle(windowTitle() + QLatin1String(___GLOSTER_WINTITLE)); + + initStackedWidget(); + + connect(listWidget, SIGNAL(currentRowChanged(int)), + this, SLOT(setNewPage(int))); + +} + +void +GSettingsWin::closeEvent (QCloseEvent * event) +{ + + QWidget::closeEvent(event); +} + +void +GSettingsWin::initStackedWidget() +{ + stackedWidget->setCurrentIndex(-1); + stackedWidget->removeWidget(stackedWidget->widget(0)); + + stackedWidget->addWidget(new GeneralPage(false)); + stackedWidget->addWidget(new NetworkPage()); + stackedWidget->addWidget(new ServerPage()); + stackedWidget->addWidget(new DirectoriesPage()); + + + setNewPage(General); + + +} + +void +GSettingsWin::setNewPage(int page) +{ + QString text; + + if (page == General) + text = tr("General"); + else if (page == Network) + text = tr("Network"); + else if (page == Directories) + text = tr("Directories"); + else if (page == Server) + text = tr("Server"); + + pageName->setText(tr("%1").arg(text)); + stackedWidget->setCurrentIndex(page); + listWidget->setCurrentRow(page); +} diff --git a/retroshare-gui/src/gui/Settings/gsettingswin.h b/retroshare-gui/src/gui/Settings/gsettingswin.h new file mode 100644 index 000000000..a335e31fb --- /dev/null +++ b/retroshare-gui/src/gui/Settings/gsettingswin.h @@ -0,0 +1,51 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 GSETTINGSWIN_HPP_ +# define GSETTINGSWIN_HPP_ + +# include +# include "ui_settings.h" + +/*! \class GSettingsWin + \brief The Gloster control panel. + + */ +class GSettingsWin: public QDialog, private Ui::Settings +{ + Q_OBJECT + + public: + enum PageType { General = 0, Network, Server, Directories }; + + GSettingsWin(QWidget * parent = 0, Qt::WFlags flags = 0); + ~GSettingsWin() {} + + public slots: + //! Go to a specific part of the control panel. + void setNewPage(int page); + + private: + void closeEvent (QCloseEvent * event); + void initStackedWidget(); +}; + +#endif // !GSETTINGSWIN_HPP_ diff --git a/retroshare-gui/src/gui/Settings/settings.ui b/retroshare-gui/src/gui/Settings/settings.ui new file mode 100644 index 000000000..56fc14bd3 --- /dev/null +++ b/retroshare-gui/src/gui/Settings/settings.ui @@ -0,0 +1,280 @@ + + Settings + + + + 0 + 0 + 434 + 366 + + + + Settings + + + + + + + 9 + + + 6 + + + + + 0 + + + 6 + + + + + + 1 + 4 + 0 + 0 + + + + + Sans Serif + 9 + 75 + false + true + false + false + + + + + + + + + + + Qt::Horizontal + + + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + + 312 + 31 + + + + + + + + + 0 + 22 + + + + Cancel + + + + + + + false + + + + 0 + 22 + + + + Apply + + + + + + + + 0 + 22 + + + + OK + + + + + + + + + + 110 + 0 + + + + + 110 + 16777215 + + + + false + + + + 24 + 24 + + + + Qt::ElideMiddle + + + QListView::Static + + + QListView::TopToBottom + + + false + + + QListView::Fixed + + + QListView::SinglePass + + + + 100 + 32 + + + + QListView::ListMode + + + 0 + + + true + + + -1 + + + + General + + + :/images/misc.png + + + + + Network + + + :/images/connect_24x24_shadow.png + + + + + Server + + + :/images/webcache_24x24.png + + + + + Directories + + + :/images/directories_24x24.png + + + + + + + + Qt::Horizontal + + + + + + + 0 + + + + + + + + + + + + okButton + clicked() + Settings + accept() + + + 278 + 253 + + + 96 + 254 + + + + + canceButton + clicked() + Settings + reject() + + + 369 + 253 + + + 179 + 282 + + + + + diff --git a/retroshare-gui/src/gui/SharedFilesDialog.cpp b/retroshare-gui/src/gui/SharedFilesDialog.cpp new file mode 100644 index 000000000..812f0e9fe --- /dev/null +++ b/retroshare-gui/src/gui/SharedFilesDialog.cpp @@ -0,0 +1,355 @@ +/**************************************************************** + * RShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 "rshare.h" +#include "SharedFilesDialog.h" +#include "rsiface/rsiface.h" +#include "rsiface/RemoteDirModel.h" +#include "util/RsAction.h" +#include "msgs/ChanMsgDialog.h" + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +/* Images for context menu icons */ +#define IMAGE_DOWNLOAD ":/images/start.png" + +/** Constructor */ +SharedFilesDialog::SharedFilesDialog(QWidget *parent) +: MainPage(parent) +{ + /* Invoke the Qt Designer generated object setup routine */ + ui.setupUi(this); + + connect( ui.localDirTreeView, SIGNAL( customContextMenuRequested( QPoint ) ), this, SLOT( shareddirtreeWidgetCostumPopupMenu( QPoint ) ) ); + + connect( ui.remoteDirTreeView, SIGNAL( customContextMenuRequested( QPoint ) ), this, SLOT( shareddirtreeviewCostumPopupMenu( QPoint ) ) ); + +/* + connect( ui.remoteDirTreeView, SIGNAL( itemExpanded( QTreeWidgetItem * ) ), + this, SLOT( checkForLocalDirRequest( QTreeWidgetItem * ) ) ); + + connect( ui.localDirTreeWidget, SIGNAL( itemExpanded( QTreeWidgetItem * ) ), + this, SLOT( checkForRemoteDirRequest( QTreeWidgetItem * ) ) ); +*/ + + + model = new RemoteDirModel(true); + localModel = new RemoteDirModel(false); + ui.remoteDirTreeView->setModel(model); + ui.localDirTreeView->setModel(localModel); + + connect( ui.remoteDirTreeView, SIGNAL( collapsed(const QModelIndex & ) ), + model, SLOT( collapsed(const QModelIndex & ) ) ); + connect( ui.remoteDirTreeView, SIGNAL( expanded(const QModelIndex & ) ), + model, SLOT( expanded(const QModelIndex & ) ) ); + + connect( ui.localDirTreeView, SIGNAL( collapsed(const QModelIndex & ) ), + localModel, SLOT( collapsed(const QModelIndex & ) ) ); + connect( ui.localDirTreeView, SIGNAL( expanded(const QModelIndex & ) ), + localModel, SLOT( expanded(const QModelIndex & ) ) ); + + + /* Set header resize modes and initial section sizes */ + QHeaderView * l_header = ui.localDirTreeView->header () ; + l_header->setResizeMode (0, QHeaderView::Interactive); + l_header->setResizeMode (1, QHeaderView::Interactive); + l_header->setResizeMode (2, QHeaderView::Interactive); + l_header->setResizeMode (3, QHeaderView::Interactive); + + l_header->resizeSection ( 0, 210 ); + l_header->resizeSection ( 1, 100 ); + l_header->resizeSection ( 2, 100 ); + l_header->resizeSection ( 3, 100 ); + + /* Set header resize modes and initial section sizes */ + QHeaderView * r_header = ui.remoteDirTreeView->header () ; + r_header->setResizeMode (0, QHeaderView::Interactive); + r_header->setResizeMode (1, QHeaderView::Interactive); + r_header->setResizeMode (2, QHeaderView::Interactive); + r_header->setResizeMode (3, QHeaderView::Interactive); + + r_header->resizeSection ( 0, 210 ); + r_header->resizeSection ( 1, 100 ); + r_header->resizeSection ( 2, 100 ); + r_header->resizeSection ( 3, 100 ); + + /* Set Multi Selection */ + ui.remoteDirTreeView->setSelectionMode(QAbstractItemView::ExtendedSelection); + ui.localDirTreeView->setSelectionMode(QAbstractItemView::ExtendedSelection); + + /* Hide platform specific features */ +#ifdef Q_WS_WIN + +#endif +} + +void SharedFilesDialog::shareddirtreeviewCostumPopupMenu( QPoint point ) +{ + + QMenu contextMnu( this ); + QMouseEvent *mevent = new QMouseEvent( QEvent::MouseButtonPress, point, Qt::RightButton, Qt::RightButton, Qt::NoModifier ); + + downloadAct = new QAction(QIcon(IMAGE_DOWNLOAD), tr( "Download" ), this ); + connect( downloadAct , SIGNAL( triggered() ), this, SLOT( downloadRemoteSelected() ) ); + + // addMsgAct = new QAction( tr( "Add to Message" ), this ); + // connect( addMsgAct , SIGNAL( triggered() ), this, SLOT( addMsgRemoteSelected() ) ); + + + contextMnu.clear(); + contextMnu.addAction( downloadAct); + // contextMnu.addAction( addMsgAct); + contextMnu.exec( mevent->globalPos() ); +} + + +void SharedFilesDialog::downloadRemoteSelected() +{ + /* call back to the model (which does all the interfacing? */ + + std::cerr << "Downloading Files"; + std::cerr << std::endl; + + QItemSelectionModel *qism = ui.remoteDirTreeView->selectionModel(); + model -> downloadSelected(qism->selectedIndexes()); + +} + + +void SharedFilesDialog::addMsgRemoteSelected() +{ + /* call back to the model (which does all the interfacing? */ + + std::cerr << "Recommending Files"; + std::cerr << std::endl; + + QItemSelectionModel *qism = ui.remoteDirTreeView->selectionModel(); + model -> recommendSelected(qism->selectedIndexes()); + + +} + + + +void SharedFilesDialog::recommendfile() +{ + /* call back to the model (which does all the interfacing? */ + + std::cerr << "Recommending Files"; + std::cerr << std::endl; + + QItemSelectionModel *qism = ui.localDirTreeView->selectionModel(); + localModel -> recommendSelected(qism->selectedIndexes()); +} + + + + +void SharedFilesDialog::recommendFileSetOnly() +{ + /* call back to the model (which does all the interfacing? */ + + std::cerr << "Recommending File Set (clearing old selection)"; + std::cerr << std::endl; + + /* clear current recommend Selection done by model */ + + QItemSelectionModel *qism = ui.localDirTreeView->selectionModel(); + localModel -> recommendSelectedOnly(qism->selectedIndexes()); +} + + +void SharedFilesDialog::recommendFilesTo( std::string rsid ) +{ + recommendFileSetOnly(); + rsicontrol -> ClearInMsg(); + rsicontrol -> SetInMsg(rsid, true); + + /* create a message */ + ChanMsgDialog *nMsgDialog = new ChanMsgDialog(true); + + /* fill it in + * files are receommended already + * just need to set peers + */ + std::cerr << "SharedFilesDialog::recommendFilesTo()" << std::endl; + nMsgDialog->newMsg(); + nMsgDialog->insertTitleText("Recommendation(s)"); + nMsgDialog->insertMsgText("Recommendation(s)"); + + nMsgDialog->sendMessage(); + nMsgDialog->close(); +} + + + +void SharedFilesDialog::recommendFilesToMsg( std::string rsid ) +{ + recommendFileSetOnly(); + + rsicontrol -> ClearInMsg(); + rsicontrol -> SetInMsg(rsid, true); + + /* create a message */ + ChanMsgDialog *nMsgDialog = new ChanMsgDialog(true); + + /* fill it in + * files are receommended already + * just need to set peers + */ + std::cerr << "SharedFilesDialog::recommendFilesToMsg()" << std::endl; + nMsgDialog->newMsg(); + nMsgDialog->insertTitleText("Recommendation(s)"); + nMsgDialog->insertMsgText("Recommendation(s)"); + + nMsgDialog->show(); +} + + + +void SharedFilesDialog::openfile() +{ + /* call back to the model (which does all the interfacing? */ + + std::cerr << "Opening File"; + std::cerr << std::endl; + + QItemSelectionModel *qism = ui.localDirTreeView->selectionModel(); + model -> openSelected(qism->selectedIndexes()); + +} + + +void SharedFilesDialog::openfolder() +{ + +} + + +void SharedFilesDialog::preModDirectories(bool update_local) +{ + if (update_local) + { + localModel->preMods(); + } + else + { + model->preMods(); + } +} + + +void SharedFilesDialog::ModDirectories(bool update_local) +{ + if (update_local) + { + localModel->postMods(); + } + else + { + model->postMods(); + } +} + + +void SharedFilesDialog::shareddirtreeWidgetCostumPopupMenu( QPoint point ) +{ + + QMenu contextMnu2( this ); + QMouseEvent *mevent2 = new QMouseEvent( QEvent::MouseButtonPress, point, Qt::RightButton, Qt::RightButton, Qt::NoModifier ); + + openfileAct = new QAction( tr( "Add to Recommend List" ), this ); + connect( openfileAct , SIGNAL( triggered() ), this, SLOT( recommendfile() ) ); + + // openfolderAct = new QAction( tr( "Play File" ), this ); + // connect( openfolderAct , SIGNAL( triggered() ), this, SLOT( openfile() ) ); + // + /* now we're going to ask who to recommend it to... + * First Level. + * + * Add to Recommend List. + * Recommend to > + * all. + * list of + * Recommend with msg > + * all. + * list of + * + */ + + QMenu *recMenu = new QMenu( tr("Recommend To "), this ); + QMenu *msgMenu = new QMenu( tr("Message Friend "), &contextMnu2 ); + + + rsiface->lockData(); /* Lock Interface */ + + std::map::const_iterator it; + const std::map &friends = + rsiface->getFriendMap(); + + for(it = friends.begin(); it != friends.end(); it++) + { + /* parents are + * recMenu + * msgMenu + */ + std::string rsid; + { + std::ostringstream out; + out << it -> second.id; + rsid = out.str(); + } + + RsAction *qaf1 = new RsAction( QString::fromStdString( it->second.name ), recMenu, rsid ); + connect( qaf1 , SIGNAL( triggeredId( std::string ) ), this, SLOT( recommendFilesTo( std::string ) ) ); + recMenu->addAction(qaf1); + + RsAction *qaf2 = new RsAction( QString::fromStdString( it->second.name ), msgMenu, rsid ); + connect( qaf2 , SIGNAL( triggeredId( std::string ) ), this, SLOT( recommendFilesToMsg( std::string ) ) ); + msgMenu->addAction(qaf2); + + /* create list of ids */ + + } + + rsiface->unlockData(); /* UnLock Interface */ + + + contextMnu2.addAction( openfileAct); + contextMnu2.addMenu( recMenu); + contextMnu2.addMenu( msgMenu); + + + contextMnu2.exec( mevent2->globalPos() ); + + +} + diff --git a/retroshare-gui/src/gui/SharedFilesDialog.h b/retroshare-gui/src/gui/SharedFilesDialog.h new file mode 100644 index 000000000..f94da1e06 --- /dev/null +++ b/retroshare-gui/src/gui/SharedFilesDialog.h @@ -0,0 +1,95 @@ +/**************************************************************** + * RShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 _SHAREDFILESDIALOG_H +#define _SHAREDFILESDIALOG_H + +#include + +//#include + +#include "mainpage.h" +#include "ui_SharedFilesDialog.h" + +#include "rsiface/rstypes.h" +#include "rsiface/RemoteDirModel.h" + +class SharedFilesDialog : public MainPage +{ + Q_OBJECT + +public: + /** Default Constructor */ + SharedFilesDialog(QWidget *parent = 0); + /** Default Destructor */ + + /* For handling the model updates */ +void preModDirectories(bool update_local); +void ModDirectories(bool update_local); + + + +private slots: + + /** Create the context popup menu and it's submenus */ + void shareddirtreeviewCostumPopupMenu( QPoint point ); + + void shareddirtreeWidgetCostumPopupMenu( QPoint point ); + + void downloadRemoteSelected(); + void addMsgRemoteSelected(); + + void recommendfile(); + void openfile(); + void openfolder(); + + void recommendFileSetOnly(); + void recommendFilesTo( std::string rsid ); + void recommendFilesToMsg( std::string rsid ); + +private: + /** Define the popup menus for the Context menu */ + QMenu* contextMnu; + + QMenu* contextMnu2; + + /** Defines the actions for the context menu for QTreeView */ + QAction* downloadAct; + QAction* addMsgAct; + + /** Defines the actions for the context menu for QTreeWidget */ + QAction* openfileAct; + QAction* openfolderAct; + + + QTreeView *shareddirtreeview; + + + /** Qt Designer generated object */ + Ui::SharedFilesDialog ui; + + /* RemoteDirModel */ + RemoteDirModel *model; + RemoteDirModel *localModel; +}; + +#endif + diff --git a/retroshare-gui/src/gui/SharedFilesDialog.ui b/retroshare-gui/src/gui/SharedFilesDialog.ui new file mode 100644 index 000000000..a82da8e56 --- /dev/null +++ b/retroshare-gui/src/gui/SharedFilesDialog.ui @@ -0,0 +1,634 @@ + + SharedFilesDialog + + + + 0 + 0 + 467 + 309 + + + + + 7 + 7 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 192 + 192 + 192 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + 104 + 104 + 104 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 104 + 104 + 104 + + + + + + + 255 + 255 + 255 + + + + + + + 104 + 104 + 104 + + + + + + + 240 + 240 + 240 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + Arial + 8 + 50 + false + false + false + false + + + + Qt::NoContextMenu + + + + 1 + + + 1 + + + + + 0 + + + 0 + + + + + 0 + + + 0 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + 0 + + + 6 + + + + + + + + :/images/folder_green16.png + + + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Files</span></p></body></html> + + + + + + + + + + + + 7 + 7 + 0 + 0 + + + + Qt::Horizontal + + + + Qt::CustomContextMenu + + + true + + + true + + + QAbstractItemView::DragDrop + + + false + + + QAbstractItemView::ContiguousSelection + + + true + + + + + Qt::CustomContextMenu + + + true + + + QAbstractItemView::DragOnly + + + false + + + true + + + + + + + + + + + + + diff --git a/retroshare-gui/src/gui/StartDialog.cpp b/retroshare-gui/src/gui/StartDialog.cpp new file mode 100644 index 000000000..76c3f4358 --- /dev/null +++ b/retroshare-gui/src/gui/StartDialog.cpp @@ -0,0 +1,173 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, 2007 crypton + * + * 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 +#include "StartDialog.h" +#include "GenCertDialog.h" +#include "LogoBar.h" +#include +#include +#include "util/Widget.h" + +/* Define the format used for displaying the date and time */ +#define DATETIME_FMT "MMM dd hh:mm:ss" + + + +/** Default constructor */ +StartDialog::StartDialog(RsInit *conf, QWidget *parent, Qt::WFlags flags) + : QMainWindow(parent, flags), rsConfig(conf), reqNewCert(false) +{ + /* Invoke Qt Designer generated QObject setup routine */ + ui.setupUi(this); + /************ +#if (QT_VERSION >= 040300) + skinobject = new QSkinObject(this); + skinobject->startSkinning(); +#endif + ***********/ + RshareSettings config; + config.loadWidgetInformation(this); + + _rsLogoBar = NULL; + + //LogoBar + _rsLogoBar = new LogoBar(ui.callBarFrame); + Widget::createLayout(ui.callBarFrame)->addWidget(_rsLogoBar); + + /* Create Bandwidth Graph related QObjects */ + _settings = new RshareSettings(); + + + + //connect(ui.genButton, SIGNAL(clicked()), this, SLOT(genPerson())); + connect(ui.loadButton, SIGNAL(clicked()), this, SLOT(loadPerson())); + connect(ui.loadPasswd, SIGNAL(returnPressed()), this, SLOT(loadPerson())); + //connect(ui.selectButton, SIGNAL(clicked()), this, SLOT(selectFriend())); + //connect(ui.friendBox, SIGNAL(stateChanged(int)), this, SLOT(checkChanged(int))); + connect(ui.createaccountButton, SIGNAL(clicked()), this, SLOT(createnewaccount())); + + /* load the Certificate File name */ + std::string userName; + + if (ValidateCertificate(rsConfig, userName)) + { + /* just need to enter password */ + ui.loadName->setText(QString::fromStdString(userName)); + ui.loadPasswd->setFocus(Qt::OtherFocusReason); + ui.loadButton -> setEnabled(true); + } + else + { + /* need to generate new user */ + ui.loadName->setText(""); + ui.loadButton -> setEnabled(false); + //ui.genName->setFocus(Qt::OtherFocusReason); + } + + //ui.genFriend -> setText(""); + +} + + + +/** + Overloads the default show() slot so we can set opacity*/ + +void StartDialog::show() +{ + //loadSettings(); + if(!this->isVisible()) { + QMainWindow::show(); + + } +} + +void StartDialog::closeEvent (QCloseEvent * event) +{ + RshareSettings config; + config.saveWidgetInformation(this); + + QWidget::closeEvent(event); +} + +void StartDialog::closeinfodlg() +{ + close(); +} + + + +void StartDialog::loadPerson() +{ + std::string passwd = ui.loadPasswd->text().toStdString(); + LoadPassword(rsConfig, passwd); + loadCertificates(); +} + +void StartDialog::loadCertificates() +{ + bool autoSave = (Qt::Checked == ui.autoBox -> checkState()); + /* Final stage of loading */ + if (LoadCertificates(rsConfig, autoSave)) + { + close(); + } + else + { + /* some error msg */ + QMessageBox::StandardButton sb = QMessageBox::warning ( NULL, + "Login Failure", + "*** Wrong Password ***", + QMessageBox::Ok); + ui.loadPasswd->setText(""); + } + +} + + +void StartDialog::createnewaccount() +{ + //static GenCertDialog *gencertdialog = new GenCertDialog(); + //gencertdialog->show(); + + QMessageBox::StandardButton sb = QMessageBox::question ( NULL, + "Create New Certificate", + "This will delete your existing Certificate\n Are you sure you want to continue", + (QMessageBox::Ok | QMessageBox::No)); + + if (sb == QMessageBox::Ok) + { + reqNewCert = true; + close(); + } +} + +bool StartDialog::requestedNewCert() +{ + return reqNewCert; +} + + +LogoBar & StartDialog::getLogoBar() const { + return *_rsLogoBar; +} + diff --git a/retroshare-gui/src/gui/StartDialog.h b/retroshare-gui/src/gui/StartDialog.h new file mode 100644 index 000000000..2a221c377 --- /dev/null +++ b/retroshare-gui/src/gui/StartDialog.h @@ -0,0 +1,92 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, 2007 crypton + * + * 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 _STARTDIALOG_H +#define _STARTDIALOG_H + +#include +#include "rsiface/rsiface.h" +/******** +#if (QT_VERSION >= 040300) +#include "qskinobject/qskinobject.h" +#endif +*******/ + +#include "ui_StartDialog.h" + +class LogoBar; + +class StartDialog : public QMainWindow +{ + Q_OBJECT + +public: + /** Default constructor */ + StartDialog(RsInit *config, QWidget *parent = 0, Qt::WFlags flags = 0); + /** Default destructor */ + //~StartDialog(); + + bool requestedNewCert(); + +public slots: + /** Overloaded QWidget.show */ + void show(); + + LogoBar & getLogoBar() const; + +protected: + void closeEvent (QCloseEvent * event); + +private slots: + + void closeinfodlg(); + void loadPerson(); + void createnewaccount(); + +private: + + /** Loads the saved connectidialog settings */ +// void loadSettings(); + void loadCertificates(); + + + /** A VidaliaSettings object that handles getting/saving settings */ + RshareSettings* _settings; + + LogoBar * _rsLogoBar; + + /** Qt Designer generated object */ + Ui::StartDialog ui; + +/************** +#if (QT_VERSION >= 040300) + QSkinObject *skinobject; +#endif +**************/ + + RsInit *rsConfig; + + bool reqNewCert; +}; + +#endif + diff --git a/retroshare-gui/src/gui/StartDialog.ui b/retroshare-gui/src/gui/StartDialog.ui new file mode 100644 index 000000000..9f58b8f4c --- /dev/null +++ b/retroshare-gui/src/gui/StartDialog.ui @@ -0,0 +1,729 @@ + + StartDialog + + + + 0 + 0 + 235 + 389 + + + + + + + + + 0 + 0 + 0 + + + + + + + 244 + 244 + 244 + + + + + + + 244 + 244 + 244 + + + + + + + 241 + 239 + 226 + + + + + + + 140 + 140 + 140 + + + + + + + 163 + 163 + 163 + + + + + + + 0 + 0 + 0 + + + + + + + 244 + 244 + 244 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 236 + 243 + 246 + + + + + + + 106 + 106 + 106 + + + + + + + 197 + 231 + 246 + + + + + + + 0 + 0 + 0 + + + + + + + 232 + 232 + 232 + + + + + + + + + 0 + 0 + 0 + + + + + + + 244 + 244 + 244 + + + + + + + 244 + 244 + 244 + + + + + + + 241 + 239 + 226 + + + + + + + 140 + 140 + 140 + + + + + + + 163 + 163 + 163 + + + + + + + 0 + 0 + 0 + + + + + + + 244 + 244 + 244 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 236 + 243 + 246 + + + + + + + 106 + 106 + 106 + + + + + + + 244 + 244 + 244 + + + + + + + 0 + 0 + 0 + + + + + + + 232 + 232 + 232 + + + + + + + + + 122 + 122 + 122 + + + + + + + 244 + 244 + 244 + + + + + + + 244 + 244 + 244 + + + + + + + 244 + 244 + 244 + + + + + + + 140 + 140 + 140 + + + + + + + 163 + 163 + 163 + + + + + + + 122 + 122 + 122 + + + + + + + 244 + 244 + 244 + + + + + + + 122 + 122 + 122 + + + + + + + 244 + 244 + 244 + + + + + + + 236 + 243 + 246 + + + + + + + 0 + 0 + 0 + + + + + + + 197 + 231 + 246 + + + + + + + 0 + 0 + 0 + + + + + + + 232 + 232 + 232 + + + + + + + + + + + Qt::NoContextMenu + + + RetroShare + + + :/images/rstray3.png + + + QWidget { + background-color: #ECF3F6; +} + + + + + 0 + + + 0 + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + 6 + + + 0 + + + + + Password: + + + + + + + Name: + + + + + + + + 20 + 0 + + + + true + + + + + + + + 20 + 0 + + + + QLineEdit::Password + + + false + + + + + + + + + + 16 + 65 + + + + QFrame::NoFrame + + + QFrame::Raised + + + + + + + 9 + + + 6 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Create a Account + + + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + + 71 + 20 + + + + + + + + Qt::Horizontal + + + + 61 + 20 + + + + + + + + Log In + + + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + QToolButton{ +border-image: url(:/images/avatar_background.png); + +} + + + + + + + :/images/retrosharelogo1.png + + + + 96 + 96 + + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + 6 + + + 0 + + + + + Auto-login + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + loadName + loadPasswd + autoBox + loadButton + toolButton + + + + + + diff --git a/retroshare-gui/src/gui/StatisticDialog.cpp b/retroshare-gui/src/gui/StatisticDialog.cpp new file mode 100644 index 000000000..2cfe9542f --- /dev/null +++ b/retroshare-gui/src/gui/StatisticDialog.cpp @@ -0,0 +1,242 @@ +/**************************************************************** + * RShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 "rshare.h" +#include "StatisticDialog.h" +//#include + + +/** Constructor */ +StatisticDialog::StatisticDialog(QWidget *parent) +: MainPage(parent) +{ + /* Invoke the Qt Designer generated object setup routine */ + ui.setupUi(this); + + /* Create Bandwidth Graph related QObjects */ + _settings = new RshareSettings(); + + /* Bind events to actions */ + createActions(); + + /* Ask Tor to notify us about bandwidth updates */ +// _torControl = Vidalia::torControl(); +// _torControl->setEvent(TorEvents::Bandwidth, this, true); + + /* Initialize Sent/Receive data counters */ + reset(); + + /* Hide Bandwidth Graph Settings frame */ + showSettingsFrame(false); + + /* Turn off opacity group on unsupported platforms */ +#if defined(Q_WS_WIN) + if(!(QSysInfo::WV_2000 <= QSysInfo::WindowsVersion <= QSysInfo::WV_2003)) { + ui.frmOpacity->setVisible(false); + } +#endif + +#if defined(Q_WS_X11) + ui.frmOpacity->setVisible(false); +#endif +} + +/** Default destructor */ +StatisticDialog::~StatisticDialog() +{ + delete _settings; +} + +/** + Custom event handler. Checks if the event is a bandwidth update event. If it + is, it will add the data point to the history and updates the graph. + +void +StatisticDialog::customEvent(QEvent *event) +{ + if (event->type() == CustomEventType::BandwidthEvent) { + BandwidthEvent *bw = (BandwidthEvent *)event; + updateGraph(bw->bytesRead(), bw->bytesWritten()); + } +}*/ + +/** + Binds events to actions +*/ +void +StatisticDialog::createActions() +{ + connect(ui.btnToggleSettings, SIGNAL(toggled(bool)), + this, SLOT(showSettingsFrame(bool))); + + connect(ui.btnReset, SIGNAL(clicked()), + this, SLOT(reset())); + + connect(ui.btnSaveSettings, SIGNAL(clicked()), + this, SLOT(saveChanges())); + + connect(ui.btnCancelSettings, SIGNAL(clicked()), + this, SLOT(cancelChanges())); + + connect(ui.sldrOpacity, SIGNAL(valueChanged(int)), + this, SLOT(setOpacity(int))); +} + +/** + Adds new data to the graph +*/ +void +StatisticDialog::updateGraph(quint64 bytesRead, quint64 bytesWritten) +{ + /* Graph only cares about kilobytes */ + ui.frmGraph->addPoints(bytesRead/1024.0, bytesWritten/1024.0); +} + +/** + Loads the saved Bandwidth Graph settings +*/ +void +StatisticDialog::loadSettings() +{ + /* Set window opacity slider widget */ + ui.sldrOpacity->setValue(_settings->getBWGraphOpacity()); + + + + /* Set the line filter checkboxes accordingly */ + uint filter = _settings->getBWGraphFilter(); + ui.chkReceiveRate->setChecked(filter & BWGRAPH_REC); + ui.chkSendRate->setChecked(filter & BWGRAPH_SEND); + + /* Set graph frame settings */ + ui.frmGraph->setShowCounters(ui.chkReceiveRate->isChecked(), + ui.chkSendRate->isChecked()); +} + +/** + Resets the log start time +*/ +void +StatisticDialog::reset() +{ + /* Set to current time */ +// ui.statusbar->showMessage(tr("Since:") + " " + +// QDateTime::currentDateTime() +// .toString(DATETIME_FMT)); + /* Reset the graph */ + ui.frmGraph->resetGraph(); +} + +/** + Saves the Bandwidth Graph settings and adjusts the graph if necessary +*/ +void +StatisticDialog::saveChanges() +{ + /* Hide the settings frame and reset toggle button */ + showSettingsFrame(false); + + /* Save the opacity */ + _settings->setBWGraphOpacity(ui.sldrOpacity->value()); + + + + /* Save the line filter values */ + _settings->setBWGraphFilter(BWGRAPH_REC, ui.chkReceiveRate->isChecked()); + _settings->setBWGraphFilter(BWGRAPH_SEND, ui.chkSendRate->isChecked()); + + /* Update the graph frame settings */ + ui.frmGraph->setShowCounters(ui.chkReceiveRate->isChecked(), + ui.chkSendRate->isChecked()); + + /* A change in window flags causes the window to disappear, so make sure + * it's still visible. */ + showNormal(); +} + +/** + Simply restores the previously saved settings +*/ +void +StatisticDialog::cancelChanges() +{ + /* Hide the settings frame and reset toggle button */ + showSettingsFrame(false); + + /* Reload the settings */ + loadSettings(); +} + +/** + Toggles the Settings pane on and off, changes toggle button text +*/ +void +StatisticDialog::showSettingsFrame(bool show) +{ + if (show) { + ui.frmSettings->setVisible(true); + ui.btnToggleSettings->setChecked(true); + ui.btnToggleSettings->setText(tr("Hide Settings")); + } else { + ui.frmSettings->setVisible(false); + ui.btnToggleSettings->setChecked(false); + ui.btnToggleSettings->setText(tr("Show Settings")); + } +} + +/** + Sets the opacity of the Bandwidth Graph window +*/ +void +StatisticDialog::setOpacity(int value) +{ + qreal newValue = value / 100.0; + + /* Opacity only supported by Mac and Win32 */ +#if defined(Q_WS_MAC) + this->setWindowOpacity(newValue); +#elif defined(Q_WS_WIN) + if(QSysInfo::WV_2000 <= QSysInfo::WindowsVersion <= QSysInfo::WV_2003) { + this->setWindowOpacity(newValue); + } +#else + Q_UNUSED(newValue); +#endif +} + +/** + Overloads the default show() slot so we can set opacity + +void +StatisticDialog::show() +{ + loadSettings(); + if(!this->isVisible()) { + QMainWindow::show(); + } else { + QMainWindow::activateWindow(); + setWindowState(windowState() & ~Qt::WindowMinimized | Qt::WindowActive); + QMainWindow::raise(); + } +} +*/ + diff --git a/retroshare-gui/src/gui/StatisticDialog.h b/retroshare-gui/src/gui/StatisticDialog.h new file mode 100644 index 000000000..89b553ec7 --- /dev/null +++ b/retroshare-gui/src/gui/StatisticDialog.h @@ -0,0 +1,81 @@ +/**************************************************************** + * RShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 _STATISTICDIALOG_H +#define _STATISTICDIALOG_H + +#include +#include +//#include + +#include + +#include "mainpage.h" +#include "ui_StatisticDialog.h" +#include "linetypes.h" + +/** Redraw graph every 1000ms **/ +#define REFRESH_RATE 1000 + +class StatisticDialog : public MainPage +{ + Q_OBJECT + +public: + /** Default Constructor */ + StatisticDialog(QWidget *parent = 0); + /** Default Destructor */ + ~StatisticDialog(); +protected: + /** Called to deliver a bandwidth update event from Tor. */ +// void customEvent(QEvent *event); + +private slots: + /** Adds new data to the graph */ + void updateGraph(quint64 bytesRead, quint64 bytesWritten); + /** Called when settings button is toggled */ + void showSettingsFrame(bool show); + /** Called when the settings button is toggled */ + void setOpacity(int value); + /** Called when the user saves settings */ + void saveChanges(); + /** Called when the user cancels changes settings */ + void cancelChanges(); + /** Called when the reset button is pressed */ + void reset(); + +private: + /** Create and bind actions to events **/ + void createActions(); + /** Loads the saved Bandwidth Graph settings */ + void loadSettings(); + + /** A TorControl object used to talk to Tor. */ + // TorControl* _torControl; + /** A VidaliaSettings object that handles getting/saving settings */ + RshareSettings* _settings; + + /** Qt Designer generated object */ + Ui::StatisticDialog ui; +}; + +#endif + diff --git a/retroshare-gui/src/gui/StatisticDialog.ui b/retroshare-gui/src/gui/StatisticDialog.ui new file mode 100644 index 000000000..2135ce8d4 --- /dev/null +++ b/retroshare-gui/src/gui/StatisticDialog.ui @@ -0,0 +1,907 @@ + + + + + StatisticDialog + + + + 0 + 0 + 400 + 300 + + + + + + + 0 + 0 + 0 + + + 208 + 208 + 208 + + + 255 + 255 + 255 + + + 247 + 247 + 247 + + + 104 + 104 + 104 + + + 139 + 139 + 139 + + + 0 + 0 + 0 + + + 255 + 255 + 255 + + + 0 + 0 + 0 + + + 255 + 255 + 255 + + + 240 + 240 + 240 + + + 0 + 0 + 0 + + + 0 + 0 + 128 + + + 255 + 255 + 255 + + + 0 + 0 + 255 + + + 255 + 0 + 255 + + + 231 + 231 + 231 + + + + + 0 + 0 + 0 + + + 208 + 208 + 208 + + + 255 + 255 + 255 + + + 247 + 247 + 247 + + + 104 + 104 + 104 + + + 139 + 139 + 139 + + + 0 + 0 + 0 + + + 255 + 255 + 255 + + + 0 + 0 + 0 + + + 255 + 255 + 255 + + + 240 + 240 + 240 + + + 0 + 0 + 0 + + + 192 + 192 + 192 + + + 0 + 0 + 0 + + + 0 + 0 + 255 + + + 255 + 0 + 255 + + + 231 + 231 + 231 + + + + + 104 + 104 + 104 + + + 208 + 208 + 208 + + + 255 + 255 + 255 + + + 247 + 247 + 247 + + + 104 + 104 + 104 + + + 139 + 139 + 139 + + + 104 + 104 + 104 + + + 255 + 255 + 255 + + + 104 + 104 + 104 + + + 240 + 240 + 240 + + + 240 + 240 + 240 + + + 0 + 0 + 0 + + + 0 + 0 + 128 + + + 255 + 255 + 255 + + + 0 + 0 + 255 + + + 255 + 0 + 255 + + + 231 + 231 + 231 + + + + + + + Arial + 8 + 50 + false + false + false + false + + + + Qt::NoContextMenu + + + + 9 + + + 6 + + + + + Qt::Horizontal + + + + + Statistics + + + + + Download + + + :/images/downloads_24x24.png + + + + Session: + + + + Downloaded: + + + + + Average Downloadspeed: + + + + + Count of Downloads: + + + + + + Overall + + + + Downloaded: + + + + + Count of Downloads: + + + + + + + Upload + + + :/images/uploads_24x24.png + + + + Session + + + + Uploaded: + + + + + Average Uploadspeed: + + + + + Count of Uploads: + + + + + + Overall + + + + Uploaded + + + + + Count of Uploads: + + + + + + + Connections: + + + :/images/connections_24x24.png + + + + Session + + + + Connections: + + + + + Peers: + + + + + + Overall + + + + Connections: + + + + + Peers: + + + + + + + Misc + + + + Session: + + + + Uptime: + + + + + + Overall: + + + + Uptime + + + + + + + Records + + + + Uploadspeed: + + + + + Downloadspeed: + + + + + Connections: + + + + + Peers: + + + + + Uptime: + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 9 + + + 6 + + + + + + 120 + 80 + + + + + Arial + 10 + 50 + false + false + false + false + + + + Qt::NoContextMenu + + + + + + + 0 + + + 6 + + + + + Show Settings + + + true + + + + + + + Qt::Horizontal + + + + 21 + 20 + + + + + + + + Reset + + + + + + + + + + 0 + 0 + 0 + 0 + + + + + 355 + 82 + + + + + 355 + 82 + + + + Qt::NoContextMenu + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 9 + + + 6 + + + + + 3 + + + 6 + + + + + + Arial + 10 + 50 + false + false + false + false + + + + Qt::NoContextMenu + + + + + + Qt::RightToLeft + + + Receive Rate + + + false + + + + + + + + Arial + 10 + 50 + false + false + false + false + + + + Qt::NoContextMenu + + + + + + Qt::RightToLeft + + + Send Rate + + + false + + + + + + + + Arial + 10 + 50 + false + false + false + false + + + + Qt::NoContextMenu + + + Qt::RightToLeft + + + Always On Top + + + + + + + Qt::Vertical + + + + 20 + 21 + + + + + + + + + + Qt::NoContextMenu + + + QFrame::NoFrame + + + QFrame::Plain + + + + 0 + + + 3 + + + + + 0 + + + 0 + + + + + + 25 + 0 + + + + + Arial + 10 + 50 + false + false + false + false + + + + Qt::NoContextMenu + + + Qt::RightToLeft + + + 100 + + + + + + + + Arial + 10 + 50 + false + false + false + false + + + + Qt::NoContextMenu + + + % Opaque + + + + + + + + + Qt::NoContextMenu + + + Changes the transparency of the Bandwidth Graph + + + 30 + + + 100 + + + 100 + + + 100 + + + false + + + Qt::Horizontal + + + false + + + QSlider::TicksBelow + + + 10 + + + + + + + Qt::Vertical + + + + 20 + 20 + + + + + + + + + + + Qt::Horizontal + + + + 21 + 20 + + + + + + + + 0 + + + 1 + + + + + Save + + + + + + + Cancel + + + + + + + + + + + + + + + + + + GraphFrame + QWidget +
    gui/graphframe.h
    + 1 + +
    +
    + + + + +
    diff --git a/retroshare-gui/src/gui/TransfersDialog.cpp b/retroshare-gui/src/gui/TransfersDialog.cpp new file mode 100644 index 000000000..7d23aedf3 --- /dev/null +++ b/retroshare-gui/src/gui/TransfersDialog.cpp @@ -0,0 +1,383 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006,2007 crypton + * + * 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 "rshare.h" +#include "TransfersDialog.h" +#include "moreinfo/moreinfo.h" +#include "DLListDelegate.h" +#include "ULListDelegate.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include "rsiface/rsiface.h" + +/* Images for context menu icons */ +#define IMAGE_INFO ":/images/fileinfo.png" +#define IMAGE_CANCEL ":/images/delete.png" +#define IMAGE_CLEARCOMPLETED ":/images/deleteall.png" + +/** Constructor */ +TransfersDialog::TransfersDialog(QWidget *parent) +: MainPage(parent) +{ + /* Invoke the Qt Designer generated object setup routine */ + ui.setupUi(this); + + connect( ui.downloadList, SIGNAL( customContextMenuRequested( QPoint ) ), this, SLOT( downloadListCostumPopupMenu( QPoint ) ) ); + + // Set Download list model + DLListModel = new QStandardItemModel(0,9); + DLListModel->setHeaderData(NAME, Qt::Horizontal, tr("Name", "i.e: file name")); + DLListModel->setHeaderData(SIZE, Qt::Horizontal, tr("Size", "i.e: file size")); + DLListModel->setHeaderData(PROGRESS, Qt::Horizontal, tr("Progress", "i.e: % downloaded")); + DLListModel->setHeaderData(DLSPEED, Qt::Horizontal, tr("Speed", "i.e: Download speed")); + DLListModel->setHeaderData(SOURCES, Qt::Horizontal, tr("Sources", "i.e: Sources")); + DLListModel->setHeaderData(STATUS, Qt::Horizontal, tr("Status")); + DLListModel->setHeaderData(COMPLETED, Qt::Horizontal, tr("Completed", "")); + DLListModel->setHeaderData(REMAINING, Qt::Horizontal, tr("Remaining", "i.e: Estimated Time of Arrival / Time left")); + DLListModel->setHeaderData(ID, Qt::Horizontal, tr("Core-ID")); + ui.downloadList->setModel(DLListModel); + ui.downloadList->hideColumn(ID); + DLDelegate = new DLListDelegate(); + ui.downloadList->setItemDelegate(DLDelegate); + + + //Selection Setup + selection = ui.downloadList->selectionModel(); + + /* Set header resize modes and initial section sizes Downloads TreeView*/ +// QHeaderView * _header = ui.downloadList->header () ; +// _header->setResizeMode (0, QHeaderView::Interactive); /*Name*/ +// _header->setResizeMode (1, QHeaderView::Interactive); /*Size*/ +// _header->setResizeMode (2, QHeaderView::Interactive); /*Progress*/ +// _header->setResizeMode (3, QHeaderView::Interactive); /*Speed*/ +// _header->setResizeMode (4, QHeaderView::Interactive); /*Sources*/ +// _header->setResizeMode (5, QHeaderView::Interactive); /*Status*/ +// _header->setResizeMode (6, QHeaderView::Interactive); /*Completed*/ +// _header->setResizeMode (7, QHeaderView::Interactive); /*Remaining */ +// +// +// _header->resizeSection ( 0, 100 ); /*Name*/ +// _header->resizeSection ( 1, 100 ); /*Size*/ +// _header->resizeSection ( 2, 170 ); /*Progress*/ +// _header->resizeSection ( 3, 100 ); /*Speed*/ +// _header->resizeSection ( 4, 100 ); /*Sources*/ +// _header->resizeSection ( 5, 100 ); /*Status*/ +// _header->resizeSection ( 6, 100 ); /*Completed*/ +// _header->resizeSection ( 7, 100 ); /*Remaining */ + + // Set Upload list model + ULListModel = new QStandardItemModel(0,7); + ULListModel->setHeaderData(UNAME, Qt::Horizontal, tr("Name", "i.e: file name")); + ULListModel->setHeaderData(USIZE, Qt::Horizontal, tr("Size", "i.e: file size")); + ULListModel->setHeaderData(USERNAME, Qt::Horizontal, tr("User Name", "i.e: user name")); + ULListModel->setHeaderData(UPROGRESS, Qt::Horizontal, tr("Progress", "i.e: % uploaded")); + ULListModel->setHeaderData(ULSPEED, Qt::Horizontal, tr("Speed", "i.e: upload speed")); + ULListModel->setHeaderData(USTATUS, Qt::Horizontal, tr("Status")); + ULListModel->setHeaderData(UTRANSFERRED, Qt::Horizontal, tr("Transferred", "")); + ui.uploadsList->setModel(ULListModel); + ULDelegate = new ULListDelegate(); + ui.uploadsList->setItemDelegate(ULDelegate); + + //Selection Setup + //selection = ui.uploadsList->selectionModel(); + + /* Set header resize modes and initial section sizes Uploads TreeView*/ +// QHeaderView * upheader = ui.uploadsList->header () ; +// upheader->setResizeMode (0, QHeaderView::Interactive); /*Name */ +// upheader->setResizeMode (1, QHeaderView::Interactive); /*Size */ +// upheader->setResizeMode (2, QHeaderView::Interactive); /*User Name*/ +// upheader->setResizeMode (3, QHeaderView::Interactive); /*Progress*/ +// upheader->setResizeMode (4, QHeaderView::Interactive); /*Speed */ +// upheader->setResizeMode (5, QHeaderView::Interactive); /*Status*/ +// upheader->setResizeMode (6, QHeaderView::Interactive); /*Transferred*/ +// +// upheader->resizeSection ( 0, 100 ); /*Name */ +// upheader->resizeSection ( 1, 100 ); /*Size */ +// upheader->resizeSection ( 2, 100 ); /*User Name*/ +// upheader->resizeSection ( 3, 100 ); /*Progress*/ +// upheader->resizeSection ( 4, 100 ); /*Speed */ +// upheader->resizeSection ( 5, 100 ); /*Status*/ +// upheader->resizeSection ( 6, 100 ); /*Transferred*/ + + /* Hide platform specific features */ +#ifdef Q_WS_WIN + +#endif +} + +void TransfersDialog::downloadListCostumPopupMenu( QPoint point ) +{ + + QMenu contextMnu( this ); + QMouseEvent *mevent = new QMouseEvent( QEvent::MouseButtonPress, point, Qt::RightButton, Qt::RightButton, Qt::NoModifier ); + +// showdowninfoAct = new QAction(QIcon(IMAGE_INFO), tr( "Details..." ), this ); +// connect( showdowninfoAct , SIGNAL( triggered() ), this, SLOT( showDownInfoWindow() ) ); + + cancelAct = new QAction(QIcon(IMAGE_CANCEL), tr( "Cancel" ), this ); + connect( cancelAct , SIGNAL( triggered() ), this, SLOT( cancel() ) ); + + clearcompletedAct = new QAction(QIcon(IMAGE_CLEARCOMPLETED), tr( "Clear Completed" ), this ); + connect( clearcompletedAct , SIGNAL( triggered() ), this, SLOT( clearcompleted() ) ); + + contextMnu.clear(); + contextMnu.addAction( cancelAct); +// contextMnu.addSeparator(); +// contextMnu.addAction( showdowninfoAct); + contextMnu.addSeparator(); + contextMnu.addAction( clearcompletedAct); + contextMnu.exec( mevent->globalPos() ); +} + +/** Shows Downloads Informations */ +void TransfersDialog::showDownInfoWindow() +{ + moreinfo *detailsdlg = new moreinfo(); + detailsdlg->show(); +} + +void TransfersDialog::updateProgress(int value) +{ + for(int i = 0; i <= DLListModel->rowCount(); i++) { + if(selection->isRowSelected(i, QModelIndex())) { + editItem(i, PROGRESS, QVariant((double)value)); + } + } +} + +TransfersDialog::~TransfersDialog() +{ + ; +} + + + +int TransfersDialog::addItem(QString symbol, QString name, QString coreID, qlonglong fileSize, double progress, double dlspeed, QString sources, QString status, qlonglong completed, qlonglong remaining) +{ + int row; + QString sl; + //QIcon icon(symbol); + name.insert(0, " "); + //sl.sprintf("%d / %d", seeds, leechs); + row = DLListModel->rowCount(); + DLListModel->insertRow(row); + + //DLListModel->setData(DLListModel->index(row, NAME), QVariant((QIcon)icon), Qt::DecorationRole); + DLListModel->setData(DLListModel->index(row, NAME), QVariant((QString)name), Qt::DisplayRole); + DLListModel->setData(DLListModel->index(row, SIZE), QVariant((qlonglong)fileSize)); + DLListModel->setData(DLListModel->index(row, PROGRESS), QVariant((double)progress)); + DLListModel->setData(DLListModel->index(row, DLSPEED), QVariant((double)dlspeed)); + DLListModel->setData(DLListModel->index(row, SOURCES), QVariant((QString)sources)); + DLListModel->setData(DLListModel->index(row, STATUS), QVariant((QString)status)); + DLListModel->setData(DLListModel->index(row, COMPLETED), QVariant((qlonglong)completed)); + DLListModel->setData(DLListModel->index(row, REMAINING), QVariant((qlonglong)remaining)); + DLListModel->setData(DLListModel->index(row, ID), QVariant((QString)coreID)); + return row; +} + +void TransfersDialog::delItem(int row) +{ + DLListModel->removeRow(row, QModelIndex()); +} + +void TransfersDialog::editItem(int row, int column, QVariant data) +{ + //QIcon *icon; + switch(column) { + //case SYMBOL: + // icon = new QIcon(data.toString()); + // DLListModel->setData(DLListModel->index(row, NAME), QVariant((QIcon)*icon), Qt::DecorationRole); + // delete icon; + // break; + case NAME: + DLListModel->setData(DLListModel->index(row, NAME), data, Qt::DisplayRole); + break; + case SIZE: + DLListModel->setData(DLListModel->index(row, SIZE), data); + break; + case PROGRESS: + DLListModel->setData(DLListModel->index(row, PROGRESS), data); + break; + case DLSPEED: + DLListModel->setData(DLListModel->index(row, DLSPEED), data); + break; + case SOURCES: + DLListModel->setData(DLListModel->index(row, SOURCES), data); + break; + case STATUS: + DLListModel->setData(DLListModel->index(row, STATUS), data); + break; + case COMPLETED: + DLListModel->setData(DLListModel->index(row, COMPLETED), data); + break; + case REMAINING: + DLListModel->setData(DLListModel->index(row, REMAINING), data); + break; + case ID: + DLListModel->setData(DLListModel->index(row, ID), data); + break; + } +} + + /* get the list of Transfers from the RsIface. **/ +void TransfersDialog::insertTransfers() +{ + QString symbol, name, sources, status, coreId; + qlonglong fileSize, completed, remaining; + double progress, dlspeed; + + //remove all Items + for(int i = DLListModel->rowCount(); i >= 0; i--) + { + delItem(i); + } + + + //nun aktuelle DownloadListe hinzufügen + rsiface->lockData(); /* Lock Interface */ + + std::list::const_iterator it; + const std::list &transfers = rsiface->getTransferList(); + + for(it = transfers.begin(); it != transfers.end(); it++) + { + + symbol = ""; + coreId = ""; + name = QString::fromStdString(it->fname); + sources = QString::fromStdString(it->source); + + /* Replace ID with HASH -> as thats what we need to cancel! */ + //std::ostringstream out; + //out << it->id; + //coreId = QString::fromStdString(it->hashout.str()); + coreId = QString::fromStdString(it->hash); + + switch(it->downloadStatus) + { + /* XXX HAND CODED! */ + case 0: /* FAILED */ + status = "Failed"; + break; + case 1: /* Downloading */ + if (it->tfRate > 0.01) + { + status = "Downloading"; + } + else + { + status = "Waiting for Peer"; + } + break; + case 2: /* COMPLETE */ + default: + status = "Complete"; + break; + + } + + dlspeed = it->tfRate * 1024.0; + fileSize = it->size; + completed = it->transfered; + progress = it->transfered * 100.0 / it->size; + remaining = (it->size - it->transfered) / (it->tfRate * 1024.0); + + addItem(symbol, name, coreId, fileSize, progress, dlspeed, sources, status, completed, remaining); + } + + rsiface->unlockData(); /* UnLock Interface */ +} + +void TransfersDialog::cancel() +{ + for(int i = 0; i <= DLListModel->rowCount(); i++) { + if(selection->isRowSelected(i, QModelIndex())) { + std::string id = getID(i, DLListModel).toStdString(); + QString qname = getFileName(i, DLListModel); + /* XXX -> Should not have to 'trim' filename ... something wrong here.. + * but otherwise, not exact filename .... BUG + */ + std::string name = (qname.trimmed()).toStdString(); + // TODO + rsicontrol->FileCancel(name, id, 0); /* name, *hash*, size */ + //std::cerr << "TranfersDialog::cancel(): " << name << ":" << id << ":" << 0 << std::endl; + } + } +} + +void TransfersDialog::clearcompleted() +{ + std::cerr << "TransfersDialog::clearcompleted()" << std::endl; + rsicontrol->FileClearCompleted(); +} + +double TransfersDialog::getProgress(int row, QStandardItemModel *model) +{ + return model->data(model->index(row, PROGRESS), Qt::DisplayRole).toDouble(); +} + +double TransfersDialog::getSpeed(int row, QStandardItemModel *model) +{ + return model->data(model->index(row, DLSPEED), Qt::DisplayRole).toDouble(); +} + +QString TransfersDialog::getFileName(int row, QStandardItemModel *model) +{ + return model->data(model->index(row, NAME), Qt::DisplayRole).toString(); +} + +QString TransfersDialog::getStatus(int row, QStandardItemModel *model) +{ + return model->data(model->index(row, STATUS), Qt::DisplayRole).toString(); +} + +QString TransfersDialog::getID(int row, QStandardItemModel *model) +{ + return model->data(model->index(row, ID), Qt::DisplayRole).toString(); +} + +qlonglong TransfersDialog::getFileSize(int row, QStandardItemModel *model) +{ + bool ok = false; + return model->data(model->index(row, SIZE), Qt::DisplayRole).toULongLong(&ok); +} + +qlonglong TransfersDialog::getTransfered(int row, QStandardItemModel *model) +{ + bool ok = false; + return model->data(model->index(row, COMPLETED), Qt::DisplayRole).toULongLong(&ok); +} + +qlonglong TransfersDialog::getRemainingTime(int row, QStandardItemModel *model) +{ + bool ok = false; + return model->data(model->index(row, REMAINING), Qt::DisplayRole).toULongLong(&ok); +} diff --git a/retroshare-gui/src/gui/TransfersDialog.h b/retroshare-gui/src/gui/TransfersDialog.h new file mode 100644 index 000000000..055dfc315 --- /dev/null +++ b/retroshare-gui/src/gui/TransfersDialog.h @@ -0,0 +1,114 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006,2007 crypton + * + * 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 _TRANSFERSDIALOG_H +#define _TRANSFERSDIALOG_H + +#include +#include +#include +#include +#include +#include + +#include "mainpage.h" +#include "ui_TransfersDialog.h" + + +class DLListDelegate; +class ULListDelegate; +class QStandardItemModel; + +class TransfersDialog : public MainPage +{ + Q_OBJECT + +public: + /** Default Constructor */ + TransfersDialog(QWidget *parent = 0); + /** Default Destructor */ + ~TransfersDialog(); + + + + + void insertTransfers(); + +private slots: + void showDownInfoWindow(); + + /** Create the context popup menu and it's submenus */ + void downloadListCostumPopupMenu( QPoint point ); + + void cancel(); + /** removes finished Downloads**/ + void clearcompleted(); + + +private: + QStandardItemModel *DLListModel; + QStandardItemModel *ULListModel; + QItemSelectionModel *selection; + DLListDelegate *DLDelegate; + ULListDelegate *ULDelegate; + qlonglong fileSize; + double progress; + double dlspeed; + QString status, icon, name; + qlonglong completed, remaining; + + + /** Create the actions on the tray menu or menubar */ + void createActions(); + + /** Define the popup menus for the Context menu */ + QMenu* contextMnu; + /** Defines the actions for the context menu */ + QAction* showdowninfoAct; + QAction* cancelAct; + QAction* clearcompletedAct; + + QTreeView *downloadList; + + /** Adds a new action to the toolbar. */ + void addAction(QAction *action, const char *slot = 0); + + /** Qt Designer generated object */ + Ui::TransfersDialog ui; + +public slots: + int addItem(QString symbol, QString name, QString coreID, qlonglong size, double progress, double dlspeed, QString sources, QString status, qlonglong completed, qlonglong remaining); + void delItem(int row); + void editItem(int row, int column, QVariant data); + void updateProgress(int value); + + double getProgress(int row, QStandardItemModel *model); + double getSpeed(int row, QStandardItemModel *model); + QString getFileName(int row, QStandardItemModel *model); + QString getStatus(int row, QStandardItemModel *model); + QString getID(int row, QStandardItemModel *model); + qlonglong getFileSize(int row, QStandardItemModel *model); + qlonglong getTransfered(int row, QStandardItemModel *model); + qlonglong getRemainingTime(int row, QStandardItemModel *model); +}; + +#endif + diff --git a/retroshare-gui/src/gui/TransfersDialog.ui b/retroshare-gui/src/gui/TransfersDialog.ui new file mode 100644 index 000000000..aa5ae6a72 --- /dev/null +++ b/retroshare-gui/src/gui/TransfersDialog.ui @@ -0,0 +1,682 @@ + + TransfersDialog + + + + 0 + 0 + 590 + 314 + + + + + 7 + 7 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 192 + 192 + 192 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + 104 + 104 + 104 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 104 + 104 + 104 + + + + + + + 255 + 255 + 255 + + + + + + + 104 + 104 + 104 + + + + + + + 240 + 240 + 240 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + Arial + 8 + 50 + false + false + false + false + + + + true + + + Qt::PreventContextMenu + + + + 1 + + + 1 + + + + + Qt::Vertical + + + + + 0 + + + 0 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + 0 + + + 6 + + + + + + + + :/images/down.png + + + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Downloads:</span></p></body></html> + + + + + + + + + true + + + Qt::CustomContextMenu + + + false + + + 0 + + + QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed|QAbstractItemView::NoEditTriggers|QAbstractItemView::SelectedClicked + + + false + + + false + + + false + + + QAbstractItemView::NoDragDrop + + + false + + + false + + + true + + + false + + + + + + + + + 0 + + + 0 + + + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + 0 + + + 6 + + + + + + + + :/images/up.png + + + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Uploads:</span></p></body></html> + + + + + + + + + + + + + + + + diff --git a/retroshare-gui/src/gui/ULListDelegate.cpp b/retroshare-gui/src/gui/ULListDelegate.cpp new file mode 100644 index 000000000..abe77c5b5 --- /dev/null +++ b/retroshare-gui/src/gui/ULListDelegate.cpp @@ -0,0 +1,170 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006,2007 crypton + * + * 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 +#include +#include +#include +#include + +#include "ULListDelegate.h" + +ULListDelegate::ULListDelegate(QObject *parent) : QAbstractItemDelegate(parent) +{ + ; +} + +ULListDelegate::~ULListDelegate(void) +{ + ; +} + +void ULListDelegate::paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const +{ + QString byteUnits[4] = {tr("B"), tr("KB"), tr("MB"), tr("GB")}; + QStyleOptionViewItem opt = option; + QStyleOptionProgressBarV2 newopt; + QRect pixmapRect; + QPixmap pixmap; + qlonglong fileSize; + double progress, ulspeed, multi; + QString temp , status; + qlonglong transferred; + + //set text color + QVariant value = index.data(Qt::TextColorRole); + if(value.isValid() && qvariant_cast(value).isValid()) { + opt.palette.setColor(QPalette::Text, qvariant_cast(value)); + } + QPalette::ColorGroup cg = option.state & QStyle::State_Enabled ? QPalette::Normal : QPalette::Disabled; + if(option.state & QStyle::State_Selected){ + painter->setPen(opt.palette.color(cg, QPalette::HighlightedText)); + } else { + painter->setPen(opt.palette.color(cg, QPalette::Text)); + } + + // draw the background color + if(index.column() != UPROGRESS) { + if(option.showDecorationSelected && (option.state & QStyle::State_Selected)) { + if(cg == QPalette::Normal && !(option.state & QStyle::State_Active)) { + cg = QPalette::Inactive; + } + painter->fillRect(option.rect, option.palette.brush(cg, QPalette::Highlight)); + } else { + value = index.data(Qt::BackgroundColorRole); + if(value.isValid() && qvariant_cast(value).isValid()) { + painter->fillRect(option.rect, qvariant_cast(value)); + } + } + } + switch(index.column()) { + case USIZE: + fileSize = index.data().toLongLong(); + if(fileSize < 0){ + temp = "Unknown"; + } else { + multi = 1.0; + for(int i = 0; i < 5; ++i) { + if (fileSize < 1024) { + fileSize = index.data().toLongLong(); + temp.sprintf("%.2f ", fileSize / multi); + temp += byteUnits[i]; + break; + } + fileSize /= 1024; + multi *= 1024.0; + } + } + painter->drawText(option.rect, Qt::AlignCenter, temp); + break; + case UTRANSFERRED: + transferred = index.data().toLongLong(); + if(transferred < 0){ + temp = "Unknown"; + } else { + multi = 1.0; + for(int i = 0; i < 5; ++i) { + if (transferred < 1024) { + transferred = index.data().toLongLong(); + temp.sprintf("%.2f ", transferred / multi); + temp += byteUnits[i]; + break; + } + transferred /= 1024; + multi *= 1024.0; + } + } + painter->drawText(option.rect, Qt::AlignCenter, temp); + break; + case ULSPEED: + ulspeed = index.data().toDouble(); + temp.clear(); + temp.sprintf("%.2f", ulspeed/1024.); + temp += " KB/s"; + painter->drawText(option.rect, Qt::AlignCenter, temp); + break; + case UPROGRESS: + progress = index.data().toDouble(); + temp.clear(); + temp.sprintf("%.2f", progress); + temp += "%"; + newopt.rect = opt.rect; + //newopt.text = temp; + newopt.maximum = 100; + newopt.minimum = 0; + newopt.progress = (int)progress; + newopt.state |= QStyle::State_Enabled; + newopt.textVisible = false; + QApplication::style()->drawControl(QStyle::CE_ProgressBar, &newopt, + painter); + //We prefer to display text manually to control color/font/boldness + if (option.state & QStyle::State_Selected){ + opt.palette.setColor(QPalette::Text, QColor("grey")); + painter->setPen(opt.palette.color(cg, QPalette::Text)); + } + painter->drawText(option.rect, Qt::AlignCenter, newopt.text); + break; + case UNAME: + // decoration + value = index.data(Qt::DecorationRole); + pixmap = qvariant_cast(value).pixmap(option.decorationSize, option.state & QStyle::State_Enabled ? QIcon::Normal : QIcon::Disabled, option.state & QStyle::State_Open ? QIcon::On : QIcon::Off); + pixmapRect = (pixmap.isNull() ? QRect(0, 0, 0, 0): QRect(QPoint(0, 0), option.decorationSize)); + if (pixmapRect.isValid()){ + QPoint p = QStyle::alignedRect(option.direction, Qt::AlignLeft, pixmap.size(), option.rect).topLeft(); + painter->drawPixmap(p, pixmap); + } + painter->drawText(option.rect.translated(pixmap.size().width(), 0), Qt::AlignLeft, index.data().toString()); + break; + default: + painter->drawText(option.rect, Qt::AlignCenter, index.data().toString()); + } +} + +QSize ULListDelegate::sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index) const +{ + QVariant value = index.data(Qt::FontRole); + QFont fnt = value.isValid() ? qvariant_cast(value) : option.font; + QFontMetrics fontMetrics(fnt); + const QString text = index.data(Qt::DisplayRole).toString(); + QRect textRect = QRect(0, 0, 0, fontMetrics.lineSpacing() * (text.count(QLatin1Char('\n')) + 1)); + return textRect.size(); +} + diff --git a/retroshare-gui/src/gui/ULListDelegate.h b/retroshare-gui/src/gui/ULListDelegate.h new file mode 100644 index 000000000..937af3ff2 --- /dev/null +++ b/retroshare-gui/src/gui/ULListDelegate.h @@ -0,0 +1,64 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006,2007 crypton + * + * 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 ULLISTDELEGATE_H +#define ULLISTDELEGATE_H + +#include + +// Defines for upload list list columns +#define UNAME 0 +#define USERNAME 1 +#define USIZE 2 +#define UPROGRESS 3 +#define ULSPEED 4 +#define USTATUS 5 +#define UTRANSFERRED 6 + + + +#define MAX_CHAR_TMP 128 + +class QModelIndex; +class QPainter; +class QStyleOptionProgressBarV2; +class QProgressBar; +class QApplication; + + +class ULListDelegate: public QAbstractItemDelegate { + + Q_OBJECT + + public: + ULListDelegate(QObject *parent=0); + ~ULListDelegate(); + void paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const; + QSize sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index) const; + + private: + + public slots: + + signals: +}; +#endif + diff --git a/retroshare-gui/src/gui/advsearch/AdvancedSearchDialog.ui b/retroshare-gui/src/gui/advsearch/AdvancedSearchDialog.ui new file mode 100644 index 000000000..28b61ce55 --- /dev/null +++ b/retroshare-gui/src/gui/advsearch/AdvancedSearchDialog.ui @@ -0,0 +1,227 @@ + + AdvancedSearchDialog + + + + 0 + 0 + 820 + 130 + + + + + 0 + 0 + 0 + 0 + + + + + 820 + 130 + + + + + 0 + 0 + + + + RetrosShare: Advanced Search + + + :/images/advsearch_24x24.png + + + + 9 + + + 6 + + + + + 0 + + + 6 + + + + + Add a further search criterion. + + + Add a selection criterion + + + :/images/add_24x24.png + + + + 24 + 24 + + + + + + + + Qt::Horizontal + + + QSizePolicy::Minimum + + + + 21 + 20 + + + + + + + + Reset the search criteria. + + + Reset + + + :/images/reset.png + + + + 24 + 24 + + + + + + + + Qt::Horizontal + + + + 381 + 27 + + + + + + + + Cancels the search. + + + Cancel + + + + + + + Perform the advanced search. + + + Search + + + + + + + + + + 3 + 3 + 1 + 1 + + + + + 800 + 60 + + + + true + + + Search Criteria + + + Qt::AlignJustify|Qt::AlignTop + + + + 9 + + + 0 + + + + + + 3 + 3 + 1 + 0 + + + + + 600 + 35 + + + + true + + + QFrame::NoFrame + + + QFrame::Raised + + + + + + + + + + + + + + cancelButton + clicked() + AdvancedSearchDialog + close() + + + 481 + 211 + + + 370 + 5 + + + + + diff --git a/retroshare-gui/src/gui/advsearch/advancedsearchdialog.cpp b/retroshare-gui/src/gui/advsearch/advancedsearchdialog.cpp new file mode 100644 index 000000000..01c2295df --- /dev/null +++ b/retroshare-gui/src/gui/advsearch/advancedsearchdialog.cpp @@ -0,0 +1,154 @@ +/**************************************************************** +* RetroShare is distributed under the following license: +* +* Copyright (C) 2006, 2007 The RetroShare Team +* +* 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 "advancedsearchdialog.h" + +AdvancedSearchDialog::AdvancedSearchDialog(QWidget * parent) : QDialog (parent) +{ + setupUi(this); + dialogLayout = this->layout(); + metrics = new QFontMetrics(this->font()); + + // the list of expressions + expressions = new QList(); + + // a area for holding the objects + expressionsLayout = new QVBoxLayout(); + expressionsLayout->setSpacing(0); + expressionsLayout->setMargin(0); + expressionsLayout->setObjectName(QString::fromUtf8("expressionsLayout")); + expressionsFrame->setSizePolicy(QSizePolicy::MinimumExpanding, + QSizePolicy::MinimumExpanding); + expressionsFrame->setLayout(expressionsLayout); + + // we now add the first expression widgets to the dialog via a vertical + // layout + reset();//addNewExpression(); + + connect (this->addExprButton, SIGNAL(clicked()), + this, SLOT(addNewExpression())); + connect (this->resetButton, SIGNAL(clicked()), + this, SLOT(reset())); + connect(this->executeButton, SIGNAL(clicked()), + this, SLOT(prepareSearch())); +} + + +void AdvancedSearchDialog::addNewExpression() +{ + int sizeChange = metrics->height() + 35; + + ExpressionWidget *expr; + if (expressions->size() == 0) + { + //create an initial expression + expr = new ExpressionWidget(expressionsFrame, true); + } else { + expr = new ExpressionWidget(expressionsFrame); + } + + expressions->append(expr); + expressionsLayout->addWidget(expr, 1, Qt::AlignLeft); + + + connect(expr, SIGNAL(signalDelete(ExpressionWidget*)), + this, SLOT(deleteExpression(ExpressionWidget*))); + + //expressionsLayout->invalidate(); + //searchCriteriaBox->setMinimumSize(searchCriteriaBox->minimumWidth(), + // searchCriteriaBox->minimumHeight() + sizeChange); + //searchCriteriaBox->adjustSize(); + expressionsFrame->adjustSize(); + this->setMinimumSize(this->minimumWidth(), this->minimumHeight()+sizeChange); + this->adjustSize(); + +} + +void AdvancedSearchDialog::deleteExpression(ExpressionWidget* expr) +{ + int sizeChange = metrics->height() + 35; + + expressions->removeAll(expr); + expr->hide(); + expressionsLayout->removeWidget(expr); + delete expr; + + expressionsLayout->invalidate(); + //searchCriteriaBox->setMinimumSize(searchCriteriaBox->minimumWidth(), + // searchCriteriaBox->minimumHeight() - sizeChange); + //searchCriteriaBox->adjustSize(); + expressionsFrame->adjustSize(); + this->setMinimumSize(this->minimumWidth(), this->minimumHeight()-sizeChange); + this->adjustSize(); +} + +void AdvancedSearchDialog::reset() +{ + ExpressionWidget *expr; + while (!expressions->isEmpty()) + { + expr = expressions->takeLast(); + deleteExpression(expr); + } + + // now add a new default expressions + addNewExpression(); +} + +void AdvancedSearchDialog::prepareSearch() +{ + emit search(getRsExpr()); +} + + +Expression * AdvancedSearchDialog::getRsExpr() +{ + Expression * wholeExpression; + + // process the special case: first expression + wholeExpression = expressions->at(0)->getRsExpression(); + + + // iterate through the items in elements and + for (int i = 1; i < expressions->size(); ++i) { + // extract the expression information and compound it with the + // first expression + wholeExpression = new CompoundExpression(expressions->at(i)->getOperator(), + wholeExpression, + expressions->at(i)->getRsExpression()); + } + return wholeExpression; +} + +QString AdvancedSearchDialog::getSearchAsString() +{ + QString str = expressions->at(0)->toString(); + + + // iterate through the items in elements and + for (int i = 1; i < expressions->size(); ++i) { + // extract the expression information and compound it with the + // first expression + str += QString(" ") + expressions->at(i)->toString(); + } + return str; +} + diff --git a/retroshare-gui/src/gui/advsearch/advancedsearchdialog.h b/retroshare-gui/src/gui/advsearch/advancedsearchdialog.h new file mode 100644 index 000000000..91a4d6053 --- /dev/null +++ b/retroshare-gui/src/gui/advsearch/advancedsearchdialog.h @@ -0,0 +1,57 @@ +/**************************************************************** +* RetroShare is distributed under the following license: +* +* Copyright (C) 2006, 2007 The RetroShare Team +* +* 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 _AdvancedSearch_h_ +#define _AdvancedSearch_h_ + +#include +#include +#include +#include +#include +#include "ui_AdvancedSearchDialog.h" +#include "expressionwidget.h" +#include "rsiface/rsexpr.h" + +class AdvancedSearchDialog : public QDialog, public Ui::AdvancedSearchDialog +{ + Q_OBJECT + +public: + AdvancedSearchDialog(QWidget * parent = 0 ); + Expression * getRsExpr(); + QString getSearchAsString(); +signals: + void search(Expression*); + +private slots: + void deleteExpression(ExpressionWidget*); + void addNewExpression(); + void reset(); + void prepareSearch(); + +private: + QLayout * dialogLayout; + QVBoxLayout * expressionsLayout; + QList * expressions; + QFontMetrics * metrics; +}; + +#endif // _AdvancedSearch_h_ diff --git a/retroshare-gui/src/gui/advsearch/expressionwidget.cpp b/retroshare-gui/src/gui/advsearch/expressionwidget.cpp new file mode 100644 index 000000000..964b2307b --- /dev/null +++ b/retroshare-gui/src/gui/advsearch/expressionwidget.cpp @@ -0,0 +1,231 @@ +/**************************************************************** +* RetroShare is distributed under the following license: +* +* Copyright (C) 2006, 2007 The RetroShare Team +* +* 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 "expressionwidget.h" + +ExpressionWidget::ExpressionWidget(QWidget * parent, bool initial) : QWidget(parent) +{ + setupUi(this); + + inRangedConfig = false; + + // the default search type + searchType = NameSearch; + + exprLayout = this->layout(); + + exprOpFrame->setLayout (createLayout()); + exprTermFrame->setLayout (createLayout()); + exprConditionFrame->setLayout (createLayout()); + exprParamFrame->setLayout (createLayout()); + exprParamFrame->setSizePolicy(QSizePolicy::MinimumExpanding, + QSizePolicy::Fixed); + + elements = new QList(); + + exprOpElem = new ExprOpElement(); + exprOpFrame->layout()->addWidget(exprOpElem); + elements->append(exprOpElem); + + exprTermElem = new ExprTermsElement(); + exprTermFrame->layout()->addWidget(exprTermElem); + elements->append(exprTermElem); + connect (exprTermElem, SIGNAL(currentIndexChanged(int)), + this, SLOT (adjustExprForTermType(int))); + + exprCondElem = new ExprConditionElement(searchType); + exprConditionFrame->layout()->addWidget(exprCondElem); + elements->append(exprCondElem); + connect (exprCondElem, SIGNAL (currentIndexChanged(int)), + this, SLOT (adjustExprForConditionType(int))); + + exprParamElem= new ExprParamElement(searchType); + exprParamFrame->layout()->addWidget(exprParamElem); + elements->append(exprParamElem); + + // set up the default search: a search on name + adjustExprForTermType(searchType); + isFirst = initial; + deleteExprButton ->setVisible(!isFirst); + exprOpElem ->setVisible(!isFirst); + exprTermFrame ->show(); + exprConditionFrame ->show(); + exprParamFrame ->show(); + + // connect the delete button signal + connect (deleteExprButton, SIGNAL (clicked()), + this, SLOT(deleteExpression())); + + this->show(); +} + +QLayout * ExpressionWidget::createLayout(QWidget * parent) +{ + QHBoxLayout * hboxLayout; + if (parent == 0) + { + hboxLayout = new QHBoxLayout(); + } else { + hboxLayout = new QHBoxLayout(parent); + } + hboxLayout->setSpacing(0); + hboxLayout->setMargin(0); + return hboxLayout; +} + +bool ExpressionWidget::isStringSearchExpression() +{ + return (searchType == NameSearch || searchType == PathSearch + || searchType == ExtSearch || searchType == HashSearch); +} + +void ExpressionWidget::adjustExprForTermType(int index) +{ + ExprSearchType type = (*GuiExprElement::TermsIndexMap)[index]; + searchType = type; + + // now adjust the relevant elements + // the condition combobox + exprCondElem->adjustForSearchType(type); + + // the parameter expression: can be a date, 1-2 edit fields + // or a size with units etc + exprParamElem->adjustForSearchType(type); + exprParamFrame->adjustSize(); + + exprLayout->invalidate(); + this->adjustSize(); +} + +void ExpressionWidget::adjustExprForConditionType(int newCondition) +{ + // we adjust the appearance for a ranged selection + inRangedConfig = (newCondition == GuiExprElement::RANGE_INDEX); + exprParamElem->setRangedSearch(inRangedConfig); + exprParamFrame->layout()->invalidate(); + exprParamFrame->adjustSize(); +} + +void ExpressionWidget::deleteExpression() +{ + this->hide(); + emit signalDelete(this); +} + +LogicalOperator ExpressionWidget::getOperator() +{ + return exprOpElem->getLogicalOperator(); +} + +Expression* ExpressionWidget::getRsExpression() +{ + Expression * expr; + + std::list wordList; + int lowVal = 0; + int highVal = 0; + + if (isStringSearchExpression()) + { + QString txt = exprParamElem->getStrSearchValue(); + QStringList words = txt.split(" ", QString::SkipEmptyParts); + for (int i = 0; i < words.size(); ++i) + wordList.push_back(words.at(i).toStdString()); + } else if (inRangedConfig){ + // correct for reversed ranges to be nice to the user + lowVal = exprParamElem->getIntLowValue(); + highVal = exprParamElem->getIntHighValue(); + if (lowVal >highVal) + { + lowVal = lowVal^highVal; + highVal = lowVal^highVal; + lowVal = lowVal^highVal; + } + } + + switch (searchType) + { + case NameSearch: + expr = new NameExpression(exprCondElem->getStringOperator(), + wordList, + exprParamElem->ignoreCase()); + break; + case PathSearch: + expr = new PathExpression(exprCondElem->getStringOperator(), + wordList, + exprParamElem->ignoreCase()); + break; + case ExtSearch: + expr = new ExtExpression(exprCondElem->getStringOperator(), + wordList, + exprParamElem->ignoreCase()); + break; + case HashSearch: + expr = new HashExpression(exprCondElem->getStringOperator(), + wordList); + break; + case DateSearch: + if (inRangedConfig) { + expr = new DateExpression(exprCondElem->getRelOperator(), + lowVal, + highVal); + } else { + expr = new DateExpression(exprCondElem->getRelOperator(), + exprParamElem->getIntValue()); + } + break; + case PopSearch: + if (inRangedConfig) { + expr = new DateExpression(exprCondElem->getRelOperator(), + lowVal, + highVal); + } else { + expr = new DateExpression(exprCondElem->getRelOperator(), + exprParamElem->getIntValue()); + } + break; + case SizeSearch: + if (inRangedConfig) { + expr = new SizeExpression(exprCondElem->getRelOperator(), + lowVal, + highVal); + } else { + expr = new SizeExpression(exprCondElem->getRelOperator(), + exprParamElem->getIntValue()); + } + break; + }; + return expr; +} + +QString ExpressionWidget::toString() +{ + QString str = ""; + if (!isFirst) + { + str += exprOpElem->toString() + " "; + } + str += exprTermElem->toString() + " "; + str += exprCondElem->toString() + " "; + str += exprParamElem->toString(); + return str; +} + diff --git a/retroshare-gui/src/gui/advsearch/expressionwidget.h b/retroshare-gui/src/gui/advsearch/expressionwidget.h new file mode 100644 index 000000000..3651206b0 --- /dev/null +++ b/retroshare-gui/src/gui/advsearch/expressionwidget.h @@ -0,0 +1,93 @@ +/**************************************************************** +* RetroShare is distributed under the following license: +* +* Copyright (C) 2006, 2007 The RetroShare Team +* +* 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 _ExpressionWidget_h_ +#define _ExpressionWidget_h_ +#include +#include +#include + +#include "rsiface/rsexpr.h" +#include "guiexprelement.h" +#include "ui_expressionwidget.h" + + +/** + Represents an Advanced Search GUI Expression object which acts as a container + for a series of GuiExprElement objects. The structure of the expression can + change dynamically, dependant on user choices made while assembling an expression. + The default appearance is simply a search on name. +*/ +class ExpressionWidget : public QWidget, public Ui::ExpressionWidget +{ + Q_OBJECT + +public: + ExpressionWidget( QWidget * parent = 0, bool initial=false ); + + /** delivers the expression represented by this widget + the operator to join this expression with any previous + expressions is provided by the getOperator method */ + Expression* getRsExpression(); + + /** supplies the operator to be used when joining this expression + to the whole query */ + LogicalOperator getOperator(); + + QString toString(); + +signals: + /** associates an expression object with the delete event */ + void signalDelete(ExpressionWidget*); + +private slots: + /** emits the signalDelete signal with a pointer to this object + for use by listeners */ + void deleteExpression(); + + /** dynbamically changes the structure of the expression based on + the terms combobox changes */ + void adjustExprForTermType(int); + + /** dynamically adjusts the expression dependant on the choices + made in the condition combobox e.g. inRange and equals + have different parameter fields */ + void adjustExprForConditionType(int); + + +private: + QLayout * createLayout(QWidget* parent = 0); + + bool isStringSearchExpression(); + + QList * elements; + QLayout * exprLayout; + + ExprOpElement * exprOpElem; + ExprTermsElement * exprTermElem; + ExprConditionElement * exprCondElem; + ExprParamElement* exprParamElem; + + bool inRangedConfig; + bool isFirst; + ExprSearchType searchType; +}; + +#endif // _ExpressionWidget_h_ diff --git a/retroshare-gui/src/gui/advsearch/expressionwidget.ui b/retroshare-gui/src/gui/advsearch/expressionwidget.ui new file mode 100644 index 000000000..11fdc86e6 --- /dev/null +++ b/retroshare-gui/src/gui/advsearch/expressionwidget.ui @@ -0,0 +1,172 @@ + + ExpressionWidget + + + + 0 + 0 + 800 + 30 + + + + + 0 + 0 + + + + + 800 + 30 + + + + + 16777215 + 55 + + + + Expression Widget + + + + + + true + + + + + + + 0 + 0 + + + + + 90 + 30 + + + + QFrame::NoFrame + + + QFrame::Raised + + + + + + + + 0 + 0 + + + + + 100 + 30 + + + + QFrame::NoFrame + + + QFrame::Raised + + + + + + + + 0 + 0 + + + + + 180 + 30 + + + + QFrame::NoFrame + + + QFrame::Raised + + + + + + + + 1 + 0 + + + + + 350 + 30 + + + + QFrame::NoFrame + + + QFrame::Raised + + + + + + + + 0 + 0 + + + + + 20 + 20 + + + + Delete this expression + + + + + + :/images/delete.png + + + + + + + Qt::Horizontal + + + + 0 + 30 + + + + + + + + + + + diff --git a/retroshare-gui/src/gui/advsearch/guiexprelement.cpp b/retroshare-gui/src/gui/advsearch/guiexprelement.cpp new file mode 100644 index 000000000..91ba03541 --- /dev/null +++ b/retroshare-gui/src/gui/advsearch/guiexprelement.cpp @@ -0,0 +1,637 @@ +/**************************************************************** +* RetroShare is distributed under the following license: +* +* Copyright (C) 2006, 2007 The RetroShare Team +* +* 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 "guiexprelement.h" +#define STR_FIELDS_MIN_WIDTH 200 +#define SIZE_FIELDS_MIN_WIDTH 80 +#define DATE_FIELDS_MIN_WIDTH 100 +#define FIELDS_MIN_HEIGHT 30 + +#define LOGICAL_OP_CB_WIDTH 70 +#define STD_CB_WIDTH 90 +#define CONDITION_CB_WIDTH 170 + +const QString GuiExprElement::AND = QObject::tr("and"); +const QString GuiExprElement::OR = QObject::tr("and / or"); +const QString GuiExprElement::XOR = QObject::tr("or"); // exclusive or + +const QString GuiExprElement::NAME = QObject::tr("Name"); +const QString GuiExprElement::PATH = QObject::tr("Path"); +const QString GuiExprElement::EXT = QObject::tr("Extension"); +const QString GuiExprElement::HASH = QObject::tr("Hash"); +//const QString GuiExprElement::KEYWORDS= QObject::tr("Keywords"); +//const QString GuiExprElement::COMMENTS= QObject::tr("Comments"); +//const QString GuiExprElement::META = QObject::tr("Meta"); +const QString GuiExprElement::DATE = QObject::tr("Date"); +const QString GuiExprElement::SIZE = QObject::tr("Size"); +const QString GuiExprElement::POP = QObject::tr("Popularity"); + +const QString GuiExprElement::CONTAINS= QObject::tr("contains"); +const QString GuiExprElement::CONTALL = QObject::tr("contains all"); +const QString GuiExprElement::IS = QObject::tr("is"); + +const QString GuiExprElement::LT = QObject::tr("less than"); +const QString GuiExprElement::LTE = QObject::tr("less than or equal"); +const QString GuiExprElement::EQUAL = QObject::tr("equals"); +const QString GuiExprElement::GTE = QObject::tr("greater than or equal"); +const QString GuiExprElement::GT = QObject::tr("greater than"); +const QString GuiExprElement::RANGE = QObject::tr("is in range"); + + +const int GuiExprElement::AND_INDEX = 0; +const int GuiExprElement::OR_INDEX = 1; +const int GuiExprElement::XOR_INDEX = 2; + +const int GuiExprElement::NAME_INDEX = 0; +const int GuiExprElement::PATH_INDEX = 1; +const int GuiExprElement::EXT_INDEX = 2; +const int GuiExprElement::HASH_INDEX = 3; +/*const int GuiExprElement::KEYWORDS_INDEX = ???; +const int GuiExprElement::COMMENTS_INDEX = ???; +const int GuiExprElement::META_INDEX = ???;*/ +const int GuiExprElement::DATE_INDEX = 4; +const int GuiExprElement::SIZE_INDEX = 5; +const int GuiExprElement::POP_INDEX = 6; + +const int GuiExprElement::CONTAINS_INDEX = 0; +const int GuiExprElement::CONTALL_INDEX = 1; +const int GuiExprElement::IS_INDEX = 2; + +const int GuiExprElement::LT_INDEX = 0; +const int GuiExprElement::LTE_INDEX = 1; +const int GuiExprElement::EQUAL_INDEX = 2; +const int GuiExprElement::GTE_INDEX = 3; +const int GuiExprElement::GT_INDEX = 4; +const int GuiExprElement::RANGE_INDEX = 5; + +QStringList * GuiExprElement::exprOpsList = new QStringList(); +QStringList * GuiExprElement::searchTermsOptionsList = new QStringList(); +QStringList * GuiExprElement::stringOptionsList = new QStringList(); +QStringList * GuiExprElement::relOptionsList = new QStringList(); + +QMap * GuiExprElement::TermsIndexMap = new QMap(); + +QMap * GuiExprElement::logicalOpIndexMap = new QMap(); +QMap * GuiExprElement::strConditionIndexMap = new QMap(); +QMap * GuiExprElement::relConditionIndexMap = new QMap(); + +QMap * GuiExprElement::logicalOpStrMap = new QMap(); +QMap * GuiExprElement::termsStrMap = new QMap(); +QMap * GuiExprElement::strConditionStrMap = new QMap(); +QMap * GuiExprElement::relConditionStrMap = new QMap(); + +bool GuiExprElement::initialised = false; + + +GuiExprElement::GuiExprElement(QWidget * parent) + : QWidget(parent) +{ + if (!GuiExprElement::initialised) + { + initialiseOptionsLists(); + } + searchType = NameSearch; + +} + + +void GuiExprElement::initialiseOptionsLists() +{ + exprOpsList->append(AND); + exprOpsList->append(OR); + exprOpsList->append(XOR); + + GuiExprElement::searchTermsOptionsList->append(NAME); + GuiExprElement::searchTermsOptionsList->append(PATH); + GuiExprElement::searchTermsOptionsList->append(EXT); + GuiExprElement::searchTermsOptionsList->append(HASH); + //GuiExprElement::searchTermsOptionsList->append(KEYWORDS); + //GuiExprElement::searchTermsOptionsList->append(COMMENTS); + //GuiExprElement::searchTermsOptionsList->append(META); + GuiExprElement::searchTermsOptionsList->append(DATE); + GuiExprElement::searchTermsOptionsList->append(SIZE); +// GuiExprElement::searchTermsOptionsList->append(POP); + + GuiExprElement::stringOptionsList->append(CONTAINS); + GuiExprElement::stringOptionsList->append(CONTALL); + GuiExprElement::stringOptionsList->append(IS); + + GuiExprElement::relOptionsList->append(LT); + GuiExprElement::relOptionsList->append(LTE); + GuiExprElement::relOptionsList->append(EQUAL); + GuiExprElement::relOptionsList->append(GTE); + GuiExprElement::relOptionsList->append(GT); + GuiExprElement::relOptionsList->append(RANGE); + + // now the maps + (*GuiExprElement::logicalOpIndexMap)[GuiExprElement::AND_INDEX] = AndOp; + (*GuiExprElement::logicalOpIndexMap)[GuiExprElement::OR_INDEX] = OrOp; + (*GuiExprElement::logicalOpIndexMap)[GuiExprElement::XOR_INDEX] = XorOp; + + (*GuiExprElement::TermsIndexMap)[GuiExprElement::NAME_INDEX] = NameSearch; + (*GuiExprElement::TermsIndexMap)[GuiExprElement::PATH_INDEX] = PathSearch; + (*GuiExprElement::TermsIndexMap)[GuiExprElement::EXT_INDEX] = ExtSearch; + (*GuiExprElement::TermsIndexMap)[GuiExprElement::HASH_INDEX] = HashSearch; + (*GuiExprElement::TermsIndexMap)[GuiExprElement::DATE_INDEX] = DateSearch; + (*GuiExprElement::TermsIndexMap)[GuiExprElement::SIZE_INDEX] = SizeSearch; + (*GuiExprElement::TermsIndexMap)[GuiExprElement::POP_INDEX] = PopSearch; + + (*GuiExprElement::strConditionIndexMap)[GuiExprElement::CONTAINS_INDEX] = ContainsAnyStrings; + (*GuiExprElement::strConditionIndexMap)[GuiExprElement::CONTALL_INDEX] = ContainsAllStrings; + (*GuiExprElement::strConditionIndexMap)[GuiExprElement::IS_INDEX] = EqualsString; + +/* W A R N I N G !!!! + the cb elements correspond to their inverse rel op counterparts in rsexpr.h due to the nature of + the implementation.there + For example consider "size greater than 100kb" selected in the GUI. + The rsexpr.cc impl returns true if the CONDITION specified is greater than the file size passed as argument + as rsexpr iterates through the files. So, the user wants files that are greater than 100kb but the impl returns + files where the condition is greater than the file size i.e. files whose size is less than or equal to the condition + Therefore we invert the mapping of rel conditions here to match the behaviour of the impl. +*/ + (*GuiExprElement::relConditionIndexMap)[GuiExprElement::LT_INDEX] = GreaterEquals; + (*GuiExprElement::relConditionIndexMap)[GuiExprElement::LTE_INDEX] = Greater; + (*GuiExprElement::relConditionIndexMap)[GuiExprElement::EQUAL_INDEX] = Equals; + (*GuiExprElement::relConditionIndexMap)[GuiExprElement::GTE_INDEX] = Smaller; + (*GuiExprElement::relConditionIndexMap)[GuiExprElement::GT_INDEX] = SmallerEquals; + (*GuiExprElement::relConditionIndexMap)[GuiExprElement::RANGE_INDEX] = InRange; + + // the string to index map + (*GuiExprElement::termsStrMap)[GuiExprElement::NAME_INDEX] = GuiExprElement::NAME; + (*GuiExprElement::termsStrMap)[GuiExprElement::PATH_INDEX] = GuiExprElement::PATH; + (*GuiExprElement::termsStrMap)[GuiExprElement::EXT_INDEX] = GuiExprElement::EXT; + (*GuiExprElement::termsStrMap)[GuiExprElement::HASH_INDEX] = GuiExprElement::HASH; + (*GuiExprElement::termsStrMap)[GuiExprElement::DATE_INDEX] = GuiExprElement::DATE; + (*GuiExprElement::termsStrMap)[GuiExprElement::SIZE_INDEX] = GuiExprElement::SIZE; + (*GuiExprElement::termsStrMap)[GuiExprElement::POP_INDEX] = GuiExprElement::POP; + + (*GuiExprElement::logicalOpStrMap)[GuiExprElement::AND_INDEX] = GuiExprElement::AND; + (*GuiExprElement::logicalOpStrMap)[GuiExprElement::XOR_INDEX] = GuiExprElement::XOR; + (*GuiExprElement::logicalOpStrMap)[GuiExprElement::OR_INDEX] = GuiExprElement::OR; + + (*GuiExprElement::strConditionStrMap)[GuiExprElement::CONTAINS_INDEX] = GuiExprElement::CONTAINS; + (*GuiExprElement::strConditionStrMap)[GuiExprElement::CONTALL_INDEX] = GuiExprElement::CONTALL; + (*GuiExprElement::strConditionStrMap)[GuiExprElement::IS_INDEX] = GuiExprElement::IS; + + (*GuiExprElement::relConditionStrMap)[GuiExprElement::LT_INDEX] = GuiExprElement::LT; + (*GuiExprElement::relConditionStrMap)[GuiExprElement::LTE_INDEX] = GuiExprElement::LTE; + (*GuiExprElement::relConditionStrMap)[GuiExprElement::EQUAL_INDEX] = GuiExprElement::EQUAL; + (*GuiExprElement::relConditionStrMap)[GuiExprElement::GTE_INDEX] = GuiExprElement::GTE; + (*GuiExprElement::relConditionStrMap)[GuiExprElement::GT_INDEX] = GuiExprElement::GT; + (*GuiExprElement::relConditionStrMap)[GuiExprElement::RANGE_INDEX] = GuiExprElement::RANGE; + + + GuiExprElement::initialised = true; +} + +QStringList* GuiExprElement::getConditionOptions(ExprSearchType t) +{ + QStringList * list = new QStringList(); + switch (t) { + case NameSearch: + case PathSearch: + case ExtSearch: + case HashSearch: + list = GuiExprElement::stringOptionsList; + break; + case DateSearch: + case PopSearch: + case SizeSearch: + default: + list = GuiExprElement::relOptionsList; + } + return list; +} + +QHBoxLayout * GuiExprElement::createLayout(QWidget * parent) +{ + QHBoxLayout * hboxLayout; + if (parent == 0) + { + hboxLayout = new QHBoxLayout(); + } else { + hboxLayout = new QHBoxLayout(parent); + } + hboxLayout->setMargin(0); + hboxLayout->setSpacing(0); + return hboxLayout; +} + +bool GuiExprElement::isStringSearchExpression() +{ + return (searchType == NameSearch || searchType == PathSearch + || searchType == ExtSearch || searchType == HashSearch); +} + + +/* ********************************************************************/ +/* *********** L O G I C A L O P E L E M E N T ******************/ +/* ********************************************************************/ +ExprOpElement::ExprOpElement(QWidget * parent) + : GuiExprElement(parent) +{ + internalframe = new QFrame(this); + internalframe->setLayout(createLayout()); + cb = new QComboBox(this); + cb->setMinimumSize(LOGICAL_OP_CB_WIDTH, FIELDS_MIN_HEIGHT); + cb->addItems(*(GuiExprElement::exprOpsList)); + internalframe->layout()->addWidget(cb); +} + +QString ExprOpElement::toString() +{ + return (*GuiExprElement::logicalOpStrMap)[cb->currentIndex()]; +} + + +LogicalOperator ExprOpElement::getLogicalOperator() +{ + return (*GuiExprElement::logicalOpIndexMap)[cb->currentIndex()]; +} + + +/* **********************************************************/ +/* *********** T E R M S E L E M E N T ******************/ +/* **********************************************************/ +ExprTermsElement::ExprTermsElement(QWidget * parent) + : GuiExprElement(parent) +{ + internalframe = new QFrame(this); + internalframe->setLayout(createLayout()); + cb = new QComboBox(this); + cb->setMinimumSize(STD_CB_WIDTH, FIELDS_MIN_HEIGHT); + connect (cb, SIGNAL(currentIndexChanged(int)), + this, SIGNAL(currentIndexChanged(int))); + cb->addItems(*(GuiExprElement::searchTermsOptionsList)); + internalframe->layout()->addWidget(cb); +} +QString ExprTermsElement::toString() +{ + return (*GuiExprElement::termsStrMap)[cb->currentIndex()]; +} + +/* ******************************************************************/ +/* *********** C O N D I T I O N E L E M E N T ******************/ +/* ******************************************************************/ +ExprConditionElement::ExprConditionElement(ExprSearchType type, QWidget * parent) + : GuiExprElement(parent) +{ + internalframe = new QFrame(this); + internalframe->setLayout(createLayout()); + cb = new QComboBox(this); + cb->setMinimumSize(CONDITION_CB_WIDTH, FIELDS_MIN_HEIGHT); + connect (cb, SIGNAL(currentIndexChanged(int)), + this, SIGNAL(currentIndexChanged(int))); + cb->addItems(*(getConditionOptions(type))); + internalframe->layout()->addWidget(cb); +} + + +QString ExprConditionElement::toString() +{ + QString str = ""; + if (isStringSearchExpression()) + { + str = (*GuiExprElement::strConditionStrMap)[cb->currentIndex()]; + } else { + str = (*GuiExprElement::relConditionStrMap)[cb->currentIndex()]; + } + return str; +} + +RelOperator ExprConditionElement::getRelOperator() +{ + return (*GuiExprElement::relConditionIndexMap)[cb->currentIndex()]; +} + +StringOperator ExprConditionElement::getStringOperator() +{ + return (*GuiExprElement::strConditionIndexMap)[cb->currentIndex()]; +} + +void ExprConditionElement::adjustForSearchType(ExprSearchType type) +{ + cb->clear(); + cb->addItems(*(getConditionOptions(type))); + searchType = type; +} + +/* **********************************************************/ +/* *********** P A R A M E L E M E N T ******************/ +/* **********************************************************/ +ExprParamElement::ExprParamElement(ExprSearchType type, QWidget * parent) + : GuiExprElement(parent) +{ + internalframe = new QFrame(this); + internalframe->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); + internalframe->setLayout(createLayout()); + inRangedConfig = false; + searchType = type; + adjustForSearchType(type); +} + +QString ExprParamElement::toString() +{ + QString str = ""; + if (isStringSearchExpression()) + { + str = QString("\"") + getStrSearchValue() + QString("\""); + // we don't bother with case if hash search + if (searchType != HashSearch) { + str += (ignoreCase() ? QString(" (ignore case)") + : QString(" (case sensitive)")); + } + } else + { + if (searchType == DateSearch) { + QDateEdit * dateEdit = qFindChild (internalframe, "param1"); + str = dateEdit->text(); + if (inRangedConfig) + { + str += QString(" ") + tr("to") + QString(" "); + dateEdit = qFindChild (internalframe, "param2"); + str += dateEdit->text(); + } + } else if (searchType == SizeSearch) + { + QLineEdit * lineEditSize = qFindChild(internalframe, "param1"); + str = ("" == lineEditSize->text()) ? "0" + : lineEditSize->text(); + QComboBox * cb = qFindChild (internalframe, "unitsCb1"); + str += QString(" ") + cb->itemText(cb->currentIndex()); + if (inRangedConfig) + { + str += QString(" ") + tr("to") + QString(" "); + lineEditSize = qFindChild(internalframe, "param2"); + str += ("" == lineEditSize->text()) ? "0" + : lineEditSize->text(); + cb = qFindChild (internalframe, "unitsCb2"); + str += QString(" ") + cb->itemText(cb->currentIndex()); + } + } + } + return str; +} + + +void ExprParamElement::adjustForSearchType(ExprSearchType type) +{ + // record which search type is active + searchType = type; + QRegExp regExp("0|[1-9][0-9]*"); + numValidator = new QRegExpValidator(regExp, this); + QRegExp hexRegExp("[A-Fa-f0-9]*"); + hexValidator = new QRegExpValidator(hexRegExp, this); + + // remove all elements + QList children = qFindChildren(internalframe); + QWidget* child; + QLayout * lay_out = internalframe->layout(); + while (!children.isEmpty()) + { + child = children.takeLast(); + child->hide(); + lay_out->removeWidget(child); + delete child; + } + delete lay_out; + + QHBoxLayout* hbox = createLayout(); + internalframe->setLayout(hbox); + internalframe->setMinimumSize(320,30); + + if (isStringSearchExpression()) + { + // set up for default of a simple input field + QLineEdit* lineEdit = new QLineEdit(internalframe); + lineEdit->setMinimumSize(STR_FIELDS_MIN_WIDTH, FIELDS_MIN_HEIGHT); + lineEdit->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed); + lineEdit->setObjectName("param1"); + hbox->addWidget(lineEdit); + hbox->addSpacing(9); + QCheckBox* icCb = new QCheckBox(tr("ignore case"), internalframe); + icCb->setObjectName("ignoreCaseCB"); + icCb->setCheckState(Qt::Checked); + // hex search specifics: hidden case sensitivity and hex validator + if (searchType == HashSearch) { + icCb->hide(); + lineEdit->setValidator(hexValidator); + } + hbox->addWidget(icCb); + hbox->addStretch(); + + } else if (searchType == DateSearch) + { + QDateEdit * dateEdit = new QDateEdit(QDate::currentDate(), internalframe); + dateEdit->setMinimumSize(DATE_FIELDS_MIN_WIDTH, FIELDS_MIN_HEIGHT); + dateEdit->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + dateEdit->setDisplayFormat(tr("dd.MM.yyyy")); + dateEdit->setObjectName("param1"); + dateEdit->setMinimumDate(QDate(1970, 1, 1)); + dateEdit->setMaximumDate(QDate(2099, 12,31)); + hbox->addWidget(dateEdit, Qt::AlignLeft); + hbox->addStretch(); + } else if (searchType == SizeSearch) + { + QLineEdit * lineEdit = new QLineEdit(internalframe); + lineEdit->setMinimumSize(SIZE_FIELDS_MIN_WIDTH, FIELDS_MIN_HEIGHT); + lineEdit->setMaximumSize(SIZE_FIELDS_MIN_WIDTH, FIELDS_MIN_HEIGHT); + lineEdit->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + lineEdit->setObjectName("param1"); + lineEdit->setValidator(numValidator); + hbox->addWidget(lineEdit, Qt::AlignLeft); + + QComboBox * cb = new QComboBox(internalframe); + cb->setObjectName("unitsCb1"); + cb-> addItem(tr("KB"), QVariant(1024)); + cb->addItem(tr("MB"), QVariant(1048576)); + cb->addItem(tr("GB"), QVariant(1073741824)); + hbox->addSpacing(9); + internalframe->layout()->addWidget(cb); + hbox->addStretch(); + } + + /* POP Search not implemented + else if (searchType == PopSearch) + { + QLineEdit * lineEdit = new QLineEdit(elem); + lineEdit->setObjectName("param1"); + lineEdit->setValidator(numValidator); + elem->layout()->addWidget(lineEdit); + }*/ + hbox->invalidate(); + internalframe->adjustSize(); + internalframe->show(); + this->adjustSize(); +} + +void ExprParamElement::setRangedSearch(bool ranged) +{ + + if (inRangedConfig == ranged) return; // nothing to do here + inRangedConfig = ranged; + QHBoxLayout* hbox = (dynamic_cast(internalframe->layout())); + + // add additional or remove extra input fields depending on whether + // ranged search or not + if (inRangedConfig) + { + QLabel * toLbl = new QLabel(tr("to")); + toLbl->setMinimumSize(10, FIELDS_MIN_HEIGHT); + toLbl->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + + if (searchType == DateSearch) { + internalframe->setMinimumSize(250,30); + QDateEdit * dateEdit = new QDateEdit(QDate::currentDate(), internalframe); + dateEdit->setMinimumSize(DATE_FIELDS_MIN_WIDTH, FIELDS_MIN_HEIGHT); + dateEdit->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + dateEdit->setObjectName("param2"); + dateEdit->setDisplayFormat(tr("dd.MM.yyyy")); + dateEdit->setMinimumDate(QDate(1970, 1, 1)); + dateEdit->setMaximumDate(QDate(2099, 12,31)); + + hbox->addSpacing(9); + hbox->addWidget(toLbl, Qt::AlignLeft); + hbox->addSpacing(9); + hbox->addWidget(dateEdit, Qt::AlignLeft); + hbox->addStretch(); + } else if (searchType == SizeSearch) { + internalframe->setMinimumSize(340,30); + QLineEdit * lineEdit = new QLineEdit(internalframe); + lineEdit->setMinimumSize(SIZE_FIELDS_MIN_WIDTH, FIELDS_MIN_HEIGHT); + lineEdit->setMaximumSize(SIZE_FIELDS_MIN_WIDTH, FIELDS_MIN_HEIGHT); + lineEdit->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + lineEdit->setObjectName("param2"); + lineEdit->setValidator(numValidator); + + QComboBox * cb = new QComboBox(internalframe); + cb->setObjectName("unitsCb2"); + cb-> addItem(tr("KB"), QVariant(1024)); + cb->addItem(tr("MB"), QVariant(1048576)); + cb->addItem(tr("GB"), QVariant(1073741824)); + + hbox->addSpacing(9); + hbox->addWidget(toLbl, Qt::AlignLeft); + hbox->addSpacing(9); + hbox->addWidget(lineEdit, Qt::AlignLeft); + hbox->addSpacing(9); + hbox->addWidget(cb); + hbox->addStretch(); + } +// else if (searchType == PopSearch) +// { +// elem->layout()->addWidget(new QLabel(tr("to")), Qt::AlignCenter); +// QLineEdit * lineEdit = new QLineEdit(elem); +// lineEdit->setObjectName("param2"); +// lineEdit->setValidator(numValidator); +// elem->layout()->addWidget(slineEdit); +// } + hbox->invalidate(); + internalframe->adjustSize(); + internalframe->show(); + this->adjustSize(); + } else { + adjustForSearchType(searchType); + } +} + +bool ExprParamElement::ignoreCase() +{ + return (isStringSearchExpression() + && (qFindChild(internalframe, "ignoreCaseCB")) + ->checkState()==Qt::Checked); +} + +QString ExprParamElement::getStrSearchValue() +{ + if (!isStringSearchExpression()) return ""; + + QLineEdit * lineEdit = qFindChild(internalframe, "param1"); + return lineEdit->displayText(); +} + +int ExprParamElement::getIntValueFromField(QString fieldName, bool isToField) +{ + int val = -1; + QString suffix = (isToField) ? "2": "1" ; + + // NOTE qFindChild necessary for MSVC 6 compatibility!! + switch (searchType) + { + case DateSearch: + { + QDateEdit * dateEdit = qFindChild (internalframe, (fieldName + suffix)); + QDateTime * time = new QDateTime(dateEdit->date()); + val = time->toTime_t(); + break; + } + case SizeSearch: + { + QLineEdit * lineEditSize = qFindChild(internalframe, (fieldName + suffix)); + bool ok = false; + val = (lineEditSize->displayText()).toInt(&ok); + if (ok) { + QComboBox * cb = qFindChild (internalframe, (QString("unitsCb") + suffix)); + QVariant data = cb->itemData(cb->currentIndex()); + val *= data.toInt(); + } else { + val = -1; + } + break; + } + case PopSearch: // not implemented +/* { + QLineEdit * lineEditPop = qFindChild(elem, (fieldName + suffix)); + bool ok = false; + val = (lineEditPop->displayText()).toInt(&ok); + if (!ok) { + val = -1; + } + break; + }*/ + case NameSearch: + case PathSearch: + case ExtSearch: + case HashSearch: + default: + // shouldn't be here...val stays at -1 + val = -1; + } + + return val; +} + +int ExprParamElement::getIntValue() +{ + return getIntValueFromField("param"); +} + +int ExprParamElement::getIntLowValue() +{ + return getIntValue(); +} + +int ExprParamElement::getIntHighValue() +{ + if (!inRangedConfig) return getIntValue(); + return getIntValueFromField("param", true); +} + diff --git a/retroshare-gui/src/gui/advsearch/guiexprelement.h b/retroshare-gui/src/gui/advsearch/guiexprelement.h new file mode 100644 index 000000000..3bee85200 --- /dev/null +++ b/retroshare-gui/src/gui/advsearch/guiexprelement.h @@ -0,0 +1,234 @@ +/**************************************************************** +* RetroShare is distributed under the following license: +* +* Copyright (C) 2006, 2007 The RetroShare Team +* +* 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 _GuiExprElement_h_ +#define _GuiExprElement_h_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "rsiface/rsexpr.h" + +enum ExprSearchType +{ + NameSearch, + PathSearch, + ExtSearch, + HashSearch, + DateSearch, + SizeSearch, + PopSearch + +}; + +class GuiExprElement: public QWidget +{ + Q_OBJECT + +public: + GuiExprElement(QWidget * parent = 0); + virtual void adjustForSearchType(ExprSearchType) {} + virtual ~GuiExprElement(){} + virtual void set(int){} + virtual void set(QObject*){} + bool isStringSearchExpression(); + + /* translatable option strings for the comboboxes */ + static const QString AND ; + static const QString XOR ; + static const QString OR ; + static const QString NAME ; + static const QString PATH ; + static const QString EXT ; + static const QString HASH ; + static const QString KEYWORDS; + static const QString COMMENTS; + static const QString META ; + static const QString DATE ; + static const QString SIZE ; + static const QString POP ; + + static const QString CONTAINS; + static const QString CONTALL ; + static const QString IS ; + + static const QString LT ; + static const QString LTE ; + static const QString EQUAL ; + static const QString GTE ; + static const QString GT ; + static const QString RANGE ; + +/* indices for possible cb options */ + static const int AND_INDEX; + static const int XOR_INDEX; + static const int OR_INDEX; + static const int NAME_INDEX; + static const int PATH_INDEX; + static const int EXT_INDEX; + static const int HASH_INDEX; + static const int KEYWORDS_INDEX; + static const int COMMENTS_INDEX; + static const int META_INDEX; + static const int DATE_INDEX; + static const int SIZE_INDEX; + static const int POP_INDEX; + + static const int CONTAINS_INDEX; + static const int CONTALL_INDEX; + static const int IS_INDEX; + + static const int LT_INDEX; + static const int LTE_INDEX; + static const int EQUAL_INDEX; + static const int GTE_INDEX; + static const int GT_INDEX; + static const int RANGE_INDEX; + + static QMap * TermsIndexMap; + + virtual QString toString(){return QString("");} + +protected: + /** prepare the option lists for use */ + void initialiseOptionsLists(); + + /** provides the appropriate options list for the + condition combobox */ + QStringList* getConditionOptions(ExprSearchType t); + + QHBoxLayout* createLayout(QWidget* parent = 0); + QFrame * internalframe; + + ExprSearchType searchType; + + static bool initialised; + static QStringList * exprOpsList; + static QStringList * searchTermsOptionsList; + static QStringList * stringOptionsList; + static QStringList * relOptionsList; + + // provides a mapping of condition operators to RSExpr reloperators + static QMap * logicalOpIndexMap; + static QMap * strConditionIndexMap; + static QMap * relConditionIndexMap; + + // provides a mapping of indexes to translatable strings + static QMap * logicalOpStrMap; + static QMap * termsStrMap; + static QMap * strConditionStrMap; + static QMap * relConditionStrMap; + + +}; + +/** the Expression operator combobox element */ +class ExprOpElement : public GuiExprElement +{ + Q_OBJECT + +public: + ExprOpElement(QWidget * parent = 0); + LogicalOperator getLogicalOperator(); + QString toString(); +private: + QComboBox * cb; +}; + +/** the Terms combobox element */ +class ExprTermsElement : public GuiExprElement +{ + Q_OBJECT + +public: + ExprTermsElement(QWidget * parent = 0); + int getTermsIndex(); + RelOperator getRelOperator(); + StringOperator getStringOperator(); + void set(int i) {cb->setCurrentIndex(i);} + QString toString(); + +signals: + void currentIndexChanged(int); + +private: + QComboBox * cb; +}; + +/** the Conditions combobox element */ +class ExprConditionElement : public GuiExprElement +{ + Q_OBJECT + +public: + ExprConditionElement(ExprSearchType, QWidget * parent = 0); + RelOperator getRelOperator(); + StringOperator getStringOperator(); + void adjustForSearchType(ExprSearchType); + void set(int i) {cb->setCurrentIndex(i);} + QString toString(); + +signals: + void currentIndexChanged(int); + +private: + QComboBox * cb; +}; + +/** the Parameter element */ +class ExprParamElement : public GuiExprElement +{ + Q_OBJECT + +public: + ExprParamElement(ExprSearchType, QWidget * parent = 0); + QVariant* getRSExprValue(); + void adjustForSearchType(ExprSearchType); + void setRangedSearch(bool ranged = true); + bool ignoreCase(); + QString getStrSearchValue(); + int getIntValue(); + int getIntLowValue(); + int getIntHighValue(); + virtual QString toString(); + +private: + QRegExpValidator * numValidator; + QRegExpValidator * hexValidator; + QFrame * rangeParamsFrame; + bool inRangedConfig; + int getIntValueFromField(QString fieldName, bool isToField=false); +}; + +#endif diff --git a/retroshare-gui/src/gui/authdlg/AuthorizationDialog.cpp b/retroshare-gui/src/gui/authdlg/AuthorizationDialog.cpp new file mode 100644 index 000000000..06ba63c53 --- /dev/null +++ b/retroshare-gui/src/gui/authdlg/AuthorizationDialog.cpp @@ -0,0 +1,122 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 "rshare.h" +#include "AuthorizationDialog.h" + +#include "rsiface/rsiface.h" + +#include + + +/** Default constructor */ +AuthorizationDialog::AuthorizationDialog(QWidget *parent, Qt::WFlags flags) + : QDialog(parent, flags) +{ + /* Invoke Qt Designer generated QObject setup routine */ + ui.setupUi(this); + +// GConfig config; +// config.loadWidgetInformation(this); + + // Create the status bar + //statusBar()->showMessage("Please enter the correct AUTH CODE !"); + + setFixedSize(QSize(267, 103)); + + connect(ui.cancelButton, SIGNAL(clicked()), this, SLOT(closedlg())); + connect(ui.okButton, SIGNAL(clicked()), this, SLOT(authAttempt())); + //connect(ui.Ledit_name, SIGNAL(textChanged()), this, SLOT(checkAuthCode())); + connect(ui.Ledit_name, SIGNAL(textChanged ( const QString & ) ), this, SLOT(checkAuthCode( const QString & ))); + +} + + + +/** + Overloads the default show() slot so we can set opacity*/ + +void +AuthorizationDialog::show() +{ + //loadSettings(); + if(!this->isVisible()) { + QDialog::show(); + + } +} + +void AuthorizationDialog::closeEvent (QCloseEvent * event) +{ +// GConfig config; +// config.saveWidgetInformation(this); + + QWidget::closeEvent(event); +} + +void AuthorizationDialog::closedlg() +{ + close(); +} + + +void AuthorizationDialog::setAuthCode(std::string id, std::string code) +{ + authId = id; + authCode = code; + ui.Ledit_name->setText(QString::fromStdString(code)); + //ui.okButton ->setEnabled(true); +} + +void AuthorizationDialog::checkAuthCode(const QString &txt) +{ + + //std::cerr << "AuthCode:" << authCode << std::endl; + //std::cerr << "Entered:" << ui.Ledit_name -> text().toStdString() << std::endl; + //std::cerr << "Entered:" << txt.toStdString() << std::endl; + + if (authCode == txt.toStdString()) + { + /* enable ok button */ + ui.okButton ->setEnabled(true); + } + else + { + /* disable ok button */ + ui.okButton ->setEnabled(false); + } +} + +void AuthorizationDialog::authAttempt() +{ + + /* well lets do it ! */ + std::cerr << "Attempting AuthCode:" << authCode << std::endl; + rsicontrol -> NeighAuthFriend(authId, authCode); + rsicontrol -> NeighAddFriend(authId); + + /* close it up! */ + closedlg(); +} + + diff --git a/retroshare-gui/src/gui/authdlg/AuthorizationDialog.h b/retroshare-gui/src/gui/authdlg/AuthorizationDialog.h new file mode 100644 index 000000000..1a7bba1e3 --- /dev/null +++ b/retroshare-gui/src/gui/authdlg/AuthorizationDialog.h @@ -0,0 +1,70 @@ +/**************************************************************** + * RShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 _AUTHORIZATIONDIALOG_H +#define _AUTHORIZATIONDIALOG_H + +#include + +#include "ui_AuthorizationDialog.h" + +#include + +class AuthorizationDialog : public QDialog +{ + Q_OBJECT + +public: + /** Default constructor */ + AuthorizationDialog(QWidget *parent = 0, Qt::WFlags flags = 0); + /** Default destructor */ + + void setAuthCode(std::string id, std::string code); + +public slots: + /** Overloaded QWidget.show */ + void checkAuthCode( const QString &txt ); + void show(); + +protected: + void closeEvent (QCloseEvent * event); + +private slots: + + void closedlg(); + void authAttempt(); + + +private: + + std::string authCode; + std::string authId; + + /** Loads the saved connectidialog settings */ + // void loadSettings(); + + /** Qt Designer generated object */ + Ui::AuthorizationDialog ui; +}; + +#endif + diff --git a/retroshare-gui/src/gui/authdlg/AuthorizationDialog.ui b/retroshare-gui/src/gui/authdlg/AuthorizationDialog.ui new file mode 100644 index 000000000..b1363b852 --- /dev/null +++ b/retroshare-gui/src/gui/authdlg/AuthorizationDialog.ui @@ -0,0 +1,151 @@ + + AuthorizationDialog + + + + 0 + 0 + 267 + 103 + + + + Authenticate + + + :/images/encrypted22.png + + + + 9 + + + 6 + + + + + + 5 + 5 + 0 + 0 + + + + Authenticate Friend By Entering Their Code + + + + + + + 0 + + + 6 + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + + + + + + + + 0 + 0 + 0 + 0 + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 40 + 20 + + + + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + + 131 + 31 + + + + + + + + false + + + + 77 + 0 + + + + OK + + + + + + + + 77 + 0 + + + + Cancel + + + + + + + + + Ledit_name + okButton + cancelButton + + + + + + diff --git a/retroshare-gui/src/gui/bwgraph/bwgraph.cpp b/retroshare-gui/src/gui/bwgraph/bwgraph.cpp new file mode 100644 index 000000000..88462c094 --- /dev/null +++ b/retroshare-gui/src/gui/bwgraph/bwgraph.cpp @@ -0,0 +1,277 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2007, crypton + * + * 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 +#include +#include "bwgraph.h" + +#define BWGRAPH_LINE_SEND (1u<<0) +#define BWGRAPH_LINE_RECV (1u<<1) +#define SETTING_FILTER "LineFilter" +#define SETTING_OPACITY "Opacity" +#define SETTING_ALWAYS_ON_TOP "AlwaysOnTop" +#define SETTING_STYLE "GraphStyle" +#define DEFAULT_FILTER (BWGRAPH_LINE_SEND|BWGRAPH_LINE_RECV) +#define DEFAULT_ALWAYS_ON_TOP false +#define DEFAULT_OPACITY 100 +#define DEFAULT_STYLE GraphFrame::AreaGraph + +#define ADD_TO_FILTER(f,v,b) (f = ((b) ? ((f) | (v)) : ((f) & ~(v)))) + +/* Define the format used for displaying the date and time */ +#define DATETIME_FMT "MMM dd hh:mm:ss" + +/* Images used in the graph style drop-down */ +#define IMG_AREA_GRAPH ":/images/16x16/graph-area.png" +#define IMG_LINE_GRAPH ":/images/16x16/graph-line.png" + + +/** Default constructor */ +BandwidthGraph::BandwidthGraph(QWidget *parent, Qt::WFlags flags) + : RWindow("BandwidthGraph", parent, flags) +{ + /* Invoke Qt Designer generated QObject setup routine */ + ui.setupUi(this); +#if defined(Q_WS_WIN) + setShortcut("Esc", SLOT(close())); +#else + setShortcut("Ctrl+W", SLOT(close())); +#endif + + /* Bind events to actions */ + createActions(); + + /* Ask RetroShare core to notify us about bandwidth updates */ + //_rsControl = RetroShare::rsControl(); + //_rsControl->setEvent(REvents::Bandwidth, this, true); + + /* Initialize Sent/Receive data counters */ + reset(); + /* Hide Bandwidth Graph Settings frame */ + showSettingsFrame(false); + /* Load the previously saved settings */ + loadSettings(); + + /* Turn off opacity group on unsupported platforms */ +#if defined(Q_WS_WIN) + if(!(QSysInfo::WV_2000 <= QSysInfo::WindowsVersion <= QSysInfo::WV_2003)) { + ui.frmOpacity->setVisible(false); + } +#endif + +#if defined(Q_WS_X11) + ui.frmOpacity->setVisible(false); +#endif +} + +/** Custom event handler. Checks if the event is a bandwidth update event. If it + * is, it will add the data point to the history and updates the graph. */ +void +BandwidthGraph::customEvent(QEvent *event) +{ + if (event->type() == CustomEventType::BandwidthEvent) { + BandwidthEvent *bw = (BandwidthEvent *)event; + updateGraph(bw->bytesRead(), bw->bytesWritten()); + } +} + +/** Binds events to actions. */ +void +BandwidthGraph::createActions() +{ + connect(ui.btnToggleSettings, SIGNAL(toggled(bool)), + this, SLOT(showSettingsFrame(bool))); + + connect(ui.btnReset, SIGNAL(clicked()), + this, SLOT(reset())); + + connect(ui.btnSaveSettings, SIGNAL(clicked()), + this, SLOT(saveChanges())); + + connect(ui.btnCancelSettings, SIGNAL(clicked()), + this, SLOT(cancelChanges())); + + connect(ui.sldrOpacity, SIGNAL(valueChanged(int)), + this, SLOT(setOpacity(int))); +} + +/** Adds new data to the graph. */ +void +BandwidthGraph::updateGraph(quint64 bytesRead, quint64 bytesWritten) +{ + /* Graph only cares about kilobytes */ + ui.frmGraph->addPoints(bytesRead/1024.0, bytesWritten/1024.0); +} + +/** Loads the saved Bandwidth Graph settings. */ +void +BandwidthGraph::loadSettings() +{ + /* Set window opacity slider widget */ + ui.sldrOpacity->setValue(getSetting(SETTING_OPACITY, DEFAULT_OPACITY).toInt()); + setOpacity(ui.sldrOpacity->value()); + + /* Set whether the window appears on top. */ + ui.chkAlwaysOnTop->setChecked(getSetting(SETTING_ALWAYS_ON_TOP, + DEFAULT_ALWAYS_ON_TOP).toBool()); + if (ui.chkAlwaysOnTop->isChecked()) { + setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); + } else { + setWindowFlags(windowFlags() & ~Qt::WindowStaysOnTopHint); + } + + /* Set the line filter checkboxes accordingly */ + uint filter = getSetting(SETTING_FILTER, DEFAULT_FILTER).toUInt(); + ui.chkReceiveRate->setChecked(filter & BWGRAPH_LINE_RECV); + ui.chkSendRate->setChecked(filter & BWGRAPH_LINE_SEND); + + /* Set whether we are plotting bandwidth as area graphs or not */ + int graphStyle = getSetting(SETTING_STYLE, DEFAULT_STYLE).toInt(); + if (graphStyle < 0 || graphStyle >= ui.cmbGraphStyle->count()) { + graphStyle = DEFAULT_STYLE; + } + ui.cmbGraphStyle->setCurrentIndex(graphStyle); + ui.frmGraph->setGraphStyle((GraphFrame::GraphStyle)graphStyle); + + /* Set graph frame settings */ + ui.frmGraph->setShowCounters(ui.chkReceiveRate->isChecked(), + ui.chkSendRate->isChecked()); +} + +/** Resets the log start time. */ +void +BandwidthGraph::reset() +{ + /* Set to current time */ + ui.statusbar->showMessage(tr("Since:") + " " + + QDateTime::currentDateTime() + .toString(DATETIME_FMT)); + /* Reset the graph */ + ui.frmGraph->resetGraph(); +} + +/** Saves the Bandwidth Graph settings and adjusts the graph if necessary. */ +void +BandwidthGraph::saveChanges() +{ + /* Hide the settings frame and reset toggle button */ + showSettingsFrame(false); + + /* Save the opacity and graph style */ + saveSetting(SETTING_OPACITY, ui.sldrOpacity->value()); + saveSetting(SETTING_STYLE, ui.cmbGraphStyle->currentIndex()); + + /* Save the Always On Top setting */ + saveSetting(SETTING_ALWAYS_ON_TOP, ui.chkAlwaysOnTop->isChecked()); + if (ui.chkAlwaysOnTop->isChecked()) { + setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); + } else { + setWindowFlags(windowFlags() & ~Qt::WindowStaysOnTopHint); + } + setOpacity(ui.sldrOpacity->value()); + + /* Save the line filter values */ + uint filter = 0; + ADD_TO_FILTER(filter, BWGRAPH_LINE_RECV, ui.chkReceiveRate->isChecked()); + ADD_TO_FILTER(filter, BWGRAPH_LINE_SEND, ui.chkSendRate->isChecked()); + saveSetting(SETTING_FILTER, filter); + + + /* Update the graph frame settings */ + ui.frmGraph->setShowCounters(ui.chkReceiveRate->isChecked(), + ui.chkSendRate->isChecked()); + ui.frmGraph->setGraphStyle((GraphFrame::GraphStyle)ui.cmbGraphStyle->currentIndex()); + + /* A change in window flags causes the window to disappear, so make sure + * it's still visible. */ + showNormal(); +} + +/** Simply restores the previously saved settings. */ +void +BandwidthGraph::cancelChanges() +{ + /* Hide the settings frame and reset toggle button */ + showSettingsFrame(false); + + /* Reload the settings */ + loadSettings(); +} + +/** Toggles the Settings pane on and off, changes toggle button text. */ +void +BandwidthGraph::showSettingsFrame(bool show) +{ + static QSize minSize = minimumSize(); + + QSize newSize = size(); + if (show) { + /* Extend the bottom of the bandwidth graph and show the settings */ + ui.frmSettings->setVisible(true); + ui.btnToggleSettings->setChecked(true); + ui.btnToggleSettings->setText(tr("Hide Settings")); + + /* 6 = vertical spacing between the settings frame and graph frame */ + newSize.setHeight(newSize.height() + ui.frmSettings->height() + 6); + } else { + /* Shrink the height of the bandwidth graph and hide the settings */ + ui.frmSettings->setVisible(false); + ui.btnToggleSettings->setChecked(false); + ui.btnToggleSettings->setText(tr("Show Settings")); + + /* 6 = vertical spacing between the settings frame and graph frame */ + newSize.setHeight(newSize.height() - ui.frmSettings->height() - 6); + setMinimumSize(minSize); + } + resize(newSize); +} + +/** Sets the opacity of the Bandwidth Graph window. */ +void +BandwidthGraph::setOpacity(int value) +{ + qreal newValue = value / 100.0; + + /* Opacity only supported by Mac and Win32 */ +#if defined(Q_WS_MAC) + this->setWindowOpacity(newValue); + ui.lblPercentOpacity->setText(QString::number(value)); +#elif defined(Q_WS_WIN) + if(QSysInfo::WV_2000 <= QSysInfo::WindowsVersion <= QSysInfo::WV_2003) { + this->setWindowOpacity(newValue); + ui.lblPercentOpacity->setText(QString::number(value)); + } +#else + Q_UNUSED(newValue); +#endif +} + +/** Overloads the default show() slot so we can set opacity. */ +void +BandwidthGraph::showWindow() +{ + /* Load saved settings */ + loadSettings(); + /* Show the window */ + RWindow::showWindow(); +} + diff --git a/retroshare-gui/src/gui/bwgraph/bwgraph.h b/retroshare-gui/src/gui/bwgraph/bwgraph.h new file mode 100644 index 000000000..804f4df69 --- /dev/null +++ b/retroshare-gui/src/gui/bwgraph/bwgraph.h @@ -0,0 +1,85 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 _BWGRAPH_H +#define _BWGRAPH_H + +#include +#include + +#include +//#include +#include + +#include "ui_bwgraph.h" + +/** Redraw graph every 1000ms **/ +#define REFRESH_RATE 1000 + + +class BandwidthGraph : public RWindow +{ + Q_OBJECT + +public: + /** Default constructor */ + BandwidthGraph(QWidget *parent = 0, Qt::WFlags flags = 0); + +public slots: + /** Overloaded QWidget.show */ + void showWindow(); + +protected: + /** Called to deliver a bandwidth update event from Tor. */ + void customEvent(QEvent *event); + +private slots: + /** Adds new data to the graph */ + void updateGraph(quint64 bytesRead, quint64 bytesWritten); + /** Called when settings button is toggled */ + void showSettingsFrame(bool show); + /** Called when the settings button is toggled */ + void setOpacity(int value); + /** Called when the user saves settings */ + void saveChanges(); + /** Called when the user cancels changes settings */ + void cancelChanges(); + /** Called when the reset button is pressed */ + void reset(); + +private: + /** Create and bind actions to events **/ + void createActions(); + /** Loads the saved Bandwidth Graph settings */ + void loadSettings(); + + /** A TorControl object used to talk to Tor. */ + // TorControl* _torControl; + /** A VidaliaSettings object that handles getting/saving settings */ + RshareSettings* _settings; + + /** Qt Designer generated object */ + Ui::BandwidthGraph ui; +}; + +#endif + diff --git a/retroshare-gui/src/gui/bwgraph/bwgraph.ui b/retroshare-gui/src/gui/bwgraph/bwgraph.ui new file mode 100644 index 000000000..15a110a13 --- /dev/null +++ b/retroshare-gui/src/gui/bwgraph/bwgraph.ui @@ -0,0 +1,976 @@ + + BandwidthGraph + + + + 0 + 0 + 373 + 161 + + + + + + + + + 16 + 16 + 16 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 160 + 160 + 160 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + + + 16 + 16 + 16 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 160 + 160 + 160 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + + + 104 + 104 + 104 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 160 + 160 + 160 + + + + + + + 104 + 104 + 104 + + + + + + + 255 + 255 + 255 + + + + + + + 104 + 104 + 104 + + + + + + + 240 + 240 + 240 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + + + 10 + + + + Qt::NoContextMenu + + + RetroShare Bandwidth Usage + + + :/images/ksysguard.png + + + + + 9 + + + 6 + + + + + 0 + + + 6 + + + + + Show Settings + + + true + + + + + + + Qt::Horizontal + + + + 21 + 20 + + + + + + + + Reset + + + + + + + + + + 120 + 80 + + + + + 10 + + + + Qt::NoContextMenu + + + QFrame::Box + + + QFrame::Plain + + + + + + + + 0 + 0 + 0 + 0 + + + + + 355 + 82 + + + + + 355 + 82 + + + + Qt::NoContextMenu + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 9 + + + 6 + + + + + 3 + + + 6 + + + + + + 10 + + + + Qt::NoContextMenu + + + + + + Qt::RightToLeft + + + Receive Rate + + + false + + + + + + + + 10 + + + + Qt::NoContextMenu + + + + + + Qt::RightToLeft + + + Send Rate + + + false + + + + + + + Qt::RightToLeft + + + Always on Top + + + + + + + Qt::Vertical + + + + 20 + 21 + + + + + + + + + + 0 + + + 1 + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + + 20 + 20 + + + + + + + + + 10 + + + + Style + + + + + + + + + + + :/images/graph-line.png + + + + + + + + :/images/graph-area.png + + + + + + + + + + Qt::NoContextMenu + + + QFrame::NoFrame + + + QFrame::Plain + + + + 0 + + + 3 + + + + + Qt::NoContextMenu + + + Changes the transparency of the Bandwidth Graph + + + 30 + + + 100 + + + 100 + + + 100 + + + false + + + Qt::Horizontal + + + false + + + QSlider::NoTicks + + + 10 + + + + + + + Qt::Vertical + + + + 20 + 20 + + + + + + + + 0 + + + 0 + + + + + Qt::Horizontal + + + + 21 + 0 + + + + + + + + + 25 + 0 + + + + + 10 + + + + Qt::NoContextMenu + + + Qt::RightToLeft + + + 100 + + + + + + + + 10 + + + + Qt::NoContextMenu + + + % Opaque + + + + + + + Qt::Horizontal + + + + 21 + 0 + + + + + + + + + + + + + Qt::Vertical + + + + 21 + 20 + + + + + + + + + + Qt::Horizontal + + + + 21 + 20 + + + + + + + + 0 + + + 1 + + + + + Save + + + + + + + Cancel + + + + + + + + + + + + + + + GraphFrame + QFrame +
    gui/graphframe.h
    +
    +
    + + btnToggleSettings + btnReset + chkReceiveRate + chkSendRate + chkAlwaysOnTop + cmbGraphStyle + sldrOpacity + btnSaveSettings + btnCancelSettings + + + + + +
    diff --git a/retroshare-gui/src/gui/chat/AvatarFrame.ui b/retroshare-gui/src/gui/chat/AvatarFrame.ui new file mode 100644 index 000000000..2c7358f2c --- /dev/null +++ b/retroshare-gui/src/gui/chat/AvatarFrame.ui @@ -0,0 +1,126 @@ + + AvatarFrame + + + + 0 + 0 + 88 + 300 + + + + Form + + + + 9 + + + 6 + + + + + + 5 + 5 + 0 + 0 + + + + + 70 + 16 + + + + + 70 + 16777215 + + + + QFrame::NoFrame + + + QFrame::Raised + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + 70 + 70 + + + + + 70 + 70 + + + + QFrame::NoFrame + + + QFrame::Raised + + + + 0 + + + 0 + + + + + + 70 + 70 + + + + + 70 + 70 + + + + + + + + + + true + + + + + + + + + + + + + diff --git a/retroshare-gui/src/gui/chat/AvatarWidget.ui b/retroshare-gui/src/gui/chat/AvatarWidget.ui new file mode 100644 index 000000000..cc4ba7270 --- /dev/null +++ b/retroshare-gui/src/gui/chat/AvatarWidget.ui @@ -0,0 +1,74 @@ + + + + + AvatarWidget + + + + 0 + 0 + 120 + 126 + + + + + 70 + 70 + + + + Form + + + + 0 + + + 4 + + + + + + 5 + 0 + 0 + 0 + + + + + + + Qt::AlignCenter + + + + + + + + 1 + 1 + 0 + 0 + + + + + + + false + + + + + + + + + + + diff --git a/retroshare-gui/src/gui/chat/ChatAvatarFrame.cpp b/retroshare-gui/src/gui/chat/ChatAvatarFrame.cpp new file mode 100644 index 000000000..71b5b66ef --- /dev/null +++ b/retroshare-gui/src/gui/chat/ChatAvatarFrame.cpp @@ -0,0 +1,94 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006,2007 crypton + * + * 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 "ChatAvatarFrame.h" +#include "ChatAvatarWidget.h" + +#include + +#include + +ChatAvatarFrame::ChatAvatarFrame(QWidget * parent) + : QWidget(parent) { + + ui.setupUi(this); + setMinimumWidth(70); + QGridLayout * glayout = dynamic_cast(ui.remoteAvatarFrame->layout()); + glayout->setSpacing(0); + glayout->setMargin(0); +} + +void ChatAvatarFrame::setUserPixmap(QPixmap pixmap) { + + QPixmap background = QPixmap(":images/avatar_background.png"); + + if (!pixmap.isNull()) { + QPainter painter(&background); + painter.drawPixmap(5, 5, pixmap.scaled(60, 60, Qt::IgnoreAspectRatio, Qt::SmoothTransformation)); + painter.end(); + ui.userAvatar->setPixmap(background); + } else { + ui.userAvatar->setPixmap(background); + } +} + +void ChatAvatarFrame::addRemoteContact(const QString & id, const QString & displayName, const QString & contactId, QPixmap avatar) { + + if (!_contactIdList.indexOf(id)) { + return; + } else { + _contactIdList.append(id); + } + + ChatAvatarWidget * avatarWidget = new ChatAvatarWidget( + ui.remoteAvatarFrame, id, avatar, displayName, contactId, ChatAvatarWidget::BIG); + avatarWidget->setupPixmap(avatar); + + _widgetList.append(avatarWidget); + QGridLayout * glayout = dynamic_cast(ui.remoteAvatarFrame->layout()); + glayout->addWidget(avatarWidget, glayout->count(), 0); + + ui.remoteAvatarFrame->setMinimumSize(0, glayout->count() * 70); +} + +void ChatAvatarFrame::removeRemoteContact(const QString & contactId) { + + for (int i = 0; i < _widgetList.size(); i++) { + if (_widgetList[i]->getContactId() == contactId) { + QGridLayout * glayout = dynamic_cast(ui.remoteAvatarFrame->layout()); + glayout->removeWidget(_widgetList[i]); + glayout->update(); + delete _widgetList[i]; + _widgetList.removeAt(i); + } + } + _contactIdList.removeAll(contactId); +} + +void ChatAvatarFrame::updateContact(const QString & id, QPixmap avatar, const QString & displayName) { + for(int i = 0; i < _widgetList.size(); i++) { + ChatAvatarWidget * chatAvatarWidget = _widgetList[i]; + if (chatAvatarWidget->getContactId() == id) { + chatAvatarWidget->setupPixmap(avatar); + chatAvatarWidget->setToolTip(displayName); + } + } +} diff --git a/retroshare-gui/src/gui/chat/ChatAvatarFrame.h b/retroshare-gui/src/gui/chat/ChatAvatarFrame.h new file mode 100644 index 000000000..635dab541 --- /dev/null +++ b/retroshare-gui/src/gui/chat/ChatAvatarFrame.h @@ -0,0 +1,62 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006,2007 crypton + * + * 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 CHATAVATARFRAME_H +#define CHATAVATARFRAME_H + +#include "ui_AvatarFrame.h" + +#include +#include +#include + +class QHBoxLayout; +class ChatAvatarWidget; + + +class ChatAvatarFrame : public QWidget { + Q_OBJECT +public: + + ChatAvatarFrame(QWidget * parent); + + void setUserPixmap(QPixmap pixmap); + + void addRemoteContact(const QString & id, const QString & displayName, const QString & contactId, QPixmap avatar); + + void removeRemoteContact(const QString & contactId); + + void updateContact(const QString & id, QPixmap avatar, const QString & displayName); + +private: + + typedef QList WidgetList; + + WidgetList _widgetList; + + QVBoxLayout * _layout; + + Ui::AvatarFrame ui; + + QStringList _contactIdList; +}; + +#endif //CHATAVATARFRAME_H diff --git a/retroshare-gui/src/gui/chat/ChatAvatarWidget.cpp b/retroshare-gui/src/gui/chat/ChatAvatarWidget.cpp new file mode 100644 index 000000000..27a67d1ba --- /dev/null +++ b/retroshare-gui/src/gui/chat/ChatAvatarWidget.cpp @@ -0,0 +1,110 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006,2007 crypton + * + * 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 "ChatAvatarWidget.h" + +#include + +//#include + + + +ChatAvatarWidget::ChatAvatarWidget(QWidget * parent, const QString & id, + QPixmap picture, const QString & nickname, const QString & contactId, OWPictureMode pmode, NicknameMode nmode) + : QWidget(parent), _pictureMode(pmode), _nicknameMode(nmode), _contactId(id) { + + ui.setupUi(this); + //setupPixmap(picture); + setToolTip(nickname); + //setupNickname(contactId); + /* + if (_nicknameMode != NONE) { + setupNickname(nickname); + } else { + _ui.nicknameLabel->hide(); + }*/ +} + +void ChatAvatarWidget::setupPixmap(QPixmap pixmap) { + + //TODO:: resize fond_avatar.png + QPixmap background = QPixmap(":/images/avatar_background.png"); + QPixmap defaultAvatar = QPixmap(":/images/nopic.png"); + //QPixmap defaultAvatar(QString::fromStdString(AvatarList::getInstance().getDefaultAvatar().getFullPath())); + QPainter painter(&background); + + if (!pixmap.isNull()) { + switch (_pictureMode) { + case HUGE: + painter.drawPixmap(0, 0, pixmap.scaled(96, 96, Qt::IgnoreAspectRatio, Qt::SmoothTransformation)); + ui.pictureLabel->resize(96, 96); + setMinimumSize(96, 96); + break; + case BIG: + painter.drawPixmap(5, 5, pixmap.scaled(60, 60, Qt::IgnoreAspectRatio, Qt::SmoothTransformation)); + ui.pictureLabel->resize(70, 70); + setMinimumSize(70, 70); + break; + case MEDIUM: + painter.drawPixmap(0, 0, pixmap.scaled(48, 48, Qt::IgnoreAspectRatio, Qt::SmoothTransformation)); + ui.pictureLabel->resize(48, 48); + setMinimumSize(48, 48); + break; + case SMALL: + painter.drawPixmap(0, 0, pixmap.scaled(24, 24, Qt::IgnoreAspectRatio, Qt::SmoothTransformation)); + ui.pictureLabel->resize(24, 24); + setMinimumSize(24, 24); + break; + case TINY: + painter.drawPixmap(0, 0, pixmap.scaled(12, 12, Qt::IgnoreAspectRatio, Qt::SmoothTransformation)); + ui.pictureLabel->resize(12, 12); + setMinimumSize(12, 12); + break; + //default: + //LOG_WARN("unknown picture mode: " + String::fromNumber(_pictureMode)); + } + } else { + painter.drawPixmap(5, 5, defaultAvatar.scaled(60, 60, Qt::IgnoreAspectRatio, Qt::SmoothTransformation)); + ui.pictureLabel->resize(70, 70); + setMinimumSize(70, 70); + } + + painter.end(); + ui.pictureLabel->setPixmap(background); +} + +void ChatAvatarWidget::setupNickname(const QString & nickname) { + //TODO: limit string length + QFontMetrics fontMetrics(ui.nicknameLabel->font()); + int width = 60; + QString temp; + for(int i = 0; i < nickname.length(); i++) { + if (fontMetrics.width(temp) > width) { + break; + } + temp += nickname[i]; + } + ui.nicknameLabel->setText(temp); +} + +void ChatAvatarWidget::setToolTip(const QString & nickname) { + ui.pictureLabel->setToolTip(nickname); +} diff --git a/retroshare-gui/src/gui/chat/ChatAvatarWidget.h b/retroshare-gui/src/gui/chat/ChatAvatarWidget.h new file mode 100644 index 000000000..ce80838a6 --- /dev/null +++ b/retroshare-gui/src/gui/chat/ChatAvatarWidget.h @@ -0,0 +1,74 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006,2007 crypton + * + * 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 CHATAVATARWIDGET_H +#define CHATAVATARWIDGET_H + +#include "ui_AvatarWidget.h" + +#include + + +class ChatAvatarWidget : public QWidget { + Q_OBJECT +public: + + enum OWPictureMode { + HUGE, // 96x96 + BIG, // 60x60 + MEDIUM, // 48x48 + SMALL, // 24x24 + TINY, // 12x12 + }; + + enum NicknameMode { + RIGHT, + LEFT, + TOP, + BOTTOM, + NONE, + }; + + ChatAvatarWidget(QWidget * parent, const QString & id, QPixmap picture, + const QString & nickname, const QString & contactId, OWPictureMode pmode = SMALL, NicknameMode nmode = NONE); + + const QString getContactId() { + return _contactId; + } + + void setupPixmap(QPixmap pixmap); + + void setToolTip(const QString & nickname); + +private: + + void setupNickname(const QString & nickname); + + OWPictureMode _pictureMode; + + NicknameMode _nicknameMode; + + QString _contactId; + + Ui::AvatarWidget ui; +}; + +#endif //CHATAVATARWIDGET_H diff --git a/retroshare-gui/src/gui/chat/ChatWindow.cpp b/retroshare-gui/src/gui/chat/ChatWindow.cpp new file mode 100644 index 000000000..e9e002171 --- /dev/null +++ b/retroshare-gui/src/gui/chat/ChatWindow.cpp @@ -0,0 +1,230 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 + +#include "rshare.h" +#include "ChatWindow.h" +#include "config/gconfig.h" +#include "ChatAvatarFrame.h" +#include "util/Widget.h" + +#include +#include +#include +#include +#include + +#include + +/** Default constructor */ +ChatWindow::ChatWindow(QWidget *parent) + : QMainWindow(parent) + +{ + /* Invoke Qt Designer generated QObject setup routine */ + ui.setupUi(this); + + GConfig config; + config.loadWidgetInformation(this); + + _isAvatarFrameOpened = true; + + //creates sub widgets + _avatarFrame = new ChatAvatarFrame(this); + //// + + + connect(ui.lineEdit, SIGNAL(returnPressed( ) ), this, SLOT(sendChat( ) )); + + connect(ui.colorButton, SIGNAL(clicked()), this, SLOT(setColor())); + + connect(ui.textboldButton, SIGNAL(clicked()), this, SLOT(textBold())); + + connect(ui.textunderlineButton, SIGNAL(clicked()), this, SLOT(textUnderline())); + + connect(ui.textitalicButton, SIGNAL(clicked()), this, SLOT(textItalic())); + + connect(ui.avatarFrameButton, SIGNAL(clicked()), SLOT(avatarFrameButtonClicked())); + + + addAvatarFrame(); + + + + +} + + + +/** + Overloads the default show() slot so we can set opacity*/ + +void +ChatWindow::show() +{ + //loadSettings(); + if(!this->isVisible()) { + QMainWindow::show(); + + } +} + +void ChatWindow::closeEvent (QCloseEvent * event) +{ + + + QMainWindow::closeEvent(event); +} + +void ChatWindow::setColor() +{ + QColor col = QColorDialog::getColor(Qt::green, this); + if (col.isValid()) { + + ui.colorButton->setPalette(QPalette(col)); + QTextCharFormat fmt; + fmt.setForeground(col); + mergeFormatOnWordOrSelection(fmt); + colorChanged(col); + } +} + +void ChatWindow::textBold() +{ + QTextCharFormat fmt; + fmt.setFontWeight(ui.textboldButton->isChecked() ? QFont::Bold : QFont::Normal); + mergeFormatOnWordOrSelection(fmt); +} + +void ChatWindow::textUnderline() +{ + QTextCharFormat fmt; + fmt.setFontUnderline(ui.textunderlineButton->isChecked()); + mergeFormatOnWordOrSelection(fmt); +} + +void ChatWindow::textItalic() +{ + QTextCharFormat fmt; + fmt.setFontItalic(ui.textitalicButton->isChecked()); + mergeFormatOnWordOrSelection(fmt); +} + +void ChatWindow::currentCharFormatChanged(const QTextCharFormat &format) +{ + fontChanged(format.font()); + colorChanged(format.foreground().color()); +} + +void ChatWindow::mergeFormatOnWordOrSelection(const QTextCharFormat &format) +{ + QTextCursor cursor = ui.textBrowser->textCursor(); + if (!cursor.hasSelection()) + cursor.select(QTextCursor::WordUnderCursor); + cursor.mergeCharFormat(format); + ui.textBrowser->mergeCurrentCharFormat(format); +} + +void ChatWindow::fontChanged(const QFont &f) +{ + //comboFont->setCurrentIndex(comboFont->findText(QFontInfo(f).family())); + //comboSize->setCurrentIndex(comboSize->findText(QString::number(f.pointSize()))); + ui.textboldButton->setChecked(f.bold()); + ui.textunderlineButton->setChecked(f.italic()); + ui.textitalicButton->setChecked(f.underline()); +} + + + +void ChatWindow::colorChanged(const QColor &c) +{ + QPixmap pix(16, 16); + pix.fill(c); + ui.colorButton->setIcon(pix); +} + + +void ChatWindow::updateChat() +{ + /* get chat off queue */ + + /* write it out */ + +} + + + +void ChatWindow::addChatMsg() +{ + +} + + +void ChatWindow::sendChat() +{ + +} + + +void ChatWindow::avatarFrameButtonClicked() { + if (_isAvatarFrameOpened) { + removeAvatarFrame(); + } else { + addAvatarFrame(); + } +} + + +void ChatWindow::addAvatarFrame() { + QBoxLayout * glayout = dynamic_cast(layout()); + _avatarFrame->setVisible(true); + //_avatarFrame->setMinimumSize(64, 0); + glayout->insertWidget(1, _avatarFrame); + + _isAvatarFrameOpened = true; + ui.avatarFrameButton->setIcon(QIcon(":images/show_toolbox_frame.png")); + update(); +} + +void ChatWindow::removeAvatarFrame() { + QBoxLayout * glayout = dynamic_cast(layout()); + _avatarFrame->setVisible(false); + _avatarFrame->setMinimumSize(0, 0); + glayout->removeWidget(_avatarFrame); + + _isAvatarFrameOpened = false; + ui.avatarFrameButton->setIcon(QIcon(":images/hide_toolbox_frame.png")); + update(); +} + + +void ChatWindow::updateUserAvatar() { + + QPixmap pixmap; + //std::string myData = _cChatHandler.getCUserProfile().getUserProfile().getIcon().getData(); + //pixmap.loadFromData((uchar *)myData.c_str(), myData.size()); + _avatarFrame->setUserPixmap(pixmap); +} + +//void ChatWindow::updateAvatarFrame() { + +//} diff --git a/retroshare-gui/src/gui/chat/ChatWindow.h b/retroshare-gui/src/gui/chat/ChatWindow.h new file mode 100644 index 000000000..a9aed6837 --- /dev/null +++ b/retroshare-gui/src/gui/chat/ChatWindow.h @@ -0,0 +1,106 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 _CHATWINDOW_H +#define _CHATWINDOW_H + + +#include "ui_ChatWindow.h" + +#include "rsiface/rsiface.h" + +#include + +class ChatAvatarFrame; +class QAction; +class QTextEdit; +class QTextCharFormat; +class RetroSyleLabel; + +class ChatWindow : public QMainWindow +{ + Q_OBJECT + +public: + /** Default constructor */ + ChatWindow(QWidget *parent = 0); + /** Default destructor */ + + void updateChat(); + void addChatMsg(); + +public slots: + /** Overloaded QWidget.show */ + void show(); + +protected: + void closeEvent (QCloseEvent * event); + +private slots: + + void setColor(); + + void textBold(); + void textUnderline(); + void textItalic(); + + void sendChat(); + + void currentCharFormatChanged(const QTextCharFormat &format); + + void avatarFrameButtonClicked(); + +private: + + + + void mergeFormatOnWordOrSelection(const QTextCharFormat &format); + void fontChanged(const QFont &f); + + void colorChanged(const QColor &c); + + void addAvatarFrame(); + void removeAvatarFrame(); + //void updateAvatarFrame(); + void updateUserAvatar(); + + bool _isAvatarFrameOpened; + + ChatAvatarFrame * _avatarFrame; + + QAction *actionTextBold; + QAction *actionTextUnderline; + QAction *actionTextItalic; + + //std::string dialogId, dialogName; + //unsigned int lastChatTime; + //std::string lastChatName; + + /** Qt Designer generated object */ + Ui::ChatWindow ui; +}; + +#endif + + + + diff --git a/retroshare-gui/src/gui/chat/ChatWindow.ui b/retroshare-gui/src/gui/chat/ChatWindow.ui new file mode 100644 index 000000000..1cdc38382 --- /dev/null +++ b/retroshare-gui/src/gui/chat/ChatWindow.ui @@ -0,0 +1,282 @@ + + ChatWindow + + + + 0 + 0 + 487 + 395 + + + + MainWindow + + + + + 9 + + + 6 + + + + + Qt::Vertical + + + + + 0 + + + 6 + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + + 321 + 20 + + + + + + + + + 24 + 24 + + + + + 24 + 24 + + + + + + + :/images/edit-underline.png + + + true + + + + + + + + 24 + 24 + + + + + 24 + 24 + + + + + + + :/images/edit-italic.png + + + true + + + + + + + + 24 + 24 + + + + + 24 + 24 + + + + + + + :/images/edit-bold.png + + + true + + + + + + + + 24 + 24 + + + + + 24 + 24 + + + + + + + + + + + + + + + + + 0 + + + 0 + + + + + + 14 + 31 + + + + + 14 + 32 + + + + + + + :/images/show_toolbox_frame.png + + + + 14 + 31 + + + + false + + + true + + + + + + + Qt::Vertical + + + + 16 + 509 + + + + + + + + + + 0 + + + 6 + + + + + + + + Send + + + + + + + Search + + + + + + + + + + + Qt::Horizontal + + + 4 + + + + + lineEdit + textboldButton + textunderlineButton + textitalicButton + colorButton + pushButton + pushButton_2 + textBrowser + avatarFrameButton + + + + diff --git a/retroshare-gui/src/gui/chat/PopupChatDialog.cpp b/retroshare-gui/src/gui/chat/PopupChatDialog.cpp new file mode 100644 index 000000000..6d9f62cb7 --- /dev/null +++ b/retroshare-gui/src/gui/chat/PopupChatDialog.cpp @@ -0,0 +1,315 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 + +#include "rshare.h" +#include "PopupChatDialog.h" + +#include +#include +#include +#include +#include + + +/* Define the format used for displaying the date and time */ +#define DATETIME_FMT "MMM dd hh:mm:ss" + +#include + + +/** Default constructor */ +PopupChatDialog::PopupChatDialog(std::string id, std::string name, + QWidget *parent, Qt::WFlags flags) + : QMainWindow(parent, flags), dialogId(id), dialogName(name), + lastChatTime(0), lastChatName("") +{ + /* Invoke Qt Designer generated QObject setup routine */ + ui.setupUi(this); + + connect(ui.lineEdit, SIGNAL(returnPressed( ) ), this, SLOT(sendChat( ) )); + + connect(ui.colorButton, SIGNAL(clicked()), this, SLOT(setColor())); + + connect(ui.textboldButton, SIGNAL(clicked()), this, SLOT(textBold())); + + connect(ui.textunderlineButton, SIGNAL(clicked()), this, SLOT(textUnderline())); + + connect(ui.textitalicButton, SIGNAL(clicked()), this, SLOT(textItalic())); + + // Create the status bar + std::ostringstream statusstr; + statusstr << "Chatting with: " << dialogName << " !!! " << id; + statusBar()->showMessage(QString::fromStdString(statusstr.str())); + ui.textBrowser->setOpenExternalLinks ( false ); + + QString title = "RS:" + tr("Chatting with") + " " + QString::fromStdString(name); + setWindowTitle(title); + + +} + + + +/** + Overloads the default show() slot so we can set opacity*/ + +void PopupChatDialog::show() +{ + + if(!this->isVisible()) { + QMainWindow::show(); + } else { + QMainWindow::activateWindow(); + setWindowState(windowState() & ~Qt::WindowMinimized | Qt::WindowActive); + QMainWindow::raise(); + } + +} + +void PopupChatDialog::closeEvent (QCloseEvent * event) +{ + hide(); + event->ignore(); +} + +void PopupChatDialog::setColor() +{ + QColor col = QColorDialog::getColor(Qt::green, this); + if (col.isValid()) { + + ui.colorButton->setPalette(QPalette(col)); + QTextCharFormat fmt; + fmt.setForeground(col); + mergeFormatOnWordOrSelection(fmt); + colorChanged(col); + } +} + +void PopupChatDialog::textBold() +{ + QTextCharFormat fmt; + fmt.setFontWeight(ui.textboldButton->isChecked() ? QFont::Bold : QFont::Normal); + mergeFormatOnWordOrSelection(fmt); +} + +void PopupChatDialog::textUnderline() +{ + QTextCharFormat fmt; + fmt.setFontUnderline(ui.textunderlineButton->isChecked()); + mergeFormatOnWordOrSelection(fmt); +} + +void PopupChatDialog::textItalic() +{ + QTextCharFormat fmt; + fmt.setFontItalic(ui.textitalicButton->isChecked()); + mergeFormatOnWordOrSelection(fmt); +} + +void PopupChatDialog::currentCharFormatChanged(const QTextCharFormat &format) +{ + fontChanged(format.font()); + colorChanged(format.foreground().color()); +} + +void PopupChatDialog::mergeFormatOnWordOrSelection(const QTextCharFormat &format) +{ + QTextCursor cursor = ui.textBrowser->textCursor(); + if (!cursor.hasSelection()) + cursor.select(QTextCursor::WordUnderCursor); + cursor.mergeCharFormat(format); + ui.textBrowser->mergeCurrentCharFormat(format); +} + +void PopupChatDialog::fontChanged(const QFont &f) +{ + //comboFont->setCurrentIndex(comboFont->findText(QFontInfo(f).family())); + //comboSize->setCurrentIndex(comboSize->findText(QString::number(f.pointSize()))); + ui.textboldButton->setChecked(f.bold()); + ui.textunderlineButton->setChecked(f.italic()); + ui.textitalicButton->setChecked(f.underline()); +} + + + +void PopupChatDialog::colorChanged(const QColor &c) +{ + QPixmap pix(16, 16); + pix.fill(c); + ui.colorButton->setIcon(pix); +} + + +void PopupChatDialog::updateChat() +{ + /* get chat off queue */ + + /* write it out */ + +} + + + +void PopupChatDialog::addChatMsg(ChatInfo *ci) +{ + QTextBrowser *msgWidget = ui.textBrowser; + + QString currenttxt = msgWidget->toHtml(); + + /* determine how many spaces to add */ + int n = msgWidget->width(); + /* now spaces = (width - txt width) / (pixel / space) + */ + + //std::cerr << "Width is : " << n << std::endl; + n -= 256; /* 220 pixels for name */ + if (n > 0) + { + n = 2 + n / 10; + } + else + { + n = 1; + } + + //std::cerr << "Space count : " << n << std::endl; + + std::string spaces(" "); + + + /* add in lines at the bottom */ + std::ostringstream out; + int ts = time(NULL); + + + bool offline = true; + + { + rsiface->lockData(); /* Lock Interface */ + const NeighbourInfo *peer = rsiface->getFriend(dialogId); + if (!peer) + { + std::cerr << "WARNING CANNOT GET PEER INFO!!!!" << std::endl; + } + else if (peer->statusString == "Online") + { + offline = false; + } + + rsiface->unlockData(); /* Unlock Interface */ + } + + if (offline) + { + QString line = "
    \n ----- PEER OFFLINE (Chat will be lost) ----- \n
    "; + + out << line.toStdString(); + } + + + if ((ci->name == lastChatName) && (ts - lastChatTime < 60)) + { + /* no name */ + } + else + { + +#if defined(Q_OS_WIN) + // Nothing. +#else + out << "
    " << std::endl; +#endif + for(int i = 0; i < n; i++) + { + out << spaces; + } + + //out << "[ " << ci->name << " +" << ts - lastChatTime << "s ]" << std::endl; + //out << "
    " << std::endl; + + QString timestamp = "(" + QDateTime::currentDateTime().toString("hh:mm:ss") + ") "; + //QString pre = tr("Peer:" ); + QString name = QString::fromStdString(ci->name); + QString line = "" + timestamp + + " " + name + " \n
    "; + + out << line.toStdString(); + + } + out << ci -> msg; + + /* This might be WIN32 only - or maybe Qt4.2.2 only - but need it for windows at the mom */ +#if defined(Q_OS_WIN) + //out << "
    "; // << std::endl; + out << std::endl; +#else + out << std::endl; +#endif + + lastChatTime = ts; + lastChatName = ci->name; + + QString extra = QString::fromStdString(out.str()); + currenttxt += extra; + + msgWidget->setHtml(currenttxt); + +// std::cerr << " Added Text: " << std::endl; +// std::cerr << out.str() << std::endl; + QScrollBar *qsb = msgWidget->verticalScrollBar(); + qsb -> setValue(qsb->maximum()); +} + + +void PopupChatDialog::sendChat() +{ + QLineEdit *lineWidget = ui.lineEdit; + + ChatInfo ci; + + { + rsiface->lockData(); /* Lock Interface */ + const RsConfig &conf = rsiface->getConfig(); + + ci.rsid = conf.ownId; + ci.name = conf.ownName; + + rsiface->unlockData(); /* Unlock Interface */ + } + + ci.msg = lineWidget->text().toStdString(); + ci.chatflags = RS_CHAT_PRIVATE; + + addChatMsg(&ci); + + /* put proper destination */ + ci.rsid = dialogId; + ci.name = dialogName; + + rsicontrol -> ChatSend(ci); + lineWidget -> setText(QString("")); + + /* redraw send list */ +} + + diff --git a/retroshare-gui/src/gui/chat/PopupChatDialog.h b/retroshare-gui/src/gui/chat/PopupChatDialog.h new file mode 100644 index 000000000..817af79a2 --- /dev/null +++ b/retroshare-gui/src/gui/chat/PopupChatDialog.h @@ -0,0 +1,95 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 _POPUPCHATDIALOG_H +#define _POPUPCHATDIALOG_H + + +#include "ui_PopupChatDialog.h" + +#include "rsiface/rsiface.h" + +#include + +class QAction; +class QTextEdit; +class QTextCharFormat; + +class PopupChatDialog : public QMainWindow +{ + Q_OBJECT + +public: + /** Default constructor */ + PopupChatDialog(std::string id, std::string name, + QWidget *parent = 0, Qt::WFlags flags = 0); + /** Default destructor */ + + void updateChat(); + void addChatMsg(ChatInfo *ci); + +public slots: + /** Overloaded QWidget.show */ + void show(); + +protected: + void closeEvent (QCloseEvent * event); + +private slots: + + void setColor(); + + void textBold(); + void textUnderline(); + void textItalic(); + + void sendChat(); + + void currentCharFormatChanged(const QTextCharFormat &format); + + + +private: + + + void mergeFormatOnWordOrSelection(const QTextCharFormat &format); + void fontChanged(const QFont &f); + + void colorChanged(const QColor &c); + + QAction *actionTextBold; + QAction *actionTextUnderline; + QAction *actionTextItalic; + + std::string dialogId, dialogName; + unsigned int lastChatTime; + std::string lastChatName; + + /** Qt Designer generated object */ + Ui::PopupChatDialog ui; +}; + +#endif + + + + diff --git a/retroshare-gui/src/gui/chat/PopupChatDialog.ui b/retroshare-gui/src/gui/chat/PopupChatDialog.ui new file mode 100644 index 000000000..d080c7ae6 --- /dev/null +++ b/retroshare-gui/src/gui/chat/PopupChatDialog.ui @@ -0,0 +1,682 @@ + + PopupChatDialog + + + + 0 + 0 + 398 + 256 + + + + + 165 + 165 + + + + + + + + + 16 + 16 + 16 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 160 + 160 + 160 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + + + 16 + 16 + 16 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 160 + 160 + 160 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + + + 104 + 104 + 104 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 160 + 160 + 160 + + + + + + + 104 + 104 + 104 + + + + + + + 255 + 255 + 255 + + + + + + + 104 + 104 + 104 + + + + + + + 240 + 240 + 240 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + + + Arial + 8 + 50 + false + false + false + false + + + + Qt::NoContextMenu + + + RetroShare User Chat + + + :/images/chat.png + + + + + 1 + + + 1 + + + + + Qt::Vertical + + + + + 0 + + + 6 + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + + 321 + 20 + + + + + + + + + 24 + 24 + + + + + 24 + 24 + + + + + + + :/images/edit-underline.png + + + true + + + + + + + + 24 + 24 + + + + + 24 + 24 + + + + + + + :/images/edit-italic.png + + + true + + + + + + + + 24 + 24 + + + + + 24 + 24 + + + + + + + :/images/edit-bold.png + + + true + + + + + + + + 24 + 24 + + + + + 24 + 24 + + + + + + + + + + + + + + + + + + + + lineEdit + textboldButton + textunderlineButton + textitalicButton + colorButton + textBrowser + + + + + + diff --git a/retroshare-gui/src/gui/chat/UserFrame.ui b/retroshare-gui/src/gui/chat/UserFrame.ui new file mode 100644 index 000000000..19b31b9d4 --- /dev/null +++ b/retroshare-gui/src/gui/chat/UserFrame.ui @@ -0,0 +1,61 @@ + + + + + UserFrame + + + + 0 + 0 + 120 + 116 + + + + + 60 + 60 + + + + Form + + + + 0 + + + 0 + + + + + QFrame::NoFrame + + + QFrame::Raised + + + + 0 + + + 0 + + + + + + + + + + + + + + + + + diff --git a/retroshare-gui/src/gui/chat/backup/ChatDialog.cpp b/retroshare-gui/src/gui/chat/backup/ChatDialog.cpp new file mode 100644 index 000000000..90bb43ca5 --- /dev/null +++ b/retroshare-gui/src/gui/chat/backup/ChatDialog.cpp @@ -0,0 +1,419 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 + +#include "rshare.h" +#include "ChatDialog.h" + +#include "rsiface/rsiface.h" +#include "chat/PopupChatDialog.h" +#include "chat/ChatWindow.h" +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +/** Constructor */ +ChatDialog::ChatDialog(QWidget *parent) +: MainPage(parent) +{ + /* Invoke the Qt Designer generated object setup routine */ + ui.setupUi(this); + + connect(ui.lineEdit, SIGNAL(returnPressed( ) ), this, SLOT(sendMsg( ) )); + + connect(ui.colorChatButton, SIGNAL(clicked()), this, SLOT(setColor())); + + connect(ui.textboldChatButton, SIGNAL(clicked()), this, SLOT(textBold())); + + connect(ui.textunderlineChatButton, SIGNAL(clicked()), this, SLOT(textUnderline())); + + connect(ui.textitalicChatButton, SIGNAL(clicked()), this, SLOT(textItalic())); + + connect( ui.msgSendList, SIGNAL( customContextMenuRequested( QPoint ) ), this, SLOT( msgSendListCostumPopupMenu( QPoint ) ) ); + +// connect(ui.msgSendList, SIGNAL(itemChanged( QTreeWidgetItem *, int ) ), +// this, SLOT(toggleSendItem( QTreeWidgetItem *, int ) )); + + loadInitMsg(); + + /* Hide platform specific features */ +#ifdef Q_WS_WIN + +#endif +} + +void ChatDialog::msgSendListCostumPopupMenu( QPoint point ) +{ + + QMenu contextMnu( this ); + QMouseEvent *mevent = new QMouseEvent( QEvent::MouseButtonPress, point, Qt::RightButton, Qt::RightButton, Qt::NoModifier ); + + privchatAct = new QAction(QIcon(), tr( "Chat" ), this ); + connect( privchatAct , SIGNAL( triggered() ), this, SLOT( privchat() ) ); + + contextMnu.clear(); + contextMnu.addAction( privchatAct); + contextMnu.exec( mevent->globalPos() ); +} +int ChatDialog::loadInitMsg() +{ + std::ostringstream out; + + //out << std::endl; + //out << std::endl; + //out << std::endl; + out << "Welcome to Retroshare's group chat."; + out << std::endl; + out << std::endl; + + QString txt = QString::fromStdString(out.str()); + ui.msgText->setPlainText(txt); + ui.msgText->setTextColor(Qt::gray); + + + return 1; +} + + + +void ChatDialog::insertChat() +{ + rsiface->lockData(); /* Lock Interface */ + + /* get a link to the table */ + QTextEdit *msgWidget = ui.msgText; + std::list newchat = rsiface->getChatNew(); + std::list::iterator it; + + rsiface->unlockData(); /* Unlock Interface */ + +static std::string lastChatName(""); +static int lastChatTime = 0; + + QString currenttxt = msgWidget->toPlainText(); + + /* determine how many spaces to add */ + int n = msgWidget->width(); + /* now spaces = (width - txt width) / (pixel / space) + */ + + std::cerr << "Width is : " << n << std::endl; + n -= 256; /* 220 pixels for name */ + if (n > 0) + { + n = 2 + n / 10; + } + else + { + n = 1; + } + + std::cerr << "Space count : " << n << std::endl; + + std::string spaces(" "); + + + /* add in lines at the bottom */ + std::ostringstream out; + int ts = time(NULL); + for(it = newchat.begin(); it != newchat.end(); it++) + { + /* are they private? */ + if (it->chatflags & RS_CHAT_PRIVATE) + { + ChatWindow *pcd = getPrivateChat(it->rsid, it->name, true); + pcd->addChatMsg(&(*it)); + } + + + if ((it->name == lastChatName) && (ts - lastChatTime < 60)) + { + /* no name */ + } + else + { + for(int i = 0; i < n; i++) + { + out << spaces; + } + + out << "<" << it -> name << " Said @" << ts << ">" << std::endl; + } + + if (it->chatflags & RS_CHAT_PRIVATE) + out << "[P] "; + out << it -> msg << std::endl; + + /* + */ + lastChatName = it -> name; + lastChatTime = ts; + } + + QString extra = QString::fromStdString(out.str()); + currenttxt += extra; + + msgWidget->setPlainText(currenttxt); + + std::cerr << " Added Text: " << std::endl; + std::cerr << out.str() << std::endl; + QScrollBar *qsb = msgWidget->verticalScrollBar(); + qsb -> setValue(qsb->maximum()); + +} + + + + +void ChatDialog::sendMsg() +{ + QLineEdit *lineWidget = ui.lineEdit; + + ChatInfo ci; + ci.msg = lineWidget->text().toStdString(); + ci.chatflags = RS_CHAT_PUBLIC; + + rsicontrol -> ChatSend(ci); + lineWidget -> setText(QString("")); + + /* redraw send list */ + insertSendList(); + + +} + +void ChatDialog::insertSendList() +{ + rsiface->lockData(); /* Lock Interface */ + + std::map::const_iterator it; + const std::map &friends = + rsiface->getFriendMap(); + + /* get a link to the table */ + QTreeWidget *sendWidget = ui.msgSendList; + + /* remove old items ??? */ + sendWidget->clear(); + sendWidget->setColumnCount(6); + + QList items; + for(it = friends.begin(); it != friends.end(); it++) + { + /* if offline, don't add */ + if ((it -> second.connectString == "Online" ) || + (it -> second.connectString == "Yourself")) + { + /* ok */ + } + else + { + continue; + } + + /* make a widget per friend */ + QTreeWidgetItem *item = new QTreeWidgetItem((QTreeWidget*)0); + + + /* add all the labels */ + /* (0) Person */ + item -> setText(0, QString::fromStdString(it->second.name)); + /* () Org */ + item -> setText(1, QString::fromStdString(it->second.org)); + /* () Location */ + item -> setText(2, QString::fromStdString(it->second.loc)); + /* () Country */ + item -> setText(3, QString::fromStdString(it->second.country)); + { + std::ostringstream out; + out << it->second.id; + item -> setText(4, QString::fromStdString(out.str())); + } + + item -> setText(5, "Friend"); + + //item -> setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled); + item -> setFlags(Qt::ItemIsUserCheckable); + + item -> setCheckState(0, Qt::Checked); + /**** NOT SELECTABLE AT THE MOMENT + if (it ->second.inChat) + { + item -> setCheckState(0, Qt::Checked); + } + else + { + item -> setCheckState(0, Qt::Unchecked); + } + ************/ + + + /* add to the list */ + items.append(item); + } + + /* add the items in! */ + sendWidget->insertTopLevelItems(0, items); + + rsiface->unlockData(); /* UnLock Interface */ + + sendWidget->update(); /* update display */ +} + + +/* to toggle the state */ + + +void ChatDialog::toggleSendItem( QTreeWidgetItem *item, int col ) +{ + std::cerr << "ToggleSendItem()" << std::endl; + + /* extract id */ + std::string id = (item -> text(4)).toStdString(); + + /* get state */ + bool inChat = (Qt::Checked == item -> checkState(0)); /* alway column 0 */ + + /* call control fns */ + + rsicontrol -> SetInChat(id, inChat); + return; +} + +void ChatDialog::setColor() +{ + QColor col = QColorDialog::getColor(Qt::green, this); + if (col.isValid()) { + + ui.colorChatButton->setPalette(QPalette(col)); + QTextCharFormat fmt; + fmt.setForeground(col); + mergeFormatOnWordOrSelection(fmt); + colorChanged(col); + } +} + +void ChatDialog::textBold() +{ + QTextCharFormat fmt; + fmt.setFontWeight(ui.textboldChatButton->isChecked() ? QFont::Bold : QFont::Normal); + mergeFormatOnWordOrSelection(fmt); +} + +void ChatDialog::textUnderline() +{ + QTextCharFormat fmt; + fmt.setFontUnderline(ui.textunderlineChatButton->isChecked()); + mergeFormatOnWordOrSelection(fmt); +} + +void ChatDialog::textItalic() +{ + QTextCharFormat fmt; + fmt.setFontItalic(ui.textitalicChatButton->isChecked()); + mergeFormatOnWordOrSelection(fmt); +} + +void ChatDialog::currentCharFormatChanged(const QTextCharFormat &format) +{ + fontChanged(format.font()); + colorChanged(format.foreground().color()); +} + +void ChatDialog::mergeFormatOnWordOrSelection(const QTextCharFormat &format) +{ + QTextCursor cursor = ui.msgText->textCursor(); + if (!cursor.hasSelection()) + cursor.select(QTextCursor::WordUnderCursor); + cursor.mergeCharFormat(format); + ui.msgText->mergeCurrentCharFormat(format); +} + +void ChatDialog::fontChanged(const QFont &f) +{ + //comboFont->setCurrentIndex(comboFont->findText(QFontInfo(f).family())); + //comboSize->setCurrentIndex(comboSize->findText(QString::number(f.pointSize()))); + ui.textboldChatButton->setChecked(f.bold()); + ui.textunderlineChatButton->setChecked(f.italic()); + ui.textitalicChatButton->setChecked(f.underline()); +} + + + +void ChatDialog::colorChanged(const QColor &c) +{ + QPixmap pix(16, 16); + pix.fill(c); + ui.colorChatButton->setIcon(pix); +} + + +void ChatDialog::privchat() +{ + +} + + + +ChatWindow *ChatDialog::getPrivateChat(std::string id, std::string name, bool show ) +{ + /* see if it exists already */ + ChatWindow *popupchatdialog = NULL; + + std::map::iterator it; + if (chatDialogs.end() != (it = chatDialogs.find(id))) + { + /* exists already */ + popupchatdialog = it->second; + } + else + { + popupchatdialog = new ChatWindow(id, name); + chatDialogs[id] = popupchatdialog; + } + + if (show) + { + popupchatdialog->show(); + } + + return popupchatdialog; + +} + +void ChatDialog::clearOldChats() +{ + /* nothing yet */ + +} + + diff --git a/retroshare-gui/src/gui/chat/backup/ChatDialog.h b/retroshare-gui/src/gui/chat/backup/ChatDialog.h new file mode 100644 index 000000000..b3996b26c --- /dev/null +++ b/retroshare-gui/src/gui/chat/backup/ChatDialog.h @@ -0,0 +1,97 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 _CHATDIALOG_H +#define _CHATDIALOG_H + +#include "mainpage.h" +#include "ui_ChatDialog.h" + +#include "chat/ChatWindow.h" + +class QAction; +class QTextEdit; +class QTextCharFormat; + +class ChatDialog : public MainPage +{ + Q_OBJECT + +public: + /** Default Constructor */ + ChatDialog(QWidget *parent = 0); + /** Default Destructor */ + +void insertChat(); +ChatWindow *getPrivateChat(std::string id, std::string name, bool show); +void clearOldChats(); + +int loadInitMsg(); + +private slots: + +void toggleSendItem( QTreeWidgetItem *item, int col ); + + /** Create the context popup menu and it's submenus */ + void msgSendListCostumPopupMenu( QPoint point ); + + void setColor(); + + void textBold(); + void textUnderline(); + void textItalic(); + + void currentCharFormatChanged(const QTextCharFormat &format); + + void insertSendList(); + void sendMsg(); + + void privchat(); + +private: + + void mergeFormatOnWordOrSelection(const QTextCharFormat &format); + void fontChanged(const QFont &f); + + void colorChanged(const QColor &c); + + QAction *actionTextBold; + QAction *actionTextUnderline; + QAction *actionTextItalic; + + /** Define the popup menus for the Context menu */ + QMenu* contextMnu; + /** Defines the actions for the context menu */ + QAction* privchatAct; + + QTreeView *msgSendList; + + + std::map chatDialogs; + + + + /** Qt Designer generated object */ + Ui::ChatDialog ui; +}; + +#endif + diff --git a/retroshare-gui/src/gui/chat/backup/ChatWindow2.cpp b/retroshare-gui/src/gui/chat/backup/ChatWindow2.cpp new file mode 100644 index 000000000..84c501bf4 --- /dev/null +++ b/retroshare-gui/src/gui/chat/backup/ChatWindow2.cpp @@ -0,0 +1,340 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 + +#include "rshare.h" +#include "ChatWindow.h" +#include "config/gconfig.h" +#include "ChatAvatarFrame.h" + +#include +#include +#include +#include +#include + + +/* Define the format used for displaying the date and time */ +#define DATETIME_FMT "MMM dd hh:mm:ss" + +#include + + +/** Default constructor */ +ChatWindow::ChatWindow(std::string id, std::string name, + QWidget *parent, Qt::WFlags flags) + : QMainWindow(parent, flags), dialogId(id), dialogName(name), + lastChatTime(0), lastChatName("") +{ + /* Invoke Qt Designer generated QObject setup routine */ + ui.setupUi(this); + + GConfig config; + config.loadWidgetInformation(this); + + _isAvatarFrameOpened = true; + + //creates sub widgets + _avatarFrame = new QtChatAvatarFrame(this); + //// + + + connect(ui.lineEdit, SIGNAL(returnPressed( ) ), this, SLOT(sendChat( ) )); + + connect(ui.colorButton, SIGNAL(clicked()), this, SLOT(setColor())); + + connect(ui.textboldButton, SIGNAL(clicked()), this, SLOT(textBold())); + + connect(ui.textunderlineButton, SIGNAL(clicked()), this, SLOT(textUnderline())); + + connect(ui.textitalicButton, SIGNAL(clicked()), this, SLOT(textItalic())); + + connect(ui.avatarFrameButton, SIGNAL(clicked()), SLOT(avatarFrameButtonClicked())); + + + addAvatarFrame(); + + // Create the status bar + std::ostringstream statusstr; + statusstr << "Chatting with: " << dialogName << " !!! " << id; + statusBar()->showMessage(QString::fromStdString(statusstr.str())); + ui.textBrowser->setOpenExternalLinks ( false ); + +} + + + +/** + Overloads the default show() slot so we can set opacity*/ + +void +ChatWindow::show() +{ + //loadSettings(); + if(!this->isVisible()) { + QMainWindow::show(); + + } +} + +void ChatWindow::closeEvent (QCloseEvent * event) +{ + + + QMainWindow::closeEvent(event); +} + +void ChatWindow::setColor() +{ + QColor col = QColorDialog::getColor(Qt::green, this); + if (col.isValid()) { + + ui.colorButton->setPalette(QPalette(col)); + QTextCharFormat fmt; + fmt.setForeground(col); + mergeFormatOnWordOrSelection(fmt); + colorChanged(col); + } +} + +void ChatWindow::textBold() +{ + QTextCharFormat fmt; + fmt.setFontWeight(ui.textboldButton->isChecked() ? QFont::Bold : QFont::Normal); + mergeFormatOnWordOrSelection(fmt); +} + +void ChatWindow::textUnderline() +{ + QTextCharFormat fmt; + fmt.setFontUnderline(ui.textunderlineButton->isChecked()); + mergeFormatOnWordOrSelection(fmt); +} + +void ChatWindow::textItalic() +{ + QTextCharFormat fmt; + fmt.setFontItalic(ui.textitalicButton->isChecked()); + mergeFormatOnWordOrSelection(fmt); +} + +void ChatWindow::currentCharFormatChanged(const QTextCharFormat &format) +{ + fontChanged(format.font()); + colorChanged(format.foreground().color()); +} + +void ChatWindow::mergeFormatOnWordOrSelection(const QTextCharFormat &format) +{ + QTextCursor cursor = ui.textBrowser->textCursor(); + if (!cursor.hasSelection()) + cursor.select(QTextCursor::WordUnderCursor); + cursor.mergeCharFormat(format); + ui.textBrowser->mergeCurrentCharFormat(format); +} + +void ChatWindow::fontChanged(const QFont &f) +{ + //comboFont->setCurrentIndex(comboFont->findText(QFontInfo(f).family())); + //comboSize->setCurrentIndex(comboSize->findText(QString::number(f.pointSize()))); + ui.textboldButton->setChecked(f.bold()); + ui.textunderlineButton->setChecked(f.italic()); + ui.textitalicButton->setChecked(f.underline()); +} + + + +void ChatWindow::colorChanged(const QColor &c) +{ + QPixmap pix(16, 16); + pix.fill(c); + ui.colorButton->setIcon(pix); +} + + +void ChatWindow::updateChat() +{ + /* get chat off queue */ + + /* write it out */ + +} + + + +void ChatWindow::addChatMsg(ChatInfo *ci) +{ + QTextBrowser *msgWidget = ui.textBrowser; + + QString currenttxt = msgWidget->toHtml(); + + /* determine how many spaces to add */ + int n = msgWidget->width(); + /* now spaces = (width - txt width) / (pixel / space) + */ + + std::cerr << "Width is : " << n << std::endl; + n -= 256; /* 220 pixels for name */ + if (n > 0) + { + n = 2 + n / 10; + } + else + { + n = 1; + } + + std::cerr << "Space count : " << n << std::endl; + + std::string spaces(" "); + + + /* add in lines at the bottom */ + std::ostringstream out; + int ts = time(NULL); + if ((ci->name == lastChatName) && (ts - lastChatTime < 60)) + { + /* no name */ + } + else + { + for(int i = 0; i < n; i++) + { + out << spaces; + } + + out << "[" << ci->name << " Said @" << ts << "]" << std::endl; + out << "
    " << std::endl; + + } + out << ci -> msg << std::endl; + lastChatTime = ts; + lastChatName = ci->name; + + QString extra = QString::fromStdString(out.str()); + currenttxt += extra; + + msgWidget->setHtml(currenttxt); + + std::cerr << " Added Text: " << std::endl; + std::cerr << out.str() << std::endl; + QScrollBar *qsb = msgWidget->verticalScrollBar(); + qsb -> setValue(qsb->maximum()); +} + + +void ChatWindow::sendChat() +{ + QTextEdit *lineWidget = ui.lineEdit; + + ChatInfo ci; + + { + rsiface->lockData(); /* Lock Interface */ + const RsConfig &conf = rsiface->getConfig(); + + ci.rsid = conf.ownId; + ci.name = conf.ownName; + + rsiface->unlockData(); /* Unlock Interface */ + } + + ci.msg = lineWidget->documentTitle().toStdString(); + ci.chatflags = RS_CHAT_PRIVATE; + + addChatMsg(&ci); + + /* put proper destination */ + ci.rsid = dialogId; + ci.name = dialogName; + + rsicontrol -> ChatSend(ci); + lineWidget -> setText(QString("")); + + /* redraw send list */ +} + + +void ChatWindow::avatarFrameButtonClicked() { + if (_isAvatarFrameOpened) { + removeAvatarFrame(); + } else { + addAvatarFrame(); + } +} + + +void ChatWindow::addAvatarFrame() { + QBoxLayout * glayout = dynamic_cast(layout()); + _avatarFrame->setVisible(true); + //_avatarFrame->setMinimumSize(64, 0); + glayout->insertWidget(1, _avatarFrame); + + _isAvatarFrameOpened = true; + ui.avatarFrameButton->setIcon(QIcon(":images/show_toolbox_frame.png")); + update(); +} + +void ChatWindow::removeAvatarFrame() { + QBoxLayout * glayout = dynamic_cast(layout()); + _avatarFrame->setVisible(false); + _avatarFrame->setMinimumSize(0, 0); + glayout->removeWidget(_avatarFrame); + + _isAvatarFrameOpened = false; + ui.avatarFrameButton->setIcon(QIcon(":images/hide_toolbox_frame.png")); + update(); +} + + +void ChatWindow::updateUserAvatar() { + + QPixmap pixmap; + //std::string myData = _cChatHandler.getCUserProfile().getUserProfile().getIcon().getData(); + //pixmap.loadFromData((uchar *)myData.c_str(), myData.size()); + _avatarFrame->setUserPixmap(pixmap); +} + +//void ChatWindow::updateAvatarFrame() { +// QMutexLocker locker(&_mutex); + + //QtContactList * qtContactList = _qtrs->getQtContactList(); + //CContactList & cContactList = qtrsContactList->getCContactList(); + + //IMContactSet imContactSet = _imChatSession->getIMContactSet(); + //IMContactSet::iterator it; + //for (it = imContactSet.begin(); it != imContactSet.end(); it++) { + + //std::string contactId = cContactList.findContactThatOwns(*it); + //ContactProfile profile = cContactList.getContactProfile(contactId); + + //std::string data = profile.getIcon().getData(); + //QPixmap pixmap; + //pixmap.loadFromData((uchar *)data.c_str(), data.size()); + //_avatarFrame->addRemoteContact( + //QString::fromStdString(contactId), + //QString::fromStdString(profile.getDisplayName()), + //QString::fromStdString((*it).getContactId()), + //pixmap + //); + //} +//} diff --git a/retroshare-gui/src/gui/chat/backup/ChatWindow2.h b/retroshare-gui/src/gui/chat/backup/ChatWindow2.h new file mode 100644 index 000000000..541b6c94c --- /dev/null +++ b/retroshare-gui/src/gui/chat/backup/ChatWindow2.h @@ -0,0 +1,106 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 _CHATWINDOW_H +#define _CHATWINDOW_H + + +#include "ui_ChatWindow.h" + +#include "rsiface/rsiface.h" + +#include + +class ChatAvatarFrame; +class QAction; +class QTextEdit; +class QTextCharFormat; + +class ChatWindow : public QMainWindow +{ + Q_OBJECT + +public: + /** Default constructor */ + ChatWindow(std::string id, std::string name, + QWidget *parent = 0, Qt::WFlags flags = 0); + /** Default destructor */ + + void updateChat(); + void addChatMsg(ChatInfo *ci); + +public slots: + /** Overloaded QWidget.show */ + void show(); + +protected: + void closeEvent (QCloseEvent * event); + +private slots: + + void setColor(); + + void textBold(); + void textUnderline(); + void textItalic(); + + void sendChat(); + + void currentCharFormatChanged(const QTextCharFormat &format); + + void avatarFrameButtonClicked(); + +private: + + + + void mergeFormatOnWordOrSelection(const QTextCharFormat &format); + void fontChanged(const QFont &f); + + void colorChanged(const QColor &c); + + void addAvatarFrame(); + void removeAvatarFrame(); + //void updateAvatarFrame(); + void updateUserAvatar(); + + bool _isAvatarFrameOpened; + + ChatAvatarFrame * _avatarFrame; + + QAction *actionTextBold; + QAction *actionTextUnderline; + QAction *actionTextItalic; + + std::string dialogId, dialogName; + unsigned int lastChatTime; + std::string lastChatName; + + /** Qt Designer generated object */ + Ui::ChatWindow ui; +}; + +#endif + + + + diff --git a/retroshare-gui/src/gui/common/rwindow.cpp b/retroshare-gui/src/gui/common/rwindow.cpp new file mode 100644 index 000000000..f5e3f738b --- /dev/null +++ b/retroshare-gui/src/gui/common/rwindow.cpp @@ -0,0 +1,145 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 +#include +#include +#include +#include +#include +#include +#include "rwindow.h" + + +/** Default constructor. */ +RWindow::RWindow(QString name, QWidget *parent, Qt::WFlags flags) + : QMainWindow(parent, flags) +{ + _name = name; + _settings = new RshareSettings(); + _previouslyShown = false; +} + +/** Destructor. */ +RWindow::~RWindow() +{ + saveWindowState(); + delete _settings; +} + +/** Associates a shortcut key sequence with a slot. */ +void +RWindow::setShortcut(QString shortcut, const char *slot) +{ + QShortcut *s = new QShortcut(QKeySequence(shortcut), this, slot, 0); + Q_UNUSED(s); +} + +/** Saves the size and location of the window. */ +void +RWindow::saveWindowState() +{ +#if QT_VERSION >= 0x040200 + saveSetting("Geometry", saveGeometry()); +#else + saveSetting("Size", size()); + saveSetting("Position", pos()); +#endif +} + +/** Restores the last size and location of the window. */ +void +RWindow::restoreWindowState() +{ +#if QT_VERSION >= 0x040200 + QByteArray geometry = getSetting("Geometry", QByteArray()).toByteArray(); + restoreGeometry(geometry); +#else + QRect screen = QDesktopWidget().availableGeometry(); + + /* Restore the window size. */ + QSize size = getSetting("Size", QSize()).toSize(); + if (!size.isEmpty()) { + size = size.boundedTo(screen.size()); + resize(size); + } + + /* Restore the window position. */ + QPoint pos = getSetting("Position", QPoint()).toPoint(); + if (!pos.isNull() && screen.contains(pos)) { + move(pos); + } +#endif +} + +/** Gets the saved value of a property associated with this window object. + * If no value was saved, the default value is returned. */ +QVariant +RWindow::getSetting(QString setting, QVariant defaultValue) +{ + QString key = _name + "/" + setting; + return _settings->value(key, defaultValue); +} + +/** Saves a value associated with a property name for this window object. */ +void +RWindow::saveSetting(QString prop, QVariant value) +{ + QString key = _name + "/" + prop; + _settings->setValue(key, value); +} + +/** Overloaded QWidget::setVisible(). If this window is already visible and + * visible is true, this window will be brought to the top and given + * focus. If visible is false, then the window state will be saved and + * this window will be hidden. */ +void +RWindow::setVisible(bool visible) +{ + if (visible) { + /* If this is the first time this window is shown, restore its window + * position and size. */ + if (!_previouslyShown) { +#if !defined (Q_WS_WIN) + /* Use the standard palette on non-Windows, overriding whatever was + * specified in the .ui file for this dialog. */ + setPalette(QPalette()); +#endif + + restoreWindowState(); + _previouslyShown = true; + } + + /* Bring the window to the top, if it's already open. Otherwise, make the + * window visible. */ + if (isVisible()) { + activateWindow(); + setWindowState(windowState() & ~Qt::WindowMinimized | Qt::WindowActive); + raise(); + } + } else { + /* Save the last size and position of this window. */ + saveWindowState(); + } + QMainWindow::setVisible(visible); +} + diff --git a/retroshare-gui/src/gui/common/rwindow.h b/retroshare-gui/src/gui/common/rwindow.h new file mode 100644 index 000000000..789a5ebb3 --- /dev/null +++ b/retroshare-gui/src/gui/common/rwindow.h @@ -0,0 +1,70 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2007, crypton + * + * 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 _RETROSHAREWINDOW_H +#define _RETROSHAREWINDOW_H + +#include +#include +#include +#include +#include + + +class RWindow : public QMainWindow +{ + Q_OBJECT + +public: + /** Default constructor. */ + RWindow(QString name, QWidget *parent = 0, Qt::WFlags flags = 0); + /** Destructor. */ + ~RWindow(); + + /** Associates a shortcut key sequence with a slot. */ + void setShortcut(QString shortcut, const char *slot); + /** Saves the size and location of the window. */ + void saveWindowState(); + /** Restores the last size and location of the window. */ + void restoreWindowState(); + + /** Gets the saved value of a property associated with this window object. + * If no value was saved, the default value is returned. */ + QVariant getSetting(QString name, QVariant defaultValue); + /** Saves a value associated with a setting name for this window object. */ + void saveSetting(QString name, QVariant value); + +public slots: + /** Shows or hides this window. */ + virtual void setVisible(bool visible); + /** Show this window. This method really just exists for subclasses to + * override, since QMainWindow::show() is non-virtual. */ + virtual void showWindow() { QMainWindow::show(); } + +private: + QString _name; /**< Name associated with this window. */ + RshareSettings* _settings; /**< Object used to store window properties */ + bool _previouslyShown; /**< True if show() has been called for this window. */ +}; + +#endif + diff --git a/retroshare-gui/src/gui/common/vmessagebox.cpp b/retroshare-gui/src/gui/common/vmessagebox.cpp new file mode 100644 index 000000000..7158425c9 --- /dev/null +++ b/retroshare-gui/src/gui/common/vmessagebox.cpp @@ -0,0 +1,166 @@ +/**************************************************************** + * Vidalia is distributed under the following license: + * + * Copyright (C) 2006, Matt Edman, Justin Hipple + * + * 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. + ****************************************************************/ + +/** + * \file vmessagebox.cpp + * \version $Id: vmessagebox.cpp 990 2006-06-08 03:31:27Z edmanm $ + */ + +#include "vmessagebox.h" + + +/** Default constructor. */ +VMessageBox::VMessageBox(QWidget *parent) +: QMessageBox(parent) +{ +} + +/** Returns the button (0, 1, or 2) that is OR-ed with QMessageBox::Default, + * or 0 if none are. */ +int +VMessageBox::defaultButton(int button0, int button1, int button2) +{ + Q_UNUSED(button0); + int defaultButton = 0; + if (button1 & QMessageBox::Default) { + defaultButton = 1; + } else if (button2 & QMessageBox::Default) { + defaultButton = 2; + } + return defaultButton; +} + +/** Returns the button (0, 1, or 2) that is OR-ed with QMessageBox::Escape, + * or -1 if none are. */ +int +VMessageBox::escapeButton(int button0, int button1, int button2) +{ + int escapeButton = -1; + if (button0 & QMessageBox::Escape) { + escapeButton = 0; + } else if (button1 & QMessageBox::Escape) { + escapeButton = 1; + } else if (button2 & QMessageBox::Escape) { + escapeButton = 2; + } + return escapeButton; +} + +/** Returns the Button enum value from the given return value. */ +int +VMessageBox::selected(int ret, int button0, int button1, int button2) +{ + if (ret == 0) { + return button0; + } else if (ret == 1) { + return button1; + } + return button2; +} + +/** Converts a Button enum value to a translated string. */ +QString +VMessageBox::buttonText(int btn) +{ + QString text; + int button = (btn & ~QMessageBox::FlagMask); + switch (button) { + case Ok: text = tr("OK"); break; + case Cancel: text = tr("Cancel"); break; + case Yes: text = tr("Yes"); break; + case No: text = tr("No"); break; + case Help: text = tr("Help"); break; + case Retry: text = tr("Retry"); break; + case ShowLog: text = tr("Show Log"); break; + case ShowSettings: text = tr("Show Settings"); break; + default: break; + } + return text; +} + +/** Displays a critical message box with the given caption, message text, and + * visible buttons. To specify a button as a default button or an escape + * button, OR the Button enum value with QMessageBox::Default or + * QMessageBox::Escape, respectively. */ +int +VMessageBox::critical(QWidget *parent, QString caption, QString text, + int button0, int button1, int button2) +{ + int ret = QMessageBox::critical(parent, caption, text, + VMessageBox::buttonText(button0), + VMessageBox::buttonText(button1), + VMessageBox::buttonText(button2), + VMessageBox::defaultButton(button0, button1, button2), + VMessageBox::escapeButton(button0, button1, button2)); + return VMessageBox::selected(ret, button0, button1, button2); +} + +/** Displays an question message box with the given caption, message text, and + * visible buttons. To specify a button as a default button or an escape + * button, OR the Button enum value with QMessageBox::Default or + * QMessageBox::Escape, respectively. */ +int +VMessageBox::question(QWidget *parent, QString caption, QString text, + int button0, int button1, int button2) +{ + int ret = QMessageBox::question(parent, caption, text, + VMessageBox::buttonText(button0), + VMessageBox::buttonText(button1), + VMessageBox::buttonText(button2), + VMessageBox::defaultButton(button0, button1, button2), + VMessageBox::escapeButton(button0, button1, button2)); + return VMessageBox::selected(ret, button0, button1, button2); +} + +/** Displays an information message box with the given caption, message text, and + * visible buttons. To specify a button as a default button or an escape + * button, OR the Button enum value with QMessageBox::Default or + * QMessageBox::Escape, respectively. */ +int +VMessageBox::information(QWidget *parent, QString caption, QString text, + int button0, int button1, int button2) +{ + int ret = QMessageBox::information(parent, caption, text, + VMessageBox::buttonText(button0), + VMessageBox::buttonText(button1), + VMessageBox::buttonText(button2), + VMessageBox::defaultButton(button0, button1, button2), + VMessageBox::escapeButton(button0, button1, button2)); + return VMessageBox::selected(ret, button0, button1, button2); +} + +/** Displays a warning message box with the given caption, message text, and + * visible buttons. To specify a button as a default button or an escape + * button, OR the Button enum value with QMessageBox::Default or + * QMessageBox::Escape, respectively. */ +int +VMessageBox::warning(QWidget *parent, QString caption, QString text, + int button0, int button1, int button2) +{ + int ret = QMessageBox::warning(parent, caption, text, + VMessageBox::buttonText(button0), + VMessageBox::buttonText(button1), + VMessageBox::buttonText(button2), + VMessageBox::defaultButton(button0, button1, button2), + VMessageBox::escapeButton(button0, button1, button2)); + return VMessageBox::selected(ret, button0, button1, button2); +} + diff --git a/retroshare-gui/src/gui/common/vmessagebox.h b/retroshare-gui/src/gui/common/vmessagebox.h new file mode 100644 index 000000000..9f9afa7fe --- /dev/null +++ b/retroshare-gui/src/gui/common/vmessagebox.h @@ -0,0 +1,101 @@ +/**************************************************************** + * Vidalia is distributed under the following license: + * + * Copyright (C) 2006, Matt Edman, Justin Hipple + * + * 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. + ****************************************************************/ + +/** + * \file vmessagebox.h + * \version $Id: vmessagebox.h 990 2006-06-08 03:31:27Z edmanm $ + */ + +#ifndef _VMESSAGEBOX_H +#define _VMESSAGEBOX_H + +#include +#include + + +class VMessageBox : public QMessageBox +{ + Q_OBJECT + +public: + enum Button { + NoButton = 0, + Ok, + Cancel, + Yes, + No, + Help, + Retry, + ShowLog, + ShowSettings + }; + + /** Default constructor. */ + VMessageBox(QWidget *parent = 0); + + /** Displays an critical message box with the given caption, message text, + * and visible buttons. To specify a button as a default button or an escape + * button, OR the Button enum value with QMessageBox::Default or + * QMessageBox::Escape, respectively. */ + static int critical(QWidget *parent, QString caption, QString text, + int button0, int button1 = NoButton, + int button2 = NoButton); + + /** Displays an information message box with the given caption, message text, + * and visible buttons. To specify a button as a default button or an escape + * button, OR the Button enum value with QMessageBox::Default or + * QMessageBox::Escape, respectively. */ + static int information(QWidget *parent, QString caption, QString text, + int button0, int button1 = NoButton, + int button2 = NoButton); + + /** Displays a warning message box with the given caption, message text, and + * visible buttons. To specify as a default button or an escape + * button, OR the Button enum value with QMessageBox::Default or + * QMessageBox::Escape, respectively. */ + static int warning(QWidget *parent, QString caption, QString text, + int button0, int button1 = NoButton, + int button2 = NoButton); + + /** Displays a warning message box with the given caption, message text, and + * visible buttons. To specify as a default button or an escape + * button, OR the Button enum value with QMessageBox::Default or + * QMessageBox::Escape, respectively. */ + static int question(QWidget *parent, QString caption, QString text, + int button0, int button1 = NoButton, + int button2 = NoButton); + + /** Converts a Button enum value to a translated string. */ + static QString buttonText(int button); + +private: + /** Returns the button (0, 1, or 2) that is OR-ed with QMessageBox::Default, + * or 0 if none are. */ + static int defaultButton(int button0, int button1, int button2); + /** Returns the button (0, 1, or 2) that is OR-ed with QMessageBox::Escape, + * or -1 if none are. */ + static int escapeButton(int button0, int button1, int button2); + /** Returns the Button enum value from the given return value. */ + static int selected(int ret, int button0, int button1, int button2); +}; + +#endif + diff --git a/retroshare-gui/src/gui/connect/AddFriendDialog.cpp b/retroshare-gui/src/gui/connect/AddFriendDialog.cpp new file mode 100644 index 000000000..bf514e012 --- /dev/null +++ b/retroshare-gui/src/gui/connect/AddFriendDialog.cpp @@ -0,0 +1,111 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, 2007 crypton + * + * 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 "AddFriendDialog.h" + +#include "rsiface/rsiface.h" +#include "gui/NetworkDialog.h" +#include + +#include + +/** Default constructor */ +AddFriendDialog::AddFriendDialog(NetworkDialog *cd, QWidget *parent, Qt::WFlags flags) + : QDialog(parent, flags), cDialog(cd) +{ + /* Invoke Qt Designer generated QObject setup routine */ + ui.setupUi(this); + + /* add a Background image for Add Friend Label */ + WidgetBackgroundImage::setBackgroundImage(ui.addfriendLabel, ":images/new-contact.png", WidgetBackgroundImage::AdjustHeight); + + connect(ui.afcancelButton, SIGNAL(clicked()), this, SLOT(afcancelbutton())); + connect(ui.fileButton, SIGNAL(clicked()), this, SLOT(filebutton())); + connect(ui.doneButton, SIGNAL(clicked()), this, SLOT(donebutton())); + + //setFixedSize(QSize(434, 462)); +} + +void AddFriendDialog::donebutton() +{ + /* something complicated ;) */ + std::string id; + + /* get the text from the window */ + /* load into string */ + std::string certstr = ui.emailText->toPlainText().toStdString(); + + /* ask retroshare to load */ + if ((cDialog) && (rsicontrol -> NeighLoadPEMString(certstr, id))) + { + close(); + cDialog->showpeerdetails(id); + } + else + { + /* error message */ + int ret = QMessageBox::warning(this, tr("RetroShare"), + tr("Certificate Load Failed"), + QMessageBox::Ok, QMessageBox::Ok); + } +} + + +void AddFriendDialog::afcancelbutton() +{ + close(); +} + + +void AddFriendDialog::filebutton() +{ + + /* show file dialog, + * load file into screen, + * push done button! + */ + std::string id; + if (cDialog) + { + id = cDialog->loadneighbour(); + } + + /* call make Friend */ + if (id != "") + { + close(); + cDialog->showpeerdetails(id); + } + else + { + /* error message */ + int ret = QMessageBox::warning(this, tr("RetroShare"), + tr("Certificate Load Failed"), + QMessageBox::Ok, QMessageBox::Ok); + } +} + + +void AddFriendDialog::setInfo(std::string invite) +{ + ui.emailText->setText(QString::fromStdString(invite)); +} + + diff --git a/retroshare-gui/src/gui/connect/AddFriendDialog.h b/retroshare-gui/src/gui/connect/AddFriendDialog.h new file mode 100644 index 000000000..cabd0bee7 --- /dev/null +++ b/retroshare-gui/src/gui/connect/AddFriendDialog.h @@ -0,0 +1,58 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 _ADDFRIENDDIALOG_H +#define _ADDFRIENDDIALOG_H + +#include + +#include "ui_AddFriendDialog.h" +class NetworkDialog; + +class AddFriendDialog : public QDialog +{ + Q_OBJECT + +public: + /** Default constructor */ + AddFriendDialog(NetworkDialog *cd, QWidget *parent = 0, Qt::WFlags flags = 0); + /** Default destructor */ + +void setInfo(std::string text); + +public slots: +protected: +private slots: + + void donebutton(); + void afcancelbutton(); + void filebutton(); + +private: + + /** Qt Designer generated object */ + Ui::AddFriendDialog ui; + NetworkDialog *cDialog; +}; + +#endif + diff --git a/retroshare-gui/src/gui/connect/AddFriendDialog.ui b/retroshare-gui/src/gui/connect/AddFriendDialog.ui new file mode 100644 index 000000000..d14812b2d --- /dev/null +++ b/retroshare-gui/src/gui/connect/AddFriendDialog.ui @@ -0,0 +1,599 @@ + + AddFriendDialog + + + + 0 + 0 + 439 + 336 + + + + Add a Friend + + + + 9 + + + 6 + + + + + false + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + + + true + + + + + + + + 77 + 0 + + + + Load From File + + + + + + + + 77 + 0 + + + + Cancel + + + + + + + + 77 + 0 + + + + Done + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + 0 + 0 + 0 + + + + + + + 212 + 208 + 200 + + + + + + + 255 + 255 + 255 + + + + + + + 234 + 229 + 220 + + + + + + + 128 + 128 + 128 + + + + + + + 141 + 139 + 133 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 212 + 208 + 200 + + + + + + + 64 + 64 + 64 + + + + + + + 10 + 36 + 106 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 232 + 232 + 232 + + + + + + + + + 0 + 0 + 0 + + + + + + + 212 + 208 + 200 + + + + + + + 255 + 255 + 255 + + + + + + + 234 + 229 + 220 + + + + + + + 128 + 128 + 128 + + + + + + + 141 + 139 + 133 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 212 + 208 + 200 + + + + + + + 64 + 64 + 64 + + + + + + + 212 + 208 + 200 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 232 + 232 + 232 + + + + + + + + + 106 + 104 + 100 + + + + + + + 212 + 208 + 200 + + + + + + + 255 + 255 + 255 + + + + + + + 233 + 231 + 227 + + + + + + + 128 + 128 + 128 + + + + + + + 141 + 139 + 133 + + + + + + + 106 + 104 + 100 + + + + + + + 255 + 255 + 255 + + + + + + + 106 + 104 + 100 + + + + + + + 212 + 208 + 200 + + + + + + + 212 + 208 + 200 + + + + + + + 0 + 0 + 0 + + + + + + + 10 + 36 + 106 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 232 + 232 + 232 + + + + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"><span style=" font-size:16pt;">Add a new Friend</span><br /><br /><span style=" font-size:10pt;">To add a new Friend, cut and paste their email </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">invitation into the box below, and click done.</p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + 100 + + + + + + + fileButton + doneButton + afcancelButton + emailText + + + + diff --git a/retroshare-gui/src/gui/connect/AddFriendWizard.cpp b/retroshare-gui/src/gui/connect/AddFriendWizard.cpp new file mode 100644 index 000000000..128da9dc4 --- /dev/null +++ b/retroshare-gui/src/gui/connect/AddFriendWizard.cpp @@ -0,0 +1,130 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 "rshare.h" +//#include "config/gconfig.h" + +//#include "rsiface/rsiface.h" +#include "AddFriendWizard.h" +#include + +#include +#include +#include +#include +#include +#include + +/** Constructor */ +AddFriendWizard::AddFriendWizard(QWidget *parent, Qt::WFlags flags) +: QDialog(parent, flags) +{ + /* Invoke the Qt Designer generated object setup routine */ + ui.setupUi(this); + + //GConfig config; + //config.loadWidgetInformation(this); + + + setFixedSize(QSize(508, 312)); + + /* Hide platform specific features */ +#ifdef Q_WS_WIN + +#endif +} + + + + +void AddFriendWizard::on_nextButton_clicked() +{ + // The current index position + int index = ui.textstackedWidget->currentIndex(); + // Test the different widgets + switch ( ui.textstackedWidget->currentIndex()) { + // + case 0 : + { + if ( ui.keyradioButton->isChecked() ) + { + ui.textstackedWidget->setCurrentWidget(ui.keypage); + + } + if ( ui.pqipemradioButton->isChecked() ) + { + ui.textstackedWidget->setCurrentWidget(ui.pqipempage); + + } + if ( ui.inviteradioButton->isChecked() ) + { + ui.textstackedWidget->setCurrentWidget(ui.invitepage); + + } + + } + return; + + } + + /* + * move to the next widget, with the signal/slot also labelstackedWidget, + * it's also moved + */ + index++; + // activate the backButton, because we are at the second widget or higher + ui.backButton->setEnabled(true); + + +} + +/*! +* The on_backButton_clicked function is called when the back button is clicked. +* First it set the variable index to the currentIndex of textstackedWidget minus 1. +* So we have the previous position. Then it tests if the index goes lower then 0. +* Because of there is no value prior 0, it sets the index back to 0. +* If we was at the last widget, the button was named "Finish". If we go back, it's +* named "Next" again and the lastStep is set to false. +*/ +void AddFriendWizard::on_backButton_clicked() +{ + int index = ui.textstackedWidget->currentIndex() - 1; + if ( index <= 0 ) + { + index = 0; + ui.backButton->setEnabled(false); + } + //ui.nextButton->setText(tr("Next")); + lastStep = false; + ui.textstackedWidget->setCurrentIndex(0); +} + +/*! +* This function closes the dialog without saving the values +*/ +void AddFriendWizard::on_cancelButton_clicked() +{ + // if cancel is pressed, use the standard settings + //writeSettings(); + // leave but show that cancel was pressed + reject(); +} diff --git a/retroshare-gui/src/gui/connect/AddFriendWizard.h b/retroshare-gui/src/gui/connect/AddFriendWizard.h new file mode 100644 index 000000000..36b32f683 --- /dev/null +++ b/retroshare-gui/src/gui/connect/AddFriendWizard.h @@ -0,0 +1,61 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 _ADDFRIENDWIZARD_H +#define _ADDFRIENDWIZARD_H + +#include + + +#include "ui_AddFriendWizard.h" + +class AddFriendWizard : public QDialog +{ + Q_OBJECT + +public: + /** Default Constructor */ + + AddFriendWizard(QWidget *parent = 0, Qt::WFlags flags = 0); + /** Default Destructor */ + + + +private slots: + +private slots: + void on_nextButton_clicked(); + void on_backButton_clicked(); + void on_cancelButton_clicked(); + + + +private: + + bool lastStep; + + /** Qt Designer generated object */ + Ui::AddFriendWizard ui; +}; + +#endif + diff --git a/retroshare-gui/src/gui/connect/AddFriendWizard.ui b/retroshare-gui/src/gui/connect/AddFriendWizard.ui new file mode 100644 index 000000000..98dd90956 --- /dev/null +++ b/retroshare-gui/src/gui/connect/AddFriendWizard.ui @@ -0,0 +1,821 @@ + + AddFriendWizard + + + + 0 + 0 + 508 + 312 + + + + + 7 + 7 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 192 + 192 + 192 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + 104 + 104 + 104 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 104 + 104 + 104 + + + + + + + 255 + 255 + 255 + + + + + + + 104 + 104 + 104 + + + + + + + 240 + 240 + 240 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + Arial + 8 + 50 + false + false + false + false + + + + Qt::NoContextMenu + + + Add Friend to my netowork Wizard + + + + + + + + 0 + 260 + 511 + 20 + + + + Qt::Horizontal + + + + + + 270 + 280 + 75 + 23 + + + + < Back + + + + + + 350 + 280 + 75 + 23 + + + + Next > + + + + + + 430 + 280 + 75 + 23 + + + + Cancel + + + + + + 160 + 10 + 341 + 241 + + + + 0 + + + + + + 10 + 10 + 261 + 16 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">This Wizard helps to Connect to your Friends</span></p></body></html> + + + + + + 10 + 100 + 311 + 18 + + + + I have a .pqi/.pem file received from a Friend + + + + + + 10 + 80 + 311 + 18 + + + + I have Key received from a Friend + + + + + + 10 + 120 + 321 + 18 + + + + I want to invite a friend to my RetroShare network + + + + + + + + 10 + 30 + 331 + 161 + + + + + + + 10 + 190 + 401 + 60 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Cut and paste the text below into an email.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;"> and send it to all your friends!</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">When you press next RetroShare will attempt to launch a Email client.</p></body></html> + + + + + + 10 + 10 + 241 + 16 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Invite your Friends to join with RetroShare</span></p></body></html> + + + + + + + + 10 + 10 + 271 + 16 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Enter the Key code you got from your friend:</span></p></body></html> + + + + + + 10 + 30 + 331 + 161 + + + + false + + + + + + 10 + 200 + 331 + 31 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">When you press next RetroShare will attempt to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">connect using the key.</p></body></html> + + + + + + + + 10 + 10 + 211 + 16 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Select a pqi/pem file:</span></p></body></html> + + + + + + 10 + 50 + 321 + 27 + + + + + 0 + + + 6 + + + + + + + + Browse + + + + + + + + + 10 + 90 + 331 + 31 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">When you press next RetroShare will attempt to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">connect using the .pqi/.pem file.</p></body></html> + + + + + + + + 10 + 10 + 151 + 251 + + + + + + + + + + + + backButton + nextButton + cancelButton + keyradioButton + pqipemradioButton + inviteradioButton + textBrowser + lineEdit + pushButton_4 + emailText + + + + + + diff --git a/retroshare-gui/src/gui/connect/ConfCertDialog.cpp b/retroshare-gui/src/gui/connect/ConfCertDialog.cpp new file mode 100644 index 000000000..78f77d4bb --- /dev/null +++ b/retroshare-gui/src/gui/connect/ConfCertDialog.cpp @@ -0,0 +1,261 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 "ConfCertDialog.h" + +#include "rsiface/rsiface.h" + +/* Define the format used for displaying the date and time */ +#define DATETIME_FMT "MMM dd hh:mm:ss" + +/** Default constructor */ +ConfCertDialog::ConfCertDialog(QWidget *parent, Qt::WFlags flags) + : QMainWindow(parent, flags) +{ + /* Invoke Qt Designer generated QObject setup routine */ + ui.setupUi(this); + + + connect(ui.applyButton, SIGNAL(clicked()), this, SLOT(applyDialog())); + connect(ui.cancelButton, SIGNAL(clicked()), this, SLOT(closeinfodlg())); + + + setFixedSize(QSize(434, 462)); +} + + + +/** + Overloads the default show() slot so we can set opacity*/ + +void +ConfCertDialog::show() +{ + //loadSettings(); + if(!this->isVisible()) { + QMainWindow::show(); + + } +} + +void ConfCertDialog::closeEvent (QCloseEvent * event) +{ + QWidget::closeEvent(event); +} + +void ConfCertDialog::closeinfodlg() +{ + close(); +} + +void ConfCertDialog::loadId(std::string id) +{ + mId = id; + loadDialog(); +} + + +void ConfCertDialog::loadDialog() +{ + /* open up the rsiface and get the data */ + /* get the shared directories */ + rsiface->lockData(); /* Lock Interface */ + + /* get the correct friend */ + const NeighbourInfo *ni = rsiface->getFriend(mId); + if (!ni) + { + /* fail */ + rsiface->unlockData(); /* UnLock Interface */ + return; + } + + ui.name->setText(QString::fromStdString(ni -> name)); + ui.orgloc->setText(QString::fromStdString(ni -> org + "/" + ni -> loc)); + ui.country->setText(QString::fromStdString(ni -> country + "/" + ni -> state)); + + /* set local address */ + ui.localAddress->setText(QString::fromStdString(ni->localAddr)); + ui.localPort -> setValue(ni->localPort); + /* set the server address */ + ui.extAddress->setText(QString::fromStdString(ni->extAddr)); + ui.extPort -> setValue(ni->extPort); + /* set the url for DNS access */ + ui.extName->setText(QString::fromStdString(ni->extName)); + ui.chkFirewall ->setChecked(ni->firewalled); + ui.chkForwarded ->setChecked(ni->forwardPort); + + ui.indivRate->setValue(ni->maxRate); + + ui.trustLvl->setText(QString::fromStdString(ni->trustString)); + + if (ni->ownsign) + { + ui.signBox -> setCheckState(Qt::Checked); + ui.signBox -> setEnabled(false); + if (ni->trustLvl == 5) /* 5 = Trusted, 6 = OwnSign */ + { + ui.trustBox -> setCheckState(Qt::Checked); + } + else + { + ui.trustBox -> setCheckState(Qt::Unchecked); + } + ui.trustBox -> setCheckable(true); + } + else + { + ui.signBox -> setCheckState(Qt::Unchecked); + ui.signBox -> setEnabled(true); + + ui.trustBox -> setCheckState(Qt::Unchecked); + ui.trustBox -> setEnabled(false); + } + + rsiface->unlockData(); /* UnLock Interface */ + + +} + + +void ConfCertDialog::applyDialog() +{ + /* open up the rsiface and get the data */ + /* get the shared directories */ + rsiface->lockData(); /* Lock Interface */ + + /* get the correct friend */ + const NeighbourInfo *ni = rsiface->getFriend(mId); + if (!ni) + { + /* fail */ + rsiface->unlockData(); /* UnLock Interface */ + return; + } + + + /* check if the data is the same */ + bool localChanged = false; + bool extChanged = false; + bool fwChanged = false; + bool dnsChanged = false; + bool signChanged = false; + bool trustChanged = false; + + /* set local address */ + if ((ni->localAddr != ui.localAddress->text().toStdString()) + || (ni->localPort != ui.localPort -> value())) + { + /* changed ... set it */ + localChanged = true; + } + + if ((ni->extAddr != ui.extAddress->text().toStdString()) + || (ni->extPort != ui.extPort -> value())) + { + /* changed ... set it */ + extChanged = true; + } + + if (ni->extName != ui.extName->text().toStdString()) + { + /* changed ... set it */ + dnsChanged = true; + } + + if ((ni->firewalled != ui.chkFirewall ->isChecked()) || + (ni->forwardPort != ui.chkForwarded ->isChecked())) + { + /* changed ... set it */ + fwChanged = true; + } + + if (ni -> maxRate != ui.indivRate->value()) + { + /* nada */ + } + + if (ni->ownsign) + { + /* check the trust tick */ + bool trsted = (ni->trustLvl == 5); /* 5 = Trusted, 6 = OwnSign */ + + if (trsted != ui.trustBox->isChecked()) + { + trustChanged = true; + } + } + else + { + if (ui.signBox->isChecked()) + { + signChanged = true; + } + } + + rsiface->unlockData(); /* UnLock Interface */ + + + /* now we can action the changes */ + if (localChanged) + rsicontrol -> FriendSetLocalAddress(mId, + ui.localAddress->text().toStdString(), ui.localPort->value()); + + if (extChanged) + rsicontrol -> FriendSetExtAddress(mId, + ui.extAddress->text().toStdString(), ui.extPort->value()); + + if (dnsChanged) + rsicontrol -> FriendSetDNSAddress(mId, ui.extName->text().toStdString()); + + if (fwChanged) + rsicontrol -> FriendSetFirewall(mId, ui.chkFirewall->isChecked(), + ui.chkForwarded->isChecked()); + + if (trustChanged) + rsicontrol -> FriendTrustSignature(mId, ui.trustBox->isChecked()); + + if (signChanged) + rsicontrol -> FriendSignCert(mId); + + /* reload now */ + loadDialog(); + + /* close the Dialog after the Changes applied */ + closeinfodlg(); +} + + +void ConfCertDialog::setInfo(std::string name, + std::string trust, + std::string org, + std::string loc, + std::string country, + std::string signers) +{ + ui.name->setText(QString::fromStdString(name)); + ui.trustLvl->setText(QString::fromStdString(trust)); + ui.orgloc->setText(QString::fromStdString(org + loc)); + //ui.loc->setText(QString::fromStdString(loc)); + //ui.country->setText(QString::fromStdString(country)); + //ui.signers->setText(QString::fromStdString(signers)); +} + + diff --git a/retroshare-gui/src/gui/connect/ConfCertDialog.h b/retroshare-gui/src/gui/connect/ConfCertDialog.h new file mode 100644 index 000000000..3b6129687 --- /dev/null +++ b/retroshare-gui/src/gui/connect/ConfCertDialog.h @@ -0,0 +1,74 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 _CONFCERTDIALOG_H +#define _CONFCERTDIALOG_H + +#include + +#include "ui_ConfCertDialog.h" + +class ConfCertDialog : public QMainWindow +{ + Q_OBJECT + +public: + /** Default constructor */ + ConfCertDialog(QWidget *parent = 0, Qt::WFlags flags = 0); + /** Default destructor */ + + +void loadId(std::string id); + +void setInfo(std::string name, + std::string trust, + std::string org, + std::string loc, + std::string country, + std::string signers); + +public slots: + /** Overloaded QWidget.show */ + void show(); + +protected: + void closeEvent (QCloseEvent * event); + +private slots: + + void closeinfodlg(); + void applyDialog(); + +private: + + /** Loads the saved connectidialog settings */ +// void loadSettings(); + +void loadDialog(); + +std::string mId; + /** Qt Designer generated object */ + Ui::ConfCertDialog ui; +}; + +#endif + diff --git a/retroshare-gui/src/gui/connect/ConfCertDialog.ui b/retroshare-gui/src/gui/connect/ConfCertDialog.ui new file mode 100644 index 000000000..989407dd4 --- /dev/null +++ b/retroshare-gui/src/gui/connect/ConfCertDialog.ui @@ -0,0 +1,942 @@ + + ConfCertDialog + + + + 0 + 0 + 434 + 462 + + + + + 7 + 7 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 192 + 192 + 192 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + 104 + 104 + 104 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 104 + 104 + 104 + + + + + + + 255 + 255 + 255 + + + + + + + 104 + 104 + 104 + + + + + + + 240 + 240 + 240 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + Arial + 8 + 50 + false + false + false + false + + + + Qt::NoContextMenu + + + :/images/RetroShare16.png + + + + + 10 + 300 + 411 + 121 + + + + Trust Settings + + + + + 20 + 20 + 81 + 21 + + + + Trust Level + + + + + + 120 + 70 + 271 + 23 + + + + Trust Their Signature + + + + + + 120 + 50 + 271 + 23 + + + + Sign The Certificate + + + + + + 110 + 20 + 221 + 23 + + + + true + + + + + + + 210 + 430 + 101 + 23 + + + + Cancel + + + + + + 320 + 430 + 101 + 23 + + + + OK + + + false + + + true + + + + + + 10 + 110 + 411 + 191 + + + + Peer Adress + + + + + 100 + 20 + 274 + 130 + + + + + 0 + + + 6 + + + + + 0 + + + 6 + + + + + 65535 + + + 0 + + + 7812 + + + + + + + Port: + + + + + + + + + + + + 0 + + + 6 + + + + + behind zee Firewall + + + + + + + Forwarded External Port + + + + + + + + + 0 + + + 6 + + + + + + + + 65535 + + + 0 + + + 7812 + + + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + + + + + + + + + + + + + + 10 + 90 + 91 + 21 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + + + + + + 10 + 120 + 80 + 21 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + + + + + + 12 + 21 + 66 + 21 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + + + + + + 120 + 150 + 194 + 33 + + + + + 0 + + + 6 + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Max Transfer Rate (kb/s) </p></body></html> + + + + + + + 65535 + + + 1 + + + 7812 + + + + + + + + + + 10 + 0 + 411 + 111 + + + + Peer Info + + + + + 101 + 25 + 259 + 19 + + + + true + + + + + + 101 + 85 + 259 + 19 + + + + true + + + + + + 101 + 55 + 259 + 19 + + + + true + + + + + + 11 + 21 + 79 + 26 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + + + + + + 11 + 84 + 79 + 26 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Country/State:</p></body></html> + + + + + + 11 + 53 + 79 + 25 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Org / Loc:</p></body></html> + + + + + + name + orgloc + country + localAddress + localPort + chkFirewall + chkForwarded + extAddress + extPort + extName + indivRate + trustLvl + signBox + trustBox + cancelButton + applyButton + + + + + + diff --git a/retroshare-gui/src/gui/connect/ConnectDialog.cpp b/retroshare-gui/src/gui/connect/ConnectDialog.cpp new file mode 100644 index 000000000..d9a4de232 --- /dev/null +++ b/retroshare-gui/src/gui/connect/ConnectDialog.cpp @@ -0,0 +1,174 @@ +/**************************************************************** + * RShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 +#include "ConnectDialog.h" + +#include "rsiface/rsiface.h" +#include + +/** Default constructor */ +ConnectDialog::ConnectDialog(QWidget *parent, Qt::WFlags flags) + : QMainWindow(parent, flags) +{ + /* Invoke Qt Designer generated QObject setup routine */ + ui.setupUi(this); + + /* Create Bandwidth Graph related QObjects */ + _settings = new RshareSettings(); + + // Create the status bar + statusBar()->showMessage("Peer Informations"); + + setFixedSize(QSize(330, 412)); + + connect(ui.cancelButton, SIGNAL(clicked()), this, SLOT(closeinfodlg())); + connect(ui.okButton, SIGNAL(clicked()), this, SLOT(authAttempt())); + connect(ui.Ledit_name, SIGNAL(textChanged ( const QString & ) ), this, SLOT(checkAuthCode( const QString & ))); + +} + + + +/** + Overloads the default show() slot so we can set opacity*/ + +void +ConnectDialog::show() +{ + //loadSettings(); + if(!this->isVisible()) { + QMainWindow::show(); + + } +} + +void ConnectDialog::closeEvent (QCloseEvent * event) +{ + + + QWidget::closeEvent(event); +} + +void ConnectDialog::closeinfodlg() +{ + close(); +} + + +void ConnectDialog::setInfo(std::string name, + std::string trust, + std::string org, + std::string loc, + std::string country, + std::string signers) +{ + ui.name->setText(QString::fromStdString(name)); + ui.trust->setText(QString::fromStdString(trust)); + ui.org->setText(QString::fromStdString(org)); + ui.loc->setText(QString::fromStdString(loc)); + ui.country->setText(QString::fromStdString(country)); + ui.signers->setText(QString::fromStdString(signers)); +} + + +void ConnectDialog::setAuthCode(std::string id, std::string code) +{ + authId = id; + authCode = code; + ui.Ledit_name->setText(QString::fromStdString(code)); + //ui.okButton ->setEnabled(true); +} + +void ConnectDialog::checkAuthCode(const QString &txt) +{ + + //std::cerr << "AuthCode:" << authCode << std::endl; + //std::cerr << "Entered:" << ui.Ledit_name -> text().toStdString() << std::endl; + //std::cerr << "Entered:" << txt.toStdString() << std::endl; + + if (authCode == txt.toStdString()) + { + /* enable ok button */ + ui.okButton ->setEnabled(true); + } + else + { + /* disable ok button */ + ui.okButton ->setEnabled(false); + } +} + +void ConnectDialog::authAttempt() +{ + + /* well lets do it ! */ + std::cerr << "Attempting AuthCode:" << authCode << std::endl; + rsicontrol -> NeighAuthFriend(authId, authCode); + rsicontrol -> NeighAddFriend(authId); + + /* close it up! */ + closeinfodlg(); +} + +bool ConnectDialog::loadPeer(std::string id) +{ + std::map::const_iterator it; + /* first grab the list of signers (outside lock) */ + + char signerstr[1024]; + rsicontrol->NeighGetSigners(id, signerstr, 1024); + + /* XXX NOTE We must copy the char * to a string, + * otherwise it get trampled on by the it = find(id). + * ( DONT KNOW WHY???? ) under mingw. + */ + + std::string signersString; + signersString = signerstr; + + /* grab the interface and check person */ + rsiface->lockData(); /* Lock Interface */ + + const std::map &neighs = + rsiface->getNeighbourMap(); + + it = neighs.find(id); + + if (it == neighs.end()) + { + rsiface->unlockData(); /* UnLock Interface */ + return false; + } + + /* setup the gui */ + setInfo(it->second.name, it->second.trustString, it->second.org, + it->second.loc, it->second.country, signersString); + + setAuthCode(id, it->second.authCode); + + rsiface->unlockData(); /* UnLock Interface */ + + return true; +} + diff --git a/retroshare-gui/src/gui/connect/ConnectDialog.h b/retroshare-gui/src/gui/connect/ConnectDialog.h new file mode 100644 index 000000000..c47798360 --- /dev/null +++ b/retroshare-gui/src/gui/connect/ConnectDialog.h @@ -0,0 +1,80 @@ +/**************************************************************** + * RShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 _CONNECTDIALOG_H +#define _CONNECTDIALOG_H + +#include + +#include "ui_ConnectDialog.h" + + +class ConnectDialog : public QMainWindow +{ + Q_OBJECT + +public: + /** Default constructor */ + ConnectDialog(QWidget *parent = 0, Qt::WFlags flags = 0); + /** Default destructor */ + +bool loadPeer(std::string id); + +public slots: + /** Overloaded QWidget.show */ + void checkAuthCode( const QString &txt ); + void show(); + +protected: + void closeEvent (QCloseEvent * event); + +private slots: + + void closeinfodlg(); + void authAttempt(); + + +private: + + +void setInfo(std::string name, + std::string trust, + std::string org, + std::string loc, + std::string country, + std::string signers); + +void setAuthCode(std::string id, std::string code); + + std::string authCode; + std::string authId; + + /** A VidaliaSettings object that handles getting/saving settings */ + RshareSettings* _settings; + + /** Qt Designer generated object */ + Ui::ConnectDialog ui; +}; + +#endif + + diff --git a/retroshare-gui/src/gui/connect/ConnectDialog.ui b/retroshare-gui/src/gui/connect/ConnectDialog.ui new file mode 100644 index 000000000..4f1a122fa --- /dev/null +++ b/retroshare-gui/src/gui/connect/ConnectDialog.ui @@ -0,0 +1,821 @@ + + ConnectDialog + + + + 0 + 0 + 324 + 428 + + + + + + + + + 16 + 16 + 16 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 160 + 160 + 160 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + + + 16 + 16 + 16 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 160 + 160 + 160 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + + + 104 + 104 + 104 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 160 + 160 + 160 + + + + + + + 104 + 104 + 104 + + + + + + + 255 + 255 + 255 + + + + + + + 104 + 104 + 104 + + + + + + + 240 + 240 + 240 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + + + Arial + 8 + 50 + false + false + false + false + + + + Qt::NoContextMenu + + + Peer Details + + + + + + + + + 10 + 330 + 301 + 25 + + + + + 0 + + + 6 + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + + + + + + + + 0 + 0 + 0 + 0 + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 40 + 20 + + + + + + + + + + 10 + 360 + 301 + 33 + + + + + 0 + + + 6 + + + + + false + + + + 77 + 0 + + + + Make Friend + + + + + + + Qt::Horizontal + + + + 131 + 31 + + + + + + + + + 77 + 0 + + + + Close + + + + + + + + + 9 + 9 + 312 + 315 + + + + Peer Details + + + + + 10 + 150 + 46 + 14 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + + + + + + 10 + 90 + 46 + 14 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Org:</span></p></body></html> + + + + + + 10 + 60 + 46 + 14 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + + + + + + 10 + 30 + 46 + 14 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Trust:</span></p></body></html> + + + + + + 10 + 120 + 46 + 14 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Loc:</span></p></body></html> + + + + + + 10 + 180 + 57 + 31 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Certificate</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">signers:</p></body></html> + + + + + + 70 + 150 + 221 + 21 + + + + true + + + + + + 70 + 120 + 221 + 21 + + + + true + + + + + + 70 + 90 + 221 + 21 + + + + true + + + + + + 70 + 60 + 221 + 21 + + + + true + + + + + + 70 + 30 + 221 + 21 + + + + true + + + + + + 70 + 180 + 221 + 131 + + + + + + + + + trust + name + org + loc + country + signers + Ledit_name + okButton + cancelButton + + + + + + diff --git a/retroshare-gui/src/gui/connect/InviteDialog.cpp b/retroshare-gui/src/gui/connect/InviteDialog.cpp new file mode 100644 index 000000000..73fd4d41b --- /dev/null +++ b/retroshare-gui/src/gui/connect/InviteDialog.cpp @@ -0,0 +1,106 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, 2007 crypton + * + * 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 "InviteDialog.h" + +#include "rsiface/rsiface.h" +#include + +/** Default constructor */ +InviteDialog::InviteDialog(QWidget *parent, Qt::WFlags flags) + : QDialog(parent, flags) +{ + /* Invoke Qt Designer generated QObject setup routine */ + ui.setupUi(this); + + /* add a Background image for Invite a Friend Label */ + WidgetBackgroundImage::setBackgroundImage(ui.invitefriendLabel, ":images/new-contact.png", WidgetBackgroundImage::AdjustHeight); + + connect(ui.cancelButton, SIGNAL(clicked()), this, SLOT(cancelbutton())); + connect(ui.emailButton, SIGNAL(clicked()), this, SLOT(emailbutton())); + connect(ui.doneButton, SIGNAL(clicked()), this, SLOT(closebutton())); + + //setFixedSize(QSize(434, 462)); +} + +void InviteDialog::closebutton() +{ + close(); +} + + +void InviteDialog::cancelbutton() +{ + close(); +} + + /* for Win32 only */ +#if defined(Q_OS_WIN) +#include + +#endif + +void InviteDialog::emailbutton() +{ + /* for Win32 only */ +#if defined(Q_OS_WIN) + + std::string mailstr = "mailto:"; + + mailstr += "&subject=RetroShare Invite"; + mailstr += "&body="; + mailstr += ui.emailText->toPlainText().toStdString(); + + /* search and replace the end of lines with: "%0D%0A" */ + + std::cerr << "MAIL STRING:" << mailstr.c_str() << std::endl; + + size_t loc; + while((loc = mailstr.find("\n")) != mailstr.npos) + { + /* sdfkasdflkjh */ + mailstr.replace(loc, 1, "%0D%0A"); + } + + HINSTANCE hInst = ShellExecuteA(0, + "open", + mailstr.c_str(), + NULL, + NULL, + SW_SHOW); + + if(reinterpret_cast(hInst) <= 32) + { + /* error */ + std::cerr << "ShellExecute Error: " << reinterpret_cast(hInst); + std::cerr << std::endl; + } + +#endif +} + + +void InviteDialog::setInfo(std::string invite) +{ + ui.emailText->setText(QString::fromStdString(invite)); +} + + diff --git a/retroshare-gui/src/gui/connect/InviteDialog.h b/retroshare-gui/src/gui/connect/InviteDialog.h new file mode 100644 index 000000000..6fabab842 --- /dev/null +++ b/retroshare-gui/src/gui/connect/InviteDialog.h @@ -0,0 +1,56 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 _INVITEDIALOG_H +#define _INVITEDIALOG_H + +#include + +#include "ui_InviteDialog.h" + +class InviteDialog : public QDialog +{ + Q_OBJECT + +public: + /** Default constructor */ + InviteDialog(QWidget *parent = 0, Qt::WFlags flags = 0); + /** Default destructor */ + +void setInfo(std::string text); + +public slots: +protected: +private slots: + + void closebutton(); + void cancelbutton(); + void emailbutton(); + +private: + + /** Qt Designer generated object */ + Ui::InviteDialog ui; +}; + +#endif + diff --git a/retroshare-gui/src/gui/connect/InviteDialog.ui b/retroshare-gui/src/gui/connect/InviteDialog.ui new file mode 100644 index 000000000..87c4ec2c7 --- /dev/null +++ b/retroshare-gui/src/gui/connect/InviteDialog.ui @@ -0,0 +1,600 @@ + + InviteDialog + + + + 0 + 0 + 577 + 554 + + + + Invite a Friend + + + + 9 + + + 6 + + + + + + 77 + 0 + + + + Launch Email + + + + + + + true + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + + + true + + + + + + + + + + + + 0 + 0 + 0 + + + + + + + 212 + 208 + 200 + + + + + + + 255 + 255 + 255 + + + + + + + 234 + 229 + 220 + + + + + + + 128 + 128 + 128 + + + + + + + 141 + 139 + 133 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 212 + 208 + 200 + + + + + + + 64 + 64 + 64 + + + + + + + 10 + 36 + 106 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 232 + 232 + 232 + + + + + + + + + 0 + 0 + 0 + + + + + + + 212 + 208 + 200 + + + + + + + 255 + 255 + 255 + + + + + + + 234 + 229 + 220 + + + + + + + 128 + 128 + 128 + + + + + + + 141 + 139 + 133 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 212 + 208 + 200 + + + + + + + 64 + 64 + 64 + + + + + + + 212 + 208 + 200 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 232 + 232 + 232 + + + + + + + + + 106 + 104 + 100 + + + + + + + 212 + 208 + 200 + + + + + + + 255 + 255 + 255 + + + + + + + 233 + 231 + 227 + + + + + + + 128 + 128 + 128 + + + + + + + 141 + 139 + 133 + + + + + + + 106 + 104 + 100 + + + + + + + 255 + 255 + 255 + + + + + + + 106 + 104 + 100 + + + + + + + 212 + 208 + 200 + + + + + + + 212 + 208 + 200 + + + + + + + 0 + 0 + 0 + + + + + + + 10 + 36 + 106 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 232 + 232 + 232 + + + + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"><span style=" font-size:16pt;">Invite a Friend</span><br /><br /><span style=" font-size:10pt;">To Invite your friends to join you with Retroshare: </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">Cut and paste the text below into an email.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">and send it to all your friends!</p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + 100 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 77 + 0 + + + + Cancel + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 77 + 0 + + + + Done + + + + + + + emailButton + doneButton + cancelButton + emailText + + + + diff --git a/retroshare-gui/src/gui/filehash/FileHashDialog.cpp b/retroshare-gui/src/gui/filehash/FileHashDialog.cpp new file mode 100644 index 000000000..10b47fa9b --- /dev/null +++ b/retroshare-gui/src/gui/filehash/FileHashDialog.cpp @@ -0,0 +1,63 @@ +/**************************************************************** + * RShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 +#include "FileHashDialog.h" + +/* Define the format used for displaying the date and time */ +#define DATETIME_FMT "MMM dd hh:mm:ss" + +/** Default constructor */ +FileHashDialog::FileHashDialog(QWidget *parent, Qt::WFlags flags) + : QMainWindow(parent, flags) +{ + /* Invoke Qt Designer generated QObject setup routine */ + ui.setupUi(this); + + // Create the status bar + statusBar()->showMessage("Please enter a valid file hash"); + + setFixedSize(QSize(313, 134)); + + +} + + +/** + Overloads the default show() */ + +void +FileHashDialog::show() +{ + //loadSettings(); + if(!this->isVisible()) { + QMainWindow::show(); + + } +} + +void FileHashDialog::closeEvent (QCloseEvent * event) +{ + QWidget::closeEvent(event); +} + diff --git a/retroshare-gui/src/gui/filehash/FileHashDialog.h b/retroshare-gui/src/gui/filehash/FileHashDialog.h new file mode 100644 index 000000000..0ea3dab9e --- /dev/null +++ b/retroshare-gui/src/gui/filehash/FileHashDialog.h @@ -0,0 +1,66 @@ +/**************************************************************** + * RShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 _FILEHASHDIALOG_H +#define _FILEHASHDIALOG_H + +#include + +#include "ui_FileHashDialog.h" + + + +class FileHashDialog : public QMainWindow +{ + Q_OBJECT + +public: + /** Default constructor */ + FileHashDialog(QWidget *parent = 0, Qt::WFlags flags = 0); + /** Default destructor */ + + +public slots: + /** Overloaded QWidget.show */ + void show(); + +protected: + void closeEvent (QCloseEvent * event); + +private slots: + + +private: + + /** Loads the saved connectidialog settings */ +// void loadSettings(); + + + /** A VidaliaSettings object that handles getting/saving settings */ + RshareSettings* _settings; + + /** Qt Designer generated object */ + Ui::FileHashDialog ui; +}; + +#endif + diff --git a/retroshare-gui/src/gui/filehash/FileHashDialog.ui b/retroshare-gui/src/gui/filehash/FileHashDialog.ui new file mode 100644 index 000000000..ad415a5d3 --- /dev/null +++ b/retroshare-gui/src/gui/filehash/FileHashDialog.ui @@ -0,0 +1,332 @@ + + + + + FileHashDialog + + + + 0 + 0 + 313 + 134 + + + + + + + 16 + 16 + 16 + + + 208 + 208 + 208 + + + 255 + 255 + 255 + + + 247 + 247 + 247 + + + 104 + 104 + 104 + + + 160 + 160 + 160 + + + 0 + 0 + 0 + + + 255 + 255 + 255 + + + 0 + 0 + 0 + + + 255 + 255 + 255 + + + 240 + 240 + 240 + + + 0 + 0 + 0 + + + 0 + 0 + 0 + + + 255 + 255 + 255 + + + 0 + 0 + 255 + + + 255 + 0 + 255 + + + 247 + 247 + 247 + + + + + 16 + 16 + 16 + + + 208 + 208 + 208 + + + 255 + 255 + 255 + + + 247 + 247 + 247 + + + 104 + 104 + 104 + + + 160 + 160 + 160 + + + 0 + 0 + 0 + + + 255 + 255 + 255 + + + 0 + 0 + 0 + + + 255 + 255 + 255 + + + 240 + 240 + 240 + + + 0 + 0 + 0 + + + 0 + 0 + 0 + + + 255 + 255 + 255 + + + 0 + 0 + 255 + + + 255 + 0 + 255 + + + 247 + 247 + 247 + + + + + 104 + 104 + 104 + + + 208 + 208 + 208 + + + 255 + 255 + 255 + + + 247 + 247 + 247 + + + 104 + 104 + 104 + + + 160 + 160 + 160 + + + 104 + 104 + 104 + + + 255 + 255 + 255 + + + 104 + 104 + 104 + + + 240 + 240 + 240 + + + 240 + 240 + 240 + + + 0 + 0 + 0 + + + 0 + 0 + 0 + + + 255 + 255 + 255 + + + 0 + 0 + 255 + + + 255 + 0 + 255 + + + 247 + 247 + 247 + + + + + + + Arial + 8 + 50 + false + false + false + false + + + + Qt::NoContextMenu + + + Download + + + :/images/RShare16.png + + + + + + 220 + 80 + 81 + 25 + + + + Download + + + + + + 10 + 10 + 291 + 64 + + + + + + + + + + + + diff --git a/retroshare-gui/src/gui/graphframe.cpp b/retroshare-gui/src/gui/graphframe.cpp new file mode 100644 index 000000000..5b53960c3 --- /dev/null +++ b/retroshare-gui/src/gui/graphframe.cpp @@ -0,0 +1,301 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2007, crypton + * + * 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 + +#include "graphframe.h" + + +/** Default contructor */ +GraphFrame::GraphFrame(QWidget *parent) +: QFrame(parent) +{ + /* Create Graph Frame related objects */ + _recvData = new QList(); + _sendData = new QList(); + _painter = new QPainter(); + _graphStyle = SolidLine; + + /* Initialize graph values */ + _recvData->prepend(0); + _sendData->prepend(0); + _maxPoints = getNumPoints(); + _showRecv = true; + _showSend = true; + _maxValue = MIN_SCALE; +} + +/** Default destructor */ +GraphFrame::~GraphFrame() +{ + delete _painter; + delete _recvData; + delete _sendData; +} + +/** Gets the width of the desktop, which is the maximum number of points + * we can plot in the graph. */ +int +GraphFrame::getNumPoints() +{ + QDesktopWidget *desktop = QApplication::desktop(); + int width = desktop->width(); + return width; +} + +/** Adds new data points to the graph. */ +void +GraphFrame::addPoints(qreal recv, qreal send) +{ + /* If maximum number of points plotted, remove oldest */ + if (_sendData->size() == _maxPoints) { + _sendData->removeLast(); + _recvData->removeLast(); + } + + /* Add the points to their respective lists */ + _sendData->prepend(send); + _recvData->prepend(recv); + + /* Add to the total counters */ + _totalSend += send; + _totalRecv += recv; + + /* Check for a new maximum value */ + if (send > _maxValue) _maxValue = send; + if (recv > _maxValue) _maxValue = recv; + + this->update(); +} + +/** Clears the graph. */ +void +GraphFrame::resetGraph() +{ + _recvData->clear(); + _sendData->clear(); + _recvData->prepend(0); + _sendData->prepend(0); + _maxValue = MIN_SCALE; + _totalSend = 0; + _totalRecv = 0; + this->update(); +} + +/** Toggles display of respective graph lines and counters. */ +void +GraphFrame::setShowCounters(bool showRecv, bool showSend) +{ + _showRecv = showRecv; + _showSend = showSend; + this->update(); +} + +/** Overloads default QWidget::paintEvent. Draws the actual + * bandwidth graph. */ +void +GraphFrame::paintEvent(QPaintEvent *event) +{ + Q_UNUSED(event); + + /* Set current graph dimensions */ + _rec = this->frameRect(); + + /* Start the painter */ + _painter->begin(this); + + /* We want antialiased lines and text */ + _painter->setRenderHint(QPainter::Antialiasing); + _painter->setRenderHint(QPainter::TextAntialiasing); + + /* Fill in the background */ + _painter->fillRect(_rec, QBrush(BACK_COLOR)); + _painter->drawRect(_rec); + + /* Paint the scale */ + paintScale(); + /* Plot the send/receive data */ + paintData(); + /* Paint the send/recv totals */ + paintTotals(); + + /* Stop the painter */ + _painter->end(); +} + +/** Paints an integral and an outline of that integral for each data set (send + * and/or receive) that is to be displayed. The integrals will be drawn first, + * followed by the outlines, since we want the area of overlapping integrals + * to blend, but not the outlines of those integrals. */ +void +GraphFrame::paintData() +{ + QVector recvPoints, sendPoints; + + /* Convert the bandwidth data points to graph points */ + recvPoints = pointsFromData(_recvData); + sendPoints = pointsFromData(_sendData); + + if (_graphStyle == AreaGraph) { + /* Plot the bandwidth data as area graphs */ + if (_showRecv) + paintIntegral(recvPoints, RECV_COLOR, 0.6); + if (_showSend) + paintIntegral(sendPoints, SEND_COLOR, 0.4); + } + + /* Plot the bandwidth as solid lines. If the graph style is currently an + * area graph, we end up outlining the integrals. */ + if (_showRecv) + paintLine(recvPoints, RECV_COLOR); + if (_showSend) + paintLine(sendPoints, SEND_COLOR); +} + +/** Returns a list of points on the bandwidth graph based on the supplied set + * of send or receive values. */ +QVector +GraphFrame::pointsFromData(QList* list) +{ + QVector points; + int x = _rec.width(); + int y = _rec.height(); + qreal scale = (y - (y/10)) / _maxValue; + qreal currValue; + + /* Translate all data points to points on the graph frame */ + points << QPointF(x, y); + for (int i = 0; i < list->size(); i++) { + currValue = y - (list->at(i) * scale); + if (x - SCROLL_STEP < SCALE_WIDTH) { + points << QPointF(SCALE_WIDTH, currValue); + break; + } + points << QPointF(x, currValue); + x -= SCROLL_STEP; + } + points << QPointF(SCALE_WIDTH, y); + return points; +} + +/** Plots an integral using the data points in points. The area will be + * filled in using color and an alpha-blending level of alpha + * (default is opaque). */ +void +GraphFrame::paintIntegral(QVector points, QColor color, qreal alpha) +{ + /* Save the current brush, plot the integral, and restore the old brush */ + QBrush oldBrush = _painter->brush(); + color.setAlphaF(alpha); + _painter->setBrush(QBrush(color)); + _painter->drawPolygon(points.data(), points.size()); + _painter->setBrush(oldBrush); +} + +/** Iterates the input list and draws a line on the graph in the appropriate + * color. */ +void +GraphFrame::paintLine(QVector points, QColor color, Qt::PenStyle lineStyle) +{ + /* Save the current brush, plot the line, and restore the old brush */ + QPen oldPen = _painter->pen(); + _painter->setPen(QPen(color, lineStyle)); + _painter->drawPolyline(points.data(), points.size()); + _painter->setPen(oldPen); +} + +/** Paints selected total indicators on the graph. */ +void +GraphFrame::paintTotals() +{ + int x = SCALE_WIDTH + FONT_SIZE, y = 0; + int rowHeight = FONT_SIZE; + +#if !defined(Q_WS_MAC) + /* On Mac, we don't need vertical spacing between the text rows. */ + rowHeight += 5; +#endif + + /* If total received is selected */ + if (_showRecv) { + y = rowHeight; + _painter->setPen(RECV_COLOR); + _painter->drawText(x, y, + tr("Recv: ") + totalToStr(_totalRecv) + + " ("+tr("%1 KB/s").arg(_recvData->first(), 0, 'f', 2)+")"); + } + + /* If total sent is selected */ + if (_showSend) { + y += rowHeight; + _painter->setPen(SEND_COLOR); + _painter->drawText(x, y, + tr("Sent: ") + totalToStr(_totalSend) + + " ("+tr("%1 KB/s").arg(_sendData->first(), 0, 'f', 2)+")"); + } +} + +/** Returns a formatted string with the correct size suffix. */ +QString +GraphFrame::totalToStr(qreal total) +{ + /* Determine the correct size suffix */ + if (total < 1024) { + /* Use KB suffix */ + return tr("%1 KB").arg(total, 0, 'f', 2); + } else if (total < 1048576) { + /* Use MB suffix */ + return tr("%1 MB").arg(total/1024.0, 0, 'f', 2); + } else { + /* Use GB suffix */ + return tr("%1 GB").arg(total/1048576.0, 0, 'f', 2); + } +} + +/** Paints the scale on the graph. */ +void +GraphFrame::paintScale() +{ + qreal markStep = _maxValue * .25; + int top = _rec.y(); + int bottom = _rec.height(); + qreal paintStep = (bottom - (bottom/10)) / 4; + + /* Draw the other marks in their correctly scaled locations */ + qreal scale; + qreal pos; + for (int i = 1; i < 5; i++) { + pos = bottom - (i * paintStep); + scale = i * markStep; + _painter->setPen(SCALE_COLOR); + _painter->drawText(QPointF(5, pos+FONT_SIZE), + tr("%1 KB/s").arg(scale, 0, 'f', 2)); + _painter->setPen(GRID_COLOR); + _painter->drawLine(QPointF(SCALE_WIDTH, pos), + QPointF(_rec.width(), pos)); + } + + /* Draw vertical separator */ + _painter->drawLine(SCALE_WIDTH, top, SCALE_WIDTH, bottom); +} + diff --git a/retroshare-gui/src/gui/graphframe.h b/retroshare-gui/src/gui/graphframe.h new file mode 100644 index 000000000..e2c87cea3 --- /dev/null +++ b/retroshare-gui/src/gui/graphframe.h @@ -0,0 +1,120 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2007, + * + * 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 _GRAPHFRAME_H +#define _GRAPHFRAME_H + +#include +#include +#include +#include +#include +#include + +#define HOR_SPC 2 /** Space between data points */ +#define SCALE_WIDTH 75 /** Width of the scale */ +#define MIN_SCALE 10 /** 10 kB/s is the minimum scale */ +#define SCROLL_STEP 4 /** Horizontal change on graph update */ + +#define BACK_COLOR Qt::black +#define SCALE_COLOR Qt::green +#define GRID_COLOR Qt::darkGreen +#define RECV_COLOR Qt::cyan +#define SEND_COLOR Qt::yellow + +#define FONT_SIZE 11 + + +class GraphFrame : public QFrame +{ + Q_OBJECT + +public: + /** Bandwidth graph style. */ + enum GraphStyle { + SolidLine = 0, /**< Plot bandwidth as solid lines. */ + AreaGraph /**< Plot bandwidth as alpha blended area graphs. */ + }; + + /** Default Constructor */ + GraphFrame(QWidget *parent = 0); + /** Default Destructor */ + ~GraphFrame(); + + /** Add data points. */ + void addPoints(qreal recv, qreal send); + /** Clears the graph. */ + void resetGraph(); + /** Toggles display of data counters. */ + void setShowCounters(bool showRecv, bool showSend); + /** Sets the graph style used to display bandwidth data. */ + void setGraphStyle(GraphStyle style) { _graphStyle = style; } + +protected: + /** Overloaded QWidget::paintEvent() */ + void paintEvent(QPaintEvent *event); + +private: + /** Gets the width of the desktop, the max # of points. */ + int getNumPoints(); + + /** Paints an integral and an outline of that integral for each data set + * (send and/or receive) that is to be displayed. */ + void paintData(); + /** Paints the send/receive totals. */ + void paintTotals(); + /** Paints the scale in the graph. */ + void paintScale(); + /** Returns a formatted string representation of total. */ + QString totalToStr(qreal total); + /** Returns a list of points on the bandwidth graph based on the supplied set + * of send or receive values. */ + QVector pointsFromData(QList* list); + /** Paints a line with the data in points. */ + void paintLine(QVector points, QColor color, + Qt::PenStyle lineStyle = Qt::SolidLine); + /** Paints an integral using the supplied data. */ + void paintIntegral(QVector points, QColor color, qreal alpha = 1.0); + + /** Style with which the bandwidth data will be graphed. */ + GraphStyle _graphStyle; + /** A QPainter object that handles drawing the various graph elements. */ + QPainter* _painter; + /** Holds the received data points. */ + QList *_recvData; + /** Holds the sent data points. */ + QList *_sendData; + /** The current dimensions of the graph. */ + QRect _rec; + /** The maximum data value plotted. */ + qreal _maxValue; + /** The maximum number of points to store. */ + int _maxPoints; + /** The total data sent/recv. */ + qreal _totalSend; + qreal _totalRecv; + /** Show the respective lines and counters. */ + bool _showRecv; + bool _showSend; +}; + +#endif diff --git a/retroshare-gui/src/gui/help/authors.html b/retroshare-gui/src/gui/help/authors.html new file mode 100644 index 000000000..7143646ae --- /dev/null +++ b/retroshare-gui/src/gui/help/authors.html @@ -0,0 +1,49 @@ + + + + + authors + + + + +

    + +

    The RetroShare Team:

    + +

    + +

    Lead Developers:

    + +

    defnax, drbob7

    + +

    Search/Channels Team:

    + +

    libris, kashifkaleem

    + +

    OpenPGP Team:

    + +

    dr_doon, pepy, sktan, shiva

    + +

    TLV Serialiser:

    + +

    chrisparker126, paolomaldini

    + +

    The Release Team:

    + +

    notdefine, agent725, the_mgt

    + +

    New GUI Developers:

    + +

    kernelpanix, mollitz,

    + +

    Occasional Developers:

    + +

    zhouk, bmeck

    + +

    From Other Projects:

    + +

    noragen, dolfcao

    + + diff --git a/retroshare-gui/src/gui/help/licence.html b/retroshare-gui/src/gui/help/licence.html new file mode 100644 index 000000000..4ce067118 --- /dev/null +++ b/retroshare-gui/src/gui/help/licence.html @@ -0,0 +1,354 @@ + + + + + + licence + + + + +

    Retroshare's Licences

    + +

    All of Retroshare's Code is available freely under open source licences, +

    + +

    However the software does not fall exclusively under one licence.

    + +

    libretroshare : (the core library)

    + +

    Is licenced under the LGPL (Gnu Library General Public Licence)

    + +

    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html

    + +

    This library also depends on:

    +
      +
    1. miniupnpc: BSD Licence
    2. +
    3. OpenSSL: OpenSSL Licence.
    4. +
    5. GPGme: LGPL Licence.
    6. +
    7. KadC : GPL Licence.
    8. +
    + +

    Retroshare GUI and Applications

    + +

    These are generally licenced under the GPL (Gnu General Public Licence)

    + +

    http://www.gnu.org/licenses/gpl.html

    + +

    And are built on top of Trolltech's Qt Libraries.

    + +

    + +

    + +

    GNU GENERAL PUBLIC LICENSE

    + +

    Version 2, June 1991

    + +

    + +

    Copyright (C) 1989, 1991 Free Software Foundation, Inc.

    + +

    51 Franklin Steet, Fifth Floor, Boston, MA 02111-1307 USA

    + +

    Everyone is permitted to copy and distribute verbatim copies

    + +

    of this license document, but changing it is not allowed.

    + +

    + +

    Preamble

    + +

    + +

    The licenses for most software are designed to take away your freedom to +share and change it. By contrast, the GNU General Public License is intended +to guarantee your freedom to share and change free software--to make sure the +software is free for all its users. This General Public License applies to +most of the Free Software Foundation's software and to any other program +whose authors commit to using it. (Some other Free Software Foundation +software is covered by the GNU Library General Public License instead.) You +can apply it to your programs, too.

    + +

    When we speak of free software, we are referring to freedom, not price. +Our General Public Licenses are designed to make sure that you have the +freedom to distribute copies of free software (and charge for this service if +you wish), that you receive source code or can get it if you want it, that +you can change the software or use pieces of it in new free programs; and +that you know you can do these things.

    + +

    To protect your rights, we need to make restrictions that forbid anyone to +deny you these rights or to ask you to surrender the rights. These +restrictions translate to certain responsibilities for you if you distribute +copies of the software, or if you modify it.

    + +

    For example, if you distribute copies of such a program, whether gratis or +for a fee, you must give the recipients all the rights that you have. You +must make sure that they, too, receive or can get the source code. And you +must show them these terms so they know their rights.

    + +

    We protect your rights with two steps: (1) copyright the software, and (2) +offer you this license which gives you legal permission to copy, distribute +and/or modify the software.

    + +

    Also, for each author's protection and ours, we want to make certain that +everyone understands that there is no warranty for this free software. If the +software is modified by someone else and passed on, we want its recipients to +know that what they have is not the original, so that any problems introduced +by others will not reflect on the original authors' reputations.

    + +

    Finally, any free program is threatened constantly by software patents. We +wish to avoid the danger that redistributors of a free program will +individually obtain patent licenses, in effect making the program +proprietary. To prevent this, we have made it clear that any patent must be +licensed for everyone's free use or not licensed at all.

    + +

    The precise terms and conditions for copying, distribution and +modification follow.

    + +

    + +

    GNU GENERAL PUBLIC LICENSE

    + +

    TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

    + +

    + +

    0. This License applies to any program or other work which contains a +notice placed by the copyright holder saying it may be distributed under the +terms of this General Public License. The "Program", below, refers to any +such program or work, and a "work based on the Program" means either the +Program or any derivative work under copyright law: that is to say, a work +containing the Program or a portion of it, either verbatim or with +modifications and/or translated into another language. (Hereinafter, +translation is included without limitation in the term "modification".) Each +licensee is addressed as "you".

    + +

    Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of running the +Program is not restricted, and the output from the Program is covered only if +its contents constitute a work based on the Program (independent of having +been made by running the Program). Whether that is true depends on what the +Program does.

    + +

    + +

    1. You may copy and distribute verbatim copies of the Program's source +code as you receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice and +disclaimer of warranty; keep intact all the notices that refer to this +License and to the absence of any warranty; and give any other recipients of +the Program a copy of this License along with the Program.

    + +

    You may charge a fee for the physical act of transferring a copy, and you +may at your option offer warranty protection in exchange for a fee.

    + +

    + +

    2. You may modify your copy or copies of the Program or any portion of it, +thus forming a work based on the Program, and copy and distribute such +modifications or work under the terms of Section 1 above, provided that you +also meet all of these conditions:

    + +

    a) You must cause the modified files to carry prominent notices stating +that you changed the files and the date of any change.

    + +

    b) You must cause any work that you distribute or publish, that in whole +or in part contains or is derived from the Program or any part thereof, to be +licensed as a whole at no charge to all third parties under the terms of this +License.

    + +

    c) If the modified program normally reads commands interactively when run, +you must cause it, when started running for such interactive use in the most +ordinary way, to print or display an announcement including an appropriate +copyright notice and a notice that there is no warranty (or else, saying that +you provide a warranty) and that users may redistribute the program under +these conditions, and telling the user how to view a copy of this License. +(Exception: if the Program itself is interactive but does not normally print +such an announcement, your work based on the Program is not required to print +an announcement.)

    + +

    These requirements apply to the modified work as a whole. If identifiable +sections of that work are not derived from the Program, and can be reasonably +considered independent and separate works in themselves, then this License, +and its terms, do not apply to those sections when you distribute them as +separate works. But when you distribute the same sections as part of a whole +which is a work based on the Program, the distribution of the whole must be +on the terms of this License, whose permissions for other licensees extend to +the entire whole, and thus to each and every part regardless of who wrote +it.

    + +

    Thus, it is not the intent of this section to claim rights or contest your +rights to work written entirely by you; rather, the intent is to exercise the +right to control the distribution of derivative or collective works based on +the Program.

    + +

    In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of a +storage or distribution medium does not bring the other work under the scope +of this License.

    + +

    + +

    3. You may copy and distribute the Program (or a work based on it, under +Section 2) in object code or executable form under the terms of Sections 1 +and 2 above provided that you also do one of the following:

    + +

    a) Accompany it with the complete corresponding machine-readable source +code, which must be distributed under the terms of Sections 1 and 2 above on +a medium customarily used for software interchange; or,

    + +

    b) Accompany it with a written offer, valid for at least three years, to +give any third party, for a charge no more than your cost of physically +performing source distribution, a complete machine-readable copy of the +corresponding source code, to be distributed under the terms of Sections 1 +and 2 above on a medium customarily used for software interchange; or,

    + +

    c) Accompany it with the information you received as to the offer to +distribute corresponding source code. (This alternative is allowed only for +noncommercial distribution and only if you received the program in object +code or executable form with such an offer, in accord with Subsection b +above.)

    + +

    The source code for a work means the preferred form of the work for making +modifications to it. For an executable work, complete source code means all +the source code for all modules it contains, plus any associated interface +definition files, plus the scripts used to control compilation and +installation of the executable. However, as a special exception, the source +code distributed need not include anything that is normally distributed (in +either source or binary form) with the major components (compiler, kernel, +and so on) of the operating system on which the executable runs, unless that +component itself accompanies the executable.

    + +

    If distribution of executable or object code is made by offering access to +copy from a designated place, then offering equivalent access to copy the +source code from the same place counts as distribution of the source code, +even though third parties are not compelled to copy the source along with the +object code.

    + +

    + +

    4. You may not copy, modify, sublicense, or distribute the Program except +as expressly provided under this License. Any attempt otherwise to copy, +modify, sublicense or distribute the Program is void, and will automatically +terminate your rights under this License. However, parties who have received +copies, or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance.

    + +

    + +

    5. You are not required to accept this License, since you have not signed +it. However, nothing else grants you permission to modify or distribute the +Program or its derivative works. These actions are prohibited by law if you +do not accept this License. Therefore, by modifying or distributing the +Program (or any work based on the Program), you indicate your acceptance of +this License to do so, and all its terms and conditions for copying, +distributing or modifying the Program or works based on it.

    + +

    + +

    6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the original +licensor to copy, distribute or modify the Program subject to these terms and +conditions. You may not impose any further restrictions on the recipients' +exercise of the rights granted herein. You are not responsible for enforcing +compliance by third parties to this License.

    + +

    + +

    7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not excuse +you from the conditions of this License. If you cannot distribute so as to +satisfy simultaneously your obligations under this License and any other +pertinent obligations, then as a consequence you may not distribute the +Program at all. For example, if a patent license would not permit +royalty-free redistribution of the Program by all those who receive copies +directly or indirectly through you, then the only way you could satisfy both +it and this License would be to refrain entirely from distribution of the +Program.

    + +

    If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply and +the section as a whole is intended to apply in other circumstances.

    + +

    It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any such +claims; this section has the sole purpose of protecting the integrity of the +free software distribution system, which is implemented by public license +practices. Many people have made generous contributions to the wide range of +software distributed through that system in reliance on consistent +application of that system; it is up to the author/donor to decide if he or +she is willing to distribute software through any other system and a licensee +cannot impose that choice.

    + +

    This section is intended to make thoroughly clear what is believed to be a +consequence of the rest of this License.

    + +

    + +

    8. If the distribution and/or use of the Program is restricted in certain +countries either by patents or by copyrighted interfaces, the original +copyright holder who places the Program under this License may add an +explicit geographical distribution limitation excluding those countries, so +that distribution is permitted only in or among countries not thus excluded. +In such case, this License incorporates the limitation as if written in the +body of this License.

    + +

    + +

    9. The Free Software Foundation may publish revised and/or new versions of +the General Public License from time to time. Such new versions will be +similar in spirit to the present version, but may differ in detail to address +new problems or concerns.

    + +

    Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any later +version", you have the option of following the terms and conditions either of +that version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of this License, +you may choose any version ever published by the Free Software Foundation.

    + +

    + +

    10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author to +ask for permission. For software which is copyrighted by the Free Software +Foundation, write to the Free Software Foundation; we sometimes make +exceptions for this. Our decision will be guided by the two goals of +preserving the free status of all derivatives of our free software and of +promoting the sharing and reuse of software generally.

    + +

    + +

    NO WARRANTY

    + +

    11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR +IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO +THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM +PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR +CORRECTION.

    + +

    + +

    12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO +LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR +THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES.

    + +

    END OF TERMS AND CONDITIONS

    + + diff --git a/retroshare-gui/src/gui/help/thanks.html b/retroshare-gui/src/gui/help/thanks.html new file mode 100644 index 000000000..dab996591 --- /dev/null +++ b/retroshare-gui/src/gui/help/thanks.html @@ -0,0 +1,45 @@ + + + + + + thanks + + + + +

    + +

    Thanks to all the developers and supporters of open-source software.

    + +

    + +

    We are especially indebted to the the authors of several key packages - +which we rely on:

    + +

    + +

    The Linux Kernel and Gnu Compiler Tools.

    + +

    OpenSSL and OpenPGP for security.

    + +

    Qt for a nice GUI.

    + +

    KadC for a DHT interface.

    + +

    miniupnpc for uPnP interface.

    + +

    + +

    + +

    + +

    + +

    + +

    + + diff --git a/retroshare-gui/src/gui/images.qrc b/retroshare-gui/src/gui/images.qrc new file mode 100644 index 000000000..f751a1901 --- /dev/null +++ b/retroshare-gui/src/gui/images.qrc @@ -0,0 +1,213 @@ + + + images/RetroShare16.png + images/rs-2.png + images/rstray3.png + images/smplayer_icon32.png + images/retrosharelogo1.png + images/retrosharelogo2.png + images/logobar/rslogo2.png + images/add-friend24.png + images/add-share24.png + images/add_24x24.png + images/advsearch_24x24.png + images/amsn.png + images/amsn16.png + images/attachment.png + images/avatar_background.png + images/backgroundimage.png + images/chat.png + images/chat/bar_end.png + images/chat/bar_fill.png + images/chat/chat_emoticon_button.png + images/chat/chat_emoticon_button_on.png + images/chat/chat_send.png + images/chat/font_bold.png + images/chat/font_bold_on.png + images/chat/font_italic.png + images/chat/font_italic_on.png + images/chat/font_underline.png + images/chat/font_underline_on.png + images/chat/hide_avatar_frame.png + images/chat/show_avatar_frame.png + images/chats_24x24.png + images/close-down.png + images/close_normal.png + images/console-small-down.png + images/console-small-hover.png + images/console-small-up.png + images/contract_hover.png + images/dadd.png + images/dauthed.png + images/daway.png + images/dbrb.png + images/dbusy.png + images/dchat.png + images/ddeny.png + images/delete.png + images/deleteall.png + images/deletemail-hover.png + images/deletemail-pressed.png + images/deletemail24.png + images/dhidden.png + images/directoryadd_24x24_shadow.png + images/directoryremove_24x24_shadow.png + images/directoryselect_24x24_shadow.png + images/dlunch.png + images/donline.png + images/down.png + images/down_24x24.png + images/dphone.png + images/edit-bold.png + images/edit-italic.png + images/edit-underline.png + images/encrypted16.png + images/encrypted48.png + images/evolution.png + images/exit_24x24.png + images/expand_hover.png + images/exportpeers_16x16.png + images/filefind.png + images/fileinfo.png + images/find.png + images/flags/af.png + images/flags/cn.png + images/flags/de.png + images/flags/dk.png + images/flags/en.png + images/flags/es.png + images/flags/fi.png + images/flags/fr.png + images/flags/gr.png + images/flags/it.png + images/flags/jp.png + images/flags/kr.png + images/flags/pl.png + images/flags/pt.png + images/flags/ru.png + images/flags/sl.png + images/flags/tr.png + images/flags/cn_trad.png + images/flags/cn_simp.pngse.png + images/flags/se.png + images/folder-draft.png + images/folder-draft24-hover.png + images/folder-draft24.png + images/folder-draft24-pressed.png + images/folder-inbox.png + images/folder-outbox.png + images/folder-sent.png + images/folder_doments.png + images/folder_green.png + images/folder_green16.png + images/graph-area.png + images/graph-line.png + images/hide_toolbox_frame.png + images/info16.png + images/informations_24x24.png + images/invite-friend24.png + images/konsole.png + images/ksysguard.png + images/ktorrent.png + images/loadcert16.png + images/locale.png + images/logobar/logo_bar_fill.png + images/logobar/logo_bar_start.png + images/logobar/rslogo.png + images/mail_delete.png + images/mail_get.png + images/mail_reply.png + images/mail_send.png + images/message-news.png + images/message.png + images/messenger.png + images/message-mail.png + images/mystatus_bg.png + images/network.png + images/network16.png + images/network32.png + images/new-account.png + images/new-contact.png + images/new-mail-alert.png + images/nopic.png + images/peerdetails_16x16.png + images/peers_16x16.png + images/peers_24x24.png + images/removefriend16.png + images/replymail24-hover.png + images/replymail24.png + images/replymail-pressed.png + images/reset.png + images/retro4.png + images/rsmessenger16.png + images/rsmessenger32.png + images/send24.png + images/settings.png + images/settings16.png + images/show_toolbox_frame.png + images/start.png + images/startall.png + images/toaster/chat.png + images/toaster/hangup.png + images/toaster/pickup.png + images/toaster/toaster-background.png + images/toaster/toaster-backrs3.png + images/toaster/toaster-backrs4.png + images/up.png + images/download.png + images/webcache_24x24.png + images/FileTypeArchive.png + images/FileTypeAudio.png + images/FileTypeCDImage.png + images/FileTypeDocument.png + images/FileTypePicture.png + images/FileTypeProgram.png + images/FileTypeVideo.png + images/FileTypeAny.png + images/kbackgammon.png + layouts/default.ui +######################### Internalised QStyleSheets + qss/default.qss + qss/default/retrotoolbar.png +######################### Arachnophobia StyleSheet. + qss/arachnophobia.qss + qss/arachnophobia/background.png +######################### Black StyleSheet. + qss/black.qss + qss/black/backgroundblack.png + qss/black/border.png + qss/black/button.png + qss/black/button_hover.png + qss/black/button_pressed.png + qss/black/checkBox.png + qss/black/checkBox_hover.png + qss/black/checkBox_selected.png + qss/black/checkBox_hoverAndSelected.png +######################### Blue StyleSheet. + qss/blue.qss + qss/blue/blue.png +######################### ed2k StyleSheet. + qss/ed2k.qss + qss/ed2k/backed2k.png + qss/ed2k/little-back.png + qss/ed2k/button-down.png + qss/ed2k/button-up.png + qss/ed2k/button-hover.png +######################### over StyleSheet. + qss/over.qss + qss/over/backover.png + qss/over/greenbot.png + qss/over/greenhover.png + qss/over/greentop.png +######################### Silver StyleSheet. + qss/silver.qss + qss/silver/silver.png +######################### Skin2 StyleSheet. + qss/skin2.qss + qss/skin2/background.png +######################### Help Pages. + help/authors.html + help/thanks.html + help/licence.html + + diff --git a/retroshare-gui/src/gui/images/COPYING b/retroshare-gui/src/gui/images/COPYING new file mode 100644 index 000000000..c6b1bb9c9 --- /dev/null +++ b/retroshare-gui/src/gui/images/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Steet, Fifth Floor, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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 Steet, Fifth Floor, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/retroshare-gui/src/gui/images/Eterm.png b/retroshare-gui/src/gui/images/Eterm.png new file mode 100644 index 000000000..b2027f5a9 Binary files /dev/null and b/retroshare-gui/src/gui/images/Eterm.png differ diff --git a/retroshare-gui/src/gui/images/FileTypeAny.png b/retroshare-gui/src/gui/images/FileTypeAny.png new file mode 100644 index 000000000..34e64b73c Binary files /dev/null and b/retroshare-gui/src/gui/images/FileTypeAny.png differ diff --git a/retroshare-gui/src/gui/images/FileTypeArchive.png b/retroshare-gui/src/gui/images/FileTypeArchive.png new file mode 100644 index 000000000..b982beb6c Binary files /dev/null and b/retroshare-gui/src/gui/images/FileTypeArchive.png differ diff --git a/retroshare-gui/src/gui/images/FileTypeAudio.png b/retroshare-gui/src/gui/images/FileTypeAudio.png new file mode 100644 index 000000000..988b27bf7 Binary files /dev/null and b/retroshare-gui/src/gui/images/FileTypeAudio.png differ diff --git a/retroshare-gui/src/gui/images/FileTypeCDImage.png b/retroshare-gui/src/gui/images/FileTypeCDImage.png new file mode 100644 index 000000000..cb3ae8289 Binary files /dev/null and b/retroshare-gui/src/gui/images/FileTypeCDImage.png differ diff --git a/retroshare-gui/src/gui/images/FileTypeDocument.png b/retroshare-gui/src/gui/images/FileTypeDocument.png new file mode 100644 index 000000000..41d20a5c3 Binary files /dev/null and b/retroshare-gui/src/gui/images/FileTypeDocument.png differ diff --git a/retroshare-gui/src/gui/images/FileTypePicture.png b/retroshare-gui/src/gui/images/FileTypePicture.png new file mode 100644 index 000000000..7e9bb14f6 Binary files /dev/null and b/retroshare-gui/src/gui/images/FileTypePicture.png differ diff --git a/retroshare-gui/src/gui/images/FileTypeProgram.png b/retroshare-gui/src/gui/images/FileTypeProgram.png new file mode 100644 index 000000000..63b9f6c32 Binary files /dev/null and b/retroshare-gui/src/gui/images/FileTypeProgram.png differ diff --git a/retroshare-gui/src/gui/images/FileTypeVideo.png b/retroshare-gui/src/gui/images/FileTypeVideo.png new file mode 100644 index 000000000..9bcc41b78 Binary files /dev/null and b/retroshare-gui/src/gui/images/FileTypeVideo.png differ diff --git a/retroshare-gui/src/gui/images/Login Manager.png b/retroshare-gui/src/gui/images/Login Manager.png new file mode 100644 index 000000000..37371456c Binary files /dev/null and b/retroshare-gui/src/gui/images/Login Manager.png differ diff --git a/retroshare-gui/src/gui/images/RetroShare16.png b/retroshare-gui/src/gui/images/RetroShare16.png new file mode 100644 index 000000000..60c7c5da5 Binary files /dev/null and b/retroshare-gui/src/gui/images/RetroShare16.png differ diff --git a/retroshare-gui/src/gui/images/add-friend24.png b/retroshare-gui/src/gui/images/add-friend24.png new file mode 100644 index 000000000..30c2dbc06 Binary files /dev/null and b/retroshare-gui/src/gui/images/add-friend24.png differ diff --git a/retroshare-gui/src/gui/images/add-share24.png b/retroshare-gui/src/gui/images/add-share24.png new file mode 100644 index 000000000..031542f51 Binary files /dev/null and b/retroshare-gui/src/gui/images/add-share24.png differ diff --git a/retroshare-gui/src/gui/images/add_24x24.png b/retroshare-gui/src/gui/images/add_24x24.png new file mode 100644 index 000000000..bbf64ca18 Binary files /dev/null and b/retroshare-gui/src/gui/images/add_24x24.png differ diff --git a/retroshare-gui/src/gui/images/advsearch_24x24.png b/retroshare-gui/src/gui/images/advsearch_24x24.png new file mode 100644 index 000000000..94182e8fe Binary files /dev/null and b/retroshare-gui/src/gui/images/advsearch_24x24.png differ diff --git a/retroshare-gui/src/gui/images/amsn.png b/retroshare-gui/src/gui/images/amsn.png new file mode 100644 index 000000000..dd1572626 Binary files /dev/null and b/retroshare-gui/src/gui/images/amsn.png differ diff --git a/retroshare-gui/src/gui/images/amsn16.png b/retroshare-gui/src/gui/images/amsn16.png new file mode 100644 index 000000000..54edfb50e Binary files /dev/null and b/retroshare-gui/src/gui/images/amsn16.png differ diff --git a/retroshare-gui/src/gui/images/attachment.png b/retroshare-gui/src/gui/images/attachment.png new file mode 100644 index 000000000..89842af21 Binary files /dev/null and b/retroshare-gui/src/gui/images/attachment.png differ diff --git a/retroshare-gui/src/gui/images/avatar_background.png b/retroshare-gui/src/gui/images/avatar_background.png new file mode 100644 index 000000000..a26219a05 Binary files /dev/null and b/retroshare-gui/src/gui/images/avatar_background.png differ diff --git a/retroshare-gui/src/gui/images/backgroundimage.png b/retroshare-gui/src/gui/images/backgroundimage.png new file mode 100644 index 000000000..f67e5176f Binary files /dev/null and b/retroshare-gui/src/gui/images/backgroundimage.png differ diff --git a/retroshare-gui/src/gui/images/chat.png b/retroshare-gui/src/gui/images/chat.png new file mode 100644 index 000000000..70c84cc17 Binary files /dev/null and b/retroshare-gui/src/gui/images/chat.png differ diff --git a/retroshare-gui/src/gui/images/chat/bar_end.png b/retroshare-gui/src/gui/images/chat/bar_end.png new file mode 100644 index 000000000..6533362ec Binary files /dev/null and b/retroshare-gui/src/gui/images/chat/bar_end.png differ diff --git a/retroshare-gui/src/gui/images/chat/bar_fill.png b/retroshare-gui/src/gui/images/chat/bar_fill.png new file mode 100644 index 000000000..2902f4129 Binary files /dev/null and b/retroshare-gui/src/gui/images/chat/bar_fill.png differ diff --git a/retroshare-gui/src/gui/images/chat/chat_emoticon_button.png b/retroshare-gui/src/gui/images/chat/chat_emoticon_button.png new file mode 100644 index 000000000..82f539602 Binary files /dev/null and b/retroshare-gui/src/gui/images/chat/chat_emoticon_button.png differ diff --git a/retroshare-gui/src/gui/images/chat/chat_emoticon_button_on.png b/retroshare-gui/src/gui/images/chat/chat_emoticon_button_on.png new file mode 100644 index 000000000..9925163d0 Binary files /dev/null and b/retroshare-gui/src/gui/images/chat/chat_emoticon_button_on.png differ diff --git a/retroshare-gui/src/gui/images/chat/chat_send.png b/retroshare-gui/src/gui/images/chat/chat_send.png new file mode 100644 index 000000000..22a96927f Binary files /dev/null and b/retroshare-gui/src/gui/images/chat/chat_send.png differ diff --git a/retroshare-gui/src/gui/images/chat/font_bold.png b/retroshare-gui/src/gui/images/chat/font_bold.png new file mode 100644 index 000000000..381277e75 Binary files /dev/null and b/retroshare-gui/src/gui/images/chat/font_bold.png differ diff --git a/retroshare-gui/src/gui/images/chat/font_bold_on.png b/retroshare-gui/src/gui/images/chat/font_bold_on.png new file mode 100644 index 000000000..1ef72ffff Binary files /dev/null and b/retroshare-gui/src/gui/images/chat/font_bold_on.png differ diff --git a/retroshare-gui/src/gui/images/chat/font_color.png b/retroshare-gui/src/gui/images/chat/font_color.png new file mode 100644 index 000000000..542c6ff1d Binary files /dev/null and b/retroshare-gui/src/gui/images/chat/font_color.png differ diff --git a/retroshare-gui/src/gui/images/chat/font_color_on.png b/retroshare-gui/src/gui/images/chat/font_color_on.png new file mode 100644 index 000000000..ee074023f Binary files /dev/null and b/retroshare-gui/src/gui/images/chat/font_color_on.png differ diff --git a/retroshare-gui/src/gui/images/chat/font_italic.png b/retroshare-gui/src/gui/images/chat/font_italic.png new file mode 100644 index 000000000..a241d9868 Binary files /dev/null and b/retroshare-gui/src/gui/images/chat/font_italic.png differ diff --git a/retroshare-gui/src/gui/images/chat/font_italic_on.png b/retroshare-gui/src/gui/images/chat/font_italic_on.png new file mode 100644 index 000000000..adc8a8abd Binary files /dev/null and b/retroshare-gui/src/gui/images/chat/font_italic_on.png differ diff --git a/retroshare-gui/src/gui/images/chat/font_police.png b/retroshare-gui/src/gui/images/chat/font_police.png new file mode 100644 index 000000000..f5c7d9d53 Binary files /dev/null and b/retroshare-gui/src/gui/images/chat/font_police.png differ diff --git a/retroshare-gui/src/gui/images/chat/font_police_on.png b/retroshare-gui/src/gui/images/chat/font_police_on.png new file mode 100644 index 000000000..e73c7e5c3 Binary files /dev/null and b/retroshare-gui/src/gui/images/chat/font_police_on.png differ diff --git a/retroshare-gui/src/gui/images/chat/font_underline.png b/retroshare-gui/src/gui/images/chat/font_underline.png new file mode 100644 index 000000000..7e2663d94 Binary files /dev/null and b/retroshare-gui/src/gui/images/chat/font_underline.png differ diff --git a/retroshare-gui/src/gui/images/chat/font_underline_on.png b/retroshare-gui/src/gui/images/chat/font_underline_on.png new file mode 100644 index 000000000..8e18a4f92 Binary files /dev/null and b/retroshare-gui/src/gui/images/chat/font_underline_on.png differ diff --git a/retroshare-gui/src/gui/images/chat/hide_avatar_frame.png b/retroshare-gui/src/gui/images/chat/hide_avatar_frame.png new file mode 100644 index 000000000..e1d9351ce Binary files /dev/null and b/retroshare-gui/src/gui/images/chat/hide_avatar_frame.png differ diff --git a/retroshare-gui/src/gui/images/chat/show_avatar_frame.png b/retroshare-gui/src/gui/images/chat/show_avatar_frame.png new file mode 100644 index 000000000..a54a4e74a Binary files /dev/null and b/retroshare-gui/src/gui/images/chat/show_avatar_frame.png differ diff --git a/retroshare-gui/src/gui/images/chats_24x24.png b/retroshare-gui/src/gui/images/chats_24x24.png new file mode 100644 index 000000000..cdf12ca35 Binary files /dev/null and b/retroshare-gui/src/gui/images/chats_24x24.png differ diff --git a/retroshare-gui/src/gui/images/close-down.png b/retroshare-gui/src/gui/images/close-down.png new file mode 100644 index 000000000..d73012fa2 Binary files /dev/null and b/retroshare-gui/src/gui/images/close-down.png differ diff --git a/retroshare-gui/src/gui/images/close_normal.png b/retroshare-gui/src/gui/images/close_normal.png new file mode 100644 index 000000000..58cd07eb2 Binary files /dev/null and b/retroshare-gui/src/gui/images/close_normal.png differ diff --git a/retroshare-gui/src/gui/images/console-big-down.png b/retroshare-gui/src/gui/images/console-big-down.png new file mode 100644 index 000000000..4ffbbcf84 Binary files /dev/null and b/retroshare-gui/src/gui/images/console-big-down.png differ diff --git a/retroshare-gui/src/gui/images/console-big-hover.png b/retroshare-gui/src/gui/images/console-big-hover.png new file mode 100644 index 000000000..a5163017f Binary files /dev/null and b/retroshare-gui/src/gui/images/console-big-hover.png differ diff --git a/retroshare-gui/src/gui/images/console-big-up.png b/retroshare-gui/src/gui/images/console-big-up.png new file mode 100644 index 000000000..c88112c81 Binary files /dev/null and b/retroshare-gui/src/gui/images/console-big-up.png differ diff --git a/retroshare-gui/src/gui/images/console-small-down.png b/retroshare-gui/src/gui/images/console-small-down.png new file mode 100644 index 000000000..4c5fa594f Binary files /dev/null and b/retroshare-gui/src/gui/images/console-small-down.png differ diff --git a/retroshare-gui/src/gui/images/console-small-hover.png b/retroshare-gui/src/gui/images/console-small-hover.png new file mode 100644 index 000000000..9dfb61454 Binary files /dev/null and b/retroshare-gui/src/gui/images/console-small-hover.png differ diff --git a/retroshare-gui/src/gui/images/console-small-up.png b/retroshare-gui/src/gui/images/console-small-up.png new file mode 100644 index 000000000..551d3f923 Binary files /dev/null and b/retroshare-gui/src/gui/images/console-small-up.png differ diff --git a/retroshare-gui/src/gui/images/contract_hover.png b/retroshare-gui/src/gui/images/contract_hover.png new file mode 100644 index 000000000..35e7d0d56 Binary files /dev/null and b/retroshare-gui/src/gui/images/contract_hover.png differ diff --git a/retroshare-gui/src/gui/images/dadd.png b/retroshare-gui/src/gui/images/dadd.png new file mode 100644 index 000000000..60d066dc7 Binary files /dev/null and b/retroshare-gui/src/gui/images/dadd.png differ diff --git a/retroshare-gui/src/gui/images/dask.png b/retroshare-gui/src/gui/images/dask.png new file mode 100644 index 000000000..3066a2693 Binary files /dev/null and b/retroshare-gui/src/gui/images/dask.png differ diff --git a/retroshare-gui/src/gui/images/dauthed.png b/retroshare-gui/src/gui/images/dauthed.png new file mode 100644 index 000000000..106963d67 Binary files /dev/null and b/retroshare-gui/src/gui/images/dauthed.png differ diff --git a/retroshare-gui/src/gui/images/daway.png b/retroshare-gui/src/gui/images/daway.png new file mode 100644 index 000000000..59240c220 Binary files /dev/null and b/retroshare-gui/src/gui/images/daway.png differ diff --git a/retroshare-gui/src/gui/images/dblocked.png b/retroshare-gui/src/gui/images/dblocked.png new file mode 100644 index 000000000..1a3392ebf Binary files /dev/null and b/retroshare-gui/src/gui/images/dblocked.png differ diff --git a/retroshare-gui/src/gui/images/dblocked_off.png b/retroshare-gui/src/gui/images/dblocked_off.png new file mode 100644 index 000000000..971d3a45a Binary files /dev/null and b/retroshare-gui/src/gui/images/dblocked_off.png differ diff --git a/retroshare-gui/src/gui/images/dbrb.png b/retroshare-gui/src/gui/images/dbrb.png new file mode 100644 index 000000000..59240c220 Binary files /dev/null and b/retroshare-gui/src/gui/images/dbrb.png differ diff --git a/retroshare-gui/src/gui/images/dbusy.png b/retroshare-gui/src/gui/images/dbusy.png new file mode 100644 index 000000000..9eb448352 Binary files /dev/null and b/retroshare-gui/src/gui/images/dbusy.png differ diff --git a/retroshare-gui/src/gui/images/dchat.png b/retroshare-gui/src/gui/images/dchat.png new file mode 100644 index 000000000..0102ab56d Binary files /dev/null and b/retroshare-gui/src/gui/images/dchat.png differ diff --git a/retroshare-gui/src/gui/images/ddeny.png b/retroshare-gui/src/gui/images/ddeny.png new file mode 100644 index 000000000..140d45914 Binary files /dev/null and b/retroshare-gui/src/gui/images/ddeny.png differ diff --git a/retroshare-gui/src/gui/images/delete.png b/retroshare-gui/src/gui/images/delete.png new file mode 100644 index 000000000..931ee1101 Binary files /dev/null and b/retroshare-gui/src/gui/images/delete.png differ diff --git a/retroshare-gui/src/gui/images/deleteall.png b/retroshare-gui/src/gui/images/deleteall.png new file mode 100644 index 000000000..a8f1dd4ec Binary files /dev/null and b/retroshare-gui/src/gui/images/deleteall.png differ diff --git a/retroshare-gui/src/gui/images/deletemail-hover.png b/retroshare-gui/src/gui/images/deletemail-hover.png new file mode 100644 index 000000000..87367bcc4 Binary files /dev/null and b/retroshare-gui/src/gui/images/deletemail-hover.png differ diff --git a/retroshare-gui/src/gui/images/deletemail-pressed.png b/retroshare-gui/src/gui/images/deletemail-pressed.png new file mode 100644 index 000000000..8d79b7e61 Binary files /dev/null and b/retroshare-gui/src/gui/images/deletemail-pressed.png differ diff --git a/retroshare-gui/src/gui/images/deletemail24.png b/retroshare-gui/src/gui/images/deletemail24.png new file mode 100644 index 000000000..b584ead3f Binary files /dev/null and b/retroshare-gui/src/gui/images/deletemail24.png differ diff --git a/retroshare-gui/src/gui/images/dhidden.png b/retroshare-gui/src/gui/images/dhidden.png new file mode 100644 index 000000000..13035ad85 Binary files /dev/null and b/retroshare-gui/src/gui/images/dhidden.png differ diff --git a/retroshare-gui/src/gui/images/dinactive.png b/retroshare-gui/src/gui/images/dinactive.png new file mode 100644 index 000000000..59240c220 Binary files /dev/null and b/retroshare-gui/src/gui/images/dinactive.png differ diff --git a/retroshare-gui/src/gui/images/directoryadd_24x24_shadow.png b/retroshare-gui/src/gui/images/directoryadd_24x24_shadow.png new file mode 100644 index 000000000..ca14db0a0 Binary files /dev/null and b/retroshare-gui/src/gui/images/directoryadd_24x24_shadow.png differ diff --git a/retroshare-gui/src/gui/images/directoryremove_24x24_shadow.png b/retroshare-gui/src/gui/images/directoryremove_24x24_shadow.png new file mode 100644 index 000000000..269bc9828 Binary files /dev/null and b/retroshare-gui/src/gui/images/directoryremove_24x24_shadow.png differ diff --git a/retroshare-gui/src/gui/images/directoryselect_24x24_shadow.png b/retroshare-gui/src/gui/images/directoryselect_24x24_shadow.png new file mode 100644 index 000000000..ad22ed11a Binary files /dev/null and b/retroshare-gui/src/gui/images/directoryselect_24x24_shadow.png differ diff --git a/retroshare-gui/src/gui/images/dlunch.png b/retroshare-gui/src/gui/images/dlunch.png new file mode 100644 index 000000000..59240c220 Binary files /dev/null and b/retroshare-gui/src/gui/images/dlunch.png differ diff --git a/retroshare-gui/src/gui/images/doffline.png b/retroshare-gui/src/gui/images/doffline.png new file mode 100644 index 000000000..bc6e8c35a Binary files /dev/null and b/retroshare-gui/src/gui/images/doffline.png differ diff --git a/retroshare-gui/src/gui/images/donline.png b/retroshare-gui/src/gui/images/donline.png new file mode 100644 index 000000000..cc4539fb1 Binary files /dev/null and b/retroshare-gui/src/gui/images/donline.png differ diff --git a/retroshare-gui/src/gui/images/down.png b/retroshare-gui/src/gui/images/down.png new file mode 100644 index 000000000..c005fe4ba Binary files /dev/null and b/retroshare-gui/src/gui/images/down.png differ diff --git a/retroshare-gui/src/gui/images/down_24x24.png b/retroshare-gui/src/gui/images/down_24x24.png new file mode 100644 index 000000000..3f6cf0e77 Binary files /dev/null and b/retroshare-gui/src/gui/images/down_24x24.png differ diff --git a/retroshare-gui/src/gui/images/download.png b/retroshare-gui/src/gui/images/download.png new file mode 100644 index 000000000..2a7788133 Binary files /dev/null and b/retroshare-gui/src/gui/images/download.png differ diff --git a/retroshare-gui/src/gui/images/dphone.png b/retroshare-gui/src/gui/images/dphone.png new file mode 100644 index 000000000..e1aa09ed0 Binary files /dev/null and b/retroshare-gui/src/gui/images/dphone.png differ diff --git a/retroshare-gui/src/gui/images/edit-bold.png b/retroshare-gui/src/gui/images/edit-bold.png new file mode 100644 index 000000000..a2c44d52d Binary files /dev/null and b/retroshare-gui/src/gui/images/edit-bold.png differ diff --git a/retroshare-gui/src/gui/images/edit-italic.png b/retroshare-gui/src/gui/images/edit-italic.png new file mode 100644 index 000000000..a0ab94570 Binary files /dev/null and b/retroshare-gui/src/gui/images/edit-italic.png differ diff --git a/retroshare-gui/src/gui/images/edit-underline.png b/retroshare-gui/src/gui/images/edit-underline.png new file mode 100644 index 000000000..98a1441e1 Binary files /dev/null and b/retroshare-gui/src/gui/images/edit-underline.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/angel.png b/retroshare-gui/src/gui/images/emoticons/angel.png new file mode 100644 index 000000000..8c33f8692 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/angel.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/angry.png b/retroshare-gui/src/gui/images/emoticons/angry.png new file mode 100644 index 000000000..8a6abc3b5 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/angry.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/ap.png b/retroshare-gui/src/gui/images/emoticons/ap.png new file mode 100644 index 000000000..e53fea386 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/ap.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/arrogant.png b/retroshare-gui/src/gui/images/emoticons/arrogant.png new file mode 100644 index 000000000..56f404acc Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/arrogant.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/asl.png b/retroshare-gui/src/gui/images/emoticons/asl.png new file mode 100644 index 000000000..40d78dbe6 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/asl.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/au.png b/retroshare-gui/src/gui/images/emoticons/au.png new file mode 100644 index 000000000..b02c10488 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/au.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/bad.png b/retroshare-gui/src/gui/images/emoticons/bad.png new file mode 100644 index 000000000..8a6abc3b5 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/bad.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/bat.png b/retroshare-gui/src/gui/images/emoticons/bat.png new file mode 100644 index 000000000..0fe94b2b0 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/bat.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/bearingteeth.png b/retroshare-gui/src/gui/images/emoticons/bearingteeth.png new file mode 100644 index 000000000..868bc332b Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/bearingteeth.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/beer.png b/retroshare-gui/src/gui/images/emoticons/beer.png new file mode 100644 index 000000000..5d6ccb5e3 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/beer.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/blank_look.png b/retroshare-gui/src/gui/images/emoticons/blank_look.png new file mode 100644 index 000000000..03d3762c8 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/blank_look.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/boy.png b/retroshare-gui/src/gui/images/emoticons/boy.png new file mode 100644 index 000000000..98134ac8f Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/boy.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/brb.png b/retroshare-gui/src/gui/images/emoticons/brb.png new file mode 100644 index 000000000..20e617c99 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/brb.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/cake.png b/retroshare-gui/src/gui/images/emoticons/cake.png new file mode 100644 index 000000000..3f986309c Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/cake.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/camera.png b/retroshare-gui/src/gui/images/emoticons/camera.png new file mode 100644 index 000000000..8ac2040b2 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/camera.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/cat.png b/retroshare-gui/src/gui/images/emoticons/cat.png new file mode 100644 index 000000000..0b5ea0d96 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/cat.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/ci.png b/retroshare-gui/src/gui/images/emoticons/ci.png new file mode 100644 index 000000000..b825b1c4d Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/ci.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/clock.png b/retroshare-gui/src/gui/images/emoticons/clock.png new file mode 100644 index 000000000..38563c8e3 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/clock.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/co.png b/retroshare-gui/src/gui/images/emoticons/co.png new file mode 100644 index 000000000..bf8e73ffe Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/co.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/cocktail.png b/retroshare-gui/src/gui/images/emoticons/cocktail.png new file mode 100644 index 000000000..8f5072434 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/cocktail.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/coins.png b/retroshare-gui/src/gui/images/emoticons/coins.png new file mode 100644 index 000000000..b6b233b5c Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/coins.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/confused.png b/retroshare-gui/src/gui/images/emoticons/confused.png new file mode 100644 index 000000000..277c7cb5a Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/confused.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/cry.png b/retroshare-gui/src/gui/images/emoticons/cry.png new file mode 100644 index 000000000..f7c1da9d7 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/cry.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/cup.png b/retroshare-gui/src/gui/images/emoticons/cup.png new file mode 100644 index 000000000..1da17f58a Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/cup.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/devil.png b/retroshare-gui/src/gui/images/emoticons/devil.png new file mode 100644 index 000000000..60ce3202a Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/devil.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/dog.png b/retroshare-gui/src/gui/images/emoticons/dog.png new file mode 100644 index 000000000..e5caa99ae Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/dog.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/dude_hug.png b/retroshare-gui/src/gui/images/emoticons/dude_hug.png new file mode 100644 index 000000000..773c719fb Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/dude_hug.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/dunno.png b/retroshare-gui/src/gui/images/emoticons/dunno.png new file mode 100644 index 000000000..e0d7a224c Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/dunno.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/embarrassed.png b/retroshare-gui/src/gui/images/emoticons/embarrassed.png new file mode 100644 index 000000000..277a7e38f Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/embarrassed.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/emblem-unreadable.png b/retroshare-gui/src/gui/images/emoticons/emblem-unreadable.png new file mode 100644 index 000000000..206df06a7 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/emblem-unreadable.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/envelope.png b/retroshare-gui/src/gui/images/emoticons/envelope.png new file mode 100644 index 000000000..dc34ea74e Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/envelope.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/eyeroll.png b/retroshare-gui/src/gui/images/emoticons/eyeroll.png new file mode 100644 index 000000000..a21d1ad5d Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/eyeroll.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/face-angel16.png b/retroshare-gui/src/gui/images/emoticons/face-angel16.png new file mode 100644 index 000000000..d2c5e940d Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/face-angel16.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/face-angel22.png b/retroshare-gui/src/gui/images/emoticons/face-angel22.png new file mode 100644 index 000000000..604bf17c6 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/face-angel22.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/face-angel48.png b/retroshare-gui/src/gui/images/emoticons/face-angel48.png new file mode 100644 index 000000000..50caecf4b Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/face-angel48.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/face-crying16.png b/retroshare-gui/src/gui/images/emoticons/face-crying16.png new file mode 100644 index 000000000..a7e3f49fb Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/face-crying16.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/face-crying22.png b/retroshare-gui/src/gui/images/emoticons/face-crying22.png new file mode 100644 index 000000000..349c50e5c Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/face-crying22.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/face-crying48.png b/retroshare-gui/src/gui/images/emoticons/face-crying48.png new file mode 100644 index 000000000..4c490ea0b Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/face-crying48.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/face-devil-grin16.png b/retroshare-gui/src/gui/images/emoticons/face-devil-grin16.png new file mode 100644 index 000000000..8e2cd4584 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/face-devil-grin16.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/face-devil-grin22.png b/retroshare-gui/src/gui/images/emoticons/face-devil-grin22.png new file mode 100644 index 000000000..b8670f226 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/face-devil-grin22.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/face-devil-grin48.png b/retroshare-gui/src/gui/images/emoticons/face-devil-grin48.png new file mode 100644 index 000000000..a3d5d4eef Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/face-devil-grin48.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/face-glasses16.png b/retroshare-gui/src/gui/images/emoticons/face-glasses16.png new file mode 100644 index 000000000..d13f2c8c7 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/face-glasses16.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/face-glasses22.png b/retroshare-gui/src/gui/images/emoticons/face-glasses22.png new file mode 100644 index 000000000..fc83f3f60 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/face-glasses22.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/face-glasses48.png b/retroshare-gui/src/gui/images/emoticons/face-glasses48.png new file mode 100644 index 000000000..501988f80 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/face-glasses48.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/face-kiss16.png b/retroshare-gui/src/gui/images/emoticons/face-kiss16.png new file mode 100644 index 000000000..809c1cf77 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/face-kiss16.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/face-kiss22.png b/retroshare-gui/src/gui/images/emoticons/face-kiss22.png new file mode 100644 index 000000000..a5d1bdd86 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/face-kiss22.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/face-kiss48.png b/retroshare-gui/src/gui/images/emoticons/face-kiss48.png new file mode 100644 index 000000000..af186838b Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/face-kiss48.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/face-plain16.png b/retroshare-gui/src/gui/images/emoticons/face-plain16.png new file mode 100644 index 000000000..a6761bd10 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/face-plain16.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/face-plain22.png b/retroshare-gui/src/gui/images/emoticons/face-plain22.png new file mode 100644 index 000000000..854c743da Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/face-plain22.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/face-plain48.png b/retroshare-gui/src/gui/images/emoticons/face-plain48.png new file mode 100644 index 000000000..db9ba6428 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/face-plain48.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/face-sad16.png b/retroshare-gui/src/gui/images/emoticons/face-sad16.png new file mode 100644 index 000000000..fa258956a Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/face-sad16.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/face-sad22.png b/retroshare-gui/src/gui/images/emoticons/face-sad22.png new file mode 100644 index 000000000..8acc8e481 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/face-sad22.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/face-sad48.png b/retroshare-gui/src/gui/images/emoticons/face-sad48.png new file mode 100644 index 000000000..56115b7dd Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/face-sad48.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/face-smile-big16.png b/retroshare-gui/src/gui/images/emoticons/face-smile-big16.png new file mode 100644 index 000000000..4cebcff64 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/face-smile-big16.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/face-smile-big22.png b/retroshare-gui/src/gui/images/emoticons/face-smile-big22.png new file mode 100644 index 000000000..54930d7e8 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/face-smile-big22.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/face-smile-big48.png b/retroshare-gui/src/gui/images/emoticons/face-smile-big48.png new file mode 100644 index 000000000..7256166d7 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/face-smile-big48.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/face-smile16.png b/retroshare-gui/src/gui/images/emoticons/face-smile16.png new file mode 100644 index 000000000..01e01170d Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/face-smile16.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/face-smile22.png b/retroshare-gui/src/gui/images/emoticons/face-smile22.png new file mode 100644 index 000000000..3b7c0b6e6 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/face-smile22.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/face-smile48.png b/retroshare-gui/src/gui/images/emoticons/face-smile48.png new file mode 100644 index 000000000..8cb551046 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/face-smile48.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/face-surprise16.png b/retroshare-gui/src/gui/images/emoticons/face-surprise16.png new file mode 100644 index 000000000..863f30484 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/face-surprise16.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/face-surprise22.png b/retroshare-gui/src/gui/images/emoticons/face-surprise22.png new file mode 100644 index 000000000..815e6130d Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/face-surprise22.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/face-surprise48.png b/retroshare-gui/src/gui/images/emoticons/face-surprise48.png new file mode 100644 index 000000000..88ae982ae Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/face-surprise48.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/face-wink16.png b/retroshare-gui/src/gui/images/emoticons/face-wink16.png new file mode 100644 index 000000000..46be68557 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/face-wink16.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/face-wink22.png b/retroshare-gui/src/gui/images/emoticons/face-wink22.png new file mode 100644 index 000000000..816d82f7a Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/face-wink22.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/face-wink48.png b/retroshare-gui/src/gui/images/emoticons/face-wink48.png new file mode 100644 index 000000000..a8b17d1bb Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/face-wink48.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/film.png b/retroshare-gui/src/gui/images/emoticons/film.png new file mode 100644 index 000000000..7d5f65949 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/film.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/girl.png b/retroshare-gui/src/gui/images/emoticons/girl.png new file mode 100644 index 000000000..325097d3a Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/girl.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/girl_hug.png b/retroshare-gui/src/gui/images/emoticons/girl_hug.png new file mode 100644 index 000000000..de50aed90 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/girl_hug.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/h5.png b/retroshare-gui/src/gui/images/emoticons/h5.png new file mode 100644 index 000000000..a2f249841 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/h5.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/handcuffs.png b/retroshare-gui/src/gui/images/emoticons/handcuffs.png new file mode 100644 index 000000000..092b53747 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/handcuffs.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/icondef.xml b/retroshare-gui/src/gui/images/emoticons/icondef.xml new file mode 100644 index 000000000..ddb08348e --- /dev/null +++ b/retroshare-gui/src/gui/images/emoticons/icondef.xml @@ -0,0 +1,674 @@ + + + + + :-) + :) + regular.png + + + :-D + :D + :> + :-d + megasmile.png + + + :-O + :o + omg.png + + + :-p + :p + tongue.png + + + ;-) + ;) + wink.png + + + :-( + :( + sad.png + + + 8o| + bearingteeth.png + + + :-@ + :@ + angry.png + + + 8-) + nerd.png + + + :'( + cry.png + + + :-S + :-s + confused.png + + + :-$ + embarrassed.png + + + :-| + :| + dunno.png + + + :-* + (K) + kiss.png + + + :-# + secret.png + + + (H) + shade.png + + + (A) + angel.png + + + +o( + sick.png + + + (brb) + brb.png + + + (6) + devil.png + + + (Y) + thumbs_up.png + + + (N) + thumbs_down.png + + + (X) + girl.png + + + (Z) + boy.png + + + (L) + love.png + + + (P) + camera.png + + + (G) + present.png + + + (%) + handcuffs.png + + + (F) + rose.png + + + (D) + cocktail.png + + + (B) + beer.png + + + (C) + cup.png + + + (^) + cake.png + + + (pi) + pizza.png + + + (M) + messenger.png + + + (sn) + snail.png + + + (tu) + tu.png + + + (bah) + sheep.png + + + :-[ + :[ + bat.png + + + (?) + asl.png + + + (@) + cat.png + + + (&) + dog.png + + + (8) + note.png + + + (ip) + ip.png + + + (S) + moon.png + + + (*) + star.png + + + (R) + rainbow.png + + + (#) + sun.png + + + (li) + li.png + + + (st) + st.png + + + (co) + co.png + + + (mp) + mp.png + + + (T) + phone.png + + + (E) + envelope.png + + + (ap) + ap.png + + + (au) + au.png + + + (~) + film.png + + + (O) + clock.png + + + (so) + so.png + + + (ci) + ci.png + + + (h5) + h5.png + + + (mo) + coins.png + + + + + :-) + :) + (-: + (: + regular.png + + + :-D + :D + megasmile.png + + + :-O + :O + omg.png + + + :-P + :P + tongue.png + + + ;-) + ;) + wink.png + + + :-( + :( + sad.png + + + :-/ + :-\ + confused.png + + + :"> + embarrassed.png + + + :-> + :> + sarcastic.png + + + :-| + :| + blank_look.png + + + B-) + shade.png + + + :-B + nerd.png + + + X-( + X( + nerd.png + + + :-X + :X + love.png + + + |-) + |) + l-) + l) + sleepy.png + + + @};- + rose.png + + + 0:-) + angel.png + + + >:) + devil.png + + + >:) + devil.png + + + :-$ + sshh.png + + + ~o) + cup.png + + + :-& + sick.png + + + =* + kiss.png + + + + + :-) + :) + regular.png + + + :-D + :D + :> + :-d + megasmile.png + + + :-O + :o + omg.png + + + :-p + :p + tongue.png + + + ;-) + ;) + wink.png + + + :-( + :( + sad.png + + + 8o| + bearingteeth.png + + + :-@ + :@ + angry.png + + + 8-) + nerd.png + + + :'( + cry.png + + + :-S + :-s + confused.png + + + :-$ + embarrassed.png + + + :-| + :| + dunno.png + + + :-* + (K) + kiss.png + + + :-# + secret.png + + + (H) + shade.png + + + (A) + angel.png + + + +o( + sick.png + + + (brb) + brb.png + + + (6) + devil.png + + + (Y) + thumbs_up.png + + + (N) + thumbs_down.png + + + (X) + girl.png + + + (Z) + boy.png + + + (L) + love.png + + + (P) + camera.png + + + (G) + present.png + + + (%) + handcuffs.png + + + (F) + rose.png + + + (D) + cocktail.png + + + (B) + beer.png + + + (C) + cup.png + + + (^) + cake.png + + + (pi) + pizza.png + + + (M) + messenger.png + + + (sn) + snail.png + + + (tu) + tu.png + + + (bah) + sheep.png + + + :-[ + :[ + bat.png + + + (?) + asl.png + + + (@) + cat.png + + + (&) + dog.png + + + (8) + note.png + + + (ip) + ip.png + + + (S) + moon.png + + + (*) + star.png + + + (R) + rainbow.png + + + (#) + sun.png + + + (li) + li.png + + + (st) + st.png + + + (co) + co.png + + + (mp) + mp.png + + + (T) + phone.png + + + (E) + envelope.png + + + (ap) + ap.png + + + (au) + au.png + + + (~) + film.png + + + (O) + clock.png + + + (so) + so.png + + + (ci) + ci.png + + + (h5) + h5.png + + + (mo) + coins.png + + + + + + :-) + :) + regular.png + + + :-D + :D + :> + :-d + megasmile.png + + + :-O + :o + omg.png + + + :-p + :p + tongue.png + + + ;-) + ;) + wink.png + + + :-( + :( + sad.png + + + diff --git a/retroshare-gui/src/gui/images/emoticons/ip.png b/retroshare-gui/src/gui/images/emoticons/ip.png new file mode 100644 index 000000000..bc90bf385 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/ip.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/kiss.png b/retroshare-gui/src/gui/images/emoticons/kiss.png new file mode 100644 index 000000000..490d86524 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/kiss.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/li.png b/retroshare-gui/src/gui/images/emoticons/li.png new file mode 100644 index 000000000..65756b410 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/li.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/lightbulb.png b/retroshare-gui/src/gui/images/emoticons/lightbulb.png new file mode 100644 index 000000000..97f1e1f9e Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/lightbulb.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/ll.png b/retroshare-gui/src/gui/images/emoticons/ll.png new file mode 100644 index 000000000..e077ba1b0 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/ll.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/love.png b/retroshare-gui/src/gui/images/emoticons/love.png new file mode 100644 index 000000000..1cff5dc25 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/love.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/megasmile.png b/retroshare-gui/src/gui/images/emoticons/megasmile.png new file mode 100644 index 000000000..e1df389e2 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/megasmile.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/messenger.png b/retroshare-gui/src/gui/images/emoticons/messenger.png new file mode 100644 index 000000000..887290ad7 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/messenger.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/mo.png b/retroshare-gui/src/gui/images/emoticons/mo.png new file mode 100644 index 000000000..b6b233b5c Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/mo.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/moon.png b/retroshare-gui/src/gui/images/emoticons/moon.png new file mode 100644 index 000000000..3c6102764 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/moon.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/mp.png b/retroshare-gui/src/gui/images/emoticons/mp.png new file mode 100644 index 000000000..b68dd45f8 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/mp.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/nerd.png b/retroshare-gui/src/gui/images/emoticons/nerd.png new file mode 100644 index 000000000..21150cffd Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/nerd.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/note.png b/retroshare-gui/src/gui/images/emoticons/note.png new file mode 100644 index 000000000..00d5951f8 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/note.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/omg.png b/retroshare-gui/src/gui/images/emoticons/omg.png new file mode 100644 index 000000000..ed61b06f1 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/omg.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/party.png b/retroshare-gui/src/gui/images/emoticons/party.png new file mode 100644 index 000000000..fa403e835 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/party.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/phone.png b/retroshare-gui/src/gui/images/emoticons/phone.png new file mode 100644 index 000000000..0ddb653ae Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/phone.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/pizza.png b/retroshare-gui/src/gui/images/emoticons/pizza.png new file mode 100644 index 000000000..fddf2ab63 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/pizza.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/pl.png b/retroshare-gui/src/gui/images/emoticons/pl.png new file mode 100644 index 000000000..66a59883c Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/pl.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/present.png b/retroshare-gui/src/gui/images/emoticons/present.png new file mode 100644 index 000000000..55f141543 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/present.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/rainbow.png b/retroshare-gui/src/gui/images/emoticons/rainbow.png new file mode 100644 index 000000000..7be14acc8 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/rainbow.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/regular.png b/retroshare-gui/src/gui/images/emoticons/regular.png new file mode 100644 index 000000000..ad235d73e Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/regular.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/rose.png b/retroshare-gui/src/gui/images/emoticons/rose.png new file mode 100644 index 000000000..64f7f89c4 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/rose.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/sad.png b/retroshare-gui/src/gui/images/emoticons/sad.png new file mode 100644 index 000000000..9da40faba Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/sad.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/sarcastic.png b/retroshare-gui/src/gui/images/emoticons/sarcastic.png new file mode 100644 index 000000000..c3d021bf3 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/sarcastic.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/secret.png b/retroshare-gui/src/gui/images/emoticons/secret.png new file mode 100644 index 000000000..0b4b31a91 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/secret.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/shade.png b/retroshare-gui/src/gui/images/emoticons/shade.png new file mode 100644 index 000000000..d5547f081 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/shade.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/sheep.png b/retroshare-gui/src/gui/images/emoticons/sheep.png new file mode 100644 index 000000000..f0385e760 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/sheep.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/sick.png b/retroshare-gui/src/gui/images/emoticons/sick.png new file mode 100644 index 000000000..6680b986c Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/sick.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/sleepy.png b/retroshare-gui/src/gui/images/emoticons/sleepy.png new file mode 100644 index 000000000..16901de5a Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/sleepy.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/snail.png b/retroshare-gui/src/gui/images/emoticons/snail.png new file mode 100644 index 000000000..7bc34b898 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/snail.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/so.png b/retroshare-gui/src/gui/images/emoticons/so.png new file mode 100644 index 000000000..3bdeb057f Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/so.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/sory.png b/retroshare-gui/src/gui/images/emoticons/sory.png new file mode 100644 index 000000000..031093201 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/sory.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/sshh.png b/retroshare-gui/src/gui/images/emoticons/sshh.png new file mode 100644 index 000000000..e4a8a9cf4 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/sshh.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/st.png b/retroshare-gui/src/gui/images/emoticons/st.png new file mode 100644 index 000000000..4b46191dc Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/st.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/star.png b/retroshare-gui/src/gui/images/emoticons/star.png new file mode 100644 index 000000000..f7a67019c Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/star.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/sun.png b/retroshare-gui/src/gui/images/emoticons/sun.png new file mode 100644 index 000000000..851639398 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/sun.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/teeth.png b/retroshare-gui/src/gui/images/emoticons/teeth.png new file mode 100644 index 000000000..6d47db7e2 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/teeth.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/thinking.png b/retroshare-gui/src/gui/images/emoticons/thinking.png new file mode 100644 index 000000000..e0d7a224c Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/thinking.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/thumbs_down.png b/retroshare-gui/src/gui/images/emoticons/thumbs_down.png new file mode 100644 index 000000000..e7eb8025f Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/thumbs_down.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/thumbs_up.png b/retroshare-gui/src/gui/images/emoticons/thumbs_up.png new file mode 100644 index 000000000..ef44bf64e Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/thumbs_up.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/tongue.png b/retroshare-gui/src/gui/images/emoticons/tongue.png new file mode 100644 index 000000000..0ecebcf57 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/tongue.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/tu.png b/retroshare-gui/src/gui/images/emoticons/tu.png new file mode 100644 index 000000000..7f9c4b75e Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/tu.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/ugly.png b/retroshare-gui/src/gui/images/emoticons/ugly.png new file mode 100644 index 000000000..08736a926 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/ugly.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/um.png b/retroshare-gui/src/gui/images/emoticons/um.png new file mode 100644 index 000000000..04b5d481e Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/um.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/unlove.png b/retroshare-gui/src/gui/images/emoticons/unlove.png new file mode 100644 index 000000000..a1bcaf90f Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/unlove.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/wilted_rose.png b/retroshare-gui/src/gui/images/emoticons/wilted_rose.png new file mode 100644 index 000000000..64f659b02 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/wilted_rose.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/wink.png b/retroshare-gui/src/gui/images/emoticons/wink.png new file mode 100644 index 000000000..aaae1332f Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/wink.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/xx.png b/retroshare-gui/src/gui/images/emoticons/xx.png new file mode 100644 index 000000000..3e08d383c Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/xx.png differ diff --git a/retroshare-gui/src/gui/images/emoticons/yn.png b/retroshare-gui/src/gui/images/emoticons/yn.png new file mode 100644 index 000000000..b10d62614 Binary files /dev/null and b/retroshare-gui/src/gui/images/emoticons/yn.png differ diff --git a/retroshare-gui/src/gui/images/encrypted16.png b/retroshare-gui/src/gui/images/encrypted16.png new file mode 100644 index 000000000..b2619730c Binary files /dev/null and b/retroshare-gui/src/gui/images/encrypted16.png differ diff --git a/retroshare-gui/src/gui/images/encrypted22.png b/retroshare-gui/src/gui/images/encrypted22.png new file mode 100644 index 000000000..1cf62bf68 Binary files /dev/null and b/retroshare-gui/src/gui/images/encrypted22.png differ diff --git a/retroshare-gui/src/gui/images/encrypted32.png b/retroshare-gui/src/gui/images/encrypted32.png new file mode 100644 index 000000000..974cd6816 Binary files /dev/null and b/retroshare-gui/src/gui/images/encrypted32.png differ diff --git a/retroshare-gui/src/gui/images/encrypted48.png b/retroshare-gui/src/gui/images/encrypted48.png new file mode 100644 index 000000000..b09df126a Binary files /dev/null and b/retroshare-gui/src/gui/images/encrypted48.png differ diff --git a/retroshare-gui/src/gui/images/evolution.png b/retroshare-gui/src/gui/images/evolution.png new file mode 100644 index 000000000..a54a36647 Binary files /dev/null and b/retroshare-gui/src/gui/images/evolution.png differ diff --git a/retroshare-gui/src/gui/images/exit_24x24.png b/retroshare-gui/src/gui/images/exit_24x24.png new file mode 100644 index 000000000..f965c44b0 Binary files /dev/null and b/retroshare-gui/src/gui/images/exit_24x24.png differ diff --git a/retroshare-gui/src/gui/images/expand_hover.png b/retroshare-gui/src/gui/images/expand_hover.png new file mode 100644 index 000000000..39bee192a Binary files /dev/null and b/retroshare-gui/src/gui/images/expand_hover.png differ diff --git a/retroshare-gui/src/gui/images/exportpeers_16x16.png b/retroshare-gui/src/gui/images/exportpeers_16x16.png new file mode 100644 index 000000000..c3bd700ba Binary files /dev/null and b/retroshare-gui/src/gui/images/exportpeers_16x16.png differ diff --git a/retroshare-gui/src/gui/images/filefind.png b/retroshare-gui/src/gui/images/filefind.png new file mode 100644 index 000000000..941825598 Binary files /dev/null and b/retroshare-gui/src/gui/images/filefind.png differ diff --git a/retroshare-gui/src/gui/images/fileinfo.png b/retroshare-gui/src/gui/images/fileinfo.png new file mode 100644 index 000000000..006da6aac Binary files /dev/null and b/retroshare-gui/src/gui/images/fileinfo.png differ diff --git a/retroshare-gui/src/gui/images/find.png b/retroshare-gui/src/gui/images/find.png new file mode 100644 index 000000000..417149f51 Binary files /dev/null and b/retroshare-gui/src/gui/images/find.png differ diff --git a/retroshare-gui/src/gui/images/flags/af.png b/retroshare-gui/src/gui/images/flags/af.png new file mode 100644 index 000000000..ba01b2b37 Binary files /dev/null and b/retroshare-gui/src/gui/images/flags/af.png differ diff --git a/retroshare-gui/src/gui/images/flags/bg.png b/retroshare-gui/src/gui/images/flags/bg.png new file mode 100644 index 000000000..6572ba75b Binary files /dev/null and b/retroshare-gui/src/gui/images/flags/bg.png differ diff --git a/retroshare-gui/src/gui/images/flags/cn.png b/retroshare-gui/src/gui/images/flags/cn.png new file mode 100644 index 000000000..2d1c8803d Binary files /dev/null and b/retroshare-gui/src/gui/images/flags/cn.png differ diff --git a/retroshare-gui/src/gui/images/flags/cn_simp.png b/retroshare-gui/src/gui/images/flags/cn_simp.png new file mode 100644 index 000000000..2d1c8803d Binary files /dev/null and b/retroshare-gui/src/gui/images/flags/cn_simp.png differ diff --git a/retroshare-gui/src/gui/images/flags/cn_trad.png b/retroshare-gui/src/gui/images/flags/cn_trad.png new file mode 100644 index 000000000..2d1c8803d Binary files /dev/null and b/retroshare-gui/src/gui/images/flags/cn_trad.png differ diff --git a/retroshare-gui/src/gui/images/flags/cz.png b/retroshare-gui/src/gui/images/flags/cz.png new file mode 100644 index 000000000..69157da03 Binary files /dev/null and b/retroshare-gui/src/gui/images/flags/cz.png differ diff --git a/retroshare-gui/src/gui/images/flags/de.png b/retroshare-gui/src/gui/images/flags/de.png new file mode 100644 index 000000000..3e4fa430f Binary files /dev/null and b/retroshare-gui/src/gui/images/flags/de.png differ diff --git a/retroshare-gui/src/gui/images/flags/dk.png b/retroshare-gui/src/gui/images/flags/dk.png new file mode 100644 index 000000000..ba866686e Binary files /dev/null and b/retroshare-gui/src/gui/images/flags/dk.png differ diff --git a/retroshare-gui/src/gui/images/flags/en.png b/retroshare-gui/src/gui/images/flags/en.png new file mode 100644 index 000000000..48931bc86 Binary files /dev/null and b/retroshare-gui/src/gui/images/flags/en.png differ diff --git a/retroshare-gui/src/gui/images/flags/es.png b/retroshare-gui/src/gui/images/flags/es.png new file mode 100644 index 000000000..6219730be Binary files /dev/null and b/retroshare-gui/src/gui/images/flags/es.png differ diff --git a/retroshare-gui/src/gui/images/flags/fi.png b/retroshare-gui/src/gui/images/flags/fi.png new file mode 100644 index 000000000..d51567449 Binary files /dev/null and b/retroshare-gui/src/gui/images/flags/fi.png differ diff --git a/retroshare-gui/src/gui/images/flags/fr.png b/retroshare-gui/src/gui/images/flags/fr.png new file mode 100644 index 000000000..71021748e Binary files /dev/null and b/retroshare-gui/src/gui/images/flags/fr.png differ diff --git a/retroshare-gui/src/gui/images/flags/gr.png b/retroshare-gui/src/gui/images/flags/gr.png new file mode 100644 index 000000000..7803cb4f9 Binary files /dev/null and b/retroshare-gui/src/gui/images/flags/gr.png differ diff --git a/retroshare-gui/src/gui/images/flags/it.png b/retroshare-gui/src/gui/images/flags/it.png new file mode 100644 index 000000000..0d6879162 Binary files /dev/null and b/retroshare-gui/src/gui/images/flags/it.png differ diff --git a/retroshare-gui/src/gui/images/flags/jp.png b/retroshare-gui/src/gui/images/flags/jp.png new file mode 100644 index 000000000..b6563899e Binary files /dev/null and b/retroshare-gui/src/gui/images/flags/jp.png differ diff --git a/retroshare-gui/src/gui/images/flags/kr.png b/retroshare-gui/src/gui/images/flags/kr.png new file mode 100644 index 000000000..e2edef509 Binary files /dev/null and b/retroshare-gui/src/gui/images/flags/kr.png differ diff --git a/retroshare-gui/src/gui/images/flags/pl.png b/retroshare-gui/src/gui/images/flags/pl.png new file mode 100644 index 000000000..8f8957664 Binary files /dev/null and b/retroshare-gui/src/gui/images/flags/pl.png differ diff --git a/retroshare-gui/src/gui/images/flags/pt.png b/retroshare-gui/src/gui/images/flags/pt.png new file mode 100644 index 000000000..9d3aa9b8f Binary files /dev/null and b/retroshare-gui/src/gui/images/flags/pt.png differ diff --git a/retroshare-gui/src/gui/images/flags/ru.png b/retroshare-gui/src/gui/images/flags/ru.png new file mode 100644 index 000000000..d0ce8817f Binary files /dev/null and b/retroshare-gui/src/gui/images/flags/ru.png differ diff --git a/retroshare-gui/src/gui/images/flags/se.png b/retroshare-gui/src/gui/images/flags/se.png new file mode 100644 index 000000000..463382f7a Binary files /dev/null and b/retroshare-gui/src/gui/images/flags/se.png differ diff --git a/retroshare-gui/src/gui/images/flags/sl.png b/retroshare-gui/src/gui/images/flags/sl.png new file mode 100644 index 000000000..4daf7d48f Binary files /dev/null and b/retroshare-gui/src/gui/images/flags/sl.png differ diff --git a/retroshare-gui/src/gui/images/flags/tr.png b/retroshare-gui/src/gui/images/flags/tr.png new file mode 100644 index 000000000..f799e03ca Binary files /dev/null and b/retroshare-gui/src/gui/images/flags/tr.png differ diff --git a/retroshare-gui/src/gui/images/flags/zh-cn.png b/retroshare-gui/src/gui/images/flags/zh-cn.png new file mode 100644 index 000000000..7a060a437 Binary files /dev/null and b/retroshare-gui/src/gui/images/flags/zh-cn.png differ diff --git a/retroshare-gui/src/gui/images/folder-draft.png b/retroshare-gui/src/gui/images/folder-draft.png new file mode 100644 index 000000000..7639d7b31 Binary files /dev/null and b/retroshare-gui/src/gui/images/folder-draft.png differ diff --git a/retroshare-gui/src/gui/images/folder-draft24-hover.png b/retroshare-gui/src/gui/images/folder-draft24-hover.png new file mode 100644 index 000000000..ef9b2a19a Binary files /dev/null and b/retroshare-gui/src/gui/images/folder-draft24-hover.png differ diff --git a/retroshare-gui/src/gui/images/folder-draft24-pressed.png b/retroshare-gui/src/gui/images/folder-draft24-pressed.png new file mode 100644 index 000000000..8f2127908 Binary files /dev/null and b/retroshare-gui/src/gui/images/folder-draft24-pressed.png differ diff --git a/retroshare-gui/src/gui/images/folder-draft24.png b/retroshare-gui/src/gui/images/folder-draft24.png new file mode 100644 index 000000000..5a2aaeb6c Binary files /dev/null and b/retroshare-gui/src/gui/images/folder-draft24.png differ diff --git a/retroshare-gui/src/gui/images/folder-inbox-new.png b/retroshare-gui/src/gui/images/folder-inbox-new.png new file mode 100644 index 000000000..da0667362 Binary files /dev/null and b/retroshare-gui/src/gui/images/folder-inbox-new.png differ diff --git a/retroshare-gui/src/gui/images/folder-inbox.png b/retroshare-gui/src/gui/images/folder-inbox.png new file mode 100644 index 000000000..25e6204bd Binary files /dev/null and b/retroshare-gui/src/gui/images/folder-inbox.png differ diff --git a/retroshare-gui/src/gui/images/folder-outbox.png b/retroshare-gui/src/gui/images/folder-outbox.png new file mode 100644 index 000000000..a7362ec29 Binary files /dev/null and b/retroshare-gui/src/gui/images/folder-outbox.png differ diff --git a/retroshare-gui/src/gui/images/folder-sent.png b/retroshare-gui/src/gui/images/folder-sent.png new file mode 100644 index 000000000..7ab95edae Binary files /dev/null and b/retroshare-gui/src/gui/images/folder-sent.png differ diff --git a/retroshare-gui/src/gui/images/folder_doments.png b/retroshare-gui/src/gui/images/folder_doments.png new file mode 100644 index 000000000..8a6f1eff7 Binary files /dev/null and b/retroshare-gui/src/gui/images/folder_doments.png differ diff --git a/retroshare-gui/src/gui/images/folder_green.png b/retroshare-gui/src/gui/images/folder_green.png new file mode 100644 index 000000000..3061a7619 Binary files /dev/null and b/retroshare-gui/src/gui/images/folder_green.png differ diff --git a/retroshare-gui/src/gui/images/folder_green16.png b/retroshare-gui/src/gui/images/folder_green16.png new file mode 100644 index 000000000..e287ad81d Binary files /dev/null and b/retroshare-gui/src/gui/images/folder_green16.png differ diff --git a/retroshare-gui/src/gui/images/graph-area.png b/retroshare-gui/src/gui/images/graph-area.png new file mode 100644 index 000000000..2ab2deb7c Binary files /dev/null and b/retroshare-gui/src/gui/images/graph-area.png differ diff --git a/retroshare-gui/src/gui/images/graph-line.png b/retroshare-gui/src/gui/images/graph-line.png new file mode 100644 index 000000000..43eedd48c Binary files /dev/null and b/retroshare-gui/src/gui/images/graph-line.png differ diff --git a/retroshare-gui/src/gui/images/hide_toolbox_frame.png b/retroshare-gui/src/gui/images/hide_toolbox_frame.png new file mode 100644 index 000000000..a54a4e74a Binary files /dev/null and b/retroshare-gui/src/gui/images/hide_toolbox_frame.png differ diff --git a/retroshare-gui/src/gui/images/info16.png b/retroshare-gui/src/gui/images/info16.png new file mode 100644 index 000000000..7fc297e0e Binary files /dev/null and b/retroshare-gui/src/gui/images/info16.png differ diff --git a/retroshare-gui/src/gui/images/informations_24x24.png b/retroshare-gui/src/gui/images/informations_24x24.png new file mode 100644 index 000000000..6dbcc2cb3 Binary files /dev/null and b/retroshare-gui/src/gui/images/informations_24x24.png differ diff --git a/retroshare-gui/src/gui/images/invite-friend24.png b/retroshare-gui/src/gui/images/invite-friend24.png new file mode 100644 index 000000000..32403b384 Binary files /dev/null and b/retroshare-gui/src/gui/images/invite-friend24.png differ diff --git a/retroshare-gui/src/gui/images/kbackgammon.png b/retroshare-gui/src/gui/images/kbackgammon.png new file mode 100644 index 000000000..9bdda1083 Binary files /dev/null and b/retroshare-gui/src/gui/images/kbackgammon.png differ diff --git a/retroshare-gui/src/gui/images/konsole.png b/retroshare-gui/src/gui/images/konsole.png new file mode 100644 index 000000000..b74026477 Binary files /dev/null and b/retroshare-gui/src/gui/images/konsole.png differ diff --git a/retroshare-gui/src/gui/images/ksysguard.png b/retroshare-gui/src/gui/images/ksysguard.png new file mode 100644 index 000000000..10c196ebf Binary files /dev/null and b/retroshare-gui/src/gui/images/ksysguard.png differ diff --git a/retroshare-gui/src/gui/images/ktorrent.png b/retroshare-gui/src/gui/images/ktorrent.png new file mode 100644 index 000000000..740badb8c Binary files /dev/null and b/retroshare-gui/src/gui/images/ktorrent.png differ diff --git a/retroshare-gui/src/gui/images/loadcert16.png b/retroshare-gui/src/gui/images/loadcert16.png new file mode 100644 index 000000000..aa4f287b0 Binary files /dev/null and b/retroshare-gui/src/gui/images/loadcert16.png differ diff --git a/retroshare-gui/src/gui/images/locale.png b/retroshare-gui/src/gui/images/locale.png new file mode 100644 index 000000000..e1bc30916 Binary files /dev/null and b/retroshare-gui/src/gui/images/locale.png differ diff --git a/retroshare-gui/src/gui/images/logobar/logo_bar_fill.png b/retroshare-gui/src/gui/images/logobar/logo_bar_fill.png new file mode 100644 index 000000000..fa8257794 Binary files /dev/null and b/retroshare-gui/src/gui/images/logobar/logo_bar_fill.png differ diff --git a/retroshare-gui/src/gui/images/logobar/logo_bar_start.png b/retroshare-gui/src/gui/images/logobar/logo_bar_start.png new file mode 100644 index 000000000..9ebb7d1fe Binary files /dev/null and b/retroshare-gui/src/gui/images/logobar/logo_bar_start.png differ diff --git a/retroshare-gui/src/gui/images/logobar/rslogo.png b/retroshare-gui/src/gui/images/logobar/rslogo.png new file mode 100644 index 000000000..18aaa95b2 Binary files /dev/null and b/retroshare-gui/src/gui/images/logobar/rslogo.png differ diff --git a/retroshare-gui/src/gui/images/logobar/rslogo2.png b/retroshare-gui/src/gui/images/logobar/rslogo2.png new file mode 100644 index 000000000..ff7e0dfee Binary files /dev/null and b/retroshare-gui/src/gui/images/logobar/rslogo2.png differ diff --git a/retroshare-gui/src/gui/images/logobar/rslogoclean.png b/retroshare-gui/src/gui/images/logobar/rslogoclean.png new file mode 100644 index 000000000..0ebb66fa9 Binary files /dev/null and b/retroshare-gui/src/gui/images/logobar/rslogoclean.png differ diff --git a/retroshare-gui/src/gui/images/mail_delete.png b/retroshare-gui/src/gui/images/mail_delete.png new file mode 100644 index 000000000..dc9c020f7 Binary files /dev/null and b/retroshare-gui/src/gui/images/mail_delete.png differ diff --git a/retroshare-gui/src/gui/images/mail_get.png b/retroshare-gui/src/gui/images/mail_get.png new file mode 100644 index 000000000..f87d1ee48 Binary files /dev/null and b/retroshare-gui/src/gui/images/mail_get.png differ diff --git a/retroshare-gui/src/gui/images/mail_new.png b/retroshare-gui/src/gui/images/mail_new.png new file mode 100644 index 000000000..7656cbc11 Binary files /dev/null and b/retroshare-gui/src/gui/images/mail_new.png differ diff --git a/retroshare-gui/src/gui/images/mail_reply.png b/retroshare-gui/src/gui/images/mail_reply.png new file mode 100644 index 000000000..c89864952 Binary files /dev/null and b/retroshare-gui/src/gui/images/mail_reply.png differ diff --git a/retroshare-gui/src/gui/images/mail_send.png b/retroshare-gui/src/gui/images/mail_send.png new file mode 100644 index 000000000..211301792 Binary files /dev/null and b/retroshare-gui/src/gui/images/mail_send.png differ diff --git a/retroshare-gui/src/gui/images/mailforward24-hover.png b/retroshare-gui/src/gui/images/mailforward24-hover.png new file mode 100644 index 000000000..bb00a4fb4 Binary files /dev/null and b/retroshare-gui/src/gui/images/mailforward24-hover.png differ diff --git a/retroshare-gui/src/gui/images/mailforward24.png b/retroshare-gui/src/gui/images/mailforward24.png new file mode 100644 index 000000000..eaa8a6296 Binary files /dev/null and b/retroshare-gui/src/gui/images/mailforward24.png differ diff --git a/retroshare-gui/src/gui/images/message-mail-forwarded-read.png b/retroshare-gui/src/gui/images/message-mail-forwarded-read.png new file mode 100644 index 000000000..390c5b8ad Binary files /dev/null and b/retroshare-gui/src/gui/images/message-mail-forwarded-read.png differ diff --git a/retroshare-gui/src/gui/images/message-mail-imapdelete.png b/retroshare-gui/src/gui/images/message-mail-imapdelete.png new file mode 100644 index 000000000..688577262 Binary files /dev/null and b/retroshare-gui/src/gui/images/message-mail-imapdelete.png differ diff --git a/retroshare-gui/src/gui/images/message-mail-new.png b/retroshare-gui/src/gui/images/message-mail-new.png new file mode 100644 index 000000000..fdd4f3dab Binary files /dev/null and b/retroshare-gui/src/gui/images/message-mail-new.png differ diff --git a/retroshare-gui/src/gui/images/message-mail-read.png b/retroshare-gui/src/gui/images/message-mail-read.png new file mode 100644 index 000000000..2599d6e90 Binary files /dev/null and b/retroshare-gui/src/gui/images/message-mail-read.png differ diff --git a/retroshare-gui/src/gui/images/message-mail-replied-read.png b/retroshare-gui/src/gui/images/message-mail-replied-read.png new file mode 100644 index 000000000..b41e15441 Binary files /dev/null and b/retroshare-gui/src/gui/images/message-mail-replied-read.png differ diff --git a/retroshare-gui/src/gui/images/message-mail-replied.png b/retroshare-gui/src/gui/images/message-mail-replied.png new file mode 100644 index 000000000..1205b7021 Binary files /dev/null and b/retroshare-gui/src/gui/images/message-mail-replied.png differ diff --git a/retroshare-gui/src/gui/images/message-mail.png b/retroshare-gui/src/gui/images/message-mail.png new file mode 100644 index 000000000..c2155b688 Binary files /dev/null and b/retroshare-gui/src/gui/images/message-mail.png differ diff --git a/retroshare-gui/src/gui/images/message-news.png b/retroshare-gui/src/gui/images/message-news.png new file mode 100644 index 000000000..c46bf3c95 Binary files /dev/null and b/retroshare-gui/src/gui/images/message-news.png differ diff --git a/retroshare-gui/src/gui/images/message.png b/retroshare-gui/src/gui/images/message.png new file mode 100644 index 000000000..6000bcd3f Binary files /dev/null and b/retroshare-gui/src/gui/images/message.png differ diff --git a/retroshare-gui/src/gui/images/messenger.png b/retroshare-gui/src/gui/images/messenger.png new file mode 100644 index 000000000..cf15aadc5 Binary files /dev/null and b/retroshare-gui/src/gui/images/messenger.png differ diff --git a/retroshare-gui/src/gui/images/mystatus_bg.png b/retroshare-gui/src/gui/images/mystatus_bg.png new file mode 100644 index 000000000..4a428424c Binary files /dev/null and b/retroshare-gui/src/gui/images/mystatus_bg.png differ diff --git a/retroshare-gui/src/gui/images/network.png b/retroshare-gui/src/gui/images/network.png new file mode 100644 index 000000000..99a04417a Binary files /dev/null and b/retroshare-gui/src/gui/images/network.png differ diff --git a/retroshare-gui/src/gui/images/network16.png b/retroshare-gui/src/gui/images/network16.png new file mode 100644 index 000000000..e1f1bd7cb Binary files /dev/null and b/retroshare-gui/src/gui/images/network16.png differ diff --git a/retroshare-gui/src/gui/images/network32.png b/retroshare-gui/src/gui/images/network32.png new file mode 100644 index 000000000..e74a67f44 Binary files /dev/null and b/retroshare-gui/src/gui/images/network32.png differ diff --git a/retroshare-gui/src/gui/images/new-account.png b/retroshare-gui/src/gui/images/new-account.png new file mode 100644 index 000000000..06280d18a Binary files /dev/null and b/retroshare-gui/src/gui/images/new-account.png differ diff --git a/retroshare-gui/src/gui/images/new-contact.png b/retroshare-gui/src/gui/images/new-contact.png new file mode 100644 index 000000000..0cb71ca03 Binary files /dev/null and b/retroshare-gui/src/gui/images/new-contact.png differ diff --git a/retroshare-gui/src/gui/images/new-mail-alert.png b/retroshare-gui/src/gui/images/new-mail-alert.png new file mode 100644 index 000000000..78a1557b3 Binary files /dev/null and b/retroshare-gui/src/gui/images/new-mail-alert.png differ diff --git a/retroshare-gui/src/gui/images/nopic.png b/retroshare-gui/src/gui/images/nopic.png new file mode 100644 index 000000000..b26ba3d71 Binary files /dev/null and b/retroshare-gui/src/gui/images/nopic.png differ diff --git a/retroshare-gui/src/gui/images/null.png b/retroshare-gui/src/gui/images/null.png new file mode 100644 index 000000000..a85bb6491 Binary files /dev/null and b/retroshare-gui/src/gui/images/null.png differ diff --git a/retroshare-gui/src/gui/images/peerdetails_16x16.png b/retroshare-gui/src/gui/images/peerdetails_16x16.png new file mode 100644 index 000000000..c3038709e Binary files /dev/null and b/retroshare-gui/src/gui/images/peerdetails_16x16.png differ diff --git a/retroshare-gui/src/gui/images/peers_16x16.png b/retroshare-gui/src/gui/images/peers_16x16.png new file mode 100644 index 000000000..a1d1bac82 Binary files /dev/null and b/retroshare-gui/src/gui/images/peers_16x16.png differ diff --git a/retroshare-gui/src/gui/images/peers_24x24.png b/retroshare-gui/src/gui/images/peers_24x24.png new file mode 100644 index 000000000..f72aa562f Binary files /dev/null and b/retroshare-gui/src/gui/images/peers_24x24.png differ diff --git a/retroshare-gui/src/gui/images/removefriend16.png b/retroshare-gui/src/gui/images/removefriend16.png new file mode 100644 index 000000000..91839538b Binary files /dev/null and b/retroshare-gui/src/gui/images/removefriend16.png differ diff --git a/retroshare-gui/src/gui/images/replymail-hover.png b/retroshare-gui/src/gui/images/replymail-hover.png new file mode 100644 index 000000000..aea2193e0 Binary files /dev/null and b/retroshare-gui/src/gui/images/replymail-hover.png differ diff --git a/retroshare-gui/src/gui/images/replymail-pressed.png b/retroshare-gui/src/gui/images/replymail-pressed.png new file mode 100644 index 000000000..aea2193e0 Binary files /dev/null and b/retroshare-gui/src/gui/images/replymail-pressed.png differ diff --git a/retroshare-gui/src/gui/images/replymail24-hover.png b/retroshare-gui/src/gui/images/replymail24-hover.png new file mode 100644 index 000000000..4b3d3f8f8 Binary files /dev/null and b/retroshare-gui/src/gui/images/replymail24-hover.png differ diff --git a/retroshare-gui/src/gui/images/replymail24.png b/retroshare-gui/src/gui/images/replymail24.png new file mode 100644 index 000000000..41c52c79e Binary files /dev/null and b/retroshare-gui/src/gui/images/replymail24.png differ diff --git a/retroshare-gui/src/gui/images/replymailall24-hover.png b/retroshare-gui/src/gui/images/replymailall24-hover.png new file mode 100644 index 000000000..ca8acf2a8 Binary files /dev/null and b/retroshare-gui/src/gui/images/replymailall24-hover.png differ diff --git a/retroshare-gui/src/gui/images/replymailall24.png b/retroshare-gui/src/gui/images/replymailall24.png new file mode 100644 index 000000000..5da21d539 Binary files /dev/null and b/retroshare-gui/src/gui/images/replymailall24.png differ diff --git a/retroshare-gui/src/gui/images/reset.png b/retroshare-gui/src/gui/images/reset.png new file mode 100644 index 000000000..84439ebb9 Binary files /dev/null and b/retroshare-gui/src/gui/images/reset.png differ diff --git a/retroshare-gui/src/gui/images/retro3.png b/retroshare-gui/src/gui/images/retro3.png new file mode 100644 index 000000000..5743e098d Binary files /dev/null and b/retroshare-gui/src/gui/images/retro3.png differ diff --git a/retroshare-gui/src/gui/images/retro4.png b/retroshare-gui/src/gui/images/retro4.png new file mode 100644 index 000000000..d68db6277 Binary files /dev/null and b/retroshare-gui/src/gui/images/retro4.png differ diff --git a/retroshare-gui/src/gui/images/retroshare_win.rc b/retroshare-gui/src/gui/images/retroshare_win.rc new file mode 100644 index 000000000..0d00d0814 --- /dev/null +++ b/retroshare-gui/src/gui/images/retroshare_win.rc @@ -0,0 +1,3 @@ +#include "retroshare_win.rc.h" + +IDI_ICON1 ICON "gui/images/rswinicon.ico" diff --git a/retroshare-gui/src/gui/images/retroshare_win.rc.h b/retroshare-gui/src/gui/images/retroshare_win.rc.h new file mode 100644 index 000000000..2c189044e --- /dev/null +++ b/retroshare-gui/src/gui/images/retroshare_win.rc.h @@ -0,0 +1,25 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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. + ****************************************************************/ + + + +#define IDI_ICON1 101 + diff --git a/retroshare-gui/src/gui/images/retrosharelogo1.png b/retroshare-gui/src/gui/images/retrosharelogo1.png new file mode 100644 index 000000000..9d0ff4810 Binary files /dev/null and b/retroshare-gui/src/gui/images/retrosharelogo1.png differ diff --git a/retroshare-gui/src/gui/images/retrosharelogo2.png b/retroshare-gui/src/gui/images/retrosharelogo2.png new file mode 100644 index 000000000..39629e2b0 Binary files /dev/null and b/retroshare-gui/src/gui/images/retrosharelogo2.png differ diff --git a/retroshare-gui/src/gui/images/retrotoolbar.png b/retroshare-gui/src/gui/images/retrotoolbar.png new file mode 100644 index 000000000..4a8e6cd39 Binary files /dev/null and b/retroshare-gui/src/gui/images/retrotoolbar.png differ diff --git a/retroshare-gui/src/gui/images/rs-2.png b/retroshare-gui/src/gui/images/rs-2.png new file mode 100644 index 000000000..e5691d430 Binary files /dev/null and b/retroshare-gui/src/gui/images/rs-2.png differ diff --git a/retroshare-gui/src/gui/images/rsmessenger16.png b/retroshare-gui/src/gui/images/rsmessenger16.png new file mode 100644 index 000000000..cdc8dd66c Binary files /dev/null and b/retroshare-gui/src/gui/images/rsmessenger16.png differ diff --git a/retroshare-gui/src/gui/images/rsmessenger32.png b/retroshare-gui/src/gui/images/rsmessenger32.png new file mode 100644 index 000000000..d768a5624 Binary files /dev/null and b/retroshare-gui/src/gui/images/rsmessenger32.png differ diff --git a/retroshare-gui/src/gui/images/rsmessenger48.png b/retroshare-gui/src/gui/images/rsmessenger48.png new file mode 100644 index 000000000..f01ab76b4 Binary files /dev/null and b/retroshare-gui/src/gui/images/rsmessenger48.png differ diff --git a/retroshare-gui/src/gui/images/rstray0.png b/retroshare-gui/src/gui/images/rstray0.png new file mode 100644 index 000000000..255bd3e7e Binary files /dev/null and b/retroshare-gui/src/gui/images/rstray0.png differ diff --git a/retroshare-gui/src/gui/images/rstray1.png b/retroshare-gui/src/gui/images/rstray1.png new file mode 100644 index 000000000..cb8a756a1 Binary files /dev/null and b/retroshare-gui/src/gui/images/rstray1.png differ diff --git a/retroshare-gui/src/gui/images/rstray3.png b/retroshare-gui/src/gui/images/rstray3.png new file mode 100644 index 000000000..d03d45063 Binary files /dev/null and b/retroshare-gui/src/gui/images/rstray3.png differ diff --git a/retroshare-gui/src/gui/images/rswinicon.ico b/retroshare-gui/src/gui/images/rswinicon.ico new file mode 100644 index 000000000..9b319e658 Binary files /dev/null and b/retroshare-gui/src/gui/images/rswinicon.ico differ diff --git a/retroshare-gui/src/gui/images/send24-hover.png b/retroshare-gui/src/gui/images/send24-hover.png new file mode 100644 index 000000000..f987787f9 Binary files /dev/null and b/retroshare-gui/src/gui/images/send24-hover.png differ diff --git a/retroshare-gui/src/gui/images/send24.png b/retroshare-gui/src/gui/images/send24.png new file mode 100644 index 000000000..1f66781f3 Binary files /dev/null and b/retroshare-gui/src/gui/images/send24.png differ diff --git a/retroshare-gui/src/gui/images/settings.png b/retroshare-gui/src/gui/images/settings.png new file mode 100644 index 000000000..9e6d52b8b Binary files /dev/null and b/retroshare-gui/src/gui/images/settings.png differ diff --git a/retroshare-gui/src/gui/images/settings16.png b/retroshare-gui/src/gui/images/settings16.png new file mode 100644 index 000000000..5f31eb45a Binary files /dev/null and b/retroshare-gui/src/gui/images/settings16.png differ diff --git a/retroshare-gui/src/gui/images/show_toolbox_frame.png b/retroshare-gui/src/gui/images/show_toolbox_frame.png new file mode 100644 index 000000000..e1d9351ce Binary files /dev/null and b/retroshare-gui/src/gui/images/show_toolbox_frame.png differ diff --git a/retroshare-gui/src/gui/images/smplayer_icon32.png b/retroshare-gui/src/gui/images/smplayer_icon32.png new file mode 100644 index 000000000..7fe048992 Binary files /dev/null and b/retroshare-gui/src/gui/images/smplayer_icon32.png differ diff --git a/retroshare-gui/src/gui/images/start.png b/retroshare-gui/src/gui/images/start.png new file mode 100644 index 000000000..167cae741 Binary files /dev/null and b/retroshare-gui/src/gui/images/start.png differ diff --git a/retroshare-gui/src/gui/images/startall.png b/retroshare-gui/src/gui/images/startall.png new file mode 100644 index 000000000..2077ee514 Binary files /dev/null and b/retroshare-gui/src/gui/images/startall.png differ diff --git a/retroshare-gui/src/gui/images/toaster/chat.png b/retroshare-gui/src/gui/images/toaster/chat.png new file mode 100644 index 000000000..1dd453348 Binary files /dev/null and b/retroshare-gui/src/gui/images/toaster/chat.png differ diff --git a/retroshare-gui/src/gui/images/toaster/hangup.png b/retroshare-gui/src/gui/images/toaster/hangup.png new file mode 100644 index 000000000..2febc25be Binary files /dev/null and b/retroshare-gui/src/gui/images/toaster/hangup.png differ diff --git a/retroshare-gui/src/gui/images/toaster/pickup.png b/retroshare-gui/src/gui/images/toaster/pickup.png new file mode 100644 index 000000000..9da541978 Binary files /dev/null and b/retroshare-gui/src/gui/images/toaster/pickup.png differ diff --git a/retroshare-gui/src/gui/images/toaster/toaster-backclear.png b/retroshare-gui/src/gui/images/toaster/toaster-backclear.png new file mode 100644 index 000000000..a39ece68b Binary files /dev/null and b/retroshare-gui/src/gui/images/toaster/toaster-backclear.png differ diff --git a/retroshare-gui/src/gui/images/toaster/toaster-background.png b/retroshare-gui/src/gui/images/toaster/toaster-background.png new file mode 100644 index 000000000..3cc0fc558 Binary files /dev/null and b/retroshare-gui/src/gui/images/toaster/toaster-background.png differ diff --git a/retroshare-gui/src/gui/images/toaster/toaster-backrs1.png b/retroshare-gui/src/gui/images/toaster/toaster-backrs1.png new file mode 100644 index 000000000..8706097fa Binary files /dev/null and b/retroshare-gui/src/gui/images/toaster/toaster-backrs1.png differ diff --git a/retroshare-gui/src/gui/images/toaster/toaster-backrs2.png b/retroshare-gui/src/gui/images/toaster/toaster-backrs2.png new file mode 100644 index 000000000..980b1a3e3 Binary files /dev/null and b/retroshare-gui/src/gui/images/toaster/toaster-backrs2.png differ diff --git a/retroshare-gui/src/gui/images/toaster/toaster-backrs3.png b/retroshare-gui/src/gui/images/toaster/toaster-backrs3.png new file mode 100644 index 000000000..eb6a88d0d Binary files /dev/null and b/retroshare-gui/src/gui/images/toaster/toaster-backrs3.png differ diff --git a/retroshare-gui/src/gui/images/toaster/toaster-backrs4.png b/retroshare-gui/src/gui/images/toaster/toaster-backrs4.png new file mode 100644 index 000000000..9d542a33c Binary files /dev/null and b/retroshare-gui/src/gui/images/toaster/toaster-backrs4.png differ diff --git a/retroshare-gui/src/gui/images/tst.ico b/retroshare-gui/src/gui/images/tst.ico new file mode 100644 index 000000000..d0d18b00f Binary files /dev/null and b/retroshare-gui/src/gui/images/tst.ico differ diff --git a/retroshare-gui/src/gui/images/up.png b/retroshare-gui/src/gui/images/up.png new file mode 100644 index 000000000..c1e63c893 Binary files /dev/null and b/retroshare-gui/src/gui/images/up.png differ diff --git a/retroshare-gui/src/gui/images/warning_16x16.png b/retroshare-gui/src/gui/images/warning_16x16.png new file mode 100644 index 000000000..56ad042e5 Binary files /dev/null and b/retroshare-gui/src/gui/images/warning_16x16.png differ diff --git a/retroshare-gui/src/gui/images/webcache_24x24.png b/retroshare-gui/src/gui/images/webcache_24x24.png new file mode 100644 index 000000000..b890a2559 Binary files /dev/null and b/retroshare-gui/src/gui/images/webcache_24x24.png differ diff --git a/retroshare-gui/src/gui/layouts/default.ui b/retroshare-gui/src/gui/layouts/default.ui new file mode 100644 index 000000000..9667e9929 --- /dev/null +++ b/retroshare-gui/src/gui/layouts/default.ui @@ -0,0 +1,1039 @@ + + MainWindow + + + + 0 + 0 + 400 + 300 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 120 + 120 + 120 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 10 + 36 + 106 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 120 + 120 + 120 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 212 + 208 + 200 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + + + 120 + 120 + 120 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 120 + 120 + 120 + + + + + + + 139 + 139 + 139 + + + + + + + 120 + 120 + 120 + + + + + + + 255 + 255 + 255 + + + + + + + 120 + 120 + 120 + + + + + + + 240 + 240 + 240 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 10 + 36 + 106 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + + + Arial + 10 + 50 + false + false + false + false + + + + Qt::CustomContextMenu + + + RetroShare + + + :/images/RShare32.png + + + + 32 + 32 + + + + Qt::ToolButtonTextUnderIcon + + + + + 2 + + + 2 + + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 120 + 120 + 120 + + + + + + + 160 + 160 + 160 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 10 + 36 + 106 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 120 + 120 + 120 + + + + + + + 160 + 160 + 160 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 212 + 208 + 200 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + + + 120 + 120 + 120 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 120 + 120 + 120 + + + + + + + 160 + 160 + 160 + + + + + + + 120 + 120 + 120 + + + + + + + 255 + 255 + 255 + + + + + + + 120 + 120 + 120 + + + + + + + 240 + 240 + 240 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 10 + 36 + 106 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + + Qt::NoContextMenu + + + + + 0 + 0 + 100 + 30 + + + + + + + + + + + Qt::NoContextMenu + + + true + + + Qt::Horizontal + + + + 24 + 24 + + + + 4 + + + + + + MainPageStack + QStackedPageWidget +
    gui/mainpagestack.h
    +
    +
    + + + + +
    diff --git a/retroshare-gui/src/gui/linetypes.h b/retroshare-gui/src/gui/linetypes.h new file mode 100644 index 000000000..7bdc30558 --- /dev/null +++ b/retroshare-gui/src/gui/linetypes.h @@ -0,0 +1,25 @@ +/**************************************************************** + * RShare QT Gui is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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. + ****************************************************************/ + + + +#define BWGRAPH_SEND (1u<<0) +#define BWGRAPH_REC (1u<<1) diff --git a/retroshare-gui/src/gui/mainpage.h b/retroshare-gui/src/gui/mainpage.h new file mode 100644 index 000000000..e9469e1c6 --- /dev/null +++ b/retroshare-gui/src/gui/mainpage.h @@ -0,0 +1,38 @@ +/**************************************************************** + * RShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 _MAINPAGE_H +#define _MAINPAGE_H + +#include + + +class MainPage : public QWidget +{ +public: + /** Default Constructor */ + MainPage(QWidget *parent = 0) : QWidget(parent) {} + + +}; + +#endif + diff --git a/retroshare-gui/src/gui/mainpagestack.cpp b/retroshare-gui/src/gui/mainpagestack.cpp new file mode 100644 index 000000000..7c55e96de --- /dev/null +++ b/retroshare-gui/src/gui/mainpagestack.cpp @@ -0,0 +1,62 @@ +/**************************************************************** + * RShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 +#include "mainpagestack.h" + +/** Default constructor. */ +MainPageStack::MainPageStack(QWidget *parent) +: QStackedWidget(parent) +{ +} + +/** Adds a page to the stack. */ +void +MainPageStack::add(MainPage *page, QAction *action) +{ + _pages.insert(action, page); + insertWidget(count(), page); +} + +/** Sets the current Main page and checks its action. */ +void +MainPageStack::setCurrentPage(MainPage *page) +{ + foreach (QAction *action, _pages.keys(page)) { + action->setChecked(true); + } + setCurrentWidget(page); +} + +/** Sets the current Main page index and checks its action. */ +void +MainPageStack::setCurrentIndex(int index) +{ + setCurrentPage((MainPage *)widget(index)); +} + +/** Shows the Main page associated with the activated action. */ +void +MainPageStack::showPage(QAction *pageAction) +{ + setCurrentWidget(_pages.value(pageAction)); +} + diff --git a/retroshare-gui/src/gui/mainpagestack.h b/retroshare-gui/src/gui/mainpagestack.h new file mode 100644 index 000000000..e9b89ba8b --- /dev/null +++ b/retroshare-gui/src/gui/mainpagestack.h @@ -0,0 +1,59 @@ +/**************************************************************** + * RShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 _MAINPAGESTACK_H +#define _MAINPAGESTACK_H + +#include +#include + +#include "mainpage.h" + + +class MainPageStack : public QStackedWidget +{ + Q_OBJECT + +public: + /** Constructor. */ + MainPageStack(QWidget *parent = 0); + + /** Adds a Mainuration page to the stack. */ + void add(MainPage *page, QAction *action); + /** Sets the current Main page and checks its action. */ + void setCurrentPage(MainPage *page); + /** Sets the current Main page index and checks its action. */ + void setCurrentIndex(int index); + + /** Returns a list of all pages in the stack. */ + QList pages() { return _pages.values(); } + +public slots: + /** Displays the page associated with the activated action. */ + void showPage(QAction *pageAction); + +private: + /** Maps an action to a Main page. */ + QHash _pages; +}; + +#endif + diff --git a/retroshare-gui/src/gui/moreinfo/moreinfo.cpp b/retroshare-gui/src/gui/moreinfo/moreinfo.cpp new file mode 100644 index 000000000..ccab887fa --- /dev/null +++ b/retroshare-gui/src/gui/moreinfo/moreinfo.cpp @@ -0,0 +1,57 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 "moreinfo.h" + +/** Default constructor */ +moreinfo::moreinfo(QWidget *parent, Qt::WFlags flags) +: QDialog(parent, flags) +{ + /* Invoke Qt Designer generated QObject setup routine */ + ui.setupUi(this); + + setFixedSize(QSize(400, 300)); + + //Closing window + connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(cancel())); +} + + + +void +moreinfo::show() +{ + //loadSettings(); + if(!this->isVisible()) { + QDialog::show(); + + } +} + +void moreinfo::closeEvent (QCloseEvent * event) +{ + QWidget::closeEvent(event); +} + +void moreinfo::cancel() +{ + close(); +} diff --git a/retroshare-gui/src/gui/moreinfo/moreinfo.h b/retroshare-gui/src/gui/moreinfo/moreinfo.h new file mode 100644 index 000000000..4308ac4e3 --- /dev/null +++ b/retroshare-gui/src/gui/moreinfo/moreinfo.h @@ -0,0 +1,58 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 _MOREINFO_H +#define _MOREINFO_H + +#include "ui_moreinfo.h" + + +class moreinfo : public QDialog +{ + Q_OBJECT + +public: + /** Default constructor */ + moreinfo(QWidget *parent = 0, Qt::WFlags flags = 0); + /** Default destructor */ + + +public slots: + /** Overloaded QWidget.show */ + void show(); + + void cancel(); + +protected: + void closeEvent (QCloseEvent * event); + +private slots: + + +private: + + /** Qt Designer generated object */ + Ui::moreinfo ui; +}; + +#endif + diff --git a/retroshare-gui/src/gui/moreinfo/moreinfo.ui b/retroshare-gui/src/gui/moreinfo/moreinfo.ui new file mode 100644 index 000000000..744622a40 --- /dev/null +++ b/retroshare-gui/src/gui/moreinfo/moreinfo.ui @@ -0,0 +1,51 @@ + + moreinfo + + + + 0 + 0 + 400 + 300 + + + + Details + + + + + 310 + 270 + 75 + 23 + + + + OK + + + + + + 10 + 10 + 381 + 251 + + + + + Name + + + + + Value + + + + + + + diff --git a/retroshare-gui/src/gui/msgs/ChanCreateDialog.cpp b/retroshare-gui/src/gui/msgs/ChanCreateDialog.cpp new file mode 100644 index 000000000..bc2c00b5a --- /dev/null +++ b/retroshare-gui/src/gui/msgs/ChanCreateDialog.cpp @@ -0,0 +1,73 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 "rshare.h" +#include "ChanCreateDialog.h" + +#include "rsiface/rsiface.h" +#include + +#include +#include +#include +#include +#include +#include + +/** Constructor */ +ChanCreateDialog::ChanCreateDialog(QWidget *parent, Qt::WFlags flags) +: QMainWindow(parent, flags) +{ + /* Invoke the Qt Designer generated object setup routine */ + ui.setupUi(this); + + // connect up the buttons. + connect( ui.cancelButton, SIGNAL( clicked ( bool ) ), this, SLOT( cancelChan( ) ) ); + connect( ui.createButton, SIGNAL( clicked ( bool ) ), this, SLOT( createChan( ) ) ); + + setFixedSize(QSize(392, 167)); + + /* Hide platform specific features */ +#ifdef Q_WS_WIN + +#endif +} + + +void ChanCreateDialog::newChan() +{ + /* clear all */ +} + +void ChanCreateDialog::createChan() +{ + hide(); + return; +} + + +void ChanCreateDialog::cancelChan() +{ + hide(); + return; +} + diff --git a/retroshare-gui/src/gui/msgs/ChanCreateDialog.h b/retroshare-gui/src/gui/msgs/ChanCreateDialog.h new file mode 100644 index 000000000..541fda51b --- /dev/null +++ b/retroshare-gui/src/gui/msgs/ChanCreateDialog.h @@ -0,0 +1,57 @@ +/**************************************************************** + * RShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 _CHAN_CREATE_DIALOG_H +#define _CHAN_CREATE_DIALOG_H + +#include + +//#include + +#include "ui_ChanCreateDialog.h" + +class ChanCreateDialog : public QMainWindow +{ + Q_OBJECT + +public: + /** Default Constructor */ + + ChanCreateDialog(QWidget *parent = 0, Qt::WFlags flags = 0); + /** Default Destructor */ + +void newChan(); /* cleanup */ + +private slots: + + /* actions to take.... */ +void createChan(); +void cancelChan(); + +private: + + /** Qt Designer generated object */ + Ui::ChanCreateDialog ui; +}; + +#endif + diff --git a/retroshare-gui/src/gui/msgs/ChanCreateDialog.ui b/retroshare-gui/src/gui/msgs/ChanCreateDialog.ui new file mode 100644 index 000000000..fe5145d5d --- /dev/null +++ b/retroshare-gui/src/gui/msgs/ChanCreateDialog.ui @@ -0,0 +1,662 @@ + + ChanCreateDialog + + + + 0 + 0 + 392 + 167 + + + + + 7 + 7 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 192 + 192 + 192 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + 104 + 104 + 104 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 104 + 104 + 104 + + + + + + + 139 + 139 + 139 + + + + + + + 104 + 104 + 104 + + + + + + + 255 + 255 + 255 + + + + + + + 104 + 104 + 104 + + + + + + + 240 + 240 + 240 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 231 + 231 + 231 + + + + + + + + + Arial + 8 + 50 + false + false + false + false + + + + Qt::NoContextMenu + + + Create a new Broadcast Channel + + + + + + + + 10 + 0 + 391 + 31 + + + + + 12 + 75 + true + + + + Create A New Broadcast Channel + + + + + + 0 + 20 + 401 + 151 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 10 + 20 + 101 + 23 + + + + + 10 + 75 + true + + + + Channel Name: + + + + + + 10 + 50 + 41 + 23 + + + + + 10 + 75 + true + + + + Type: + + + + + + 120 + 20 + 261 + 23 + + + + + + + 150 + 110 + 111 + 26 + + + + Cancel Channel + + + + + + 270 + 110 + 111 + 26 + + + + Create Channel + + + true + + + + + + 120 + 50 + 271 + 23 + + + + Public Channel (Signed) + + + + + + 120 + 70 + 271 + 23 + + + + Private Channel (Encrypted) + + + + + + channelName + publicButton + privateButton + cancelButton + createButton + + + + + + diff --git a/retroshare-gui/src/gui/msgs/ChanMsgDialog.cpp b/retroshare-gui/src/gui/msgs/ChanMsgDialog.cpp new file mode 100644 index 000000000..0a2e8a763 --- /dev/null +++ b/retroshare-gui/src/gui/msgs/ChanMsgDialog.cpp @@ -0,0 +1,474 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 "rshare.h" +#include "ChanMsgDialog.h" + +#include "rsiface/rsiface.h" +#include + +#include +#include +#include +#include +#include +#include + +/** Constructor */ +ChanMsgDialog::ChanMsgDialog(bool msg, QWidget *parent, Qt::WFlags flags) +: mIsMsg(msg), QMainWindow(parent, flags) +{ + /* Invoke the Qt Designer generated object setup routine */ + ui.setupUi(this); + + setAttribute ( Qt::WA_DeleteOnClose, true ); + + //connect( ui.channelstreeView, SIGNAL( customContextMenuRequested( QPoint ) ), this, SLOT( channelstreeViewCostumPopupMenu( QPoint ) ) ); + // + + // connect up the buttons. + connect( ui.actionSend, SIGNAL( triggered (bool)), this, SLOT( sendMessage( ) ) ); + //connect( ui.actionReply, SIGNAL( triggered (bool)), this, SLOT( replyMessage( ) ) ); + + /* if Msg */ + if (mIsMsg) + { + connect(ui.msgSendList, SIGNAL(itemChanged( QTreeWidgetItem *, int ) ), + this, SLOT(togglePersonItem( QTreeWidgetItem *, int ) )); + } + else + { + connect(ui.msgSendList, SIGNAL(itemChanged( QTreeWidgetItem *, int ) ), + this, SLOT(toggleChannelItem( QTreeWidgetItem *, int ) )); + } + + connect(ui.msgFileList, SIGNAL(itemChanged( QTreeWidgetItem *, int ) ), + this, SLOT(toggleRecommendItem( QTreeWidgetItem *, int ) )); + + /* hide the Tree +/- */ + ui.msgSendList -> setRootIsDecorated( false ); + + + /* Hide platform specific features */ +#ifdef Q_WS_WIN + +#endif +} + + +void ChanMsgDialog::channelstreeViewCostumPopupMenu( QPoint point ) +{ + + QMenu contextMnu( this ); + QMouseEvent *mevent = new QMouseEvent( QEvent::MouseButtonPress, point, Qt::RightButton, Qt::RightButton, Qt::NoModifier ); + + deletechannelAct = new QAction( tr( "Delete Channel" ), this ); + connect( deletechannelAct , SIGNAL( triggered() ), this, SLOT( deletechannel() ) ); + + createchannelmsgAct = new QAction( tr( "Create Channel MSG" ), this ); + connect( createchannelmsgAct , SIGNAL( triggered() ), this, SLOT( createchannelmsg() ) ); + + + contextMnu.clear(); + contextMnu.addAction( deletechannelAct); + contextMnu.addAction( createchannelmsgAct); + contextMnu.exec( mevent->globalPos() ); +} + + +void ChanMsgDialog::deletechannel() +{ + + +} + + +void ChanMsgDialog::createchannelmsg() +{ + + +} + + + +void ChanMsgDialog::insertSendList() +{ + rsiface->lockData(); /* Lock Interface */ + + std::map::const_iterator it; + const std::map &friends = + rsiface->getFriendMap(); + + /* get a link to the table */ + QTreeWidget *sendWidget = ui.msgSendList; + + /* remove old items ??? */ + sendWidget->clear(); + sendWidget->setColumnCount(6); + + QList items; + for(it = friends.begin(); it != friends.end(); it++) + { + if (it -> second.connectString == "Yourself") + { + /* ok */ + continue; + } + + /* make a widget per friend */ + QTreeWidgetItem *item = new QTreeWidgetItem((QTreeWidget*)0); + + + /* add all the labels */ + /* (0) Person */ + item -> setText(0, QString::fromStdString(it->second.name)); + /* () Org */ + item -> setText(1, QString::fromStdString(it->second.org)); + /* () Location */ + item -> setText(2, QString::fromStdString(it->second.loc)); + /* () Country */ + item -> setText(3, QString::fromStdString(it->second.country)); + { + std::ostringstream out; + out << it->second.id; + item -> setText(4, QString::fromStdString(out.str())); + } + + item -> setText(5, "Friend"); + + item -> setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled); + //item -> setCheckState(0, Qt::Checked); + // + + if (it -> second.inMsg) + { + item -> setCheckState(0, Qt::Checked); + } + else + { + item -> setCheckState(0, Qt::Unchecked); + } + + /* add to the list */ + items.append(item); + } + + /* add the items in! */ + sendWidget->insertTopLevelItems(0, items); + + rsiface->unlockData(); /* UnLock Interface */ + + sendWidget->update(); /* update display */ +} + + +void ChanMsgDialog::insertChannelSendList() +{ + rsiface->lockData(); /* Lock Interface */ + + std::map::const_iterator it; + const std::map &chans = + rsiface->getChannels(); + + /* get a link to the table */ + QTreeWidget *sendWidget = ui.msgSendList; + + /* remove old items ??? */ + sendWidget->clear(); + sendWidget->setColumnCount(4); + + QList items; + for(it = chans.begin(); it != chans.end(); it++) + { + /* make a widget per friend */ + QTreeWidgetItem *item = new QTreeWidgetItem((QTreeWidget*)0); + + /* (0) Title */ + item -> setText(0, QString::fromStdString(it->second.chanName)); + if (it->second.publisher) + { + item -> setText(1, "Publisher"); + } + else + { + item -> setText(1, "Listener"); + } + + { + std::ostringstream out; + out << it->second.chanId; + item -> setText(2, QString::fromStdString(out.str())); + } + + item -> setText(3, "Channel"); + + item -> setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled); + item -> setCheckState(0, Qt::Unchecked); + + if (it -> second.inBroadcast) + { + item -> setCheckState(0, Qt::Checked); + } + else + { + item -> setCheckState(0, Qt::Unchecked); + } + + /* add to the list */ + items.append(item); + } + + /* add the items in! */ + sendWidget->insertTopLevelItems(0, items); + + rsiface->unlockData(); /* UnLock Interface */ + + sendWidget->update(); /* update display */ +} + + + +/* Utility Fns */ +/*** +RsCertId getSenderRsCertId(QTreeWidgetItem *i) +{ + RsCertId id = (i -> text(3)).toStdString(); + return id; +} +***/ + + + /* get the list of peers from the RsIface. */ +void ChanMsgDialog::insertFileList() +{ + rsiface->lockData(); /* Lock Interface */ + + + const std::list &recList = rsiface->getRecommendList(); + std::list::const_iterator it; + + /* get a link to the table */ + QTreeWidget *tree = ui.msgFileList; + + tree->clear(); + tree->setColumnCount(5); + + QList items; + for(it = recList.begin(); it != recList.end(); it++) + { + /* make a widget per person */ + QTreeWidgetItem *item = new QTreeWidgetItem((QTreeWidget*)0); + /* (0) Filename */ + item -> setText(0, QString::fromStdString(it->fname)); + + /* (1) Size */ + { + std::ostringstream out; + out << it->size; + item -> setText(1, QString::fromStdString(out.str())); + } + /* (2) Rank */ + { + std::ostringstream out; + out << it->rank; + item -> setText(2, QString::fromStdString(out.str())); + } + + item -> setText(3, QString::fromStdString(it->hash)); + + item -> setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled); + + if (it -> inRecommend) + { + item -> setCheckState(0, Qt::Checked); + } + else + { + item -> setCheckState(0, Qt::Unchecked); + } + + /* add to the list */ + items.append(item); + } + + /* add the items in! */ + tree->insertTopLevelItems(0, items); + + rsiface->unlockData(); /* UnLock Interface */ + + tree->update(); /* update display */ +} + + +void ChanMsgDialog::newMsg() +{ + /* clear all */ + ui.titleEdit->setText("No Title"); + ui.msgText->setText(""); + + /* worker fns */ + if (mIsMsg) + { + insertSendList(); + } + else + { + insertChannelSendList(); + } + + insertFileList(); +} + +void ChanMsgDialog::insertTitleText(std::string title) +{ + ui.titleEdit->setText(QString::fromStdString(title)); +} + + +void ChanMsgDialog::insertMsgText(std::string msg) +{ + ui.msgText->setText(QString::fromStdString(msg)); +} + + +void ChanMsgDialog::sendMessage() +{ + rsiface->lockData(); /* Lock Interface */ + + + /* construct a message */ + MessageInfo mi; + + mi.title = ui.titleEdit->text().toStdString(); + mi.msg = ui.msgText->toPlainText().toStdString(); + /* filled in later */ + //mi.msgId = rand(); + + const std::list &recList = rsiface->getRecommendList(); + std::list::const_iterator it; + for(it = recList.begin(); it != recList.end(); it++) + { + if (it -> inRecommend) + { + mi.files.push_back(*it); + } + } + + /* get a list of people to send it to */ + std::map::const_iterator it2; + const std::map &friends = + rsiface->getFriendMap(); + + std::list persons; + std::list::iterator it3; + + for(it2 = friends.begin(); it2 != friends.end(); it2++) + { + /* send to all listed + ourselves */ + if ((it2 -> second.inMsg) + || (it2 -> second.connectString == "Yourself")) + { + std::ostringstream out; + out << it2 -> second.id; + persons.push_back(out.str()); + } + } + + rsiface->unlockData(); /* UnLock Interface */ + + /* send message */ + for(it3 = persons.begin(); it3 != persons.end(); it3++) + { + mi.id = *it3; + rsicontrol -> MessageSend(mi); + } + + close(); + return; +} + + +void ChanMsgDialog::cancelMessage() +{ + close(); + return; +} + + + +/* Toggling .... Check Boxes..... + * This is dependent on whether we are a + * + * Chan or Msg Dialog. + */ + + +/* First the Msg (People) ones */ +void ChanMsgDialog::togglePersonItem( QTreeWidgetItem *item, int col ) +{ + std::cerr << "TogglePersonItem()" << std::endl; + + /* extract id */ + std::string id = (item -> text(4)).toStdString(); + + /* get state */ + bool inMsg = (Qt::Checked == item -> checkState(0)); /* alway column 0 */ + + /* call control fns */ + + rsicontrol -> SetInMsg(id, inMsg); + return; +} + +/* Second the Channel ones */ +void ChanMsgDialog::toggleChannelItem( QTreeWidgetItem *item, int col ) +{ + std::cerr << "ToggleChannelItem()" << std::endl; + + /* extract id */ + std::string id = (item -> text(2)).toStdString(); + + /* get state */ + bool inBroad = (Qt::Checked == item -> checkState(0)); /* alway column 0 */ + + /* call control fns */ + + rsicontrol -> SetInBroadcast(id, inBroad); + return; +} + +/* This is actually for both */ +void ChanMsgDialog::toggleRecommendItem( QTreeWidgetItem *item, int col ) +{ + std::cerr << "ToggleRecommendItem()" << std::endl; + + /* extract name */ + std::string id = (item -> text(0)).toStdString(); + + /* get state */ + bool inRecommend = (Qt::Checked == item -> checkState(0)); /* alway column 0 */ + + /* call control fns */ + + rsicontrol -> SetInRecommend(id, inRecommend); + return; +} + diff --git a/retroshare-gui/src/gui/msgs/ChanMsgDialog.h b/retroshare-gui/src/gui/msgs/ChanMsgDialog.h new file mode 100644 index 000000000..13bceda45 --- /dev/null +++ b/retroshare-gui/src/gui/msgs/ChanMsgDialog.h @@ -0,0 +1,90 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 _CHAN_MSG_DIALOG_H +#define _CHAN_MSG_DIALOG_H + +#include + +#include "ui_ChanMsgDialog.h" + +class ChanMsgDialog : public QMainWindow +{ + Q_OBJECT + +public: + /** Default Constructor */ + + ChanMsgDialog(bool isMsg, QWidget *parent = 0, Qt::WFlags flags = 0); + /** Default Destructor */ + +void newMsg(); + + /* worker fns */ +void insertSendList(); /* for Msgs */ +void insertChannelSendList(); /* for Channels */ +void insertFileList(); /* for Both */ +void insertTitleText(std::string title); +void insertMsgText(std::string msg); + +public slots: + + /* actions to take.... */ +void sendMessage(); +void cancelMessage(); + +private slots: + + /** Create the context popup menu and it's submenus */ + void channelstreeViewCostumPopupMenu( QPoint point ); + + /** Defines the context menu functions*/ + void deletechannel(); + void createchannelmsg(); + + + /* for toggling flags */ + void togglePersonItem( QTreeWidgetItem *item, int col ); + void toggleChannelItem( QTreeWidgetItem *item, int col ); + void toggleRecommendItem( QTreeWidgetItem *item, int col ); + + +private: + + /** Define the popup menus for the Context menu */ + QMenu* contextMnu; + + /** Defines the actions for the context menu */ + QAction* deletechannelAct; + QAction* createchannelmsgAct; + + QTreeView *channelstreeView; + + bool mIsMsg; /* different behaviour for Msg or ChanMsg */ + + /** Qt Designer generated object */ + Ui::ChanMsgDialog ui; + +}; + +#endif + diff --git a/retroshare-gui/src/gui/msgs/ChanMsgDialog.ui b/retroshare-gui/src/gui/msgs/ChanMsgDialog.ui new file mode 100644 index 000000000..c79bac60d --- /dev/null +++ b/retroshare-gui/src/gui/msgs/ChanMsgDialog.ui @@ -0,0 +1,271 @@ + + ChanMsgDialog + + + + 0 + 0 + 599 + 411 + + + + Qt::NoContextMenu + + + Compose + + + :/images/folder-draft.png + + + + + 9 + + + 6 + + + + + Qt::Vertical + + + + Qt::Vertical + + + + + 0 + + + 6 + + + + + + 0 + 0 + 0 + 0 + + + + + 10 + 75 + true + + + + Send To: + + + + + + + + 7 + 7 + 0 + 4 + + + + true + + + + 1 + + + + + + + + Qt::Horizontal + + + + 421 + 20 + + + + + + + + + + 0 + + + 6 + + + + + 0 + + + 6 + + + + + + 10 + 75 + true + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-weight:400;"><span style=" font-weight:600;">Subject:</span></p></body></html> + + + + + + + + + + + + + 7 + 7 + 4 + 4 + + + + Qt::TextEditorInteraction + + + + + + + + + + 0 + + + 6 + + + + + + 0 + 0 + 0 + 0 + + + + + 10 + 75 + true + + + + Recommended Files + + + + + + + + 7 + 7 + 0 + 0 + + + + true + + + + 1 + + + + + + + + + + + + + + 0 + 0 + 599 + 24 + + + + + + + Qt::NoContextMenu + + + false + + + Qt::Horizontal + + + Qt::ToolButtonTextUnderIcon + + + 4 + + + + + + :/images/send24.png + + + Send + + + + + :/images/replymail24.png + + + Reply + + + + + msgSendList + titleEdit + msgText + msgFileList + + + + + + diff --git a/retroshare-gui/src/gui/qskinobject/qskinobject.h b/retroshare-gui/src/gui/qskinobject/qskinobject.h new file mode 100644 index 000000000..1f65bdba1 --- /dev/null +++ b/retroshare-gui/src/gui/qskinobject/qskinobject.h @@ -0,0 +1,90 @@ +/******************************************************************************************************** + * PROGRAM : childform + * DATE - TIME : Samstag 30 Dezember 2006 - 12h04 + * AUTHOR : ( ) + * FILENAME : QSkinMainWindow.h + * LICENSE : + * COMMENTARY : + ********************************************************************************************************/ +#ifndef QSkinObject_H +#define QSkinObject_H +#include "qskinwidgetresizehandler.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef WIN32 +#define _WIN32_WINNT 0x0500 +#define WINVER 0x0500 +#include +#endif +class QSkinWidgetResizeHandler; +class QSkinObject : public QObject +{ + Q_OBJECT + friend class QSkinWidgetResizeHandler; +public: + QSkinObject(QWidget* wgtParent); + ~QSkinObject(){} + void setSkinPath(const QString & skinpath); + QString getSkinPath(); + int customFrameWidth(); +public slots: + void updateStyle(); + void updateButtons(); + void startSkinning(); + void stopSkinning(); +protected: + bool eventFilter(QObject *o, QEvent *e); + //Events to filter + //void mouseMoveEvent(QMouseEvent *event); + void mousePressEvent(QMouseEvent *event); + //void mouseReleaseEvent(QMouseEvent *mouseEvent); + void paintEvent(QPaintEvent *event); + void resizeEvent(QResizeEvent *e); + //void closeEvent(QCloseEvent *e); + + void loadSkinIni(); + void manageRegions(); + QPixmap drawCtrl(QWidget * widget); + QRegion childRegion; + void timerEvent ( QTimerEvent * event ); +private: + QRect saveRect; + QRect skinGeometry; + QPixmap widgetMask;//the pixmap, in which the ready frame is stored on pressed? + QString skinPath; + QFont titleFont; + QColor titleColor; + bool milchglas; + bool gotMousePress; + QRegion quitButton; + QRegion maxButton; + QRegion minButton; + QRect contentsRect; + QSkinWidgetResizeHandler * resizeHandler; + bool mousePress; + QBasicTimer *skinTimer; + QWidget *skinWidget; + void fastbluralpha(QImage &img, int radius); + Qt::WindowFlags flags; + int wlong; +#ifdef WIN32 +public slots: + void setLayered(); + void updateAlpha(); +private: + double alpha; +#endif +}; +#endif + diff --git a/retroshare-gui/src/gui/qskinobject/qskinwidgetresizehandler.h b/retroshare-gui/src/gui/qskinobject/qskinwidgetresizehandler.h new file mode 100644 index 000000000..45ba0788e --- /dev/null +++ b/retroshare-gui/src/gui/qskinobject/qskinwidgetresizehandler.h @@ -0,0 +1,115 @@ +/**************************************************************** + * RShare is distributed under the following license: + * + * Copyright (C) 2006, The RetroShare Team + * + * 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 QSKINWIDGETRESIZEHANDLER_P_H +#define QSKINWIDGETRESIZEHANDLER_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. This header file may +// change from version to version without notice, or even be +// removed. +// +// We mean it. +// + +#include +#include +#include "qskinobject.h" +class QSkinObject; +class QMouseEvent; +class QKeyEvent; + +class QSkinWidgetResizeHandler : public QObject +{ + Q_OBJECT + friend class QSkinObject; +public: + enum Action { + Move = 0x01, + Resize = 0x02, + Any = Move|Resize + }; + + explicit QSkinWidgetResizeHandler(QSkinObject * skobj, QWidget *parent, QWidget *cw = 0); + void setActive(bool b) { setActive(Any, b); } + void setActive(Action ac, bool b); + bool isActive() const { return isActive(Any); } + bool isActive(Action ac) const; + void setMovingEnabled(bool b) { movingEnabled = b; } + bool isMovingEnabled() const { return movingEnabled; } + + bool isButtonDown() const { return buttonDown; } + + void setExtraHeight(int h) { extrahei = h; } + void setSizeProtection(bool b) { sizeprotect = b; } + + void setFrameWidth(int w) { fw = w; } + + void doResize(); + void doMove(); + +Q_SIGNALS: + void activate(); + +protected: + bool eventFilter(QObject *o, QEvent *e); + void mouseMoveEvent(QMouseEvent *e); + void keyPressEvent(QKeyEvent *e); + +private: + Q_DISABLE_COPY(QSkinWidgetResizeHandler) + QSkinObject *obj; + enum MousePosition { + Nowhere, + TopLeft, BottomRight, BottomLeft, TopRight, + Top, Bottom, Left, Right, + Center + }; + + QWidget *widget; + QWidget *childWidget; + QPoint moveOffset; + QPoint invertedMoveOffset; + MousePosition mode; + int fw; + int extrahei; + int range; + uint buttonDown :1; + uint moveResizeMode :1; + uint activeForResize :1; + uint sizeprotect :1; + uint movingEnabled :1; + uint activeForMove :1; + uint widgetType; + void setMouseCursor(MousePosition m); + bool isMove() const { + return moveResizeMode && mode == Center; + } + bool isResize() const { + return moveResizeMode && !isMove(); + } +}; + + +#endif // QSkinWidgetResizeHandler_P_H diff --git a/retroshare-gui/src/gui/qss/arachnophobia.qss b/retroshare-gui/src/gui/qss/arachnophobia.qss new file mode 100644 index 000000000..eecc247bd --- /dev/null +++ b/retroshare-gui/src/gui/qss/arachnophobia.qss @@ -0,0 +1,56 @@ + + +/* Customize the toolbar. */ +QToolBar { + + min-height: 89px; +} + +QToolBar { + + border-image: url(:qss/arachnophobia/background.png); + +} + + +QPushButton#addfriendButton { + color: white; + min-height: 34px; + min-width: 48px; +} + +QPushButton#invitefriendButton { + color: white; + min-height: 34px; + min-width: 48px; +} + +QPushButton#addshareButton { + color: white; + min-height: 34px; + min-width: 48px; +} + +QPushButton#optionsButton { + color: white; + min-height: 34px; + min-width: 48px; +} + +QPushButton#quitButton { + color: white; + min-height: 34px; + min-width: 48px; +} + +QPushButton#okButton { + color: white; + min-height: 27px; + min-width: 77px; +} + +QPushButton#cancelButton { + color: white; + min-height: 25px; + min-width: 75px; +} diff --git a/retroshare-gui/src/gui/qss/arachnophobia/background.png b/retroshare-gui/src/gui/qss/arachnophobia/background.png new file mode 100644 index 000000000..5516be886 Binary files /dev/null and b/retroshare-gui/src/gui/qss/arachnophobia/background.png differ diff --git a/retroshare-gui/src/gui/qss/black.qss b/retroshare-gui/src/gui/qss/black.qss new file mode 100644 index 000000000..d288cc337 --- /dev/null +++ b/retroshare-gui/src/gui/qss/black.qss @@ -0,0 +1,161 @@ +.QWidget { + background-color: #F9F9F9; +} + +/* Customize the toolbar. */ +QToolBar { + border-image: url(:qss/black/backgroundblack.png); + +} + +QToolButton { + color: white; +} + +QPushButton { + color: white; + min-height: 22px; + +} + +QPushButton#addfriendButton { + color: white; + min-height: 34px; + min-width: 48px; +} + +QPushButton#invitefriendButton { + color: white; + min-height: 34px; + min-width: 48px; +} + +QPushButton#addshareButton { + color: white; + min-height: 34px; + min-width: 48px; +} + +QPushButton#optionsButton { + color: white; + min-height: 34px; + min-width: 48px; +} + +QPushButton#quitButton { + color: white; + min-height: 34px; + min-width: 48px; +} + +QPushButton#okButton { + color: white; + min-height: 27px; + min-width: 77px; +} + +QPushButton#cancelButton#afcancelButton#doneButton { + color: white; + min-height: 25px; + min-width: 75px; +} + +QPushButton#fileButton#emailButton { + color: white; + min-height: 27px; + min-width: 77px; +} + +QPushButton#cancelprefButton { + color: white; + min-height: 25px; + min-width: 75px; +} + +QPushButton#toggleAdvancedSearchBtn{ + min-height: 34px; + min-width: 34px; +} + +QPushButton#pushButtonDownload{ + min-height: 34px; + min-width: 34px; +} + +QPushButton +{ +border-image: url(:qss/black/button.png) ; +} + +QPushButton:hover +{ +border-image: url(:qss/black/button_hover.png); +} + +QPushButton:pressed +{ +border-image: url(:qss/black/button_pressed.png) ; +} + + +QSplitter +{ +background-color: #F9F9F9; +} + +QLineEdit +{ +border-image: url(:qss/black/border.png) 4; +border-width: 3; +} + +QLabel +{ +color: #306090; +} + + +QGroupBox +{ +color: #306090; +font: bold; +} + + +QRadioButton::indicator::unchecked { + image: url(:qss/black/checkBox.png); +} + +QRadioButton::indicator:unchecked:hover { + image: url(:qss/black/checkBox_hover.png); +} + + + +QRadioButton::indicator::checked { + image: url(:qss/black/checkBox_selected.png); +} + +QRadioButton::indicator:checked:hover { + image: url(:qss/black/checkBox_hoverAndSelected.png); +} + + +QCheckBox::indicator:unchecked { + image: url(:qss/black/checkBox.png); +} + +QCheckBox::indicator:unchecked:hover { + image: url(:qss/black/checkBox_hover.png); +} + + +QCheckBox::indicator:checked { + image: url(:qss/black/checkBox_selected.png); +} + +QCheckBox::indicator:checked:hover { + image: url(:qss/black/checkBox_hoverAndSelected.png); +} + + diff --git a/retroshare-gui/src/gui/qss/black/backgroundblack.png b/retroshare-gui/src/gui/qss/black/backgroundblack.png new file mode 100644 index 000000000..4edc99fc0 Binary files /dev/null and b/retroshare-gui/src/gui/qss/black/backgroundblack.png differ diff --git a/retroshare-gui/src/gui/qss/black/border.png b/retroshare-gui/src/gui/qss/black/border.png new file mode 100644 index 000000000..b31e7f960 Binary files /dev/null and b/retroshare-gui/src/gui/qss/black/border.png differ diff --git a/retroshare-gui/src/gui/qss/black/button.png b/retroshare-gui/src/gui/qss/black/button.png new file mode 100644 index 000000000..1aa7052e8 Binary files /dev/null and b/retroshare-gui/src/gui/qss/black/button.png differ diff --git a/retroshare-gui/src/gui/qss/black/button_hover.png b/retroshare-gui/src/gui/qss/black/button_hover.png new file mode 100644 index 000000000..92ecba15c Binary files /dev/null and b/retroshare-gui/src/gui/qss/black/button_hover.png differ diff --git a/retroshare-gui/src/gui/qss/black/button_pressed.png b/retroshare-gui/src/gui/qss/black/button_pressed.png new file mode 100644 index 000000000..796a7166c Binary files /dev/null and b/retroshare-gui/src/gui/qss/black/button_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/black/checkBox.png b/retroshare-gui/src/gui/qss/black/checkBox.png new file mode 100644 index 000000000..73deed8b9 Binary files /dev/null and b/retroshare-gui/src/gui/qss/black/checkBox.png differ diff --git a/retroshare-gui/src/gui/qss/black/checkBox_hover.png b/retroshare-gui/src/gui/qss/black/checkBox_hover.png new file mode 100644 index 000000000..8db50bcaa Binary files /dev/null and b/retroshare-gui/src/gui/qss/black/checkBox_hover.png differ diff --git a/retroshare-gui/src/gui/qss/black/checkBox_hoverAndSelected.png b/retroshare-gui/src/gui/qss/black/checkBox_hoverAndSelected.png new file mode 100644 index 000000000..f5af48f3c Binary files /dev/null and b/retroshare-gui/src/gui/qss/black/checkBox_hoverAndSelected.png differ diff --git a/retroshare-gui/src/gui/qss/black/checkBox_selected.png b/retroshare-gui/src/gui/qss/black/checkBox_selected.png new file mode 100644 index 000000000..5f8800266 Binary files /dev/null and b/retroshare-gui/src/gui/qss/black/checkBox_selected.png differ diff --git a/retroshare-gui/src/gui/qss/blue.qss b/retroshare-gui/src/gui/qss/blue.qss new file mode 100644 index 000000000..c501b4136 --- /dev/null +++ b/retroshare-gui/src/gui/qss/blue.qss @@ -0,0 +1,51 @@ +.QWidget { + background-color: #c4dafa; +} + + +/* Customize the toolbar. */ +QToolBar { + border-image: url(:qss/blue/blue.png); + +} + +QPushButton#addfriendButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#invitefriendButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#addshareButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#optionsButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#quitButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#okButton { + min-height: 27px; + min-width: 77px; +} + +QPushButton#cancelButton { + min-height: 25px; + min-width: 75px; +} + + + + + + diff --git a/retroshare-gui/src/gui/qss/blue/blue.png b/retroshare-gui/src/gui/qss/blue/blue.png new file mode 100644 index 000000000..28a723edd Binary files /dev/null and b/retroshare-gui/src/gui/qss/blue/blue.png differ diff --git a/retroshare-gui/src/gui/qss/default.qss b/retroshare-gui/src/gui/qss/default.qss new file mode 100644 index 000000000..7fef3e178 --- /dev/null +++ b/retroshare-gui/src/gui/qss/default.qss @@ -0,0 +1,13 @@ +.QWidget { + background-color: #ECF3F6; +} + +/* Customize the toolbar. */ +QToolBar { + border-image: url(:/qss/default/retrotoolbar.png); + +} + + + + diff --git a/retroshare-gui/src/gui/qss/default/retrotoolbar.png b/retroshare-gui/src/gui/qss/default/retrotoolbar.png new file mode 100644 index 000000000..4a8e6cd39 Binary files /dev/null and b/retroshare-gui/src/gui/qss/default/retrotoolbar.png differ diff --git a/retroshare-gui/src/gui/qss/ed2k.qss b/retroshare-gui/src/gui/qss/ed2k.qss new file mode 100644 index 000000000..7910be854 --- /dev/null +++ b/retroshare-gui/src/gui/qss/ed2k.qss @@ -0,0 +1,73 @@ +.QWidget { + background-image: url(:qss/ed2k/little-back.png); +} + + +/* Customize the toolbar. */ +QToolBar { + border-image: url(:qss/ed2k/backed2k.png); + +} + + +QPushButton { + min-height: 22px; +} + + +QPushButton +{ +border-image: url(:qss/ed2k/button-down.png) ; +} + +QPushButton:hover +{ +border-image: url(:qss/ed2k/button-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:qss/ed2k/button-up.png) ; +} + + +QPushButton#addfriendButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#invitefriendButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#addshareButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#optionsButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#quitButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#okButton { + min-height: 27px; + min-width: 77px; +} + +QPushButton#cancelButton { + min-height: 25px; + min-width: 75px; +} + +QPushButton#cancelprefButton { + + min-height: 25px; + min-width: 75px; +} diff --git a/retroshare-gui/src/gui/qss/ed2k/backed2k.png b/retroshare-gui/src/gui/qss/ed2k/backed2k.png new file mode 100644 index 000000000..61a7573ed Binary files /dev/null and b/retroshare-gui/src/gui/qss/ed2k/backed2k.png differ diff --git a/retroshare-gui/src/gui/qss/ed2k/button-down.png b/retroshare-gui/src/gui/qss/ed2k/button-down.png new file mode 100644 index 000000000..91bcb06b8 Binary files /dev/null and b/retroshare-gui/src/gui/qss/ed2k/button-down.png differ diff --git a/retroshare-gui/src/gui/qss/ed2k/button-hover.png b/retroshare-gui/src/gui/qss/ed2k/button-hover.png new file mode 100644 index 000000000..842eba29d Binary files /dev/null and b/retroshare-gui/src/gui/qss/ed2k/button-hover.png differ diff --git a/retroshare-gui/src/gui/qss/ed2k/button-up.png b/retroshare-gui/src/gui/qss/ed2k/button-up.png new file mode 100644 index 000000000..e27a751bf Binary files /dev/null and b/retroshare-gui/src/gui/qss/ed2k/button-up.png differ diff --git a/retroshare-gui/src/gui/qss/ed2k/little-back.png b/retroshare-gui/src/gui/qss/ed2k/little-back.png new file mode 100644 index 000000000..18ed14ad4 Binary files /dev/null and b/retroshare-gui/src/gui/qss/ed2k/little-back.png differ diff --git a/retroshare-gui/src/gui/qss/over.qss b/retroshare-gui/src/gui/qss/over.qss new file mode 100644 index 000000000..3afb73a9f --- /dev/null +++ b/retroshare-gui/src/gui/qss/over.qss @@ -0,0 +1,81 @@ +.QWidget { + background-color: #66ff33; +} + +/* Customize the toolbar. */ +QToolBar { + + border-image: url(:qss/over/backover.png); + +} + + +QPushButton { + + min-height: 22px; +} + + +QPushButton +{ +border-image: url(:qss/over/greenbot.png) ; +} + +QPushButton:hover +{ +border-image: url(:qss/over/greenhover.png); +} + +QPushButton:pressed +{ +color: white; +border-image: url(:qss/over/greentop.png) ; +} + +QPushButton#addfriendButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#invitefriendButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#addshareButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#optionsButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#quitButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#okButton { + min-height: 27px; + min-width: 77px; +} + +QPushButton#cancelButton { + min-height: 25px; + min-width: 75px; +} + +QPushButton#cancelprefButton { + color: white; + min-height: 25px; + min-width: 75px; +} + +QSplitter +{ +background-color: #66ff33; +} + + diff --git a/retroshare-gui/src/gui/qss/over/backover.png b/retroshare-gui/src/gui/qss/over/backover.png new file mode 100644 index 000000000..208e244b6 Binary files /dev/null and b/retroshare-gui/src/gui/qss/over/backover.png differ diff --git a/retroshare-gui/src/gui/qss/over/greenbot.png b/retroshare-gui/src/gui/qss/over/greenbot.png new file mode 100644 index 000000000..f0f5e00a8 Binary files /dev/null and b/retroshare-gui/src/gui/qss/over/greenbot.png differ diff --git a/retroshare-gui/src/gui/qss/over/greenhover.png b/retroshare-gui/src/gui/qss/over/greenhover.png new file mode 100644 index 000000000..64dde08bf Binary files /dev/null and b/retroshare-gui/src/gui/qss/over/greenhover.png differ diff --git a/retroshare-gui/src/gui/qss/over/greentop.png b/retroshare-gui/src/gui/qss/over/greentop.png new file mode 100644 index 000000000..0e065e387 Binary files /dev/null and b/retroshare-gui/src/gui/qss/over/greentop.png differ diff --git a/retroshare-gui/src/gui/qss/silver.qss b/retroshare-gui/src/gui/qss/silver.qss new file mode 100644 index 000000000..5bf061fb8 --- /dev/null +++ b/retroshare-gui/src/gui/qss/silver.qss @@ -0,0 +1,45 @@ + +/* Customize the toolbar. */ +QToolBar { + border-image: url(:qss/silver/silver.png); + +} + + + +QPushButton#addfriendButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#invitefriendButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#addshareButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#optionsButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#quitButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#okButton { + min-height: 27px; + min-width: 77px; +} + +QPushButton#cancelButton { + min-height: 25px; + min-width: 75px; +} + + diff --git a/retroshare-gui/src/gui/qss/silver/silver.png b/retroshare-gui/src/gui/qss/silver/silver.png new file mode 100644 index 000000000..2559aa8d8 Binary files /dev/null and b/retroshare-gui/src/gui/qss/silver/silver.png differ diff --git a/retroshare-gui/src/gui/qss/skin2.qss b/retroshare-gui/src/gui/qss/skin2.qss new file mode 100644 index 000000000..85737be51 --- /dev/null +++ b/retroshare-gui/src/gui/qss/skin2.qss @@ -0,0 +1,43 @@ + + +/* Customize the toolbar. */ +QToolBar { + border-image: url(:qss/skin2/background.png); + +} + + +QPushButton#addfriendButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#invitefriendButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#addshareButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#optionsButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#quitButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#okButton { + min-height: 27px; + min-width: 77px; +} + +QPushButton#cancelButton { + min-height: 25px; + min-width: 75px; +} diff --git a/retroshare-gui/src/gui/qss/skin2/background.png b/retroshare-gui/src/gui/qss/skin2/background.png new file mode 100644 index 000000000..6c3182dca Binary files /dev/null and b/retroshare-gui/src/gui/qss/skin2/background.png differ diff --git a/retroshare-gui/src/gui/toaster/CallToaster.cpp b/retroshare-gui/src/gui/toaster/CallToaster.cpp new file mode 100644 index 000000000..9bb1ed9b5 --- /dev/null +++ b/retroshare-gui/src/gui/toaster/CallToaster.cpp @@ -0,0 +1,97 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006,2007 crypton + * + * 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 "CallToaster.h" + +#include "QtToaster.h" + +#include "ui_CallToaster.h" + +//#include +//#include + +#include + +CallToaster::CallToaster() + : QObject(NULL) { + + _callToasterWidget = new QWidget(NULL); + + _ui = new Ui::CallToaster(); + _ui->setupUi(_callToasterWidget); + + _ui->hangUpButton->setPixmaps(QPixmap(":/images/toaster/hangup.png"), + QPixmap(), + QPixmap(), + QPixmap(":/images/toaster/hangup.png"), + QPixmap(), + QPixmap()); + + _ui->pickUpButton->setPixmaps(QPixmap(":/images/toaster/pickup.png"), + QPixmap(), + QPixmap(), + QPixmap(":/images/toaster/pickup.png"), + QPixmap(), + QPixmap()); + + _ui->pickUpButton->setMinimumSize(QSize(48, 56)); + _ui->pickUpButton->setMaximumSize(QSize(48, 56)); + connect(_ui->pickUpButton, SIGNAL(clicked()), SLOT(pickUpButtonSlot())); + + _ui->hangUpButton->setMinimumSize(QSize(28, 56)); + _ui->hangUpButton->setMaximumSize(QSize(28, 56)); + connect(_ui->hangUpButton, SIGNAL(clicked()), SLOT(hangUpButtonSlot())); + + connect(_ui->closeButton, SIGNAL(clicked()), SLOT(close())); + + _toaster = new QtToaster(_callToasterWidget, _ui->windowFrame); + _toaster->setTimeOnTop(10000); +} + +CallToaster::~CallToaster() { + delete(_ui); +} + +void CallToaster::setMessage(const QString & message) { + _ui->messageLabel->setText(message); +} + +void CallToaster::setPixmap(const QPixmap & pixmap) { + _ui->pixmapLabel->setPixmap(pixmap); +} + +void CallToaster::show() { + _toaster->show(); +} + +void CallToaster::close() { + _toaster->close(); +} + +void CallToaster::hangUpButtonSlot() { + hangUpButtonClicked(); + close(); +} + +void CallToaster::pickUpButtonSlot() { + pickUpButtonClicked(); + close(); +} diff --git a/retroshare-gui/src/gui/toaster/CallToaster.h b/retroshare-gui/src/gui/toaster/CallToaster.h new file mode 100644 index 000000000..2c6061003 --- /dev/null +++ b/retroshare-gui/src/gui/toaster/CallToaster.h @@ -0,0 +1,80 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006,2007 crypton + * + * 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 CALLTOASTER_H +#define CALLTOASTER_H + +#include "IQtToaster.h" + +#include + +class QtToaster; + +class QWidget; +class QString; +class QPixmap; +namespace Ui { class CallToaster; } + +/** + * Shows a toaster when a phone call is incoming. + * + * + */ +class CallToaster : public QObject, public IQtToaster { + Q_OBJECT +public: + + CallToaster(); + + ~CallToaster(); + + void setMessage(const QString & message); + + void setPixmap(const QPixmap & pixmap); + + void show(); + +public Q_SLOTS: + + void close(); + +Q_SIGNALS: + + void hangUpButtonClicked(); + + void pickUpButtonClicked(); + +private Q_SLOTS: + + void hangUpButtonSlot(); + + void pickUpButtonSlot(); + +private: + + Ui::CallToaster * _ui; + + QWidget * _callToasterWidget; + + QtToaster * _toaster; +}; + +#endif //CALLTOASTER_H diff --git a/retroshare-gui/src/gui/toaster/CallToaster.ui b/retroshare-gui/src/gui/toaster/CallToaster.ui new file mode 100644 index 000000000..1c438d512 --- /dev/null +++ b/retroshare-gui/src/gui/toaster/CallToaster.ui @@ -0,0 +1,681 @@ + + CallToaster + + + + 0 + 0 + 400 + 300 + + + + + 0 + + + 0 + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 0 + + + 0 + + + + + 6 + + + 0 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + QFrame::NoFrame + + + :/images/toaster/pickup.png + + + + + + + QFrame::NoFrame + + + :/images/toaster/hangup.png + + + + + + + Qt::AlignCenter + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + 0 + + + 0 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 0 + 0 + 0 + + + + + 18 + 18 + + + + + 18 + 18 + + + + :/images/close-down.png + + + true + + + + + + + + + 0 + + + 0 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + 255 + 255 + 255 + + + + + + + 212 + 208 + 200 + + + + + + + 255 + 255 + 255 + + + + + + + 234 + 229 + 220 + + + + + + + 128 + 128 + 128 + + + + + + + 141 + 139 + 133 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 212 + 208 + 200 + + + + + + + 64 + 64 + 64 + + + + + + + 10 + 36 + 106 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 232 + 232 + 232 + + + + + + + + + 255 + 255 + 255 + + + + + + + 212 + 208 + 200 + + + + + + + 255 + 255 + 255 + + + + + + + 234 + 229 + 220 + + + + + + + 128 + 128 + 128 + + + + + + + 141 + 139 + 133 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 212 + 208 + 200 + + + + + + + 64 + 64 + 64 + + + + + + + 212 + 208 + 200 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 232 + 232 + 232 + + + + + + + + + 106 + 104 + 100 + + + + + + + 212 + 208 + 200 + + + + + + + 255 + 255 + 255 + + + + + + + 233 + 231 + 227 + + + + + + + 128 + 128 + 128 + + + + + + + 141 + 139 + 133 + + + + + + + 106 + 104 + 100 + + + + + + + 255 + 255 + 255 + + + + + + + 106 + 104 + 100 + + + + + + + 212 + 208 + 200 + + + + + + + 212 + 208 + 200 + + + + + + + 0 + 0 + 0 + + + + + + + 10 + 36 + 106 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 232 + 232 + 232 + + + + + + + + Message + + + Qt::AlignCenter + + + + + + + + + + + + + RetroStyleLabel + QLabel +
    gui/toaster/RetroStyleLabelProxy.h
    +
    +
    + + + + +
    diff --git a/retroshare-gui/src/gui/toaster/ChatToaster.cpp b/retroshare-gui/src/gui/toaster/ChatToaster.cpp new file mode 100644 index 000000000..4dbf615e6 --- /dev/null +++ b/retroshare-gui/src/gui/toaster/ChatToaster.cpp @@ -0,0 +1,77 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006,2007 crypton + * + * 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 "ChatToaster.h" + +#include "ui_ChatToaster.h" + +#include "QtToaster.h" + + +#include + +ChatToaster::ChatToaster() + : QObject(NULL) { + + _chatToasterWidget = new QWidget(NULL); + + _ui = new Ui::ChatToaster(); + _ui->setupUi(_chatToasterWidget); + + _ui->chatButton->setPixmaps(QPixmap(":/images/toaster/chat.png"), + QPixmap(), + QPixmap(), + QPixmap(":/images/toaster/chat.png"), + QPixmap(), + QPixmap()); + + connect(_ui->chatButton, SIGNAL(clicked()), SLOT(chatButtonSlot())); + + connect(_ui->closeButton, SIGNAL(clicked()), SLOT(close())); + + _toaster = new QtToaster(_chatToasterWidget, _ui->windowFrame); + _toaster->setTimeOnTop(5000); +} + +ChatToaster::~ChatToaster() { + delete(_ui); +} + +void ChatToaster::setMessage(const QString & message) { + _ui->messageLabel->setText(message); +} + +void ChatToaster::setPixmap(const QPixmap & pixmap) { + _ui->pixmapLabel->setPixmap(pixmap); +} + +void ChatToaster::show() { + _toaster->show(); +} + +void ChatToaster::close() { + _toaster->close(); +} + +void ChatToaster::chatButtonSlot() { + chatButtonClicked(); + close(); +} diff --git a/retroshare-gui/src/gui/toaster/ChatToaster.h b/retroshare-gui/src/gui/toaster/ChatToaster.h new file mode 100644 index 000000000..440c5a4b8 --- /dev/null +++ b/retroshare-gui/src/gui/toaster/ChatToaster.h @@ -0,0 +1,76 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006,2007 crypton + * + * 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 CHATTOASTER_H +#define CHATTOASTER_H + +#include "IQtToaster.h" + +#include + +class QtToaster; + +class QWidget; +class QString; +class QPixmap; +namespace Ui { class ChatToaster; } + +/** + * Shows a toaster when a chat is incoming. + * + * + */ +class ChatToaster : public QObject, public IQtToaster { + Q_OBJECT +public: + + ChatToaster(); + + ~ChatToaster(); + + void setMessage(const QString & message); + + void setPixmap(const QPixmap & pixmap); + + void show(); + +public Q_SLOTS: + + void close(); + +Q_SIGNALS: + + void chatButtonClicked(); + +private Q_SLOTS: + + void chatButtonSlot(); + +private: + + Ui::ChatToaster * _ui; + + QWidget * _chatToasterWidget; + + QtToaster * _toaster; +}; + +#endif //CHATTOASTER_H diff --git a/retroshare-gui/src/gui/toaster/ChatToaster.ui b/retroshare-gui/src/gui/toaster/ChatToaster.ui new file mode 100644 index 000000000..795b7243e --- /dev/null +++ b/retroshare-gui/src/gui/toaster/ChatToaster.ui @@ -0,0 +1,675 @@ + + ChatToaster + + + + 0 + 0 + 400 + 300 + + + + + 0 + + + 0 + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 0 + + + 0 + + + + + 6 + + + 0 + + + + + ../images/toaster/chat.png + + + Qt::AlignCenter + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + + + + 0 + + + 0 + + + + + + + + + + 255 + 255 + 255 + + + + + + + 212 + 208 + 200 + + + + + + + 255 + 255 + 255 + + + + + + + 234 + 229 + 220 + + + + + + + 128 + 128 + 128 + + + + + + + 141 + 139 + 133 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 212 + 208 + 200 + + + + + + + 64 + 64 + 64 + + + + + + + 10 + 36 + 106 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 232 + 232 + 232 + + + + + + + + + 255 + 255 + 255 + + + + + + + 212 + 208 + 200 + + + + + + + 255 + 255 + 255 + + + + + + + 234 + 229 + 220 + + + + + + + 128 + 128 + 128 + + + + + + + 141 + 139 + 133 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 212 + 208 + 200 + + + + + + + 64 + 64 + 64 + + + + + + + 212 + 208 + 200 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 232 + 232 + 232 + + + + + + + + + 106 + 104 + 100 + + + + + + + 212 + 208 + 200 + + + + + + + 255 + 255 + 255 + + + + + + + 233 + 231 + 227 + + + + + + + 128 + 128 + 128 + + + + + + + 141 + 139 + 133 + + + + + + + 106 + 104 + 100 + + + + + + + 255 + 255 + 255 + + + + + + + 106 + 104 + 100 + + + + + + + 212 + 208 + 200 + + + + + + + 212 + 208 + 200 + + + + + + + 0 + 0 + 0 + + + + + + + 10 + 36 + 106 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 232 + 232 + 232 + + + + + + + + Message + + + Qt::AlignCenter + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + 0 + + + 0 + + + + + + 0 + 0 + 0 + 0 + + + + + 18 + 18 + + + + + 18 + 18 + + + + :/images/close-down.png + + + true + + + + + + + Qt::Horizontal + + + + 225 + 22 + + + + + + + + + + + + + + RetroStyleLabel + QLabel +
    gui/toaster/RetroStyleLabelProxy.h
    +
    +
    + + chatButton + closeButton + + + + + +
    diff --git a/retroshare-gui/src/gui/toaster/IQtToaster.h b/retroshare-gui/src/gui/toaster/IQtToaster.h new file mode 100644 index 000000000..7125b011a --- /dev/null +++ b/retroshare-gui/src/gui/toaster/IQtToaster.h @@ -0,0 +1,65 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006,2007 crypton + * + * 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 IQTTOASTER_H +#define IQTTOASTER_H + +#include + +class QString; +class QPixmap; + +/** + * Shows a toaster when a phone call or a chat is incoming. + * + * A toaster is a small window in the lower right of the desktop. + * + * + */ +class IQtToaster : Interface { +public: + + /** + * Sets the toaster window message. + * + * @param message toaster message + */ + virtual void setMessage(const QString & message) = 0; + + /** + * Sets the toaster window picture. + * + * @param pixmap toaster picture + */ + virtual void setPixmap(const QPixmap & pixmap) = 0; + + /** + * Shows the toaster window. + */ + virtual void show() = 0; + + /** + * Closes the toaster window. + */ + virtual void close() = 0; +}; + +#endif //IQTTOASTER_H diff --git a/retroshare-gui/src/gui/toaster/MessageToaster.cpp b/retroshare-gui/src/gui/toaster/MessageToaster.cpp new file mode 100644 index 000000000..9771bae06 --- /dev/null +++ b/retroshare-gui/src/gui/toaster/MessageToaster.cpp @@ -0,0 +1,67 @@ +/* + * RetroShare + * Copyright (C) 2006,2007 crypton + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "MessageToaster.h" + +#include "ui_MessageToaster.h" + +#include "QtToaster.h" + +#include + +MessageToaster::MessageToaster() + : QObject(NULL) { + + _messageToasterWidget = new QWidget(NULL); + + _ui = new Ui::MessageToaster(); + _ui->setupUi(_messageToasterWidget); + + connect(_ui->messageButton, SIGNAL(clicked()), SLOT(chatButtonSlot())); + + connect(_ui->closeButton, SIGNAL(clicked()), SLOT(close())); + + _toaster = new QtToaster(_messageToasterWidget, _ui->windowFrame); + _toaster->setTimeOnTop(5000); +} + +MessageToaster::~MessageToaster() { + delete _ui; +} + +void MessageToaster::setMessage(const QString & message) { + _ui->messageButton->setText(message); +} + +void MessageToaster::setPixmap(const QPixmap & pixmap) { + _ui->pixmaplabel->setPixmap(pixmap); +} + +void MessageToaster::show() { + _toaster->show(); +} + +void MessageToaster::close() { + _toaster->close(); +} + +void MessageToaster::chatButtonSlot() { + chatButtonClicked(); + close(); +} diff --git a/retroshare-gui/src/gui/toaster/MessageToaster.h b/retroshare-gui/src/gui/toaster/MessageToaster.h new file mode 100644 index 000000000..7a9fa8b5c --- /dev/null +++ b/retroshare-gui/src/gui/toaster/MessageToaster.h @@ -0,0 +1,72 @@ +/* + * RetroShare + * Copyright (C) 2006 crypton + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef MESSAGETOASTER_H +#define MESSAGETOASTER_H + +#include "IQtToaster.h" + +#include + +class QtToaster; + +class QWidget; +class QString; +class QPixmap; +namespace Ui { class MessageToaster; } + +/** + * Shows a toaster when a Message is incoming. + * + * + */ +class MessageToaster : public QObject, public IQtToaster { + Q_OBJECT +public: + + MessageToaster(); + + ~MessageToaster(); + + void setMessage(const QString & message); + + void setPixmap(const QPixmap & pixmap); + + void show(); + +Q_SIGNALS: + + void chatButtonClicked(); + +private Q_SLOTS: + + void chatButtonSlot(); + + void close(); + +private: + + Ui::MessageToaster * _ui; + + QWidget * _messageToasterWidget; + + QtToaster * _toaster; +}; + +#endif //MESSAGETOASTER_H diff --git a/retroshare-gui/src/gui/toaster/MessageToaster.ui b/retroshare-gui/src/gui/toaster/MessageToaster.ui new file mode 100644 index 000000000..5e1fb4837 --- /dev/null +++ b/retroshare-gui/src/gui/toaster/MessageToaster.ui @@ -0,0 +1,167 @@ + + MessageToaster + + + + 0 + 0 + 370 + 221 + + + + + 0 + + + 0 + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 0 + + + 0 + + + + + Qt::Vertical + + + + 398 + 201 + + + + + + + + 0 + + + 6 + + + + + message + + + :/images/folder-inbox.png + + + + + + + Qt::Horizontal + + + + 124 + 56 + + + + + + + + + + + + + + + + + + Qt::Horizontal + + + + 124 + 56 + + + + + + + + + + 0 + + + 0 + + + + + + 18 + 18 + + + + + 18 + 18 + + + + :/images/close-down.png + + + + 16 + 16 + + + + true + + + + + + + Qt::Horizontal + + + + 225 + 22 + + + + + + + + + + + + + messageButton + closeButton + + + + + + diff --git a/retroshare-gui/src/gui/toaster/QtToaster.cpp b/retroshare-gui/src/gui/toaster/QtToaster.cpp new file mode 100644 index 000000000..bc07b3d35 --- /dev/null +++ b/retroshare-gui/src/gui/toaster/QtToaster.cpp @@ -0,0 +1,109 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006,2007 crypton + * + * 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 "QtToaster.h" + + +#include + +#include + +static const unsigned TIME_TO_SHOW = 20; + +QtToaster::QtToaster(QWidget * toaster, QFrame * toasterWindowFrame) + : QObject(toaster) { + + _timer = NULL; + _show = true; + + _toaster = toaster; + _toaster->setParent(_toaster->parentWidget(), Qt::ToolTip | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint); + + WidgetBackgroundImage::setBackgroundImage(toasterWindowFrame, ":images/toaster/toaster-backrs4.png", WidgetBackgroundImage::AdjustHeight); + + _toaster->resize(201, 116); +} + +void QtToaster::setTimeOnTop(unsigned time) { + _timeOnTop = time; +} + +void QtToaster::close() { + if (_timer) { + _timer->stop(); + } + _toaster->close(); +} + +void QtToaster::show() { + //10 pixels of margin +#if !defined(OS_WINDOWS) + static const int MARGIN_X = 30; +#else + static const int MARGIN_X = 10; +#endif + + QDesktopWidget * desktop = QApplication::desktop(); + QRect screenGeometry = desktop->screenGeometry(desktop->primaryScreen()); + + _toaster->move(screenGeometry.right() - _toaster->size().width() - MARGIN_X, screenGeometry.bottom()); + + _toaster->show(); + + _timer = new QTimer(this); + connect(_timer, SIGNAL(timeout()), SLOT(changeToasterPosition())); + _timer->start(TIME_TO_SHOW); +} + +void QtToaster::changeToasterPosition() { + QDesktopWidget * desktop = QApplication::desktop(); + QPoint p = _toaster->pos(); + + //Toaster is showing slowly + if (_show) { + _toaster->move(p.x(), p.y() - 3); + + QRect desktopGeometry = desktop->availableGeometry(desktop->primaryScreen()); + + if (p.y() < (desktopGeometry.bottom() - _toaster->size().height() - 5)) { + //Toaster should be hidden now + _show = false; + _timer->stop(); + //Waits 5 seconds with the toaster on top + _timer->start(_timeOnTop); + } + } + + //Toaster is hiding slowly + else { + _toaster->move(p.x(), p.y() + 3); + + QRect screenGeometry = desktop->screenGeometry(desktop->primaryScreen()); + + _timer->stop(); + _timer->start(TIME_TO_SHOW); + + if (p.y() > (screenGeometry.bottom())) { + //Closes the toaster -> hide it completely + close(); + } + } +} diff --git a/retroshare-gui/src/gui/toaster/QtToaster.h b/retroshare-gui/src/gui/toaster/QtToaster.h new file mode 100644 index 000000000..2120fca4e --- /dev/null +++ b/retroshare-gui/src/gui/toaster/QtToaster.h @@ -0,0 +1,70 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006,2007 crypton + * + * 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 QTTOASTER_H +#define QTTOASTER_H + +#include + +class QWidget; +class QTimer; +class QFrame; + +/** + * This class codes the algorithm that show/hide the toaster. + * + * This class helps factorizing the code between QtCallToaster and QtChatToaster. + * + * + */ +class QtToaster : public QObject { + Q_OBJECT +public: + + QtToaster(QWidget * toaster, QFrame * toasterWindowFrame); + + /** + * Sets the time with the toaster on top. + * + * @param time time toaster on top in milliseconds + */ + void setTimeOnTop(unsigned time); + + void show(); + + void close(); + +private Q_SLOTS: + + void changeToasterPosition(); + +private: + + QWidget * _toaster; + + QTimer * _timer; + + bool _show; + + unsigned _timeOnTop; +}; + +#endif //QTTOASTER_H diff --git a/retroshare-gui/src/gui/toaster/RetroStyleLabelProxy.h b/retroshare-gui/src/gui/toaster/RetroStyleLabelProxy.h new file mode 100644 index 000000000..2d02fb41a --- /dev/null +++ b/retroshare-gui/src/gui/toaster/RetroStyleLabelProxy.h @@ -0,0 +1,22 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006,2007 crypton + * + * 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 diff --git a/retroshare-gui/src/lang/lang.qrc b/retroshare-gui/src/lang/lang.qrc new file mode 100644 index 000000000..3de91b111 --- /dev/null +++ b/retroshare-gui/src/lang/lang.qrc @@ -0,0 +1,26 @@ + + + retroshare_de.qm + retroshare_en.qm + retroshare_es.qm + retroshare_fi.qm + retroshare_fr.qm + retroshare_ru.qm + retroshare_af.qm + retroshare_cn_simp.qm + retroshare_cn_trad.qm + retroshare_gr.qm + retroshare_it.qm + retroshare_jp.qm + retroshare_kr.qm + retroshare_pl.qm + retroshare_pt.qm + retroshare_tr.qm + retroshare_sl.qm + retroshare_dk.qm + retroshare_bg.qm + retroshare_sr.qm + retroshare_se.qm + + + diff --git a/retroshare-gui/src/lang/languagesupport.cpp b/retroshare-gui/src/lang/languagesupport.cpp new file mode 100644 index 000000000..cc9a5905e --- /dev/null +++ b/retroshare-gui/src/lang/languagesupport.cpp @@ -0,0 +1,137 @@ +/**************************************************************** + * Vidalia is distributed under the following license: + * + * Copyright (C) 2006, Matt Edman, Justin Hipple + * + * 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 +#include + +#include "languagesupport.h" + +/** Static list of supported languages and codes. */ +QMap LanguageSupport::_languages; + +/** Initializes the list of available languages. */ +void +LanguageSupport::initialize() +{ + _languages.clear(); + _languages.insert("en", "English"); + _languages.insert("de", "Deutsch"); + _languages.insert("af", "Afrikaans"); + _languages.insert("cn_simp", "Chinese-Simple"); + _languages.insert("cn_trad", "Chinese-Trad"); + _languages.insert("dk", "danish"); + _languages.insert("fr", + QString::fromUtf8("fran\303\247ais")); + _languages.insert("gr", "Greek"); + _languages.insert("it", "Italiano"); + _languages.insert("jp", "Japanese"); + _languages.insert("kr", "Korean"); + _languages.insert("pl", "Polish"); + _languages.insert("pt", "Portuguese"); + _languages.insert("ru", + QString::fromUtf8("\320\240\321\203\321\201\321\201\320\272\320\270\320\271")); + _languages.insert("es", + QString::fromUtf8("spanish")); + _languages.insert("sl", "slovenian"); + _languages.insert("sr", "Serbian"); + _languages.insert("se", "Swedish"); + _languages.insert("tr", "Turkish"); + _languages.insert("fi", "suomi"); +/**** + _languages.insert("zh-cn", + QString::fromUtf8("\347\256\200\344\275\223\345\255\227")); +***/ + +} + +/** Returns the default language code for the system locale. */ +QString +LanguageSupport::defaultLanguageCode() +{ + QString localeName = QLocale::system().name(); + QString language = localeName.mid(0, localeName.indexOf("_")); + if (language == "zh") { + language += "-" + localeName.mid(localeName.indexOf("_")+1).toLower(); + } + if (!isValidLanguageCode(language)) { + language = "en"; + } + return language; +} + +/** Returns the language code for a given language name. */ +QString +LanguageSupport::languageCode(QString languageName) +{ + return _languages.key(languageName); +} + +/** Returns a list of all supported language codes. (e.g., "en"). */ +QStringList +LanguageSupport::languageCodes() +{ + return _languages.keys(); +} + +/** Returns the language name for a given language code. */ +QString +LanguageSupport::languageName(QString languageCode) +{ + return _languages.value(languageCode); +} + +/** Returns a list of all supported language names (e.g., "English"). */ +QStringList +LanguageSupport::languageNames() +{ + return _languages.values(); +} + +/** Returns a list of all supported language codes and names. */ +QMap +LanguageSupport::languages() +{ + return _languages; +} + +/** Returns true if we understand the given language code. */ +bool +LanguageSupport::isValidLanguageCode(QString code) +{ + return languageCodes().contains(code.toLower()); +} + +/** Sets the application's translator to the specified language. */ +bool +LanguageSupport::translate(QString langCode) +{ + if (isValidLanguageCode(langCode)) { + QTranslator *translator = new QTranslator(); + if (translator->load(QString(":/lang/") + langCode.toLower())) { + QApplication::installTranslator(translator); + return true; + } + delete translator; + } + return false; +} + diff --git a/retroshare-gui/src/lang/languagesupport.h b/retroshare-gui/src/lang/languagesupport.h new file mode 100644 index 000000000..37cd250a2 --- /dev/null +++ b/retroshare-gui/src/lang/languagesupport.h @@ -0,0 +1,59 @@ +/**************************************************************** + * Vidalia is distributed under the following license: + * + * Copyright (C) 2006, Crypton + * + * 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 _LANGUAGESUPPORT_H +#define _LANGUAGESUPPORT_H + +#include +#include +#include + + +class LanguageSupport +{ +public: + /** Initializes the list of supported languages. */ + static void initialize(); + /** Returns the default language code for the system locale. */ + static QString defaultLanguageCode(); + /** Returns the language code for a given language name. */ + static QString languageCode(QString languageName); + /** Returns a list of all supported language codes (e.g., "en"). */ + static QStringList languageCodes(); + /** Returns the language name for a given language code. */ + static QString languageName(QString languageCode); + /** Returns a list of all supported language names (e.g., "English"). */ + static QStringList languageNames(); + /** Returns a list of all supported language codes and names. */ + static QMap languages(); + /** Returns true if we understand the given language code. */ + static bool isValidLanguageCode(QString code); + /** Sets the application's translator to the specified language. */ + static bool translate(QString langCode); + +private: + static QMap _languages; /**< List of support languages. */ +}; + +#endif + diff --git a/retroshare-gui/src/lang/retroshare_af.qm b/retroshare-gui/src/lang/retroshare_af.qm new file mode 100644 index 000000000..b809bde2d Binary files /dev/null and b/retroshare-gui/src/lang/retroshare_af.qm differ diff --git a/retroshare-gui/src/lang/retroshare_af.ts b/retroshare-gui/src/lang/retroshare_af.ts new file mode 100644 index 000000000..1c789e48b --- /dev/null +++ b/retroshare-gui/src/lang/retroshare_af.ts @@ -0,0 +1,3974 @@ + + + + + + + Arial + Afrikaans Arial + + + + AddFriendDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;"> To add a new Friend, cut and paste their email </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">invitation into the box below, and click done.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;"> To add a new Friend, cut and paste their email </span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">invitation into the box below, and click done.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;"></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + Cancel + Kanselleer + + + + Done + Done + + + + Load From File + belaai vanaf tou + + + + RetroShare + Retroshare + + + + Certificate Load Failed + sertifikaat belaai nee werk + + + + Add a Friend + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"><span style=" font-size:16pt;">Add a new Friend</span><br /><br /><span style=" font-size:10pt;">To add a new Friend, cut and paste their email </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">invitation into the box below, and click done.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + + + + + AddFriendWizard + + + < Back + + + + + Next > + + + + + Cancel + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">This Wizard helps to Connect to your Friends</span></p></body></html> + + + + + I have a .pqi/.pem file received from a Friend + + + + + I have Key received from a Friend + + + + + I want to invite a friend to my RetroShare network + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Cut and paste the text below into an email.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;"> and send it to all your friends!</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">When you press next RetroShare will attempt to launch a Email client.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Invite your Friends to join with RetroShare</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Enter the Key code you got from your friend:</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">When you press next RetroShare will attempt to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">connect using the key.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Select a pqi/pem file:</span></p></body></html> + + + + + Browse + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">When you press next RetroShare will attempt to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">connect using the .pqi/.pem file.</p></body></html> + + + + + Add Friend to my netowork Wizard + + + + + AdvancedSearchDialog + + + RetrosShare: Advanced Search + + + + + Add a further search criterion. + + + + + Add a selection criterion + + + + + Reset + + + + + Cancels the search. + + + + + Cancel + + + + + Perform the advanced search. + + + + + Search + + + + + Search Criteria + + + + + Reset the search criteria. + + + + + ApplicationWindow + + + RetroShare %1 + + + + + Example Application + + + + + Application Users: 0 Files: 0 + + + + + Down: 0.0 Up: 0.0 + + + + + Connections: 0/45 + + + + + Hide + + + + + Show + + + + + RetroShare + + + + + Home + + + + + General + + + + + Advanced + + + + + QTextBrowser { + background-color: rgb(192,192,192); + + } + + + + + QPushButton + { + border-image: url(:/images/console-small-up.png) + } + + QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + + } + + QPushButton:pressed { + border-image: url(:/images/console-small-down.png) + } + + + + + + AuthorizationDialog + + + Authenticate + bewys + + + + Authenticate Friend By Entering Their Code + bewys vriend by insit die kode + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">bewys kode:</span></p></body></html> + + + + OK + Top OK + + + + Cancel + kanselleer + + + + BandwidthGraph + + + RetroShare Bandwidth Usage + + + + + Show Settings + + + + + Reset + + + + + Receive Rate + + + + + Send Rate + + + + + Always on Top + + + + + Style + + + + + Changes the transparency of the Bandwidth Graph + + + + + 100 + + + + + % Opaque + + + + + Save + + + + + Cancel + + + + + Since: + + + + + Hide Settings + + + + + CallToaster + + + Message + + + + + ChanCreateDialog + + + Create a new Broadcast Channel + kreëer nuut oorsend kanaal + + + + Create A New Broadcast Channel + kreëer nuut oorsend kanaal + + + + Channel Name: + kanaal naam: + + + + Type: + Tipe: + + + + Public Channel (Signed) + Publiek kanaal (teken) + + + + Private Channel (Encrypted) + privaat kanaal (veilig) + + + + Cancel Channel + kanselleer kanaal + + + + Create Channel + kreëer kanaal + + + + ChanMsgDialog + + + Compose + kreëer + + + + Recommended Files + vasstel tou + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-weight:400;"><span style=" font-weight:600;">Subject:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-weight:400;"><span style=" font-weight:600;">Koplyn:</span></p></body></html> + + + + Send To: + Oorsend aan: + + + + Send + Oorsend + + + + Delete Channel + kanselleer kanaal + + + + Create Channel MSG + kreëer kanaal boodskap + + + + 1 + + + + + Reply + + + + + ChannelsDialog + + + New Message + Nuut Boodskap + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Messages</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">boodskaps</span></p></body></html> + + + + Date + Date + + + + Rank + Rank + + + + From + vanaf + + + + Title + Koplyn: + + + + Msg + Boodskap + + + + Count + Count + + + + Size + Size + + + + Type + Tipe: + + + + Rs[Cert/Chan]IdSize + Rs[Cert/Chan]IdSize + + + + RsMsgId + RsMsgId + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Message Text</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Boodskap Teks</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Recommended Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Vasstel Tou</span></p></body></html> + + + + New Channel + Nuut Kanaal + + + + Subscribe To Channel + Subscribe To Kanaal + + + + Unsubscribe To Channel + Unsubscribe To Kanaal + + + + Delete Your Channel + kanselleer julle kanaal + + + + Download + Download + + + + Download All + Download al die + + + + ChatDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:9pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:400;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:9pt; font-weight:600; font-style:normal; text-decoration:none;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:400;"></p></body></html> + + + + Chat History: + Praat geskiedenis: + + + + Chat With: + Praat saam met: + + + + Chat + Praat + + + + Users: + + + + + ChatToaster + + + message + boodskap + + + + You Get a New Message + Nuut boodskap aankom + + + + Message + + + + + ConfCertDialog + + + Cancel + kanselleer + + + + Done + Done + + + + Apply + toepas + + + + Peer Settings + Peer Verstel + + + + Port: + Port: + + + + behind zee Firewall + agterent Firewall + + + + Forwarded External Port + Forwarded External Port + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Max Transfer Rate (kb/s) </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Max Transfer Rate (kb/s) </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Org / Loc:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Org / Loc:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Country/State:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Country/State:</p></body></html> + + + + Trust Settings + Vertroue Verstel + + + + Trust Level + Vertroue Level + + + + Trust Their Signature + Vertroue vanaf handtekening + + + + Sign The Certificate + bewys sertifikaat + + + + OK + + + + + Peer Adress + + + + + Peer Info + + + + + ConfirmQuitDialog + + + Exit RetroShare + + + + + You are about to exit the RetroShare application and therefore stop all transfers. <br><br>Are you sure you want to stop and exit RetroShare? + + + + + Do not show this message again. + + + + + ConnectDialog + + + Peer Details + Peer Details + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Org:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Org:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Trust:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Trust:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Loc:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Loc:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Certificate</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">signers:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Certificate</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">bewys /signers:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">bewys kode:</span></p></body></html> + + + + Make Friend + Maak Vriend + + + + Close + Toemaak + + + + ConnectionsDialog + + + Load Certificate + belaai sertifikaat + + + + Select a pem/pqi File + Select a pem/pqi File + + + + File Not Found + File Not Found + + + + %1 does not exist. Would you like to create it? + %1 does not exist. Would you like to create it? + + + + Failed to Create File + Failed to Create File + + + + Unable to create %1 [%2] + Unable to create %1 [%2] + + + + Select Certificate + Select Certificate + + + + Certificates (*.pqi *.pem) + Certificates (*.pqi *.pem) + + + + Accept + Accept + + + + Trust + Vertroue + + + + Last Contact + Last Contact + + + + Name + Name + + + + Organisation + Organisation + + + + Location + Location + + + + Country + Country + + + + Peer Address + Peer Address + + + + Cert Id + Cert Id + + + + Auth Code + Auth Code + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + + + + Peer Details / Authenticate + Peer Details / Authenticate + + + + CryptographyDialog + + + RSA Key Size + RSA Key Size + + + + Rijndael Block size + Rijndael Block size + + + + 128 Bits + 128 Bits + + + + 192 Bits + 192 Bits + + + + 256 Bits + 256 Bits + + + + Rijndael Key Size + Rijndael Key Size + + + + Rijndael Mode + Rijndael Mode + + + + CBC + CBC + + + + ECB + ECB + + + + CFB + CFB + + + + Rijndael Padding + Rijndael Padding + + + + PKCS7 + PKCS7 + + + + Zeros + Zeros + + + + ANSIX923 + ANSIX923 + + + + ISO10126 + ISO10126 + + + + Rijndael Feedback Size + Rijndael Feedback Size + + + + Key Size: + Key Size: + + + + Block Size: + Block Size: + + + + Feedback Size: + Feedback Size: + + + + Mode: + Mode: + + + + Padding: + Padding: + + + + DLListDelegate + + + B + + + + + KB + + + + + MB + + + + + GB + + + + + DirectoriesDialog + + + Shared Directories + Shared Directories + + + + Other Directories + Other Directories + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Incoming Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Incoming Files</span></p></body></html> + + + + Add Shared Directory + Add Shared Directory + + + + DirectoriesPage + + + Shared Directories + Shared Directories + + + + Incoming files + Incoming files + + + + ExampleDialog + + + Vote Up + + + + + Vote Down + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Friends</span></p></body></html> + + + + + # + + + + + Status + + + + + Person + + + + + Auto Connect + + + + + Trust Level + + + + + Peer Address + Peer Address + + + + Last Contact + Last Contact + + + + Organisation + Organisation + + + + Location + Location + + + + Country + Country + + + + Person Id + + + + + Auth Code + Auth Code + + + + ExprParamElement + + + to + + + + + ignore case + + + + + dd.MM.yyyy + + + + + KB + + + + + MB + + + + + GB + + + + + ExpressionWidget + + + Expression Widget + + + + + Delete this expression + + + + + FileHashDialog + + + Download + Download + + + + GSettingsWin + + + General + General + + + + Network + Network + + + + Directories + Directories + + + + Server + Peer Settings + + + + %1 + %1 + + + + GenCertDialog + + + RetroShare setup + Retroshare setup + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16pt;">Generate a new profile</span><br /><br />Please fill in the information which will<br />allow your RetroShare to connect to</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Friends.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Organisation:</p></body></html> + + + + + Password (Again) + + + + + Location: + + + + + Load Trusted Certificate (Optional) + Load Trusted Certificate (Optional) + + + + Password + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + + + + Select File + Select File + + + + Country: + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + + + + + Generate New Certificate + Generate New Certificate + + + + Select Trusted Friend + Select Trusted Friend + + + + Certificates (*.pqi *.pem) + Certificates (*.pqi *.pem) + + + + GeneralPage + + + Keys manager + Keys manager + + + + Style + Style + + + + Choose RetroShare's interface style + Choose RetroShare's interface style + + + + Language + Language + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + + + + Choose the language used in RetroShare + Choose the language used in RetroShare + + + + GraphFrame + + + Recv: + Recv: + + + + %1 KB/s + %1 KB/s + + + + Sent: + Sent: + + + + %1 KB + %1 KB + + + + %1 MB + %1 MB + + + + %1 GB + %1 GB + + + + HelpDialog + + + About + + + + + Authors + + + + + Thanks to + + + + + Translation + + + + + License Agreement + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">About/Help</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:xx-large; font-weight:600; color:#0000ff;">About RetroShare.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-weight:600;">Retroshare is a private and secure decentralised commmunication platform.<br />You can use it chat, send messages and share files with your friends.</span><br /><br />This is just a placeholder page for the moment. You can<br />improve retroshare's in-built help (this text) by<br />updating the retroshare wiki: <a href="http://retroshare.wiki.sourceforge.net/help_tab"><span style=" text-decoration: underline; color:#0000ff;">This Page in the retroshare Wiki</span></a><br /><br />The About/Help Tab is regularly updated from the Wiki page.<br /><br />External Links to more information:<br /></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.sourceforge.net"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Webpage</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.wiki.sourceforge.net/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Wiki</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://sourceforge.net/projects/retroshare/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Project Page</span></a></li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.lunamutt.com"><span style=" text-decoration: underline; color:#0000ff;">Lunamutt Homepage.</span></a></li></ul></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-size:19pt; font-weight:600; color:#0000ff;">The RetroShare Team:</span><br /> <br /><span style=" font-size:9pt; color:#0000ff;">defnax</span>: Lead GUI developer <br /><span style=" font-size:9pt; color:#0000ff;">drbob7</span>: Lead Core developer. <br /> <br /><span style=" font-size:9pt; color:#0000ff;">bmeck</span> : Our new web-developer. Joined retroshare a couple <br />of weeks ago, and already starting on an exciting new <br />design for the web-page. <br /> <br /><span style=" font-size:9pt; color:#0000ff;">noragen</span> : Developer from the SIM-IM project. Working on a retroshare plugin to SIM-IM. <br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">kernelpanix</span> : Gui and skin developer</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">libris</span><span style=" font-size:9pt;">:</span> core developer</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-size:9pt; color:#0000ff;">kashif: </span><span style=" color:#000000;">core developer</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt; color:#000000;"><span style=" font-size:8pt;"><br /></span><span style=" color:#0000ff;">agent725</span><span style=" font-size:8pt;">: Manages the 'local' Retroshare release, <br />and beta-testing retroshare on a large scale. <br /> <br /></span><span style=" color:#0000ff;">the_mgt</span><span style=" font-size:8pt;">: Maintains the Gentoo and generic linux <br />installation/compilation scripts. </span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">notdefine:</span> Maintains the .rpm, .deb installation/compilation scripts.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">zhouk</span>: developer</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Translators:</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Serbian</span>: Kunalagon Umuhanik &lt;kunalagon@gmail.com&gt;</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Polish: </span>Jarek</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">French</span>:Temet</p></body></html> + + + + + InviteDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">To </span><span style=" font-size:10pt; font-weight:600;">Invite your friends to join you with Retroshare: </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">Cut and paste the text below into an email.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">and send it to all your friends!</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">To </span><span style=" font-size:10pt; font-weight:600;">Invite your friends to join you with Retroshare: </span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">Cut and paste the text below into an email.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">and send it to all your friends!</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + Done + Done + + + + Cancel + Kanselleer + + + + Launch Email + Start Email + + + + Invite a Friend + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"><span style=" font-size:16pt;">Invite a Friend</span><br /><br /><span style=" font-size:10pt;">To Invite your friends to join you with Retroshare: </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">Cut and paste the text below into an email.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">and send it to all your friends!</p></body></html> + + + + + LogDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> + +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="ABOUT"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">About RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShare is a private peer to peer communication platform created by Dr. Bob.This program enables you to securely share files and chat with your friends (and no-one else!).</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, and the latest release go to http://www.lunamutt.com.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="START"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Quick Start Guide to RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If this is your first time using Retroshare, it is recommended that you readthis guide for instructions on how to get started. The first step is:<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Connecting to Your Friends</span></a>. Once you have managed this you can <a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">Download Files</span></a> and<a href="#START-SHARE"><span style=" text-decoration: underline; color:#0000ff;">Share with Others</span></a></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Some of the key concepts related to ensuring your sharing remains private aredescribed in the <a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">Frequently Asked Questions</span></a>. Some Key security questions are:<a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">What is a Web of Trust?</span></a>, <a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">Should I Sign this Certificate?</span></a>, and finally<a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">What does "Trust" Mean?</span></a>.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is also worthwhile reading the <a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">GUI Overview</span></a>which describes the featureson available through the User Interface.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Connecting to your Friends </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">There are four steps to connecting to a Friend:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Get Friend's Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Load Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Sign Certificate</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect to Friend.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The instructions might initially appear long and daunting, however thesesteps are required to ensure that your sharing is private and secure.These steps are only required a couple of times, to add new friends, and become quite straight forward after the first time.</p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (1) EXCHANGE CERTIFICATES </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Before you can connect, you need send your certificate to your friend, and get your friends certificate. Follow these steps to get your certificate:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on Your Certificate to Select it.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on the "Export Friend" Button to bring up a file save dialog.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select directory to save the certificate to.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Enter desired filename. (with a file type of .pqi), and Click OK.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Email this File to your Friend. (It is recommended you put thecertificate in a zip file before sending, as some email programsdon't transmit the file correctly).</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Ask your friend to do the same.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Once you have received your friend's certificate, removed itfrom the zip file and saved it to disk, you can proceed to step (2).</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Note: This exchange of certificates is only necessary to get you started.Once you are connected to some friends the exchange of certificates becomeautomated by the autoDiscovery system. See<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">GUI: Connecting</span></a> for more information.------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (2) LOAD YOUR FRIEND'S CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Import Friend"</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select your friends certificate file, then click "Okay". Their certificate should appear in the top window of the "Connect" Tab.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (3) SIGN CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select their Certificate by clicking on their name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Configure Friend" Button. This will bring up a configuration window. which allows you to look at the detailsof the certificate.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click the "Sign Certificate" button near the bottom of the "Certificate Configuration" Window.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Now close the window by clicking on the "Done" button.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Your Friends certificate should now say "Trusted (S)", indicating it is ready for connections.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can only share with "Trusted" Peers. You must sign your Friend'scertificate to prove that you know the certificate belongs to your Friend. Do not sign any/all certificates - only the people youtrust. For more information see: <br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br />------------------------------------------------------------------------<br /><br /> <br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (4) AUTOCONNECT TO PEER </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Finally You need to activate the connection:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click in the Box, next to your friends Name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> A Tick should appear in the box, a connection will be started.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> The "Offline" will change to "Online" when you have successfullyconnected.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Remember: Your initial connection attempts will fail, until your friend has signed your certificate and ticked the Auto-Connect Box.This ensures that both peers trust each other, and stops random peopleaccessing your files.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>. <br />------------------------------------------------------------------------<br /><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-DOWNLOAD"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Downloading Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have connected to friends, you can download their shared files.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can search for the files you want using either:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) File Listing Tab: This gives you a directory view of the files being shared by your peers. Double clickon the directory name (not the arrow) to diplay its subdirectories and files.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 1: This can take up to 5 seconds to fetch the information for your peer.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 2: If the directory is empty, or the person is offline, then the request will silently fail.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Search Tab: Retroshare also allows you to search your peers computers for filenames. Enter yourterm(s) in the search box at the top of the TAB and click the "Search" button. This willsearch all of the peers that you are currently connected to.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 3: If any matching files are found they will be displayed within 5 - 10 seconds.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have found the files you want, Select the file(s), and click "Download" to begin the download process.If you click over the "File Transfer" TAB, the status of the files will appear.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 4: The files can take up to 10 seconds to appear in the transfer window.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-SHARING"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Sharing Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can specify which files you want to share in the "Config" Tab.In the "Share Directories" section, click the "Add Directory" Button, and select the directory you want to share.The files and subdirectories will become available for you peers.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can remove a directory from the Shared Directories List by clicking onthe directory name in the list, and then clicking "Remove Directory".</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="GUI"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Gui Overview (Tab Description) </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The GUI is divided up into several sections which can be accessed by clicking on the Tabs along the top of the main window. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect: Manage Connections and Friends.(<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">getting started</span></a> and<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Listing: A directory view of available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Search: Search for available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Messages: For Sending/Recving Message. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Channels: A broadcast/subscription system. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Transfer: Listing of Current and completed Transfers.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Config: Specify of share diectories and IP Addresses.(<a href="#GUI-CONFIG"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> About: Help and other Information.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Chat: Accessed by the clicking on the "Chat" button.</li></ul> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Connect Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Connect TAB consists of two windows. The upper windowshows a list of your friends. This window indicates each friendscurrent trust level, as well as their connection state.The "Trust_Lvl" Column indicates if the certificate has beenAuthenticated using the web of trust. You can only connect to "Trusted" certificates. Tick the "Auto_Connect" box to connect to your trusted friends.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The lower window provides a list of the friends of your friends.This window shows the neighbour's name and how long ago they attempted to connect to you. This window is automatically populatedby the autoDiscovery system, and should be used to expand yourretroShare network. A word of warning: Do not automatically trust (or sign) anyonethat appears in this window. First verify by some other means (email/phone)that certificate belongs to the person you think it does.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use the "Neighbour List" window to expand your friend list. Select the desired entry in the lower window by clicking on it, then click the "Add to Friends" Button to move it to the upper window.Likewise the "Remove from Friends" button moved a person from the upper window to the lower window.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The "Configure Friend" Button opens a Certificate Configuration window.This window can be used to examine the certificate details, sign the certificate or manually change the peer's IP Address.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">See Also:<br /><a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Getting Started: Connecting to your friends</span></a>.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>.<br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONFIG"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Config Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Configuration Tab allows you to select the share directories, as well as the directory that downloaded files are saved to.<br />See <a href="#STARTUP-SHARING"><span style=" text-decoration: underline; color:#0000ff;">Sharing you Files</span></a> for details. </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Config Tab also allows you to control the IP Address and Portused by RetroShare. Under most cirumstances you do not need to changethese setting. If you are behind a firewall and can setup a forwarded port, the selected IP Address and Port should be specified here.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="FAQ"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Frequently Asked Questions </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">How does the security/privacy work? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShares uses a Web of Trust Authentication system to ensurethat your "friends" are your friends, and uses SSL to encryptthe communcications between peers. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What is a Web of Trust? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Web of Trust relies on a collection of peers to identify eachother. Look it up on the Web!</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-TRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What does "Trust" Mean in RetroShare?</span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Anyone can generate a certificate, with any name on it. So howdo you know that the certificate that claims to be from "Joe Bloggs"is really from your mate Joe. This is the "AuthenticationProblem". RetroShare uses a Web of Trust to Authenticate your peers.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-SIGN"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Should I Sign this Certificate? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should only sign a certificate if you are completely surethat it comes from the "right" person. If you sign a certificateyou are "Authenticating" the person to yourself and others.If you sign certificates that you haven't checked, then you aredestroying your own privacy and security.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">How do you verify a certificate? Use an alternative method ofcommunication to send the certificate: E.g. email or USB stick. This will improve you confidence that the certificate belongsto the correct person. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><span style=" font-size:small;"> </span><a name="FAQ-CONNECT"></a><span style=" font-size:small;">W</span><span style=" font-size:small;">hy won't it Connect?</span><span style=" font-size:small;"> </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A connection can fail for a number of reasons:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) Failed Authentication. Have both peers signed each otherscertificates? </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Firewalls. If both peers are behind firewalls then they cannotconnect directly. RetroShare has a built in proxy system to circumventfirewalls - However this can only function if both peers can connect to a common third party that is not behind a firewall. Thisis the most likely reason for initial connections to fail. The only solution to find a common friend that isn't firewalled (know anyone with Broadband?)</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(3) IP Addresses are wrong. You can manually examine and change these using the Certificate configuration.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +</body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="ABOUT"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">About RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShare is a private peer to peer communication platform created by Dr. Bob.This program enables you to securely share files and chat with your friends (and no-one else!).</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, and the latest release go to http://www.lunamutt.com.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="START"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Quick Start Guide to RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If this is your first time using Retroshare, it is recommended that you readthis guide for instructions on how to get started. The first step is:<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Connecting to Your Friends</span></a>. Once you have managed this you can <a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">Download Files</span></a> and<a href="#START-SHARE"><span style=" text-decoration: underline; color:#0000ff;">Share with Others</span></a></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Some of the key concepts related to ensuring your sharing remains private aredescribed in the <a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">Frequently Asked Questions</span></a>. Some Key security questions are:<a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">What is a Web of Trust?</span></a>, <a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">Should I Sign this Certificate?</span></a>, and finally<a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">What does "Trust" Mean?</span></a>.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is also worthwhile reading the <a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">GUI Overview</span></a>which describes the featureson available through the User Interface.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Connecting to your Friends </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">There are four steps to connecting to a Friend:</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Get Friend's Certificate</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Load Certificate</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Sign Certificate</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect to Friend.</li></ul><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The instructions might initially appear long and daunting, however thesesteps are required to ensure that your sharing is private and secure.These steps are only required a couple of times, to add new friends, and become quite straight forward after the first time.</p><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (1) EXCHANGE CERTIFICATES </span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Before you can connect, you need send your certificate to your friend, and get your friends certificate. Follow these steps to get your certificate:</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on Your Certificate to Select it.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on the "Export Friend" Button to bring up a file save dialog.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select directory to save the certificate to.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Enter desired filename. (with a file type of .pqi), and Click OK.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Email this File to your Friend. (It is recommended you put thecertificate in a zip file before sending, as some email programsdon't transmit the file correctly).</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Ask your friend to do the same.</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Once you have received your friend's certificate, removed itfrom the zip file and saved it to disk, you can proceed to step (2).</li></ul><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Note: This exchange of certificates is only necessary to get you started.Once you are connected to some friends the exchange of certificates becomeautomated by the autoDiscovery system. See<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">GUI: Connecting</span></a> for more information.------------------------------------------------------------------------<br /><br /><br /></p><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (2) LOAD YOUR FRIEND'S CERTIFICATE </span></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Import Friend"</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select your friends certificate file, then click "Okay". Their certificate should appear in the top window of the "Connect" Tab.</li></ul><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">------------------------------------------------------------------------<br /><br /><br /></p><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (3) SIGN CERTIFICATE </span></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select their Certificate by clicking on their name.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Configure Friend" Button. This will bring up a configuration window. which allows you to look at the detailsof the certificate.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click the "Sign Certificate" button near the bottom of the "Certificate Configuration" Window.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Now close the window by clicking on the "Done" button.</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Your Friends certificate should now say "Trusted (S)", indicating it is ready for connections.</li></ul><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can only share with "Trusted" Peers. You must sign your Friend'scertificate to prove that you know the certificate belongs to your Friend. Do not sign any/all certificates - only the people youtrust. For more information see: <br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br />------------------------------------------------------------------------<br /><br /> <br /></p><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (4) AUTOCONNECT TO PEER </span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Finally You need to activate the connection:</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click in the Box, next to your friends Name.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> A Tick should appear in the box, a connection will be started.</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> The "Offline" will change to "Online" when you have successfullyconnected.</li></ul><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Remember: Your initial connection attempts will fail, until your friend has signed your certificate and ticked the Auto-Connect Box.This ensures that both peers trust each other, and stops random peopleaccessing your files.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>. <br />------------------------------------------------------------------------<br /><br /><br /></p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-DOWNLOAD"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Downloading Files </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have connected to friends, you can download their shared files.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can search for the files you want using either:</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) File Listing Tab: This gives you a directory view of the files being shared by your peers. Double clickon the directory name (not the arrow) to diplay its subdirectories and files.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 1: This can take up to 5 seconds to fetch the information for your peer.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 2: If the directory is empty, or the person is offline, then the request will silently fail.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Search Tab: Retroshare also allows you to search your peers computers for filenames. Enter yourterm(s) in the search box at the top of the TAB and click the "Search" button. This willsearch all of the peers that you are currently connected to.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 3: If any matching files are found they will be displayed within 5 - 10 seconds.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have found the files you want, Select the file(s), and click "Download" to begin the download process.If you click over the "File Transfer" TAB, the status of the files will appear.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 4: The files can take up to 10 seconds to appear in the transfer window.</p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-SHARING"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Sharing Files </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can specify which files you want to share in the "Config" Tab.In the "Share Directories" section, click the "Add Directory" Button, and select the directory you want to share.The files and subdirectories will become available for you peers.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can remove a directory from the Shared Directories List by clicking onthe directory name in the list, and then clicking "Remove Directory".</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="GUI"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Gui Overview (Tab Description) </span><span style=" font-size:medium;"> </span></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The GUI is divided up into several sections which can be accessed by clicking on the Tabs along the top of the main window. </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect: Manage Connections and Friends.(<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">getting started</span></a> and<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Listing: A directory view of available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Search: Search for available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Messages: For Sending/Recving Message. (Coming Soon)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Channels: A broadcast/subscription system. (Coming Soon)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Transfer: Listing of Current and completed Transfers.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Config: Specify of share diectories and IP Addresses.(<a href="#GUI-CONFIG"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> About: Help and other Information.</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Chat: Accessed by the clicking on the "Chat" button.</li></ul><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Connect Tab </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Connect TAB consists of two windows. The upper windowshows a list of your friends. This window indicates each friendscurrent trust level, as well as their connection state.The "Trust_Lvl" Column indicates if the certificate has beenAuthenticated using the web of trust. You can only connect to "Trusted" certificates. Tick the "Auto_Connect" box to connect to your trusted friends.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The lower window provides a list of the friends of your friends.This window shows the neighbour's name and how long ago they attempted to connect to you. This window is automatically populatedby the autoDiscovery system, and should be used to expand yourretroShare network. A word of warning: Do not automatically trust (or sign) anyonethat appears in this window. First verify by some other means (email/phone)that certificate belongs to the person you think it does.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use the "Neighbour List" window to expand your friend list. Select the desired entry in the lower window by clicking on it, then click the "Add to Friends" Button to move it to the upper window.Likewise the "Remove from Friends" button moved a person from the upper window to the lower window.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The "Configure Friend" Button opens a Certificate Configuration window.This window can be used to examine the certificate details, sign the certificate or manually change the peer's IP Address.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">See Also:<br /><a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Getting Started: Connecting to your friends</span></a>.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>.<br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br /></p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONFIG"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Config Tab </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Configuration Tab allows you to select the share directories, as well as the directory that downloaded files are saved to.<br />See <a href="#STARTUP-SHARING"><span style=" text-decoration: underline; color:#0000ff;">Sharing you Files</span></a> for details. </p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Config Tab also allows you to control the IP Address and Portused by RetroShare. Under most cirumstances you do not need to changethese setting. If you are behind a firewall and can setup a forwarded port, the selected IP Address and Port should be specified here.</p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="FAQ"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Frequently Asked Questions </span><span style=" font-size:medium;"> </span></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">How does the security/privacy work? </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShares uses a Web of Trust Authentication system to ensurethat your "friends" are your friends, and uses SSL to encryptthe communcications between peers. </p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What is a Web of Trust? </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Web of Trust relies on a collection of peers to identify eachother. Look it up on the Web!</p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-TRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What does "Trust" Mean in RetroShare?</span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Anyone can generate a certificate, with any name on it. So howdo you know that the certificate that claims to be from "Joe Bloggs"is really from your mate Joe. This is the "AuthenticationProblem". RetroShare uses a Web of Trust to Authenticate your peers.</p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-SIGN"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Should I Sign this Certificate? </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should only sign a certificate if you are completely surethat it comes from the "right" person. If you sign a certificateyou are "Authenticating" the person to yourself and others.If you sign certificates that you haven't checked, then you aredestroying your own privacy and security.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">How do you verify a certificate? Use an alternative method ofcommunication to send the certificate: E.g. email or USB stick. This will improve you confidence that the certificate belongsto the correct person. </p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><span style=" font-size:small;"> </span><a name="FAQ-CONNECT"></a><span style=" font-size:small;">W</span><span style=" font-size:small;">hy won't it Connect?</span><span style=" font-size:small;"> </span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A connection can fail for a number of reasons:</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) Failed Authentication. Have both peers signed each otherscertificates? </p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Firewalls. If both peers are behind firewalls then they cannotconnect directly. RetroShare has a built in proxy system to circumventfirewalls - However this can only function if both peers can connect to a common third party that is not behind a firewall. Thisis the most likely reason for initial connections to fail. The only solution to find a common friend that isn't firewalled (know anyone with Broadband?)</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(3) IP Addresses are wrong. You can manually examine and change these using the Certificate configuration.</p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table></body></html> + + + + MainWindow + + + Preferences + Preferences + + + + Network + Network + + + + Friends + Praat saam met Vriend + + + + Transfers + Oorsteek + + + + Messages + Email + + + + Channels + Kanaal + + + + Options + Options + + + + Users: 0 Files: 0 + Users: 0 Files: 0 + + + + Down: 0.0 Up: 0.0 + Down: 0.0 Up: 0.0 + + + + Connections: 0/45 + Connections: 0/45 + + + + System tray is unavailable + System tray is unavailable + + + + System tray unavailable + System tray unavailable + + + + RetroShare System tray + Retroshare System tray + + + + Application will continue running. Quit using context menu in the system tray + Application will continue running. Quit using context menu in the system tray + + + + Hide + Hide + + + + Show + Show + + + + RetroShare + Retroshare + + + + Home + Home + + + + General + Generaal + + + + Invite Friend + Nooi Vriend + + + + Add Friend + Byvoeg Vriend + + + + Add Share + Byvoeg Gedeelte + + + + Advanced + Advanced + + + + QTextBrowser { + background-color: rgb(192,192,192); + +} + QTextBrowser { background-color: rgb(192,192,192);} + + + + QPushButton +{ + border-image: url(:/images/console-small-up.png) +} + +QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + +} + +QPushButton:pressed { + border-image: url(:/images/console-small-down.png) +} + + QPushButton{ border-image: url(:/images/console-small-up.png) }QPushButton:hover { border-image: url(:/images/console-small-hover.png) }QPushButton:pressed { border-image: url(:/images/console-small-down.png) } + + + + Exit + Uitgaan + + + + Search + Search + + + + Files + Files Biblioteek + + + + Chat + GroepPraat + + + + Add Shared Directory + Byvoeg Gedeelte Katalogus + + + + About/Help + + + + + Messenger + + + + + Show/Hide + + + + + &Quit + + + + + Bandwidth Graph + + + + + Open Messenger + + + + + RetroShare %1 + + + + + Add a Friend + + + + + Invite a Friend + + + + + Add a Share + + + + + Quit + + + + + Minimize + + + + + Maximize + + + + + Hide Console + + + + + Show Console + + + + + Hide ToolBox + + + + + :images/hide_toolbox_frame.png + + + + + Show ToolBox + + + + + :images/show_toolbox_frame.png + + + + + QTextBrowser { + background-color: rgb(192,192,192); + + } + + + + + QPushButton + { + border-image: url(:/images/console-small-up.png) + } + + QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + + } + + QPushButton:pressed { + border-image: url(:/images/console-small-down.png) + } + + + + + + Apps + + + + + MessageToaster + + + message + boodskap + + + + MessagesDialog + + + New Message + Nuut Boodskap + + + + Reply to Message + Antwoord aan Boodskap + + + + Remove Message + Remove Boodskap + + + + Date + Date + + + + From + From + + + + Title + Koplyn: + + + + Msg + Boodskap + + + + Count + Count + + + + Size + Size + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Recommended Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Vasstel Tou</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">remove selected message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">remove selected message</p></body></html> + + + + QPushButton +{ +border-image: url(:/images/deletemail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/deletemail-hover.png); +} + QPushButton{border-image: url(:/images/deletemail24.png);}QPushButton:pressed{border-image: url(:/images/deletemail-hover.png);} + + + + Inbox + Email-Inbox + + + + Outbox + Email-Outbox + + + + Draft + Konsep + + + + Sent + Email-Sent + + + + Timestamp + Timestamp + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">reply to selected message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">reply to selected message</p></body></html> + + + + +QPushButton +{ +border-image: url(:/images/replymail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/replymail-hover.png); +} + + QPushButton{border-image: url(:/images/replymail24.png);}QPushButton:pressed{border-image: url(:/images/replymail-hover.png);} + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">New Message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Nuut Boodskap</p></body></html> + + + + QPushButton +{ +border-image: url(:/images/folder-draft24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/folder-draft24-hover.png); +} + + QPushButton{border-image: url(:/images/folder-draft24.png);}QPushButton:pressed {border-image: url(:/images/folder-draft24-hover.png);} + + + + You get Message testing + You get Message testing + + + + Download All + Download All + + + + QPushButton +{ +border-image: url(:/images/deletemail24.png); +} + +QPushButton:hover +{ +border-image: url(:/images/deletemail-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/deletemail-pressed.png); +} + + + + + +QPushButton +{ +border-image: url(:/images/replymail24.png); +} + +QPushButton:hover +{ +border-image: url(:/images/replymail24-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/replymail-pressed.png); +} + + + + + + QPushButton +{ +border-image: url(:/images/folder-draft24.png); +} +QPushButton:hover +{ +border-image: url(:/images/folder-draft24-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/folder-draft24-pressed.png); +} + + + + + + MessengerWindow + + + QWidget#MessengerWindow { +background-color: #ECF3F6; background-image:url(:/images/backgroundimage.png); +background-position: top right; +background-repeat: no-repeat +} + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click to change your avatar</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Change your Status and your display</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">picture here.</p></body></html> + + + + + Online + + + + + Busy + + + + + Be right Back + + + + + Away + + + + + In a Call + + + + + Out of lunch + + + + + Apear Offline + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Share a personal message with your contacts</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Add a Friend</p></body></html> + + + + + Chat + + + + + Connect To Friend + + + + + NetworkDialog + + + Peer Details / Authenticate + Peer Details / Authenticate + + + + Load Certificate + belaai sertifikaat + + + + Select a pem/pqi File + Select a pem/pqi File + + + + File Not Found + File Not Found + + + + %1 does not exist. Would you like to create it? + %1 does not exist. Would you like to create it? + + + + Failed to Create File + Failed to Create File + + + + Unable to create %1 [%2] + Unable to create %1 [%2] + + + + Select Certificate + Select Certificate + + + + Certificates (*.pqi *.pem) + Certificates (*.pqi *.pem) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + + + + # + + + + + Accept + Accept + + + + Trust + Vertroue + + + + Last Contact + Last Contact + + + + Name + Name + + + + Peer Address + Peer Address + + + + Organisation + Organisation + + + + Location + Location + + + + Country + Country + + + + Cert Id + Cert Id + + + + Auth Code + Auth Code + + + + NetworkPage + + + Rate Options + Rate Options + + + + Max Total Data Rate (KB/S): + Max Total Data Rate (KB/S): + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Rate per Person (KB/S):</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Rate per Person (KB/S):</p></body></html> + + + + PeersDialog + + + Chat + Praat + + + + Configure Friend + Configure Friend + + + + Export Friend + Configure Friend + + + + Remove Friend + Remove Friend + + + + Save Certificate + Save Certificate + + + + Certificates (*.pqi) + Certificates (*.pqi) + + + + Status + Status + + + + Person + Person + + + + Auto Connect + Auto Connect + + + + Trust Level + Trust Level + + + + Peer Address + Peer Address + + + + Last Contact + Last Contact + + + + Organisation + Organisation + + + + Location + Location + + + + Country + Country + + + + Person Id + Person ID + + + + Auth Code + Bewys Kode: + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Friends</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Vriend</span></p></body></html> + + + + Connect To Friend + Verbind to Vriend + + + + # + + + + + PopupChatDialog + + + RetroShare Friend Chat + Retrshare Vriend Praat + + + + RetroShare User Chat + + + + + PreferencesDialog + + + Language + Language + + + + Style + Style + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + + + + Style Sheet + Style Sheet + + + + Default + Default + + + + Pagefold + Pagefold + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose RetroShare's interface style</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose RetroShare's interface style</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose the language used in RetroShare</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose the language used in RetroShare</p></body></html> + + + + blue + blue + + + + silver + silver + + + + ed2k + ed2k + + + + over + over + + + + black + black + + + + arachnophobia + arachnophobia + + + + Skin2 + Skin2 + + + + Login + Login + + + + Remove Auto Login + Remove Auto Login + + + + PreferencesWindow + + + Directories + Directories + + + + Error Saving Configuration + Error Saving Configuration + + + + About + About + + + + General + General + + + + Server + Peer Settings + + + + Options + Options + + + + Cancel + Kanselleer + + + + OK + Top OK + + + + QObject + + + Name + Name + + + + Path + + + + + Extension + + + + + Date + + + + + Size + + + + + Popularity + + + + + contains + + + + + contains all + + + + + is + + + + + less than + + + + + less than or equal + + + + + greater than or equal + + + + + greater than + + + + + is in range + + + + + and + + + + + and / or + + + + + or + + + + + equals + + + + + Rshare + + + Invalid language code specified: + Invalid language code specified: + + + + Invalid GUI style specified: + Invalid GUI style specified: + + + + SearchDialog + + + File Name + File Name + + + + Sources + Sources + + + + Search Pattern + Search Pattern + + + + Results + Results + + + + File Size + File Size + + + + Download + Download + + + + Broadcast on Channel + Broadcast on Channe + + + + Recommend to Friends + Recommend to Friends + + + + Remove + Remove + + + + Remove All + Remove All + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Keywords</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Keywords</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Format</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Format</p></body></html> + + + + Any + Any + + + + Audio + Audio + + + + Video + Video + + + + Images + Images + + + + Programs + Programs + + + + Archives + Archives + + + + Documents + Documents + + + + search + search + + + + download + download + + + + Toggle advanced searching on and off. + + + + + <h3>Simple Search:</h3> + + + + + Keywords + + + + + Perform simple search + + + + + Show Advanced Search Tool + + + + + Filename + + + + + Hash + + + + + KeyWords + + + + + Search Id + + + + + <h3>Advanced Search:</h3> + + + + + ServerDialog + + + Transfer Rates + Transfer Rates + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Total Rate (kb/s) </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Total Rate (kb/s) </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Per Person </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Per Person </p></body></html> + + + + Server Settings + Peer Settings + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + + + + Port: + Port: + + + + behind zee Firewall + Behind a Firewall + + + + Forwarded External Port + Forwarded External Port (Router) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + + + + Check Settings + Check Settings + + + + Firewall/Router Configuration + + + + + Manual router setup. + + + + + Use uPnP to configure router + + + + + Network Address Configuration (takes effect after restart) + + + + + Use DHT to locate friends + + + + + Manual IP Addresses + + + + + Server Status And Network Settings + + + + + Firewalled + + + + + Forwarded Port + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">DHT Status</p></body></html> + + + + + uPnP Status + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Local Address:</p></body></html> + + + + + ServerPage + + + Change + Restart Server + Change + Restart + + + + Server Settings + Peer Settings + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Adress:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + + + + Port: + Port: + + + + Misc + Misc + + + + behinde Firewall + Behind a Firewall + + + + Forwarded External Port + Forwarded External Port (Router) + + + + Settings + + + Settings + Settings + + + + Cancel + Kanselleer + + + + Apply + Apply + + + + OK + OK + + + + General + General + + + + Network + Network + + + + Server + Peer + + + + Directories + Katalogus + + + + SharedFilesDialog + + + Download + Download + + + + Recommend + Recommend + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Files</span></p></body></html> + + + + Add to Recommend List + + + + + Recommend To + + + + + Message Friend + + + + + StartDialog + + + Select Trusted Friend + Select Trusted Friend + + + + Certificates (*.pqi *.pem) + Certificates (*.pqi *.pem) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:13pt; font-weight:600; color:#8b0000;">Welcome to RetroShare</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:13pt; font-weight:600; color:#8b0000;">Welkom to Retroshare</span></p></body></html> + + + + Please Login .... + Please Login .... + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Pasword</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Pasword</span></p></body></html> + + + + Load Existing User + Load Existing User + + + + Or create a New User + Or create a New User + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Organisation:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Organisation:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Location:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Location:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Password (Again)</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Password (Again)</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">New Password</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">New Password</span></p></body></html> + + + + Load Trusted Certificate (Optional) + Load Trusted Certificate (Optional) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + + + + Select File + Select File + + + + Generate New Certificate + Generate New Certificate + + + + RetroShare setup + Retroshare setup + + + + Automatically Login in Future + Automatically Login in Future + + + + RetroShare + + + + + QWidget { + background-color: #ECF3F6; +} + + + + + Auto-login + + + + + Name: + + + + + Log In + + + + + Password: + + + + + Create a Account + + + + + QToolButton{ +border-image: url(:/images/avatar_background.png); + +} + + + + + + StatisticDialog + + + Statistics + Statistics + + + + Download + Download + + + + Session: + Session: + + + + Downloaded: + Downloaded: + + + + Average Downloadspeed: + Average Downloadspeed: + + + + Count of Downloads: + Count of Downloads: + + + + Overall + Overall + + + + Upload + Upload + + + + Session + Session + + + + Uploaded: + Uploaded: + + + + Average Uploadspeed: + Average Uploadspeed: + + + + Count of Uploads: + Count of Uploads: + + + + Uploaded + Uploaded + + + + Connections: + Connections: + + + + Peers: + Peers: + + + + Misc + Misc + + + + Uptime: + Uptime: + + + + Overall: + Overall: + + + + Uptime + Uptime + + + + Records + Records + + + + Uploadspeed: + Uploadspeed: + + + + Downloadspeed: + Downloadspeed: + + + + Show Settings + Show Settings + + + + Reset + Reset + + + + Receive Rate + Receive Rate + + + + Send Rate + Send Rate + + + + Always On Top + Always On Top + + + + 100 + 100 + + + + % Opaque + 100 + + + + Changes the transparency of the Bandwidth Graph + Changes the transparency of the Bandwidth Graph + + + + Save + Save + + + + Cancel + Cancel + + + + Hide Settings + Hide Settings + + + + TransfersDialog + + + Cancel + Kanselleer + + + + Clear Completed + Clear Completed + + + + File Name + File Name + + + + Sources + Sources + + + + Status + Status + + + + File Size + File Size + + + + Speed + Speed + + + + Progress + Progress + + + + Completed + Completed + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Downloads:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Downloads:</span></p></body></html> + + + + Peer Name + Peer Name + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Uploads:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Uploads:</span></p></body></html> + + + + Name + i.e: file name + Name + + + + Size + i.e: file size + + + + + Progress + i.e: % downloaded + Progress + + + + Speed + i.e: Download speed + Speed + + + + Sources + i.e: Sources + Sources + + + + Remaining + i.e: Estimated Time of Arrival / Time left + + + + + Core-ID + + + + + User Name + i.e: user name + + + + + Progress + i.e: % uploaded + Progress + + + + Speed + i.e: upload speed + Speed + + + + Transferred + + + + + ULListDelegate + + + B + + + + + KB + + + + + MB + + + + + GB + + + + + VMessageBox + + + OK + OK + + + + Cancel + Kanselleer + + + + Yes + Ja + + + + No + No + + + + Help + Help + + + + Retry + Retry + + + + Show Log + Show Log + + + + Show Settings + Show Settings + + + + moreinfo + + + Details + Details + + + + OK + OK + + + + Name + Name + + + + Value + Value + + + diff --git a/retroshare-gui/src/lang/retroshare_bg.qm b/retroshare-gui/src/lang/retroshare_bg.qm new file mode 100644 index 000000000..6b0e76092 Binary files /dev/null and b/retroshare-gui/src/lang/retroshare_bg.qm differ diff --git a/retroshare-gui/src/lang/retroshare_bg.ts b/retroshare-gui/src/lang/retroshare_bg.ts new file mode 100644 index 000000000..2230f51fe --- /dev/null +++ b/retroshare-gui/src/lang/retroshare_bg.ts @@ -0,0 +1,4181 @@ + + + + + + + Arial + Arial + + + + AddFriendDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;"> To add a new Friend, cut and paste their email </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">invitation into the box below, and click done.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;"> За да добавите приÑтел, копирайте електронната </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">покана в кутиÑта по-долу и изберете "Готово!"</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;"></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + Cancel + Отказ + + + + Done + Готово! + + + + Load From File + Зареждане от файл + + + + RetroShare + RetroShare + + + + Certificate Load Failed + ÐеуÑпешно зареждане на Ñертификат + + + + Add a Friend + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"><span style=" font-size:16pt;">Add a new Friend</span><br /><br /><span style=" font-size:10pt;">To add a new Friend, cut and paste their email </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">invitation into the box below, and click done.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + + + + + AddFriendWizard + + + < Back + + + + + Next > + + + + + Cancel + Отказ + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">This Wizard helps to Connect to your Friends</span></p></body></html> + + + + + I have a .pqi/.pem file received from a Friend + + + + + I have Key received from a Friend + + + + + I want to invite a friend to my RetroShare network + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Cut and paste the text below into an email.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;"> and send it to all your friends!</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">When you press next RetroShare will attempt to launch a Email client.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Invite your Friends to join with RetroShare</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Enter the Key code you got from your friend:</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">When you press next RetroShare will attempt to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">connect using the key.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Select a pqi/pem file:</span></p></body></html> + + + + + Browse + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">When you press next RetroShare will attempt to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">connect using the .pqi/.pem file.</p></body></html> + + + + + Add Friend to my netowork Wizard + + + + + AdvancedSearchDialog + + + RetrosShare: Advanced Search + + + + + Add a further search criterion. + + + + + Add a selection criterion + + + + + Reset + + + + + Cancels the search. + + + + + Cancel + Отказ + + + + Perform the advanced search. + + + + + Search + + + + + Search Criteria + + + + + Reset the search criteria. + + + + + ApplicationWindow + + + RetroShare %1 + + + + + Example Application + + + + + Application Users: 0 Files: 0 + + + + + Down: 0.0 Up: 0.0 + + + + + Connections: 0/45 + + + + + Hide + + + + + Show + + + + + RetroShare + + + + + Home + + + + + General + Общи + + + + Advanced + + + + + QTextBrowser { + background-color: rgb(192,192,192); + + } + + + + + QPushButton + { + border-image: url(:/images/console-small-up.png) + } + + QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + + } + + QPushButton:pressed { + border-image: url(:/images/console-small-down.png) + } + + + + + + AuthorizationDialog + + + Authenticate + Ð˜Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ + + + + Authenticate Friend By Entering Their Code + Ð˜Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð½Ð° приÑтел чрез код + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Идентификационен код:</span></p></body></html> + + + + OK + OK + + + + Cancel + Отказ + + + + BandwidthGraph + + + RetroShare Bandwidth Usage + + + + + Show Settings + + + + + Reset + + + + + Receive Rate + + + + + Send Rate + + + + + Always on Top + + + + + Style + + + + + Changes the transparency of the Bandwidth Graph + + + + + 100 + + + + + % Opaque + + + + + Save + + + + + Cancel + Отказ + + + + Since: + + + + + Hide Settings + + + + + CallToaster + + + Message + + + + + ChanCreateDialog + + + Create a new Broadcast Channel + Създаване на нов канал + + + + Create A New Broadcast Channel + Създаване на нов канал + + + + Channel Name: + Име на канала: + + + + Type: + Вид: + + + + Public Channel (Signed) + Публичен канал (Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñ) + + + + Private Channel (Encrypted) + Таен канал (криптиран) + + + + Cancel Channel + Отказ + + + + Create Channel + Създаване на канал + + + + ChanMsgDialog + + + Compose + Създаване + + + + Recommended Files + Препоръчани файлове + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-weight:400;"><span style=" font-weight:600;">Subject:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-weight:400;"><span style=" font-weight:600;">Тема:</span></p></body></html> + + + + Send To: + До: + + + + Send + Изпращане + + + + Delete Channel + Изтриване на канал + + + + Create Channel MSG + Създаване на канал MSG + + + + 1 + + + + + Reply + + + + + ChannelsDialog + + + New Message + Ðово Ñъобщение + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Messages</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">СъобщениÑ</span></p></body></html> + + + + Date + Дата + + + + Rank + Ранг + + + + From + От + + + + Title + Заглавие + + + + Msg + Съобщение + + + + Count + Брой + + + + Size + Размер + + + + Type + Вид + + + + Rs[Cert/Chan]IdSize + Rs[Cert/Chan]IdSize + + + + RsMsgId + RsMsgId + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Message Text</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">ТекÑÑ‚ на Ñъобщението</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Recommended Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Препоръчани файлове</span></p></body></html> + + + + New Channel + Ðов канал + + + + Subscribe To Channel + Ðбонамент за канал + + + + Unsubscribe To Channel + Отказване на абонамент за канал + + + + Delete Your Channel + Изтриване на канала + + + + Download + СвалÑне + + + + Download All + СвалÑне на вÑичко + + + + ChatDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:9pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:400;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:9pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:400;"></p></body></html> + + + + Chat History: + ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð½Ð° разговора: + + + + Chat With: + Разговор Ñ: + + + + Chat + Разговор + + + + Users: + + + + + ChatToaster + + + message + Ñъобщение + + + + You Get a New Message + Имате ново Ñъобщение + + + + Message + + + + + ConfCertDialog + + + Cancel + Отказ + + + + Done + Готово! + + + + Apply + Прилагане + + + + Peer Settings + ПотребителÑки наÑтройки + + + + Port: + Порт: + + + + behind zee Firewall + зад Огнена Ñтена + + + + Forwarded External Port + Външен порт за пренаÑочване + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Порт:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Външен адреÑ:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Име</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Вътрешен адреÑ:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Max Transfer Rate (kb/s) </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">МакÑимална ÑкороÑÑ‚ на транÑфер (kb/s) </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Org / Loc:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ÐžÑ€Ð³Ð°Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ / МеÑтоположение:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Име:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Country/State:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Държава/Щат:</p></body></html> + + + + Trust Settings + ÐаÑтройки за доверие + + + + Trust Level + Ðиво на доверие + + + + Trust Their Signature + Сертифициране на Ð¿Ð¾Ð´Ð¿Ð¸Ñ + + + + Sign The Certificate + ÐŸÐ¾Ð´Ð¿Ð¸Ñ Ð½Ð° Ñертификата + + + + OK + + + + + Peer Adress + + + + + Peer Info + + + + + ConfirmQuitDialog + + + Exit RetroShare + + + + + You are about to exit the RetroShare application and therefore stop all transfers. <br><br>Are you sure you want to stop and exit RetroShare? + + + + + Do not show this message again. + + + + + ConnectDialog + + + Peer Details + ПотребителÑка Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Държава:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Org:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ОрганизациÑ:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Име:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Trust:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Доверие:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Loc:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">МеÑтоположение:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Certificate</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">signers:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Сертификационни</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">подпиÑи:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Идентификационен код:</span></p></body></html> + + + + Make Friend + Ðов приÑтел + + + + Close + ЗатварÑне + + + + ConnectionsDialog + + + Load Certificate + Зареждане на Ñертификат + + + + Select a pem/pqi File + Избор на pem/pqi файл + + + + File Not Found + Файлът не е намерен + + + + %1 does not exist. Would you like to create it? + %1 не ÑъщеÑтвува. ИÑкате ли да го Ñъздадете? + + + + Failed to Create File + Грешка при Ñъздаването на файла + + + + Unable to create %1 [%2] + %1 [%2] не може да бъде Ñъздаден + + + + Select Certificate + Изберете Ñертификат + + + + Certificates (*.pqi *.pem) + Сертификати (*.pqi *.pem) + + + + Accept + Приемане + + + + Trust + Доверие + + + + Last Contact + ПоÑледно Ñвързване + + + + Name + Име + + + + Organisation + ÐžÑ€Ð³Ð°Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ + + + + Location + МеÑтоположение + + + + Country + Държава + + + + Peer Address + ÐÐ´Ñ€ÐµÑ + + + + Cert Id + Сертификат + + + + Auth Code + Идентификационен код + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Мрежа:</span></p></body></html> + + + + Peer Details / Authenticate + Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° Ð¿Ð¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ / Ð˜Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ + + + + CryptographyDialog + + + RSA Key Size + Размер на RSA ключ + + + + Rijndael Block size + Размер на Rijndael блок + + + + 128 Bits + 128 Bits + + + + 192 Bits + 192 Bits + + + + 256 Bits + 256 Bits + + + + Rijndael Key Size + Размер на Rijndael ключ + + + + Rijndael Mode + + + + + CBC + CBC + + + + ECB + ECB + + + + CFB + CFB + + + + Rijndael Padding + + + + + PKCS7 + PKCS7 + + + + Zeros + + + + + ANSIX923 + ANSIX923 + + + + ISO10126 + ISO10126 + + + + Rijndael Feedback Size + Размер на Rijndael + + + + Key Size: + Размер на ключа: + + + + Block Size: + Размер на блока: + + + + Feedback Size: + Размер на обратната връзка: + + + + Mode: + + + + + Padding: + + + + + DLListDelegate + + + B + + + + + KB + + + + + MB + + + + + GB + + + + + DirectoriesDialog + + + Shared Directories + Споделени директории + + + + Other Directories + Други директории + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Incoming Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">ВходÑщи файлове</span></p></body></html> + + + + Add Shared Directory + ДобавÑне на Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð·Ð° ÑподелÑне + + + + DirectoriesPage + + + Shared Directories + Споделени директории + + + + Incoming files + ВходÑщи файлове + + + + ExampleDialog + + + Vote Up + + + + + Vote Down + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Friends</span></p></body></html> + + + + + # + + + + + Status + + + + + Person + + + + + Auto Connect + + + + + Trust Level + + + + + Peer Address + ÐÐ´Ñ€ÐµÑ + + + + Last Contact + ПоÑледно Ñвързване + + + + Organisation + ÐžÑ€Ð³Ð°Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ + + + + Location + МеÑтоположение + + + + Country + Държава + + + + Person Id + + + + + Auth Code + Идентификационен код + + + + ExprParamElement + + + to + + + + + ignore case + + + + + dd.MM.yyyy + + + + + KB + + + + + MB + + + + + GB + + + + + ExpressionWidget + + + Expression Widget + + + + + Delete this expression + + + + + FileHashDialog + + + Download + СвалÑне + + + + GSettingsWin + + + General + Общи + + + + Network + Мрежа + + + + Directories + Директории + + + + Server + Сървър + + + + %1 + %1 + + + + GenCertDialog + + + RetroShare setup + ИнÑÑ‚Ð°Ð»Ð°Ñ†Ð¸Ñ Ð½Ð° Retro Share + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16pt;">Generate a new profile</span><br /><br />Please fill in the information which will<br />allow your RetroShare to connect to</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Friends.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Organisation:</p></body></html> + + + + + Password (Again) + + + + + Location: + + + + + Load Trusted Certificate (Optional) + Зареждане на Ñертификат (по избор) + + + + Password + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ПриÑтел</span></p></body></html> + + + + Select File + Избор на файл + + + + Country: + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + + + + + Generate New Certificate + Генериране на нов Ñертификат + + + + Select Trusted Friend + Избор на доверен приÑтел + + + + Certificates (*.pqi *.pem) + Сертификати (*.pqi *.pem) + + + + GeneralPage + + + Keys manager + Управление на ключовете + + + + Style + + + + + Choose RetroShare's interface style + Избор на интерфейÑен език за Retro Share + + + + Language + Език + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ПромÑната на езика ще наÑтъпи при реÑтартиране на RetroShare!</p></body></html> + + + + Choose the language used in RetroShare + Избор на език за работа Ñ Retro Share + + + + GraphFrame + + + Recv: + Получени: + + + + %1 KB/s + %1 KB/s + + + + Sent: + Изпратени: + + + + %1 KB + %1 KB + + + + %1 MB + %1 MB + + + + %1 GB + %1 GB + + + + HelpDialog + + + About + + + + + Authors + + + + + Thanks to + + + + + Translation + + + + + License Agreement + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">About/Help</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:xx-large; font-weight:600; color:#0000ff;">About RetroShare.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-weight:600;">Retroshare is a private and secure decentralised commmunication platform.<br />You can use it chat, send messages and share files with your friends.</span><br /><br />This is just a placeholder page for the moment. You can<br />improve retroshare's in-built help (this text) by<br />updating the retroshare wiki: <a href="http://retroshare.wiki.sourceforge.net/help_tab"><span style=" text-decoration: underline; color:#0000ff;">This Page in the retroshare Wiki</span></a><br /><br />The About/Help Tab is regularly updated from the Wiki page.<br /><br />External Links to more information:<br /></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.sourceforge.net"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Webpage</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.wiki.sourceforge.net/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Wiki</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://sourceforge.net/projects/retroshare/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Project Page</span></a></li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.lunamutt.com"><span style=" text-decoration: underline; color:#0000ff;">Lunamutt Homepage.</span></a></li></ul></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-size:19pt; font-weight:600; color:#0000ff;">The RetroShare Team:</span><br /> <br /><span style=" font-size:9pt; color:#0000ff;">defnax</span>: Lead GUI developer <br /><span style=" font-size:9pt; color:#0000ff;">drbob7</span>: Lead Core developer. <br /> <br /><span style=" font-size:9pt; color:#0000ff;">bmeck</span> : Our new web-developer. Joined retroshare a couple <br />of weeks ago, and already starting on an exciting new <br />design for the web-page. <br /> <br /><span style=" font-size:9pt; color:#0000ff;">noragen</span> : Developer from the SIM-IM project. Working on a retroshare plugin to SIM-IM. <br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">kernelpanix</span> : Gui and skin developer</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">libris</span><span style=" font-size:9pt;">:</span> core developer</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-size:9pt; color:#0000ff;">kashif: </span><span style=" color:#000000;">core developer</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt; color:#000000;"><span style=" font-size:8pt;"><br /></span><span style=" color:#0000ff;">agent725</span><span style=" font-size:8pt;">: Manages the 'local' Retroshare release, <br />and beta-testing retroshare on a large scale. <br /> <br /></span><span style=" color:#0000ff;">the_mgt</span><span style=" font-size:8pt;">: Maintains the Gentoo and generic linux <br />installation/compilation scripts. </span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">notdefine:</span> Maintains the .rpm, .deb installation/compilation scripts.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">zhouk</span>: developer</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Translators:</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Serbian</span>: Kunalagon Umuhanik &lt;kunalagon@gmail.com&gt;</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Polish: </span>Jarek</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">French</span>:Temet</p></body></html> + + + + + InviteDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">To </span><span style=" font-size:10pt; font-weight:600;">Invite your friends to join you with Retroshare: </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">Cut and paste the text below into an email.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">and send it to all your friends!</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">To </span><span style=" font-size:10pt; font-weight:600;">Поканете приÑтелите Ñи в RetroShare: </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">Копирайте Ð´Ð¾Ð»Ð½Ð¸Ñ Ñ‚ÐµÐºÑÑ‚ в електронно Ñъобщение.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">and send it to all your friends!</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + Done + Готово! + + + + Cancel + Отказ + + + + Launch Email + Зареждане на електронна поща + + + + Invite a Friend + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"><span style=" font-size:16pt;">Invite a Friend</span><br /><br /><span style=" font-size:10pt;">To Invite your friends to join you with Retroshare: </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">Cut and paste the text below into an email.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">and send it to all your friends!</p></body></html> + + + + + LogDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> + +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="ABOUT"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">About RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShare is a private peer to peer communication platform created by Dr. Bob.This program enables you to securely share files and chat with your friends (and no-one else!).</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, and the latest release go to http://www.lunamutt.com.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="START"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Quick Start Guide to RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If this is your first time using Retroshare, it is recommended that you readthis guide for instructions on how to get started. The first step is:<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Connecting to Your Friends</span></a>. Once you have managed this you can <a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">Download Files</span></a> and<a href="#START-SHARE"><span style=" text-decoration: underline; color:#0000ff;">Share with Others</span></a></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Some of the key concepts related to ensuring your sharing remains private aredescribed in the <a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">Frequently Asked Questions</span></a>. Some Key security questions are:<a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">What is a Web of Trust?</span></a>, <a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">Should I Sign this Certificate?</span></a>, and finally<a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">What does "Trust" Mean?</span></a>.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is also worthwhile reading the <a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">GUI Overview</span></a>which describes the featureson available through the User Interface.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Connecting to your Friends </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">There are four steps to connecting to a Friend:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Get Friend's Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Load Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Sign Certificate</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect to Friend.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The instructions might initially appear long and daunting, however thesesteps are required to ensure that your sharing is private and secure.These steps are only required a couple of times, to add new friends, and become quite straight forward after the first time.</p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (1) EXCHANGE CERTIFICATES </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Before you can connect, you need send your certificate to your friend, and get your friends certificate. Follow these steps to get your certificate:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on Your Certificate to Select it.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on the "Export Friend" Button to bring up a file save dialog.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select directory to save the certificate to.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Enter desired filename. (with a file type of .pqi), and Click OK.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Email this File to your Friend. (It is recommended you put thecertificate in a zip file before sending, as some email programsdon't transmit the file correctly).</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Ask your friend to do the same.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Once you have received your friend's certificate, removed itfrom the zip file and saved it to disk, you can proceed to step (2).</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Note: This exchange of certificates is only necessary to get you started.Once you are connected to some friends the exchange of certificates becomeautomated by the autoDiscovery system. See<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">GUI: Connecting</span></a> for more information.------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (2) LOAD YOUR FRIEND'S CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Import Friend"</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select your friends certificate file, then click "Okay". Their certificate should appear in the top window of the "Connect" Tab.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (3) SIGN CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select their Certificate by clicking on their name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Configure Friend" Button. This will bring up a configuration window. which allows you to look at the detailsof the certificate.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click the "Sign Certificate" button near the bottom of the "Certificate Configuration" Window.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Now close the window by clicking on the "Done" button.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Your Friends certificate should now say "Trusted (S)", indicating it is ready for connections.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can only share with "Trusted" Peers. You must sign your Friend'scertificate to prove that you know the certificate belongs to your Friend. Do not sign any/all certificates - only the people youtrust. For more information see: <br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br />------------------------------------------------------------------------<br /><br /> <br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (4) AUTOCONNECT TO PEER </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Finally You need to activate the connection:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click in the Box, next to your friends Name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> A Tick should appear in the box, a connection will be started.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> The "Offline" will change to "Online" when you have successfullyconnected.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Remember: Your initial connection attempts will fail, until your friend has signed your certificate and ticked the Auto-Connect Box.This ensures that both peers trust each other, and stops random peopleaccessing your files.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>. <br />------------------------------------------------------------------------<br /><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-DOWNLOAD"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Downloading Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have connected to friends, you can download their shared files.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can search for the files you want using either:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) File Listing Tab: This gives you a directory view of the files being shared by your peers. Double clickon the directory name (not the arrow) to diplay its subdirectories and files.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 1: This can take up to 5 seconds to fetch the information for your peer.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 2: If the directory is empty, or the person is offline, then the request will silently fail.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Search Tab: Retroshare also allows you to search your peers computers for filenames. Enter yourterm(s) in the search box at the top of the TAB and click the "Search" button. This willsearch all of the peers that you are currently connected to.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 3: If any matching files are found they will be displayed within 5 - 10 seconds.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have found the files you want, Select the file(s), and click "Download" to begin the download process.If you click over the "File Transfer" TAB, the status of the files will appear.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 4: The files can take up to 10 seconds to appear in the transfer window.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-SHARING"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Sharing Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can specify which files you want to share in the "Config" Tab.In the "Share Directories" section, click the "Add Directory" Button, and select the directory you want to share.The files and subdirectories will become available for you peers.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can remove a directory from the Shared Directories List by clicking onthe directory name in the list, and then clicking "Remove Directory".</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="GUI"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Gui Overview (Tab Description) </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The GUI is divided up into several sections which can be accessed by clicking on the Tabs along the top of the main window. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect: Manage Connections and Friends.(<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">getting started</span></a> and<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Listing: A directory view of available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Search: Search for available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Messages: For Sending/Recving Message. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Channels: A broadcast/subscription system. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Transfer: Listing of Current and completed Transfers.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Config: Specify of share diectories and IP Addresses.(<a href="#GUI-CONFIG"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> About: Help and other Information.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Chat: Accessed by the clicking on the "Chat" button.</li></ul> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Connect Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Connect TAB consists of two windows. The upper windowshows a list of your friends. This window indicates each friendscurrent trust level, as well as their connection state.The "Trust_Lvl" Column indicates if the certificate has beenAuthenticated using the web of trust. You can only connect to "Trusted" certificates. Tick the "Auto_Connect" box to connect to your trusted friends.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The lower window provides a list of the friends of your friends.This window shows the neighbour's name and how long ago they attempted to connect to you. This window is automatically populatedby the autoDiscovery system, and should be used to expand yourretroShare network. A word of warning: Do not automatically trust (or sign) anyonethat appears in this window. First verify by some other means (email/phone)that certificate belongs to the person you think it does.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use the "Neighbour List" window to expand your friend list. Select the desired entry in the lower window by clicking on it, then click the "Add to Friends" Button to move it to the upper window.Likewise the "Remove from Friends" button moved a person from the upper window to the lower window.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The "Configure Friend" Button opens a Certificate Configuration window.This window can be used to examine the certificate details, sign the certificate or manually change the peer's IP Address.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">See Also:<br /><a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Getting Started: Connecting to your friends</span></a>.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>.<br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONFIG"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Config Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Configuration Tab allows you to select the share directories, as well as the directory that downloaded files are saved to.<br />See <a href="#STARTUP-SHARING"><span style=" text-decoration: underline; color:#0000ff;">Sharing you Files</span></a> for details. </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Config Tab also allows you to control the IP Address and Portused by RetroShare. Under most cirumstances you do not need to changethese setting. If you are behind a firewall and can setup a forwarded port, the selected IP Address and Port should be specified here.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="FAQ"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Frequently Asked Questions </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">How does the security/privacy work? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShares uses a Web of Trust Authentication system to ensurethat your "friends" are your friends, and uses SSL to encryptthe communcications between peers. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What is a Web of Trust? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Web of Trust relies on a collection of peers to identify eachother. Look it up on the Web!</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-TRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What does "Trust" Mean in RetroShare?</span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Anyone can generate a certificate, with any name on it. So howdo you know that the certificate that claims to be from "Joe Bloggs"is really from your mate Joe. This is the "AuthenticationProblem". RetroShare uses a Web of Trust to Authenticate your peers.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-SIGN"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Should I Sign this Certificate? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should only sign a certificate if you are completely surethat it comes from the "right" person. If you sign a certificateyou are "Authenticating" the person to yourself and others.If you sign certificates that you haven't checked, then you aredestroying your own privacy and security.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">How do you verify a certificate? Use an alternative method ofcommunication to send the certificate: E.g. email or USB stick. This will improve you confidence that the certificate belongsto the correct person. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><span style=" font-size:small;"> </span><a name="FAQ-CONNECT"></a><span style=" font-size:small;">W</span><span style=" font-size:small;">hy won't it Connect?</span><span style=" font-size:small;"> </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A connection can fail for a number of reasons:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) Failed Authentication. Have both peers signed each otherscertificates? </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Firewalls. If both peers are behind firewalls then they cannotconnect directly. RetroShare has a built in proxy system to circumventfirewalls - However this can only function if both peers can connect to a common third party that is not behind a firewall. Thisis the most likely reason for initial connections to fail. The only solution to find a common friend that isn't firewalled (know anyone with Broadband?)</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(3) IP Addresses are wrong. You can manually examine and change these using the Certificate configuration.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +</body></html> + + + + + MainWindow + + + Preferences + ÐаÑтройки + + + + Network + Мрежа + + + + Friends + ПриÑтели + + + + Transfers + ТранÑфер + + + + Messages + Ð¡ÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ + + + + Channels + Канали + + + + Options + + + + + Users: 0 Files: 0 + Потребители: 0Файлове: 0 + + + + Down: 0.0 Up: 0.0 + + + + + Connections: 0/45 + Връзки: 0/45 + + + + RetroShare System tray + RetroShare ÑиÑтемен буфер + + + + Application will continue running. Quit using context menu in the system tray + Приложението ще продължи да работи. За изход изберете менюто от ÑиÑÑ‚ÐµÐ¼Ð½Ð¸Ñ Ð±ÑƒÑ„ÐµÑ€ + + + + Hide + Скриване + + + + Show + Показване + + + + RetroShare + RetroShare + + + + Home + Ðачало + + + + General + Общи + + + + Invite Friend + Покана за приÑтел + + + + Add Friend + ДобавÑне на приÑтел + + + + Add Share + ДобавÑне на Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ + + + + Advanced + ЕкÑперт + + + + QTextBrowser { + background-color: rgb(192,192,192); + +} + QTextBrowser { + background-color: rgb(192,192,192); + +} + + + + QPushButton +{ + border-image: url(:/images/console-small-up.png) +} + +QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + +} + +QPushButton:pressed { + border-image: url(:/images/console-small-down.png) +} + + QPushButton +{ + border-image: url(:/images/console-small-up.png) +} + +QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + +} + +QPushButton:pressed { + border-image: url(:/images/console-small-down.png) +} + + + + + Exit + Изход + + + + Search + ТърÑене + + + + Files + Файлове + + + + Chat + Разговор + + + + Add Shared Directory + ДобавÑне на Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð·Ð° ÑподелÑне + + + + About/Help + + + + + Messenger + + + + + Show/Hide + + + + + &Quit + + + + + Bandwidth Graph + + + + + Open Messenger + + + + + RetroShare %1 + + + + + Add a Friend + + + + + Invite a Friend + + + + + Add a Share + + + + + Quit + + + + + Minimize + + + + + Maximize + + + + + Hide Console + + + + + Show Console + + + + + Hide ToolBox + + + + + :images/hide_toolbox_frame.png + + + + + Show ToolBox + + + + + :images/show_toolbox_frame.png + + + + + QTextBrowser { + background-color: rgb(192,192,192); + + } + + + + + QPushButton + { + border-image: url(:/images/console-small-up.png) + } + + QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + + } + + QPushButton:pressed { + border-image: url(:/images/console-small-down.png) + } + + + + + + Apps + + + + + MessageToaster + + + message + Ñъобщение + + + + MessagesDialog + + + New Message + Ðово Ñъобщение + + + + Reply to Message + Отговор + + + + Remove Message + Изтриване + + + + Date + Дата + + + + From + От + + + + Title + Заглавие + + + + Msg + Съобщение + + + + Count + Брой + + + + Size + Размер + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Recommended Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Препоръчани файлове</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">remove selected message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">изтриване на избраните ÑъобщениÑ</p></body></html> + + + + QPushButton +{ +border-image: url(:/images/deletemail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/deletemail-hover.png); +} + QPushButton +{ +border-image: url(:/images/deletemail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/deletemail-hover.png); +} + + + + Inbox + ВходÑща ÐºÑƒÑ‚Ð¸Ñ + + + + Outbox + ИзходÑща ÐºÑƒÑ‚Ð¸Ñ + + + + Draft + Чернови + + + + Sent + Изпратени + + + + Timestamp + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">reply to selected message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">отговор на избраните ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ </p></body></html> + + + + +QPushButton +{ +border-image: url(:/images/replymail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/replymail-hover.png); +} + + +QPushButton +{ +border-image: url(:/images/replymail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/replymail-hover.png); +} + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">New Message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ðово Ñъобщение</p></body></html> + + + + QPushButton +{ +border-image: url(:/images/folder-draft24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/folder-draft24-hover.png); +} + + QPushButton +{ +border-image: url(:/images/folder-draft24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/folder-draft24-hover.png); +} + + + + + You get Message testing + Получихте теÑтово Ñъобщение + + + + Download All + ИзтеглÑне на вÑички + + + + QPushButton +{ +border-image: url(:/images/deletemail24.png); +} + +QPushButton:hover +{ +border-image: url(:/images/deletemail-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/deletemail-pressed.png); +} + + + + + +QPushButton +{ +border-image: url(:/images/replymail24.png); +} + +QPushButton:hover +{ +border-image: url(:/images/replymail24-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/replymail-pressed.png); +} + + + + + + QPushButton +{ +border-image: url(:/images/folder-draft24.png); +} +QPushButton:hover +{ +border-image: url(:/images/folder-draft24-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/folder-draft24-pressed.png); +} + + + + + + MessengerWindow + + + QWidget#MessengerWindow { +background-color: #ECF3F6; background-image:url(:/images/backgroundimage.png); +background-position: top right; +background-repeat: no-repeat +} + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click to change your avatar</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Change your Status and your display</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">picture here.</p></body></html> + + + + + Online + + + + + Busy + + + + + Be right Back + + + + + Away + + + + + In a Call + + + + + Out of lunch + + + + + Apear Offline + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Share a personal message with your contacts</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Add a Friend</p></body></html> + + + + + Chat + + + + + Connect To Friend + + + + + NetworkDialog + + + Peer Details / Authenticate + Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° Ð¿Ð¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ / Ð˜Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ + + + + Load Certificate + Зареждане на Ñертификат + + + + Select a pem/pqi File + Избор на pem/pqi файл + + + + File Not Found + Файлът не е намерен + + + + %1 does not exist. Would you like to create it? + %1 не ÑъщеÑтвува. ИÑкате ли да го Ñъздадете? + + + + Failed to Create File + Грешка при Ñъздаването на файла + + + + Unable to create %1 [%2] + %1 [%2] не може да бъде Ñъздаден + + + + Select Certificate + Изберете Ñертификат + + + + Certificates (*.pqi *.pem) + Сертификати (*.pqi *.pem) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Мрежа:</span></p></body></html> + + + + # + + + + + Accept + Приемане + + + + Trust + Доверие + + + + Last Contact + ПоÑледно Ñвързване + + + + Name + Име + + + + Peer Address + ÐÐ´Ñ€ÐµÑ + + + + Organisation + ÐžÑ€Ð³Ð°Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ + + + + Location + МеÑтоположение + + + + Country + Държава + + + + Cert Id + Сертификат + + + + Auth Code + Идентификационен код + + + + NetworkPage + + + Rate Options + ÐаÑтройки за ÑкороÑтта + + + + Max Total Data Rate (KB/S): + Общ макÑимум за ÑкороÑÑ‚ (KB/S): + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Rate per Person (KB/S):</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">СкороÑÑ‚ за един потребител (KB/S):</p></body></html> + + + + PeersDialog + + + Chat + Разговор + + + + Configure Friend + ÐаÑтройки за Ð¿Ð¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ + + + + Export Friend + ЕкÑпорт на приÑтел + + + + Remove Friend + Изтриване на приÑтел + + + + Save Certificate + Запазване на Ñертификат + + + + Certificates (*.pqi) + Сертификати (*.pqi) + + + + Status + СъÑтоÑние + + + + Person + Потребител + + + + Auto Connect + Ðвтоматично Ñвързване + + + + Trust Level + Ðиво на доверие + + + + Peer Address + ÐÐ´Ñ€ÐµÑ + + + + Last Contact + ПоÑледно Ñвързване + + + + Organisation + ÐžÑ€Ð³Ð°Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ + + + + Location + МеÑтоположение + + + + Country + Държава + + + + Person Id + ПотребителÑка Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ + + + + Auth Code + Идентификационен код + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Friends</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">ПриÑтели</span></p></body></html> + + + + Connect To Friend + Свързване Ñ Ð¿Ñ€Ð¸Ñтел + + + + # + + + + + PopupChatDialog + + + RetroShare Friend Chat + RetroShare разговор + + + + RetroShare User Chat + + + + + PreferencesDialog + + + Language + Език + + + + Style + + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ПромÑната на езика ще наÑтъпи когато реÑтартирате RetroShare!</p></body></html> + + + + Style Sheet + + + + + Default + По подразбиране + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose RetroShare's interface style</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose the language used in RetroShare</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Изберете език, Ñ ÐºÐ¾Ð¹Ñ‚Ð¾ да работи RetroShare</p></body></html> + + + + blue + Ñиньо + + + + silver + Ñребро + + + + ed2k + ed2k + + + + over + отгоре + + + + black + черно + + + + arachnophobia + Ð°Ñ€Ð°Ñ…Ð½Ð¾Ñ„Ð¾Ð±Ð¸Ñ + + + + Skin2 + Skin2 + + + + Login + Вход + + + + Remove Auto Login + Отказване на автоматичното влизане + + + + PreferencesWindow + + + Directories + Директории + + + + Error Saving Configuration + Грешка при запазване на наÑтройките + + + + About + За програмата + + + + General + Общи + + + + Server + Сървър + + + + Options + ÐаÑтройки + + + + Cancel + Отказ + + + + OK + ОК + + + + QObject + + + Name + Име + + + + Path + + + + + Extension + + + + + Date + + + + + Size + + + + + Popularity + + + + + contains + + + + + contains all + + + + + is + + + + + less than + + + + + less than or equal + + + + + greater than or equal + + + + + greater than + + + + + is in range + + + + + and + + + + + and / or + + + + + or + + + + + equals + + + + + Rshare + + + Invalid language code specified: + ПоÑочен е невалиден езиков код: + + + + Invalid GUI style specified: + ПоÑочен е невалиден GUI Ñтил: + + + + SearchDialog + + + File Name + Име на файл + + + + Sources + Източници + + + + Search Pattern + Модел за Ñ‚ÑŠÑ€Ñене + + + + Results + Резултати + + + + File Size + Размер на файла + + + + Download + СвалÑне + + + + Broadcast on Channel + Излъчване по канал + + + + Recommend to Friends + Препоръка за приÑтели + + + + Remove + Изтриване + + + + Remove All + Изтриване на вÑичко + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Keywords</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ключови думи</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Format</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Формат</p></body></html> + + + + Any + Ð’Ñички + + + + Audio + Ðудио + + + + Video + Видео + + + + Images + Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ + + + + Programs + Програми + + + + Archives + Ðрхиви + + + + Documents + Документи + + + + search + Ñ‚ÑŠÑ€Ñене + + + + download + ÑвалÑне + + + + Toggle advanced searching on and off. + + + + + <h3>Simple Search:</h3> + + + + + Keywords + + + + + Perform simple search + + + + + Show Advanced Search Tool + + + + + Filename + + + + + Hash + + + + + KeyWords + + + + + Search Id + + + + + <h3>Advanced Search:</h3> + + + + + ServerDialog + + + Transfer Rates + СкороÑÑ‚ на транÑфер + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Total Rate (kb/s) </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Общо (kb/s) </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Per Person </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ðа човек </p></body></html> + + + + Server Settings + ÐаÑтройки за Ñървъра + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Вътрешен адреÑ:</p></body></html> + + + + Port: + Порт: + + + + behind zee Firewall + зад Огнена Ñтена + + + + Forwarded External Port + Външен порт за пренаÑочване + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Порт:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Външно име</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Външен адреÑ:</p></body></html> + + + + Check Settings + Проверка на наÑтройките + + + + Firewall/Router Configuration + + + + + Manual router setup. + + + + + Use uPnP to configure router + + + + + Network Address Configuration (takes effect after restart) + + + + + Use DHT to locate friends + + + + + Manual IP Addresses + + + + + Server Status And Network Settings + + + + + Firewalled + + + + + Forwarded Port + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">DHT Status</p></body></html> + + + + + uPnP Status + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Local Address:</p></body></html> + + + + + ServerPage + + + Change + Restart Server + ПромÑна и реÑтартиране на Ñървъра + + + + Server Settings + ÐаÑтройки на Ñървъра + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Външен адреÑ:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Вътрешен адреÑ:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Порт:</p></body></html> + + + + Port: + Порт: + + + + Misc + Разни + + + + behinde Firewall + зад Огнена Ñтена + + + + Forwarded External Port + Външен порт за пренаÑочване + + + + Settings + + + Settings + ÐаÑтройки + + + + Cancel + Отказ + + + + Apply + Прилагане + + + + OK + ОК + + + + General + Общи + + + + Network + Мрежа + + + + Server + Сървър + + + + Directories + Директории + + + + SharedFilesDialog + + + Download + СвалÑне + + + + Recommend + Препоръка + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Файлове</span></p></body></html> + + + + Add to Recommend List + + + + + Recommend To + + + + + Message Friend + + + + + StartDialog + + + Select Trusted Friend + Избор на доверен приÑтел + + + + Certificates (*.pqi *.pem) + Сертификати (*.pqi *.pem) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:13pt; font-weight:600; color:#8b0000;">Welcome to RetroShare</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:13pt; font-weight:600; color:#8b0000;">Здравейте от RetroShare</span></p></body></html> + + + + Please Login .... + МолÑ, идентифицирайте Ñе... + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Име:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Pasword</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Парола</span></p></body></html> + + + + Load Existing User + Зареждане на ÑъщеÑтвуващ потребител + + + + Or create a New User + или Ñъздаване на нов потребител + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Organisation:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ОрганизациÑ:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Държава:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Location:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">МеÑтоположение:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Password (Again)</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Парола (отново)</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">New Password</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Ðова парола</span></p></body></html> + + + + Load Trusted Certificate (Optional) + Зареждане на Ñертификат (по избор) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ПриÑтел</span></p></body></html> + + + + Select File + Избор на файл + + + + Generate New Certificate + Генериране на нов Ñертификат + + + + RetroShare setup + ИнÑÑ‚Ð°Ð»Ð°Ñ†Ð¸Ñ Ð½Ð° Retro Share + + + + Automatically Login in Future + Ðвтоматично влизане за в бъдеще + + + + RetroShare + + + + + QWidget { + background-color: #ECF3F6; +} + + + + + Auto-login + + + + + Name: + + + + + Log In + + + + + Password: + + + + + Create a Account + + + + + QToolButton{ +border-image: url(:/images/avatar_background.png); + +} + + + + + + StatisticDialog + + + Statistics + СтатиÑтика + + + + Download + СвалÑне + + + + Session: + СеÑиÑ: + + + + Downloaded: + Свалено: + + + + Average Downloadspeed: + Средна ÑкороÑÑ‚ на ÑвалÑне: + + + + Count of Downloads: + Брой на ÑвалÑниÑта: + + + + Overall + Общо + + + + Upload + Качено + + + + Session + СеÑÐ¸Ñ + + + + Uploaded: + Качено: + + + + Average Uploadspeed: + Средна ÑкороÑÑ‚ на качване: + + + + Count of Uploads: + Брой на качваниÑта: + + + + Uploaded + Качено + + + + Connections: + Връзки: + + + + Peers: + Потребители: + + + + Misc + Разни + + + + Uptime: + Време на активноÑÑ‚: + + + + Overall: + Общо: + + + + Uptime + Време на активноÑÑ‚ + + + + Records + ЗапиÑи + + + + Uploadspeed: + СкороÑÑ‚ на качване: + + + + Downloadspeed: + СкороÑÑ‚ на ÑвалÑне: + + + + Show Settings + Показване на наÑтройките + + + + Reset + РеÑтартиране + + + + Receive Rate + СкороÑÑ‚ на получаване + + + + Send Rate + СКороÑÑ‚ на изпращане + + + + Always On Top + Ðад вÑички прозорци + + + + 100 + 100 + + + + % Opaque + % непрозрачноÑÑ‚ + + + + Changes the transparency of the Bandwidth Graph + ÐŸÑ€Ð¾Ð¼ÐµÐ½Ñ Ð¿Ñ€Ð¾Ð·Ñ€Ð°Ñ‡Ð½Ð¾Ñтта на графиката за канала + + + + Save + СъхранÑване + + + + Cancel + Отказ + + + + Hide Settings + Скриване на наÑтройките + + + + TransfersDialog + + + Cancel + Отказ + + + + Clear Completed + ИзчиÑтване на готовите + + + + File Name + Име на файл + + + + Sources + Източници + + + + Status + СъÑтоÑние + + + + File Size + Размер на файла + + + + Speed + СкороÑÑ‚ + + + + Progress + Развитие + + + + Completed + Готови + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Downloads:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">СвалÑне:</span></p></body></html> + + + + Peer Name + Потребител + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Uploads:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Качване:</span></p></body></html> + + + + Name + i.e: file name + Име + + + + Size + i.e: file size + + + + + Progress + i.e: % downloaded + Развитие + + + + Speed + i.e: Download speed + СкороÑÑ‚ + + + + Sources + i.e: Sources + Източници + + + + Remaining + i.e: Estimated Time of Arrival / Time left + + + + + Core-ID + + + + + User Name + i.e: user name + + + + + Progress + i.e: % uploaded + Развитие + + + + Speed + i.e: upload speed + СкороÑÑ‚ + + + + Transferred + + + + + ULListDelegate + + + B + + + + + KB + + + + + MB + + + + + GB + + + + + VMessageBox + + + OK + ОК + + + + Cancel + Отказ + + + + Yes + Да + + + + No + Ðе + + + + Help + Помощ + + + + Retry + Ðов опит + + + + Show Log + ИÑÑ‚Ð¾Ñ€Ð¸Ñ + + + + Show Settings + Показване на наÑтройките + + + + moreinfo + + + Details + ПодробноÑти + + + + OK + ОК + + + + Name + Име + + + + Value + СтойноÑÑ‚ + + + diff --git a/retroshare-gui/src/lang/retroshare_cn_simp.qm b/retroshare-gui/src/lang/retroshare_cn_simp.qm new file mode 100644 index 000000000..750239fc4 Binary files /dev/null and b/retroshare-gui/src/lang/retroshare_cn_simp.qm differ diff --git a/retroshare-gui/src/lang/retroshare_cn_simp.ts b/retroshare-gui/src/lang/retroshare_cn_simp.ts new file mode 100644 index 000000000..a181f7651 --- /dev/null +++ b/retroshare-gui/src/lang/retroshare_cn_simp.ts @@ -0,0 +1,3974 @@ + + + + + + + Arial + Arial + + + + AddFriendDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;"> To add a new Friend, cut and paste their email </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">invitation into the box below, and click done.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">增加了一ä½æ–°æœ‹å‹,剪切和é»è²¼å®ƒå€‘çš„email</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">邀請到下é¢çš„方框. 按åš.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;"></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + Cancel + å–消 + + + + Done + å®Œæˆ + + + + Load From File + 从文件中加載證書 + + + + RetroShare + Retroshare + + + + Certificate Load Failed + 證書加載失敗 + + + + Add a Friend + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"><span style=" font-size:16pt;">Add a new Friend</span><br /><br /><span style=" font-size:10pt;">To add a new Friend, cut and paste their email </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">invitation into the box below, and click done.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + + + + + AddFriendWizard + + + < Back + + + + + Next > + + + + + Cancel + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">This Wizard helps to Connect to your Friends</span></p></body></html> + + + + + I have a .pqi/.pem file received from a Friend + + + + + I have Key received from a Friend + + + + + I want to invite a friend to my RetroShare network + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Cut and paste the text below into an email.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;"> and send it to all your friends!</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">When you press next RetroShare will attempt to launch a Email client.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Invite your Friends to join with RetroShare</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Enter the Key code you got from your friend:</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">When you press next RetroShare will attempt to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">connect using the key.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Select a pqi/pem file:</span></p></body></html> + + + + + Browse + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">When you press next RetroShare will attempt to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">connect using the .pqi/.pem file.</p></body></html> + + + + + Add Friend to my netowork Wizard + + + + + AdvancedSearchDialog + + + RetrosShare: Advanced Search + + + + + Add a further search criterion. + + + + + Add a selection criterion + + + + + Reset + + + + + Cancels the search. + + + + + Cancel + + + + + Perform the advanced search. + + + + + Search + + + + + Search Criteria + + + + + Reset the search criteria. + + + + + ApplicationWindow + + + RetroShare %1 + + + + + Example Application + + + + + Application Users: 0 Files: 0 + + + + + Down: 0.0 Up: 0.0 + + + + + Connections: 0/45 + + + + + Hide + + + + + Show + + + + + RetroShare + + + + + Home + + + + + General + + + + + Advanced + + + + + QTextBrowser { + background-color: rgb(192,192,192); + + } + + + + + QPushButton + { + border-image: url(:/images/console-small-up.png) + } + + QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + + } + + QPushButton:pressed { + border-image: url(:/images/console-small-down.png) + } + + + + + + AuthorizationDialog + + + Authenticate + 簽署此人 (authenticate) + + + + Authenticate Friend By Entering Their Code + 簽署這項朋å‹é€²å…¥ä»£ç¢¼ + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + + + + OK + 確定 + + + + Cancel + å–消 + + + + BandwidthGraph + + + RetroShare Bandwidth Usage + + + + + Show Settings + + + + + Reset + + + + + Receive Rate + + + + + Send Rate + + + + + Always on Top + + + + + Style + + + + + Changes the transparency of the Bandwidth Graph + + + + + 100 + + + + + % Opaque + + + + + Save + + + + + Cancel + + + + + Since: + + + + + Hide Settings + + + + + CallToaster + + + Message + + + + + ChanCreateDialog + + + Create a new Broadcast Channel + å‰µå»ºä¸€å€‹æ–°çš„å»£æ’­é »é“ + + + + Create A New Broadcast Channel + å‰µå»ºä¸€å€‹æ–°çš„å»£æ’­é »é“ + + + + Channel Name: + é »é“å稱: + + + + Type: + é¡žåž‹: + + + + Public Channel (Signed) + 公共頻é“(簽字) + + + + Private Channel (Encrypted) + ç§äººé »é“(加密) + + + + Cancel Channel + å–æ¶ˆé »é“ + + + + Create Channel + åˆ›å‰µå»ºé »é“ + + + + ChanMsgDialog + + + Compose + 譜寫了信æ¯æ¸ é“ + + + + Recommended Files + 推薦檔案 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-weight:400;"><span style=" font-weight:600;">Subject:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-weight:400;"><span style=" font-weight:600;">標題:</span></p></body></html> + + + + Send To: + 發é€çµ¦: + + + + Send + ç™¼é€ + + + + Delete Channel + åˆªé™¤é »é“ + + + + Create Channel MSG + 建立MSGé »é“ + + + + 1 + + + + + Reply + + + + + ChannelsDialog + + + New Message + æ–°è¨Šæ¯ + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Messages</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">電文</span></p></body></html> + + + + Date + 日期 + + + + Rank + 排å + + + + From + 發é€æ–¹ + + + + Title + 標題 + + + + Msg + 電文 + + + + Count + è¨ˆæ•¸è¨Šæ¯ + + + + Size + å¤§å° + + + + Type + é¡žåž‹ + + + + Rs[Cert/Chan]IdSize + Rs[Cert/Chan]IdSize (ID大å°) + + + + RsMsgId + RsMsgId (消æ¯è­˜åˆ¥ç¢¼) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Message Text</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">電文全文</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Recommended Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">推薦檔案</span></p></body></html> + + + + New Channel + æ–°é »é“ + + + + Subscribe To Channel + è¨‚é–²é »é“ (Subscribe) + + + + Unsubscribe To Channel + å–æ¶ˆè¨‚é–²é »é“ (Unsubscribe) + + + + Delete Your Channel + åˆªé™¤é »é“ + + + + Download + 下載 (Download) + + + + Download All + 下載所有 (Download All) + + + + ChatDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:9pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:400;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:9pt; font-weight:600; font-style:normal; text-decoration:none;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:400;"></p></body></html> + + + + Chat History: + èŠå¤©é‚å²: + + + + Chat With: + èŠå¤©: + + + + Chat + èŠå¤© + + + + Users: + + + + + ChatToaster + + + message + 電文 + + + + You Get a New Message + ä½ å¾—åˆ°æ–°è¨Šæ¯ + + + + Message + + + + + ConfCertDialog + + + Cancel + å–消 + + + + Done + å®Œæˆ + + + + Apply + 應用 + + + + Peer Settings + çµç‚¹èª¿æ•´ + + + + Port: + ipç«¯å£ + + + + behind zee Firewall + ä½äºŽé˜²ç«ç‰†åŽ (Firewall) + + + + Forwarded External Port + 轉發å°å¤–æ¸¯å£ (Router) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ip端å£:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">外部地å€:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">å°å¤–å稱</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">本地地å€:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Max Transfer Rate (kb/s) </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">你的最大上傳速度 (kb/s) </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Org / Loc:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">組織/ä½ç½®:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">姓å:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Country/State:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">國家/å·ž:</p></body></html> + + + + Trust Settings + 信託設定 + + + + Trust Level + 信任水平 + + + + Trust Their Signature + 信託簽å + + + + Sign The Certificate + 簽署證書 + + + + OK + + + + + Peer Adress + + + + + Peer Info + + + + + ConfirmQuitDialog + + + Exit RetroShare + + + + + You are about to exit the RetroShare application and therefore stop all transfers. <br><br>Are you sure you want to stop and exit RetroShare? + + + + + Do not show this message again. + + + + + ConnectDialog + + + Peer Details + çµç‚¹è©³ç´°ä¿¡æ¯ + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">國別:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Org:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">組織:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">姓å:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Trust:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">信託:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Loc:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ä½ç½®:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Certificate</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">signers:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Certificate</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">人簽å:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">å…¸èªè­‰:</span></p></body></html> + + + + Make Friend + æˆçˆ²æœ‹å‹ + + + + Close + 關閉 + + + + ConnectionsDialog + + + Load Certificate + 加載證書 + + + + Select a pem/pqi File + é¸æ“‡ä¸€å€‹æ–‡ä»¶ PEM/PQI + + + + File Not Found + 未找到文件 + + + + %1 does not exist. Would you like to create it? + %1 ä¸å­˜åœ¨. 你想創建它嗎? + + + + Failed to Create File + 創建文件失敗 + + + + Unable to create %1 [%2] + 無法創建 %1 [%2] + + + + Select Certificate + é¸æ“‡è­‰æ›¸ + + + + Certificates (*.pqi *.pem) + 證書 (*.pqi *.pem) + + + + Accept + æŽ¥å— + + + + Trust + 信託 + + + + Last Contact + 最後一次è¯ç³» + + + + Name + 姓å + + + + Organisation + 組織 + + + + Location + ä½ç½® + + + + Country + 國別 + + + + Peer Address + çµç‚¹åœ°å€ + + + + Cert Id + 證書編號 + + + + Auth Code + èªè¨¼ç¢¼ (Authenticate Code èªè­‰) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">网絡:</span></p></body></html> + + + + Peer Details / Authenticate + çµç‚¹è©³ç´°ä¿¡æ¯/èªè­‰ + + + + CryptographyDialog + + + RSA Key Size + RSA Key Size / é—œéµå¤§å° + + + + Rijndael Block size + Rijndael Block size å¡Šå¤§å° + + + + 128 Bits + 128 Bits + + + + 192 Bits + 192 Bits + + + + 256 Bits + 256 Bits + + + + Rijndael Key Size + Rijndael Key Size /é—œéµå¤§å° + + + + Rijndael Mode + Rijndael Mode + + + + CBC + CBC + + + + ECB + ECB + + + + CFB + CFB + + + + Rijndael Padding + Rijndael Padding + + + + PKCS7 + PKCS7 + + + + Zeros + Zeros + + + + ANSIX923 + ANSIX923 + + + + ISO10126 + ISO10126 + + + + Rijndael Feedback Size + Rijndael Feedback Size + + + + Key Size: + Key Size (é—œéµå¤§å°): + + + + Block Size: + Block Size (塊大å°): + + + + Feedback Size: + Feedback Size (å饋人數 ): + + + + Mode: + Mode (模å¼): + + + + Padding: + Padding: + + + + DLListDelegate + + + B + + + + + KB + + + + + MB + + + + + GB + + + + + DirectoriesDialog + + + Shared Directories + 共享目祿錄 + + + + Other Directories + 其它目祿 + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Incoming Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">來襲檔案</span></p></body></html> + + + + Add Shared Directory + 添加共享目祿錄 + + + + DirectoriesPage + + + Shared Directories + 共享目祿錄 + + + + Incoming files + 接收的文件 + + + + ExampleDialog + + + Vote Up + + + + + Vote Down + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Friends</span></p></body></html> + + + + + # + + + + + Status + + + + + Person + + + + + Auto Connect + + + + + Trust Level + + + + + Peer Address + çµç‚¹åœ°å€ + + + + Last Contact + 最後一次è¯ç³» + + + + Organisation + 組織 + + + + Location + ä½ç½® + + + + Country + 國別 + + + + Person Id + + + + + Auth Code + èªè¨¼ç¢¼ (Authenticate Code èªè­‰) + + + + ExprParamElement + + + to + + + + + ignore case + + + + + dd.MM.yyyy + + + + + KB + + + + + MB + + + + + GB + + + + + ExpressionWidget + + + Expression Widget + + + + + Delete this expression + + + + + FileHashDialog + + + Download + 下載 (Download) + + + + GSettingsWin + + + General + 一般 + + + + Network + 网絡 + + + + Directories + 目祿 + + + + Server + çµç‚¹ / 朋å‹èª¿æ•´ + + + + %1 + %1 + + + + GenCertDialog + + + RetroShare setup + Retroshare 設置 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16pt;">Generate a new profile</span><br /><br />Please fill in the information which will<br />allow your RetroShare to connect to</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Friends.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Organisation:</p></body></html> + + + + + Password (Again) + + + + + Location: + + + + + Load Trusted Certificate (Optional) + 加載å¯ä¿¡ä»»è­‰æ›¸(å¯é¸) + + + + Password + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">朋å‹</span></p></body></html> + + + + Select File + é¸æ“‡æ–‡æ¡ˆ + + + + Country: + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + + + + + Generate New Certificate + 生æˆæ–°çš„證書 + + + + Select Trusted Friend + é¸æ“‡ä¿¡è³´çš„æœ‹å‹ + + + + Certificates (*.pqi *.pem) + 證書 (*.pqi *.pem) + + + + GeneralPage + + + Keys manager + key管ç†å™¨ + + + + Style + 風格 + + + + Choose RetroShare's interface style + é¸æ“‡ç•Œé¢é¢¨æ ¼ + + + + Language + 語言 (Language) + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">改變語言æ‰ç”Ÿæ•ˆå¾Œé‡å•ŸRetroshare!</p></body></html> + + + + Choose the language used in RetroShare + é¸æ“‡èªžè¨€Retroshare + + + + GraphFrame + + + Recv: + 接收 / Recv: + + + + %1 KB/s + %1 KB/s + + + + Sent: + ç™¼é€ (Sent): + + + + %1 KB + %1 KB + + + + %1 MB + %1 MB + + + + %1 GB + %1 GB + + + + HelpDialog + + + About + + + + + Authors + + + + + Thanks to + + + + + Translation + + + + + License Agreement + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">About/Help</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:xx-large; font-weight:600; color:#0000ff;">About RetroShare.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-weight:600;">Retroshare is a private and secure decentralised commmunication platform.<br />You can use it chat, send messages and share files with your friends.</span><br /><br />This is just a placeholder page for the moment. You can<br />improve retroshare's in-built help (this text) by<br />updating the retroshare wiki: <a href="http://retroshare.wiki.sourceforge.net/help_tab"><span style=" text-decoration: underline; color:#0000ff;">This Page in the retroshare Wiki</span></a><br /><br />The About/Help Tab is regularly updated from the Wiki page.<br /><br />External Links to more information:<br /></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.sourceforge.net"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Webpage</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.wiki.sourceforge.net/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Wiki</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://sourceforge.net/projects/retroshare/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Project Page</span></a></li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.lunamutt.com"><span style=" text-decoration: underline; color:#0000ff;">Lunamutt Homepage.</span></a></li></ul></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-size:19pt; font-weight:600; color:#0000ff;">The RetroShare Team:</span><br /> <br /><span style=" font-size:9pt; color:#0000ff;">defnax</span>: Lead GUI developer <br /><span style=" font-size:9pt; color:#0000ff;">drbob7</span>: Lead Core developer. <br /> <br /><span style=" font-size:9pt; color:#0000ff;">bmeck</span> : Our new web-developer. Joined retroshare a couple <br />of weeks ago, and already starting on an exciting new <br />design for the web-page. <br /> <br /><span style=" font-size:9pt; color:#0000ff;">noragen</span> : Developer from the SIM-IM project. Working on a retroshare plugin to SIM-IM. <br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">kernelpanix</span> : Gui and skin developer</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">libris</span><span style=" font-size:9pt;">:</span> core developer</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-size:9pt; color:#0000ff;">kashif: </span><span style=" color:#000000;">core developer</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt; color:#000000;"><span style=" font-size:8pt;"><br /></span><span style=" color:#0000ff;">agent725</span><span style=" font-size:8pt;">: Manages the 'local' Retroshare release, <br />and beta-testing retroshare on a large scale. <br /> <br /></span><span style=" color:#0000ff;">the_mgt</span><span style=" font-size:8pt;">: Maintains the Gentoo and generic linux <br />installation/compilation scripts. </span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">notdefine:</span> Maintains the .rpm, .deb installation/compilation scripts.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">zhouk</span>: developer</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Translators:</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Serbian</span>: Kunalagon Umuhanik &lt;kunalagon@gmail.com&gt;</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Polish: </span>Jarek</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">French</span>:Temet</p></body></html> + + + + + InviteDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">To </span><span style=" font-size:10pt; font-weight:600;">Invite your friends to join you with Retroshare: </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">Cut and paste the text below into an email.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">and send it to all your friends!</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">To </span><span style=" font-size:10pt; font-weight:600;">邀請你的朋å‹åŠ å…¥ä½  Retroshare:</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">剪切和é»è²¼ä»¥ä¸‹æ–‡æœ¬ä¸­æˆç‚ºé›»å­éƒµä»¶</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">並把它é€çµ¦æ‰€æœ‰æœ‹å‹! </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + Done + å®Œæˆ + + + + Cancel + å–消 + + + + Launch Email + 登陸電å­éƒµä»¶ + + + + Invite a Friend + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"><span style=" font-size:16pt;">Invite a Friend</span><br /><br /><span style=" font-size:10pt;">To Invite your friends to join you with Retroshare: </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">Cut and paste the text below into an email.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">and send it to all your friends!</p></body></html> + + + + + LogDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> + +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="ABOUT"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">About RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShare is a private peer to peer communication platform created by Dr. Bob.This program enables you to securely share files and chat with your friends (and no-one else!).</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, and the latest release go to http://www.lunamutt.com.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="START"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Quick Start Guide to RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If this is your first time using Retroshare, it is recommended that you readthis guide for instructions on how to get started. The first step is:<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Connecting to Your Friends</span></a>. Once you have managed this you can <a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">Download Files</span></a> and<a href="#START-SHARE"><span style=" text-decoration: underline; color:#0000ff;">Share with Others</span></a></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Some of the key concepts related to ensuring your sharing remains private aredescribed in the <a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">Frequently Asked Questions</span></a>. Some Key security questions are:<a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">What is a Web of Trust?</span></a>, <a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">Should I Sign this Certificate?</span></a>, and finally<a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">What does "Trust" Mean?</span></a>.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is also worthwhile reading the <a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">GUI Overview</span></a>which describes the featureson available through the User Interface.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Connecting to your Friends </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">There are four steps to connecting to a Friend:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Get Friend's Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Load Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Sign Certificate</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect to Friend.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The instructions might initially appear long and daunting, however thesesteps are required to ensure that your sharing is private and secure.These steps are only required a couple of times, to add new friends, and become quite straight forward after the first time.</p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (1) EXCHANGE CERTIFICATES </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Before you can connect, you need send your certificate to your friend, and get your friends certificate. Follow these steps to get your certificate:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on Your Certificate to Select it.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on the "Export Friend" Button to bring up a file save dialog.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select directory to save the certificate to.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Enter desired filename. (with a file type of .pqi), and Click OK.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Email this File to your Friend. (It is recommended you put thecertificate in a zip file before sending, as some email programsdon't transmit the file correctly).</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Ask your friend to do the same.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Once you have received your friend's certificate, removed itfrom the zip file and saved it to disk, you can proceed to step (2).</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Note: This exchange of certificates is only necessary to get you started.Once you are connected to some friends the exchange of certificates becomeautomated by the autoDiscovery system. See<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">GUI: Connecting</span></a> for more information.------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (2) LOAD YOUR FRIEND'S CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Import Friend"</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select your friends certificate file, then click "Okay". Their certificate should appear in the top window of the "Connect" Tab.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (3) SIGN CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select their Certificate by clicking on their name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Configure Friend" Button. This will bring up a configuration window. which allows you to look at the detailsof the certificate.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click the "Sign Certificate" button near the bottom of the "Certificate Configuration" Window.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Now close the window by clicking on the "Done" button.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Your Friends certificate should now say "Trusted (S)", indicating it is ready for connections.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can only share with "Trusted" Peers. You must sign your Friend'scertificate to prove that you know the certificate belongs to your Friend. Do not sign any/all certificates - only the people youtrust. For more information see: <br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br />------------------------------------------------------------------------<br /><br /> <br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (4) AUTOCONNECT TO PEER </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Finally You need to activate the connection:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click in the Box, next to your friends Name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> A Tick should appear in the box, a connection will be started.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> The "Offline" will change to "Online" when you have successfullyconnected.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Remember: Your initial connection attempts will fail, until your friend has signed your certificate and ticked the Auto-Connect Box.This ensures that both peers trust each other, and stops random peopleaccessing your files.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>. <br />------------------------------------------------------------------------<br /><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-DOWNLOAD"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Downloading Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have connected to friends, you can download their shared files.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can search for the files you want using either:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) File Listing Tab: This gives you a directory view of the files being shared by your peers. Double clickon the directory name (not the arrow) to diplay its subdirectories and files.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 1: This can take up to 5 seconds to fetch the information for your peer.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 2: If the directory is empty, or the person is offline, then the request will silently fail.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Search Tab: Retroshare also allows you to search your peers computers for filenames. Enter yourterm(s) in the search box at the top of the TAB and click the "Search" button. This willsearch all of the peers that you are currently connected to.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 3: If any matching files are found they will be displayed within 5 - 10 seconds.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have found the files you want, Select the file(s), and click "Download" to begin the download process.If you click over the "File Transfer" TAB, the status of the files will appear.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 4: The files can take up to 10 seconds to appear in the transfer window.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-SHARING"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Sharing Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can specify which files you want to share in the "Config" Tab.In the "Share Directories" section, click the "Add Directory" Button, and select the directory you want to share.The files and subdirectories will become available for you peers.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can remove a directory from the Shared Directories List by clicking onthe directory name in the list, and then clicking "Remove Directory".</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="GUI"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Gui Overview (Tab Description) </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The GUI is divided up into several sections which can be accessed by clicking on the Tabs along the top of the main window. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect: Manage Connections and Friends.(<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">getting started</span></a> and<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Listing: A directory view of available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Search: Search for available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Messages: For Sending/Recving Message. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Channels: A broadcast/subscription system. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Transfer: Listing of Current and completed Transfers.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Config: Specify of share diectories and IP Addresses.(<a href="#GUI-CONFIG"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> About: Help and other Information.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Chat: Accessed by the clicking on the "Chat" button.</li></ul> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Connect Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Connect TAB consists of two windows. The upper windowshows a list of your friends. This window indicates each friendscurrent trust level, as well as their connection state.The "Trust_Lvl" Column indicates if the certificate has beenAuthenticated using the web of trust. You can only connect to "Trusted" certificates. Tick the "Auto_Connect" box to connect to your trusted friends.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The lower window provides a list of the friends of your friends.This window shows the neighbour's name and how long ago they attempted to connect to you. This window is automatically populatedby the autoDiscovery system, and should be used to expand yourretroShare network. A word of warning: Do not automatically trust (or sign) anyonethat appears in this window. First verify by some other means (email/phone)that certificate belongs to the person you think it does.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use the "Neighbour List" window to expand your friend list. Select the desired entry in the lower window by clicking on it, then click the "Add to Friends" Button to move it to the upper window.Likewise the "Remove from Friends" button moved a person from the upper window to the lower window.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The "Configure Friend" Button opens a Certificate Configuration window.This window can be used to examine the certificate details, sign the certificate or manually change the peer's IP Address.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">See Also:<br /><a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Getting Started: Connecting to your friends</span></a>.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>.<br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONFIG"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Config Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Configuration Tab allows you to select the share directories, as well as the directory that downloaded files are saved to.<br />See <a href="#STARTUP-SHARING"><span style=" text-decoration: underline; color:#0000ff;">Sharing you Files</span></a> for details. </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Config Tab also allows you to control the IP Address and Portused by RetroShare. Under most cirumstances you do not need to changethese setting. If you are behind a firewall and can setup a forwarded port, the selected IP Address and Port should be specified here.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="FAQ"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Frequently Asked Questions </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">How does the security/privacy work? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShares uses a Web of Trust Authentication system to ensurethat your "friends" are your friends, and uses SSL to encryptthe communcications between peers. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What is a Web of Trust? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Web of Trust relies on a collection of peers to identify eachother. Look it up on the Web!</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-TRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What does "Trust" Mean in RetroShare?</span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Anyone can generate a certificate, with any name on it. So howdo you know that the certificate that claims to be from "Joe Bloggs"is really from your mate Joe. This is the "AuthenticationProblem". RetroShare uses a Web of Trust to Authenticate your peers.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-SIGN"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Should I Sign this Certificate? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should only sign a certificate if you are completely surethat it comes from the "right" person. If you sign a certificateyou are "Authenticating" the person to yourself and others.If you sign certificates that you haven't checked, then you aredestroying your own privacy and security.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">How do you verify a certificate? Use an alternative method ofcommunication to send the certificate: E.g. email or USB stick. This will improve you confidence that the certificate belongsto the correct person. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><span style=" font-size:small;"> </span><a name="FAQ-CONNECT"></a><span style=" font-size:small;">W</span><span style=" font-size:small;">hy won't it Connect?</span><span style=" font-size:small;"> </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A connection can fail for a number of reasons:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) Failed Authentication. Have both peers signed each otherscertificates? </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Firewalls. If both peers are behind firewalls then they cannotconnect directly. RetroShare has a built in proxy system to circumventfirewalls - However this can only function if both peers can connect to a common third party that is not behind a firewall. Thisis the most likely reason for initial connections to fail. The only solution to find a common friend that isn't firewalled (know anyone with Broadband?)</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(3) IP Addresses are wrong. You can manually examine and change these using the Certificate configuration.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +</body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="ABOUT"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">見網é Retroshare更多細節. ( http://Retroshare.sf.net ) / About RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShare is a private peer to peer communication platform created by Dr. Bob.This program enables you to securely share files and chat with your friends (and no-one else!).</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, and the latest release go to http://www.lunamutt.com.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="START"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Quick Start Guide to RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If this is your first time using Retroshare, it is recommended that you readthis guide for instructions on how to get started. The first step is:<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Connecting to Your Friends</span></a>. Once you have managed this you can <a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">Download Files</span></a> and<a href="#START-SHARE"><span style=" text-decoration: underline; color:#0000ff;">Share with Others</span></a></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Some of the key concepts related to ensuring your sharing remains private aredescribed in the <a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">Frequently Asked Questions</span></a>. Some Key security questions are:<a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">What is a Web of Trust?</span></a>, <a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">Should I Sign this Certificate?</span></a>, and finally<a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">What does "Trust" Mean?</span></a>.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is also worthwhile reading the <a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">GUI Overview</span></a>which describes the featureson available through the User Interface.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Connecting to your Friends </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">There are four steps to connecting to a Friend:</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Get Friend's Certificate</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Load Certificate</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Sign Certificate</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect to Friend.</li></ul><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The instructions might initially appear long and daunting, however thesesteps are required to ensure that your sharing is private and secure.These steps are only required a couple of times, to add new friends, and become quite straight forward after the first time.</p><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (1) EXCHANGE CERTIFICATES </span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Before you can connect, you need send your certificate to your friend, and get your friends certificate. Follow these steps to get your certificate:</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on Your Certificate to Select it.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on the "Export Friend" Button to bring up a file save dialog.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select directory to save the certificate to.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Enter desired filename. (with a file type of .pqi), and Click OK.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Email this File to your Friend. (It is recommended you put thecertificate in a zip file before sending, as some email programsdon't transmit the file correctly).</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Ask your friend to do the same.</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Once you have received your friend's certificate, removed itfrom the zip file and saved it to disk, you can proceed to step (2).</li></ul><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Note: This exchange of certificates is only necessary to get you started.Once you are connected to some friends the exchange of certificates becomeautomated by the autoDiscovery system. See<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">GUI: Connecting</span></a> for more information.------------------------------------------------------------------------<br /><br /><br /></p><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (2) LOAD YOUR FRIEND'S CERTIFICATE </span></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Import Friend"</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select your friends certificate file, then click "Okay". Their certificate should appear in the top window of the "Connect" Tab.</li></ul><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">------------------------------------------------------------------------<br /><br /><br /></p><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (3) SIGN CERTIFICATE </span></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select their Certificate by clicking on their name.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Configure Friend" Button. This will bring up a configuration window. which allows you to look at the detailsof the certificate.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click the "Sign Certificate" button near the bottom of the "Certificate Configuration" Window.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Now close the window by clicking on the "Done" button.</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Your Friends certificate should now say "Trusted (S)", indicating it is ready for connections.</li></ul><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can only share with "Trusted" Peers. You must sign your Friend'scertificate to prove that you know the certificate belongs to your Friend. Do not sign any/all certificates - only the people youtrust. For more information see: <br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br />------------------------------------------------------------------------<br /><br /> <br /></p><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (4) AUTOCONNECT TO PEER </span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Finally You need to activate the connection:</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click in the Box, next to your friends Name.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> A Tick should appear in the box, a connection will be started.</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> The "Offline" will change to "Online" when you have successfullyconnected.</li></ul><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Remember: Your initial connection attempts will fail, until your friend has signed your certificate and ticked the Auto-Connect Box.This ensures that both peers trust each other, and stops random peopleaccessing your files.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>. <br />------------------------------------------------------------------------<br /><br /><br /></p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-DOWNLOAD"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Downloading Files </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have connected to friends, you can download their shared files.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can search for the files you want using either:</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) File Listing Tab: This gives you a directory view of the files being shared by your peers. Double clickon the directory name (not the arrow) to diplay its subdirectories and files.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 1: This can take up to 5 seconds to fetch the information for your peer.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 2: If the directory is empty, or the person is offline, then the request will silently fail.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Search Tab: Retroshare also allows you to search your peers computers for filenames. Enter yourterm(s) in the search box at the top of the TAB and click the "Search" button. This willsearch all of the peers that you are currently connected to.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 3: If any matching files are found they will be displayed within 5 - 10 seconds.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have found the files you want, Select the file(s), and click "Download" to begin the download process.If you click over the "File Transfer" TAB, the status of the files will appear.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 4: The files can take up to 10 seconds to appear in the transfer window.</p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-SHARING"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Sharing Files </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can specify which files you want to share in the "Config" Tab.In the "Share Directories" section, click the "Add Directory" Button, and select the directory you want to share.The files and subdirectories will become available for you peers.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can remove a directory from the Shared Directories List by clicking onthe directory name in the list, and then clicking "Remove Directory".</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="GUI"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Gui Overview (Tab Description) </span><span style=" font-size:medium;"> </span></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The GUI is divided up into several sections which can be accessed by clicking on the Tabs along the top of the main window. </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect: Manage Connections and Friends.(<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">getting started</span></a> and<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Listing: A directory view of available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Search: Search for available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Messages: For Sending/Recving Message. (Coming Soon)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Channels: A broadcast/subscription system. (Coming Soon)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Transfer: Listing of Current and completed Transfers.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Config: Specify of share diectories and IP Addresses.(<a href="#GUI-CONFIG"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> About: Help and other Information.</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Chat: Accessed by the clicking on the "Chat" button.</li></ul><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Connect Tab </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Connect TAB consists of two windows. The upper windowshows a list of your friends. This window indicates each friendscurrent trust level, as well as their connection state.The "Trust_Lvl" Column indicates if the certificate has beenAuthenticated using the web of trust. You can only connect to "Trusted" certificates. Tick the "Auto_Connect" box to connect to your trusted friends.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The lower window provides a list of the friends of your friends.This window shows the neighbour's name and how long ago they attempted to connect to you. This window is automatically populatedby the autoDiscovery system, and should be used to expand yourretroShare network. A word of warning: Do not automatically trust (or sign) anyonethat appears in this window. First verify by some other means (email/phone)that certificate belongs to the person you think it does.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use the "Neighbour List" window to expand your friend list. Select the desired entry in the lower window by clicking on it, then click the "Add to Friends" Button to move it to the upper window.Likewise the "Remove from Friends" button moved a person from the upper window to the lower window.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The "Configure Friend" Button opens a Certificate Configuration window.This window can be used to examine the certificate details, sign the certificate or manually change the peer's IP Address.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">See Also:<br /><a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Getting Started: Connecting to your friends</span></a>.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>.<br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br /></p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONFIG"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Config Tab </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Configuration Tab allows you to select the share directories, as well as the directory that downloaded files are saved to.<br />See <a href="#STARTUP-SHARING"><span style=" text-decoration: underline; color:#0000ff;">Sharing you Files</span></a> for details. </p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Config Tab also allows you to control the IP Address and Portused by RetroShare. Under most cirumstances you do not need to changethese setting. If you are behind a firewall and can setup a forwarded port, the selected IP Address and Port should be specified here.</p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="FAQ"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Frequently Asked Questions </span><span style=" font-size:medium;"> </span></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">How does the security/privacy work? </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShares uses a Web of Trust Authentication system to ensurethat your "friends" are your friends, and uses SSL to encryptthe communcications between peers. </p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What is a Web of Trust? </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Web of Trust relies on a collection of peers to identify eachother. Look it up on the Web!</p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-TRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What does "Trust" Mean in RetroShare?</span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Anyone can generate a certificate, with any name on it. So howdo you know that the certificate that claims to be from "Joe Bloggs"is really from your mate Joe. This is the "AuthenticationProblem". RetroShare uses a Web of Trust to Authenticate your peers.</p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-SIGN"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Should I Sign this Certificate? </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should only sign a certificate if you are completely surethat it comes from the "right" person. If you sign a certificateyou are "Authenticating" the person to yourself and others.If you sign certificates that you haven't checked, then you aredestroying your own privacy and security.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">How do you verify a certificate? Use an alternative method ofcommunication to send the certificate: E.g. email or USB stick. This will improve you confidence that the certificate belongsto the correct person. </p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><span style=" font-size:small;"> </span><a name="FAQ-CONNECT"></a><span style=" font-size:small;">W</span><span style=" font-size:small;">hy won't it Connect?</span><span style=" font-size:small;"> </span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A connection can fail for a number of reasons:</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) Failed Authentication. Have both peers signed each otherscertificates? </p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Firewalls. If both peers are behind firewalls then they cannotconnect directly. RetroShare has a built in proxy system to circumventfirewalls - However this can only function if both peers can connect to a common third party that is not behind a firewall. Thisis the most likely reason for initial connections to fail. The only solution to find a common friend that isn't firewalled (know anyone with Broadband?)</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(3) IP Addresses are wrong. You can manually examine and change these using the Certificate configuration.</p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table></body></html> + + + + MainWindow + + + Preferences + 喜好 + + + + Network + 网絡 + + + + Friends + èŠå¤©æœ‹å‹ + + + + Transfers + 文件 + + + + Messages + é›»å­éƒµä»¶ + + + + Channels + é »é“ + + + + Options + é¸é … + + + + Users: 0 Files: 0 + 用戶: 0 / 檔案: 0 + + + + Down: 0.0 Up: 0.0 + 下載速度 - Down: 0.0 Up: 0.0 + + + + Connections: 0/45 + 連線: 0/45 + + + + System tray is unavailable + 系統托盤ä¸å¯ç”¨ + + + + System tray unavailable + 系統托盤ä¸å¯ç”¨ + + + + RetroShare System tray + Retroshare 系統托盤 + + + + Application will continue running. Quit using context menu in the system tray + 程å¼å°‡ç¹¼çºŒé‹è¡Œ. 退出請使用系統托盤的上下文èœå–®. + + + + Hide + éš±è— + + + + Show + 顯示 + + + + RetroShare + Retroshare + + + + Home + ä¸»é  + + + + General + 一般 + + + + Invite Friend + é‚€è«‹æœ‹å‹ + + + + Add Friend + æ·»åŠ æœ‹å‹ + + + + Add Share + 添加共享 + + + + Advanced + 高級é¸é … + + + + QTextBrowser { + background-color: rgb(192,192,192); + +} + QTextBrowser { background-color: rgb(192,192,192);} + + + + QPushButton +{ + border-image: url(:/images/console-small-up.png) +} + +QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + +} + +QPushButton:pressed { + border-image: url(:/images/console-small-down.png) +} + + QPushButton{ border-image: url(:/images/console-small-up.png) }QPushButton:hover { border-image: url(:/images/console-small-hover.png) }QPushButton:pressed { border-image: url(:/images/console-small-down.png) } + + + + Exit + 退出 + + + + Search + æœç´¢ + + + + Files + 文案 + + + + Chat + èŠå¤© + + + + Add Shared Directory + 添加共享目禄錄 + + + + About/Help + + + + + Messenger + + + + + Show/Hide + + + + + &Quit + + + + + Bandwidth Graph + + + + + Open Messenger + + + + + RetroShare %1 + + + + + Add a Friend + + + + + Invite a Friend + + + + + Add a Share + + + + + Quit + + + + + Minimize + + + + + Maximize + + + + + Hide Console + + + + + Show Console + + + + + Hide ToolBox + + + + + :images/hide_toolbox_frame.png + + + + + Show ToolBox + + + + + :images/show_toolbox_frame.png + + + + + QTextBrowser { + background-color: rgb(192,192,192); + + } + + + + + QPushButton + { + border-image: url(:/images/console-small-up.png) + } + + QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + + } + + QPushButton:pressed { + border-image: url(:/images/console-small-down.png) + } + + + + + + Apps + + + + + MessageToaster + + + message + 電文 + + + + MessagesDialog + + + New Message + æ–°è¨Šæ¯ + + + + Reply to Message + å›žè¦†è¨Šæ¯ + + + + Remove Message + æ¸…é™¤è¨Šæ¯ + + + + Date + 日期 + + + + From + 從 + + + + Title + 標題 + + + + Msg + 電文 + + + + Count + è‹¥å¹²è¨Šæ¯ + + + + Size + å¤§å° + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Recommended Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">推薦檔案</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">remove selected message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">刪除é¸ä¸­éƒµä»¶</p></body></html> + + + + QPushButton +{ +border-image: url(:/images/deletemail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/deletemail-hover.png); +} + QPushButton{border-image: url(:/images/deletemail24.png);}QPushButton:pressed{border-image: url(:/images/deletemail-hover.png);} + + + + Inbox + 收件箱 + + + + Outbox + 發件箱 + + + + Draft + è‰ç¨¿ + + + + Sent + 發é€é›»å­éƒµä»¶ + + + + Timestamp + 時間點 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">reply to selected message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">回覆é¸å®šæ¶ˆæ¯</p></body></html> + + + + +QPushButton +{ +border-image: url(:/images/replymail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/replymail-hover.png); +} + + QPushButton{border-image: url(:/images/replymail24.png);}QPushButton:pressed{border-image: url(:/images/replymail-hover.png);} + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">New Message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">新郵件 </p></body></html> + + + + QPushButton +{ +border-image: url(:/images/folder-draft24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/folder-draft24-hover.png); +} + + QPushButton{border-image: url(:/images/folder-draft24.png);}QPushButton:pressed {border-image: url(:/images/folder-draft24-hover.png);} + + + + You get Message testing + 您得到這個訊æ¯æ¸¬è©¦ + + + + Download All + 下載所有 + + + + QPushButton +{ +border-image: url(:/images/deletemail24.png); +} + +QPushButton:hover +{ +border-image: url(:/images/deletemail-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/deletemail-pressed.png); +} + + + + + +QPushButton +{ +border-image: url(:/images/replymail24.png); +} + +QPushButton:hover +{ +border-image: url(:/images/replymail24-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/replymail-pressed.png); +} + + + + + + QPushButton +{ +border-image: url(:/images/folder-draft24.png); +} +QPushButton:hover +{ +border-image: url(:/images/folder-draft24-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/folder-draft24-pressed.png); +} + + + + + + MessengerWindow + + + QWidget#MessengerWindow { +background-color: #ECF3F6; background-image:url(:/images/backgroundimage.png); +background-position: top right; +background-repeat: no-repeat +} + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click to change your avatar</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Change your Status and your display</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">picture here.</p></body></html> + + + + + Online + + + + + Busy + + + + + Be right Back + + + + + Away + + + + + In a Call + + + + + Out of lunch + + + + + Apear Offline + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Share a personal message with your contacts</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Add a Friend</p></body></html> + + + + + Chat + + + + + Connect To Friend + + + + + NetworkDialog + + + Peer Details / Authenticate + çµç‚¹è©³ç´°ä¿¡æ¯/èªè­‰ + + + + Load Certificate + 加載證書 + + + + Select a pem/pqi File + é¸æ“‡ä¸€å€‹æ–‡ä»¶ PEM/PQI + + + + File Not Found + 未找到文件 + + + + %1 does not exist. Would you like to create it? + %1 ä¸å­˜åœ¨. 你想創建它嗎? + + + + Failed to Create File + 創建文件失敗 + + + + Unable to create %1 [%2] + 無法創建 %1 [%2] + + + + Select Certificate + é¸æ“‡è­‰æ›¸ + + + + Certificates (*.pqi *.pem) + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">网絡:</span></p></body></html> + + + + # + + + + + Accept + æŽ¥å— + + + + Trust + 信託 + + + + Last Contact + 最後一次è¯ç³» + + + + Name + 姓å + + + + Peer Address + çµç‚¹åœ°å€ + + + + Organisation + 組織 + + + + Location + ä½ç½® + + + + Country + 國別 + + + + Cert Id + 證書編號 + + + + Auth Code + èªè¨¼ç¢¼ (Authenticate Code èªè­‰) + + + + NetworkPage + + + Rate Options + 速度é¸é … + + + + Max Total Data Rate (KB/S): + 你的最大上傳速度 (KB/S): + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Rate per Person (KB/S):</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">速æ¯äºº (KB/S):</p></body></html> + + + + PeersDialog + + + Chat + èŠå¤© + + + + Configure Friend + é…ç½®æœ‹å‹ + + + + Export Friend + å¯¼å‡ºæœ‹å‹ + + + + Remove Friend + åˆªé™¤æœ‹å‹ + + + + Save Certificate + ä¿å­˜è­‰æ›¸ + + + + Certificates (*.pqi) + 證書 (*.pqi) + + + + Status + 状態 + + + + Person + 人 + + + + Auto Connect + 自動連接 + + + + Trust Level + 信任水平 + + + + Peer Address + çµç‚¹åœ°å€ + + + + Last Contact + 最後一次è¯ç³» + + + + Organisation + 組織 + + + + Location + ä½ç½® + + + + Country + 國別 + + + + Person Id + 個人識別號碼 + + + + Auth Code + èªè¨¼ç¢¼ (Authenticate Code èªè­‰) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Friends</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">朋å‹</span></p></body></html> + + + + Connect To Friend + é€£æŽ¥åˆ°æœ‹å‹ + + + + # + + + + + PopupChatDialog + + + RetroShare Friend Chat + Retroshare 朋å‹èŠå¤© + + + + RetroShare User Chat + + + + + PreferencesDialog + + + Language + 語言(Language) + + + + Style + 風格 + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">改變語言æ‰ç”Ÿæ•ˆå¾Œé‡å•Ÿ Retroshare!</p></body></html> + + + + Style Sheet + 樣å¼è¡¨ + + + + Default + é»˜èª (Default) + + + + Pagefold + Pagefold + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose RetroShare's interface style</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">é¸æ“‡ç•Œé¢é¢¨æ ¼ Retroshare</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose the language used in RetroShare</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">é¸æ“‡èªžè¨€ Retroshare</p></body></html> + + + + blue + è— + + + + silver + 銀牌 + + + + ed2k + emule.sf.net - ed2k (é›»å­æ¯›é©¢) + + + + over + over + + + + black + 黑色 + + + + arachnophobia + arachnophobia + + + + Skin2 + 皮膚 2 + + + + Login + Login 登陸 + + + + Remove Auto Login + å–消自動登陸 + + + + PreferencesWindow + + + Directories + 目禄 + + + + Error Saving Configuration + ä¿å­˜é…置出錯 + + + + About + 關於 + + + + General + 一般 + + + + Server + æœå‹™å™¨ + + + + Options + é¸é … + + + + Cancel + å–消 + + + + OK + 確定 + + + + QObject + + + Name + 姓å + + + + Path + + + + + Extension + + + + + Date + + + + + Size + + + + + Popularity + + + + + contains + + + + + contains all + + + + + is + + + + + less than + + + + + less than or equal + + + + + greater than or equal + + + + + greater than + + + + + is in range + + + + + and + + + + + and / or + + + + + or + + + + + equals + + + + + Rshare + + + Invalid language code specified: + 無效的語言代碼指定: + + + + Invalid GUI style specified: + 無效桂å¼æŒ‡å®š: + + + + SearchDialog + + + File Name + 文案å稱 + + + + Sources + ä¾†æº + + + + Search Pattern + æœç´¢æ¨¡å¼ + + + + Results + çµæžœ + + + + File Size + æ–‡æ¡ˆå¤§å° + + + + Download + 下載 + + + + Broadcast on Channel + 在頻é“内广播 + + + + Recommend to Friends + æŽ¨è–¦çµ¦æœ‹å‹ + + + + Remove + 移除 + + + + Remove All + 清除所有 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Keywords</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Keywords</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Format</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Format</p></body></html> + + + + Any + 任何 + + + + Audio + 音頻 + + + + Video + 視頻 + + + + Images + 圖片 + + + + Programs + 節目 + + + + Archives + 文件夾 + + + + Documents + 文件 + + + + search + æœç´¢ + + + + download + 下載 (download) + + + + Toggle advanced searching on and off. + + + + + <h3>Simple Search:</h3> + + + + + Keywords + + + + + Perform simple search + + + + + Show Advanced Search Tool + + + + + Filename + + + + + Hash + + + + + KeyWords + + + + + Search Id + + + + + <h3>Advanced Search:</h3> + + + + + ServerDialog + + + Transfer Rates + 傳輸速度 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Total Rate (kb/s) </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">您的總上傳速度 / 總速度 (kb/s) </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Per Person </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">速æ¯äºº </p></body></html> + + + + Server Settings + æœå‹™å™¨è¨­ç½® + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">本地地å€:</p></body></html> + + + + Port: + IP-Port (IP端å£): + + + + behind zee Firewall + ä½äºŽé˜²ç«ç‰† ä¹‹åŽ + + + + Forwarded External Port + è½‰ç™¼å¤–éƒ¨ç«¯å£ + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">IP-Port (IP的端å£/ 港å£):</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">å°å¤–å稱</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">外部地å€:</p></body></html> + + + + Check Settings + 檢察設置 + + + + Firewall/Router Configuration + + + + + Manual router setup. + + + + + Use uPnP to configure router + + + + + Network Address Configuration (takes effect after restart) + + + + + Use DHT to locate friends + + + + + Manual IP Addresses + + + + + Server Status And Network Settings + + + + + Firewalled + + + + + Forwarded Port + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">DHT Status</p></body></html> + + + + + uPnP Status + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Local Address:</p></body></html> + + + + + ServerPage + + + Change + Restart Server + 改變+é‡ç¶®å‹• + + + + Server Settings + æœå‹™å™¨è¨­ç½® + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">外部地å€:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">本地地å€:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">IP-Port (IP的端å£/ 港å£):</p></body></html> + + + + Port: + IP-Port (IP的端å£): + + + + Misc + Misc + + + + behinde Firewall + 防ç«ç‰† + + + + Forwarded External Port + è½‰ç™¼å¤–éƒ¨ç«¯å£ + + + + Settings + + + Settings + 設置 + + + + Cancel + å–消 + + + + Apply + 應用 + + + + OK + 確定 + + + + General + 一般 + + + + Network + 网絡 + + + + Server + æœå‹™å™¨ + + + + Directories + 目禄 + + + + SharedFilesDialog + + + Download + 下載 + + + + Recommend + 推薦 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">檔案</span></p></body></html> + + + + Add to Recommend List + + + + + Recommend To + + + + + Message Friend + + + + + StartDialog + + + Select Trusted Friend + é¸æ“‡ä¿¡è³´çš„æœ‹å‹ + + + + Certificates (*.pqi *.pem) + 證書 (*.pqi *.pem) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:13pt; font-weight:600; color:#8b0000;">Welcome to RetroShare</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:13pt; font-weight:600; color:#8b0000;">æ­¡è¿Ž Retroshare</span></p></body></html> + + + + Please Login .... + 登陸 (Login) .... + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">姓å:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Pasword</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">密碼 (Password)</span></p></body></html> + + + + Load Existing User + 加載ç¾æœ‰ç”¨æˆ¸æˆ¶ + + + + Or create a New User + 或創建一個新用戸戶 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Organisation:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">組織:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Location:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ä½ç½®:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Password (Again)</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">密碼(å†) (Password Again)</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">New Password</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">新密碼 (New Password)</span></p></body></html> + + + + Load Trusted Certificate (Optional) + 加載å¯ä¿¡ä»»è­‰æ›¸(å¯é¸) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">朋å‹</span></p></body></html> + + + + Select File + é¸æ“‡æ–‡æ¡ˆ + + + + Generate New Certificate + 生æˆæ–°çš„證書 + + + + RetroShare setup + Retroshare 設置 + + + + Automatically Login in Future + 自動登陸 + + + + RetroShare + + + + + QWidget { + background-color: #ECF3F6; +} + + + + + Auto-login + + + + + Name: + + + + + Log In + + + + + Password: + + + + + Create a Account + + + + + QToolButton{ +border-image: url(:/images/avatar_background.png); + +} + + + + + + StatisticDialog + + + Statistics + 統計 (Statistics) + + + + Download + 下載中 + + + + Session: + Session: + + + + Downloaded: + 下載完æˆ: + + + + Average Downloadspeed: + Average Downloadspeed: + + + + Count of Downloads: + 下載統計: + + + + Overall + Overall + + + + Upload + Upload + + + + Session + Session + + + + Uploaded: + Uploaded: + + + + Average Uploadspeed: + Average Uploadspeed: + + + + Count of Uploads: + 上載統計: + + + + Uploaded + Uploaded + + + + Connections: + 連接: + + + + Peers: + Peers: + + + + Misc + Misc + + + + Uptime: + Uptime: + + + + Overall: + Overall: + + + + Uptime + Uptime + + + + Records + Records + + + + Uploadspeed: + Uploadspeed: + + + + Downloadspeed: + 下載速度: + + + + Show Settings + Show Settings + + + + Reset + Reset + + + + Receive Rate + Receive Rate + + + + Send Rate + Send Rate + + + + Always On Top + Always On Top + + + + 100 + 100 + + + + % Opaque + % Opaque + + + + Changes the transparency of the Bandwidth Graph + Changes the transparency of the Bandwidth Graph / 改變é€æ˜Žåº¦çš„頻寬圖 + + + + Save + 拯救 + + + + Cancel + å–消 + + + + Hide Settings + éš±è—設置 + + + + TransfersDialog + + + Cancel + å–消 + + + + Clear Completed + æ˜Žç¢ºå®Œæˆ + + + + File Name + 文案å稱 + + + + Sources + æ¥æº + + + + Status + 状態 + + + + File Size + æ–‡æ¡ˆå¤§å° + + + + Speed + 速度 + + + + Progress + 進度 + + + + Completed + å®Œæˆ + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Downloads:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">下載 (Downloads):</span></p></body></html> + + + + Peer Name + çµç‚¹å稱 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Uploads:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">上傳 (Uploads):</span></p></body></html> + + + + Name + i.e: file name + 姓å + + + + Size + i.e: file size + + + + + Progress + i.e: % downloaded + 進度 + + + + Speed + i.e: Download speed + 速度 + + + + Sources + i.e: Sources + æ¥æº + + + + Remaining + i.e: Estimated Time of Arrival / Time left + + + + + Core-ID + + + + + User Name + i.e: user name + + + + + Progress + i.e: % uploaded + 進度 + + + + Speed + i.e: upload speed + 速度 + + + + Transferred + + + + + ULListDelegate + + + B + + + + + KB + + + + + MB + + + + + GB + + + + + VMessageBox + + + OK + 確定 + + + + Cancel + å–消 + + + + Yes + Yes + + + + No + No + + + + Help + 幇助 + + + + Retry + å†è©¦ + + + + Show Log + 顯示記祿 + + + + Show Settings + 顯示設置 + + + + moreinfo + + + Details + 詳情 + + + + OK + OK + + + + Name + 姓å + + + + Value + Value值 + + + diff --git a/retroshare-gui/src/lang/retroshare_cn_trad.qm b/retroshare-gui/src/lang/retroshare_cn_trad.qm new file mode 100644 index 000000000..29808af60 Binary files /dev/null and b/retroshare-gui/src/lang/retroshare_cn_trad.qm differ diff --git a/retroshare-gui/src/lang/retroshare_cn_trad.ts b/retroshare-gui/src/lang/retroshare_cn_trad.ts new file mode 100644 index 000000000..5916d8acd --- /dev/null +++ b/retroshare-gui/src/lang/retroshare_cn_trad.ts @@ -0,0 +1,3974 @@ + + + + + + + Arial + Arial + + + + AddFriendDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;"> To add a new Friend, cut and paste their email </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">invitation into the box below, and click done.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">增加了一ä½æ–°æœ‹å‹,剪切和é»è²¼å®ƒå€‘çš„email</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">邀請到下é¢çš„方框. 按åš.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;"></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + Cancel + å–消 + + + + Done + å®Œæˆ + + + + Load From File + 从文件中加載証術 + + + + RetroShare + Retroshare (復å¤åˆ†äº«) + + + + Certificate Load Failed + 證書加載失敗 + + + + Add a Friend + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"><span style=" font-size:16pt;">Add a new Friend</span><br /><br /><span style=" font-size:10pt;">To add a new Friend, cut and paste their email </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">invitation into the box below, and click done.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + + + + + AddFriendWizard + + + < Back + + + + + Next > + + + + + Cancel + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">This Wizard helps to Connect to your Friends</span></p></body></html> + + + + + I have a .pqi/.pem file received from a Friend + + + + + I have Key received from a Friend + + + + + I want to invite a friend to my RetroShare network + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Cut and paste the text below into an email.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;"> and send it to all your friends!</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">When you press next RetroShare will attempt to launch a Email client.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Invite your Friends to join with RetroShare</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Enter the Key code you got from your friend:</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">When you press next RetroShare will attempt to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">connect using the key.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Select a pqi/pem file:</span></p></body></html> + + + + + Browse + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">When you press next RetroShare will attempt to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">connect using the .pqi/.pem file.</p></body></html> + + + + + Add Friend to my netowork Wizard + + + + + AdvancedSearchDialog + + + RetrosShare: Advanced Search + + + + + Add a further search criterion. + + + + + Add a selection criterion + + + + + Reset + + + + + Cancels the search. + + + + + Cancel + + + + + Perform the advanced search. + + + + + Search + + + + + Search Criteria + + + + + Reset the search criteria. + + + + + ApplicationWindow + + + RetroShare %1 + + + + + Example Application + + + + + Application Users: 0 Files: 0 + + + + + Down: 0.0 Up: 0.0 + + + + + Connections: 0/45 + + + + + Hide + + + + + Show + + + + + RetroShare + + + + + Home + + + + + General + + + + + Advanced + + + + + QTextBrowser { + background-color: rgb(192,192,192); + + } + + + + + QPushButton + { + border-image: url(:/images/console-small-up.png) + } + + QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + + } + + QPushButton:pressed { + border-image: url(:/images/console-small-down.png) + } + + + + + + AuthorizationDialog + + + Authenticate + 簽署此人 (authenticate) + + + + Authenticate Friend By Entering Their Code + 簽署這項朋å‹é€²å…¥ä»£ç¢¼ + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + + + + OK + 確定 + + + + Cancel + å–消 + + + + BandwidthGraph + + + RetroShare Bandwidth Usage + + + + + Show Settings + + + + + Reset + + + + + Receive Rate + + + + + Send Rate + + + + + Always on Top + + + + + Style + + + + + Changes the transparency of the Bandwidth Graph + + + + + 100 + + + + + % Opaque + + + + + Save + + + + + Cancel + + + + + Since: + + + + + Hide Settings + + + + + CallToaster + + + Message + + + + + ChanCreateDialog + + + Create a new Broadcast Channel + å‰µå»ºä¸€å€‹æ–°çš„å»£æ’­é »é“ + + + + Create A New Broadcast Channel + å‰µå»ºä¸€å€‹æ–°çš„å»£æ’­é »é“ + + + + Channel Name: + é »é“å稱: + + + + Type: + é¡žåž‹: + + + + Public Channel (Signed) + 公共頻é“(簽字) + + + + Private Channel (Encrypted) + ç§äººé »é“(加密) + + + + Cancel Channel + å–æ¶ˆé »é“ + + + + Create Channel + åˆ›å‰µå»ºé »é“ + + + + ChanMsgDialog + + + Compose + 譜寫了信æ¯æ¸ é“ + + + + Recommended Files + 推薦檔案 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-weight:400;"><span style=" font-weight:600;">Subject:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-weight:400;"><span style=" font-weight:600;">標題:</span></p></body></html> + + + + Send To: + 發é€çµ¦: + + + + Send + ç™¼é€ + + + + Delete Channel + åˆªé™¤é »é“ + + + + Create Channel MSG + 建立MSGé »é“ + + + + 1 + + + + + Reply + + + + + ChannelsDialog + + + New Message + æ–°è¨Šæ¯ + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Messages</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">電文</span></p></body></html> + + + + Date + 日期 + + + + Rank + 排å + + + + From + 發é€æ–¹ + + + + Title + 標題 + + + + Msg + 電文 + + + + Count + è¨ˆæ•¸è¨Šæ¯ + + + + Size + å¤§å° + + + + Type + é¡žåž‹ + + + + Rs[Cert/Chan]IdSize + Rs[Cert/Chan]IdSize (ID大å°) + + + + RsMsgId + RsMsgId (消æ¯è­˜åˆ¥ç¢¼) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Message Text</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">電文全文</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Recommended Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">推薦檔案</span></p></body></html> + + + + New Channel + æ–°é »é“ + + + + Subscribe To Channel + è¨‚é–²é »é“ (Subscribe) + + + + Unsubscribe To Channel + å–æ¶ˆè¨‚é–²é »é“ (Unsubscribe) + + + + Delete Your Channel + åˆªé™¤é »é“ + + + + Download + 下載 (Download) + + + + Download All + 下載所有 (Download All) + + + + ChatDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:9pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:400;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:9pt; font-weight:600; font-style:normal; text-decoration:none;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:400;"></p></body></html> + + + + Chat History: + èŠå¤©é‚å²: + + + + Chat With: + èŠå¤©: + + + + Chat + èŠå¤© + + + + Users: + + + + + ChatToaster + + + message + 電文 + + + + You Get a New Message + ä½ å¾—åˆ°æ–°è¨Šæ¯ + + + + Message + + + + + ConfCertDialog + + + Cancel + å–消 + + + + Done + å®Œæˆ + + + + Apply + 應用 + + + + Peer Settings + çµç‚¹èª¿æ•´ + + + + Port: + ipç«¯å£ + + + + behind zee Firewall + ä½äºŽé˜²ç«ç‰†åŽ (Firewall) + + + + Forwarded External Port + 轉發å°å¤–æ¸¯å£ (Router) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ip端å£:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">外部地å€:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">å°å¤–å稱</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">本地地å€:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Max Transfer Rate (kb/s) </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">你的最大上傳速度 (kb/s) </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Org / Loc:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">組織/ä½ç½®:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">姓å:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Country/State:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">國家/å·ž:</p></body></html> + + + + Trust Settings + 信託設定 + + + + Trust Level + 信任水平 + + + + Trust Their Signature + 信託簽å + + + + Sign The Certificate + 簽署證書 + + + + OK + + + + + Peer Adress + + + + + Peer Info + + + + + ConfirmQuitDialog + + + Exit RetroShare + + + + + You are about to exit the RetroShare application and therefore stop all transfers. <br><br>Are you sure you want to stop and exit RetroShare? + + + + + Do not show this message again. + + + + + ConnectDialog + + + Peer Details + çµç‚¹è©³ç´°ä¿¡æ¯ + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">國別:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Org:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">組織:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">姓å:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Trust:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">信託:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Loc:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ä½ç½®:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Certificate</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">signers:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Certificate</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">人簽å:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">å…¸èªè­‰:</span></p></body></html> + + + + Make Friend + æˆçˆ²æœ‹å‹ + + + + Close + 關閉 + + + + ConnectionsDialog + + + Load Certificate + 加載證書 + + + + Select a pem/pqi File + é¸æ“‡ä¸€å€‹æ–‡ä»¶ PEM/PQI + + + + File Not Found + 未找到文件 + + + + %1 does not exist. Would you like to create it? + %1 ä¸å­˜åœ¨. 你想創建它嗎? + + + + Failed to Create File + 創建文件失敗 + + + + Unable to create %1 [%2] + 無法創建 %1 [%2] + + + + Select Certificate + é¸æ“‡è­‰æ›¸ + + + + Certificates (*.pqi *.pem) + 證書 (*.pqi *.pem) + + + + Accept + æŽ¥å— + + + + Trust + 信託 + + + + Last Contact + 最後一次è¯ç³» + + + + Name + 姓å + + + + Organisation + 組織 + + + + Location + ä½ç½® + + + + Country + 國別 + + + + Peer Address + çµç‚¹åœ°å€ + + + + Cert Id + 證書編號 + + + + Auth Code + èªè¨¼ç¢¼ (Authenticate Code èªè­‰) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">网絡:</span></p></body></html> + + + + Peer Details / Authenticate + çµç‚¹è©³ç´°ä¿¡æ¯/èªè­‰ + + + + CryptographyDialog + + + RSA Key Size + RSA Key Size / é—œéµå¤§å° + + + + Rijndael Block size + Rijndael Block size å¡Šå¤§å° + + + + 128 Bits + 128 Bits + + + + 192 Bits + 192 Bits + + + + 256 Bits + 256 Bits + + + + Rijndael Key Size + Rijndael Key Size /é—œéµå¤§å° + + + + Rijndael Mode + Rijndael Mode + + + + CBC + CBC + + + + ECB + ECB + + + + CFB + CFB + + + + Rijndael Padding + Rijndael Padding + + + + PKCS7 + PKCS7 + + + + Zeros + Zeros + + + + ANSIX923 + ANSIX923 + + + + ISO10126 + ISO10126 + + + + Rijndael Feedback Size + Rijndael Feedback Size + + + + Key Size: + Key Size (é—œéµå¤§å°): + + + + Block Size: + Block Size (塊大å°): + + + + Feedback Size: + Feedback Size (å饋人數 ): + + + + Mode: + Mode (模å¼): + + + + Padding: + Padding: + + + + DLListDelegate + + + B + + + + + KB + + + + + MB + + + + + GB + + + + + DirectoriesDialog + + + Shared Directories + 共享目祿錄 + + + + Other Directories + 其它目祿 + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Incoming Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">來襲檔案</span></p></body></html> + + + + Add Shared Directory + 添加共享目祿錄 + + + + DirectoriesPage + + + Shared Directories + 共享目祿錄 + + + + Incoming files + 接收的文件 + + + + ExampleDialog + + + Vote Up + + + + + Vote Down + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Friends</span></p></body></html> + + + + + # + + + + + Status + + + + + Person + + + + + Auto Connect + + + + + Trust Level + + + + + Peer Address + çµç‚¹åœ°å€ + + + + Last Contact + 最後一次è¯ç³» + + + + Organisation + 組織 + + + + Location + ä½ç½® + + + + Country + 國別 + + + + Person Id + + + + + Auth Code + èªè¨¼ç¢¼ (Authenticate Code èªè­‰) + + + + ExprParamElement + + + to + + + + + ignore case + + + + + dd.MM.yyyy + + + + + KB + + + + + MB + + + + + GB + + + + + ExpressionWidget + + + Expression Widget + + + + + Delete this expression + + + + + FileHashDialog + + + Download + 下載 (Download) + + + + GSettingsWin + + + General + 一般 + + + + Network + 网絡 + + + + Directories + 目祿 + + + + Server + çµç‚¹ / 朋å‹èª¿æ•´ + + + + %1 + %1 + + + + GenCertDialog + + + RetroShare setup + Retroshare 設置 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16pt;">Generate a new profile</span><br /><br />Please fill in the information which will<br />allow your RetroShare to connect to</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Friends.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Organisation:</p></body></html> + + + + + Password (Again) + + + + + Location: + + + + + Load Trusted Certificate (Optional) + 加載å¯ä¿¡ä»»è­‰æ›¸(å¯é¸) + + + + Password + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">朋å‹</span></p></body></html> + + + + Select File + é¸æ“‡æ–‡æ¡ˆ + + + + Country: + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + + + + + Generate New Certificate + 生æˆæ–°çš„證書 + + + + Select Trusted Friend + é¸æ“‡ä¿¡è³´çš„æœ‹å‹ + + + + Certificates (*.pqi *.pem) + 證書 (*.pqi *.pem) + + + + GeneralPage + + + Keys manager + key管ç†å™¨ + + + + Style + 風格 + + + + Choose RetroShare's interface style + é¸æ“‡ç•Œé¢é¢¨æ ¼ + + + + Language + 語言 (Language) + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">改變語言æ‰ç”Ÿæ•ˆå¾Œé‡å•ŸRetroshare!</p></body></html> + + + + Choose the language used in RetroShare + é¸æ“‡èªžè¨€Retroshare + + + + GraphFrame + + + Recv: + 接收 / Recv: + + + + %1 KB/s + %1 KB/s + + + + Sent: + ç™¼é€ (Sent): + + + + %1 KB + %1 KB + + + + %1 MB + %1 MB + + + + %1 GB + %1 GB + + + + HelpDialog + + + About + + + + + Authors + + + + + Thanks to + + + + + Translation + + + + + License Agreement + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">About/Help</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:xx-large; font-weight:600; color:#0000ff;">About RetroShare.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-weight:600;">Retroshare is a private and secure decentralised commmunication platform.<br />You can use it chat, send messages and share files with your friends.</span><br /><br />This is just a placeholder page for the moment. You can<br />improve retroshare's in-built help (this text) by<br />updating the retroshare wiki: <a href="http://retroshare.wiki.sourceforge.net/help_tab"><span style=" text-decoration: underline; color:#0000ff;">This Page in the retroshare Wiki</span></a><br /><br />The About/Help Tab is regularly updated from the Wiki page.<br /><br />External Links to more information:<br /></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.sourceforge.net"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Webpage</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.wiki.sourceforge.net/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Wiki</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://sourceforge.net/projects/retroshare/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Project Page</span></a></li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.lunamutt.com"><span style=" text-decoration: underline; color:#0000ff;">Lunamutt Homepage.</span></a></li></ul></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-size:19pt; font-weight:600; color:#0000ff;">The RetroShare Team:</span><br /> <br /><span style=" font-size:9pt; color:#0000ff;">defnax</span>: Lead GUI developer <br /><span style=" font-size:9pt; color:#0000ff;">drbob7</span>: Lead Core developer. <br /> <br /><span style=" font-size:9pt; color:#0000ff;">bmeck</span> : Our new web-developer. Joined retroshare a couple <br />of weeks ago, and already starting on an exciting new <br />design for the web-page. <br /> <br /><span style=" font-size:9pt; color:#0000ff;">noragen</span> : Developer from the SIM-IM project. Working on a retroshare plugin to SIM-IM. <br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">kernelpanix</span> : Gui and skin developer</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">libris</span><span style=" font-size:9pt;">:</span> core developer</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-size:9pt; color:#0000ff;">kashif: </span><span style=" color:#000000;">core developer</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt; color:#000000;"><span style=" font-size:8pt;"><br /></span><span style=" color:#0000ff;">agent725</span><span style=" font-size:8pt;">: Manages the 'local' Retroshare release, <br />and beta-testing retroshare on a large scale. <br /> <br /></span><span style=" color:#0000ff;">the_mgt</span><span style=" font-size:8pt;">: Maintains the Gentoo and generic linux <br />installation/compilation scripts. </span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">notdefine:</span> Maintains the .rpm, .deb installation/compilation scripts.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">zhouk</span>: developer</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Translators:</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Serbian</span>: Kunalagon Umuhanik &lt;kunalagon@gmail.com&gt;</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Polish: </span>Jarek</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">French</span>:Temet</p></body></html> + + + + + InviteDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">To </span><span style=" font-size:10pt; font-weight:600;">Invite your friends to join you with Retroshare: </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">Cut and paste the text below into an email.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">and send it to all your friends!</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">To </span><span style=" font-size:10pt; font-weight:600;">邀請你的朋å‹åŠ å…¥ä½  Retroshare:</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">剪切和é»è²¼ä»¥ä¸‹æ–‡æœ¬ä¸­æˆç‚ºé›»å­éƒµä»¶</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">並把它é€çµ¦æ‰€æœ‰æœ‹å‹! </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + Done + å®Œæˆ + + + + Cancel + å–消 + + + + Launch Email + 登陸電å­éƒµä»¶ + + + + Invite a Friend + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"><span style=" font-size:16pt;">Invite a Friend</span><br /><br /><span style=" font-size:10pt;">To Invite your friends to join you with Retroshare: </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">Cut and paste the text below into an email.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">and send it to all your friends!</p></body></html> + + + + + LogDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> + +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="ABOUT"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">About RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShare is a private peer to peer communication platform created by Dr. Bob.This program enables you to securely share files and chat with your friends (and no-one else!).</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, and the latest release go to http://www.lunamutt.com.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="START"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Quick Start Guide to RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If this is your first time using Retroshare, it is recommended that you readthis guide for instructions on how to get started. The first step is:<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Connecting to Your Friends</span></a>. Once you have managed this you can <a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">Download Files</span></a> and<a href="#START-SHARE"><span style=" text-decoration: underline; color:#0000ff;">Share with Others</span></a></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Some of the key concepts related to ensuring your sharing remains private aredescribed in the <a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">Frequently Asked Questions</span></a>. Some Key security questions are:<a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">What is a Web of Trust?</span></a>, <a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">Should I Sign this Certificate?</span></a>, and finally<a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">What does "Trust" Mean?</span></a>.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is also worthwhile reading the <a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">GUI Overview</span></a>which describes the featureson available through the User Interface.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Connecting to your Friends </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">There are four steps to connecting to a Friend:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Get Friend's Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Load Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Sign Certificate</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect to Friend.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The instructions might initially appear long and daunting, however thesesteps are required to ensure that your sharing is private and secure.These steps are only required a couple of times, to add new friends, and become quite straight forward after the first time.</p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (1) EXCHANGE CERTIFICATES </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Before you can connect, you need send your certificate to your friend, and get your friends certificate. Follow these steps to get your certificate:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on Your Certificate to Select it.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on the "Export Friend" Button to bring up a file save dialog.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select directory to save the certificate to.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Enter desired filename. (with a file type of .pqi), and Click OK.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Email this File to your Friend. (It is recommended you put thecertificate in a zip file before sending, as some email programsdon't transmit the file correctly).</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Ask your friend to do the same.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Once you have received your friend's certificate, removed itfrom the zip file and saved it to disk, you can proceed to step (2).</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Note: This exchange of certificates is only necessary to get you started.Once you are connected to some friends the exchange of certificates becomeautomated by the autoDiscovery system. See<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">GUI: Connecting</span></a> for more information.------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (2) LOAD YOUR FRIEND'S CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Import Friend"</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select your friends certificate file, then click "Okay". Their certificate should appear in the top window of the "Connect" Tab.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (3) SIGN CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select their Certificate by clicking on their name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Configure Friend" Button. This will bring up a configuration window. which allows you to look at the detailsof the certificate.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click the "Sign Certificate" button near the bottom of the "Certificate Configuration" Window.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Now close the window by clicking on the "Done" button.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Your Friends certificate should now say "Trusted (S)", indicating it is ready for connections.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can only share with "Trusted" Peers. You must sign your Friend'scertificate to prove that you know the certificate belongs to your Friend. Do not sign any/all certificates - only the people youtrust. For more information see: <br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br />------------------------------------------------------------------------<br /><br /> <br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (4) AUTOCONNECT TO PEER </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Finally You need to activate the connection:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click in the Box, next to your friends Name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> A Tick should appear in the box, a connection will be started.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> The "Offline" will change to "Online" when you have successfullyconnected.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Remember: Your initial connection attempts will fail, until your friend has signed your certificate and ticked the Auto-Connect Box.This ensures that both peers trust each other, and stops random peopleaccessing your files.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>. <br />------------------------------------------------------------------------<br /><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-DOWNLOAD"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Downloading Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have connected to friends, you can download their shared files.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can search for the files you want using either:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) File Listing Tab: This gives you a directory view of the files being shared by your peers. Double clickon the directory name (not the arrow) to diplay its subdirectories and files.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 1: This can take up to 5 seconds to fetch the information for your peer.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 2: If the directory is empty, or the person is offline, then the request will silently fail.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Search Tab: Retroshare also allows you to search your peers computers for filenames. Enter yourterm(s) in the search box at the top of the TAB and click the "Search" button. This willsearch all of the peers that you are currently connected to.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 3: If any matching files are found they will be displayed within 5 - 10 seconds.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have found the files you want, Select the file(s), and click "Download" to begin the download process.If you click over the "File Transfer" TAB, the status of the files will appear.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 4: The files can take up to 10 seconds to appear in the transfer window.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-SHARING"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Sharing Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can specify which files you want to share in the "Config" Tab.In the "Share Directories" section, click the "Add Directory" Button, and select the directory you want to share.The files and subdirectories will become available for you peers.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can remove a directory from the Shared Directories List by clicking onthe directory name in the list, and then clicking "Remove Directory".</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="GUI"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Gui Overview (Tab Description) </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The GUI is divided up into several sections which can be accessed by clicking on the Tabs along the top of the main window. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect: Manage Connections and Friends.(<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">getting started</span></a> and<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Listing: A directory view of available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Search: Search for available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Messages: For Sending/Recving Message. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Channels: A broadcast/subscription system. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Transfer: Listing of Current and completed Transfers.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Config: Specify of share diectories and IP Addresses.(<a href="#GUI-CONFIG"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> About: Help and other Information.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Chat: Accessed by the clicking on the "Chat" button.</li></ul> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Connect Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Connect TAB consists of two windows. The upper windowshows a list of your friends. This window indicates each friendscurrent trust level, as well as their connection state.The "Trust_Lvl" Column indicates if the certificate has beenAuthenticated using the web of trust. You can only connect to "Trusted" certificates. Tick the "Auto_Connect" box to connect to your trusted friends.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The lower window provides a list of the friends of your friends.This window shows the neighbour's name and how long ago they attempted to connect to you. This window is automatically populatedby the autoDiscovery system, and should be used to expand yourretroShare network. A word of warning: Do not automatically trust (or sign) anyonethat appears in this window. First verify by some other means (email/phone)that certificate belongs to the person you think it does.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use the "Neighbour List" window to expand your friend list. Select the desired entry in the lower window by clicking on it, then click the "Add to Friends" Button to move it to the upper window.Likewise the "Remove from Friends" button moved a person from the upper window to the lower window.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The "Configure Friend" Button opens a Certificate Configuration window.This window can be used to examine the certificate details, sign the certificate or manually change the peer's IP Address.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">See Also:<br /><a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Getting Started: Connecting to your friends</span></a>.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>.<br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONFIG"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Config Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Configuration Tab allows you to select the share directories, as well as the directory that downloaded files are saved to.<br />See <a href="#STARTUP-SHARING"><span style=" text-decoration: underline; color:#0000ff;">Sharing you Files</span></a> for details. </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Config Tab also allows you to control the IP Address and Portused by RetroShare. Under most cirumstances you do not need to changethese setting. If you are behind a firewall and can setup a forwarded port, the selected IP Address and Port should be specified here.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="FAQ"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Frequently Asked Questions </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">How does the security/privacy work? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShares uses a Web of Trust Authentication system to ensurethat your "friends" are your friends, and uses SSL to encryptthe communcications between peers. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What is a Web of Trust? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Web of Trust relies on a collection of peers to identify eachother. Look it up on the Web!</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-TRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What does "Trust" Mean in RetroShare?</span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Anyone can generate a certificate, with any name on it. So howdo you know that the certificate that claims to be from "Joe Bloggs"is really from your mate Joe. This is the "AuthenticationProblem". RetroShare uses a Web of Trust to Authenticate your peers.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-SIGN"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Should I Sign this Certificate? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should only sign a certificate if you are completely surethat it comes from the "right" person. If you sign a certificateyou are "Authenticating" the person to yourself and others.If you sign certificates that you haven't checked, then you aredestroying your own privacy and security.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">How do you verify a certificate? Use an alternative method ofcommunication to send the certificate: E.g. email or USB stick. This will improve you confidence that the certificate belongsto the correct person. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><span style=" font-size:small;"> </span><a name="FAQ-CONNECT"></a><span style=" font-size:small;">W</span><span style=" font-size:small;">hy won't it Connect?</span><span style=" font-size:small;"> </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A connection can fail for a number of reasons:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) Failed Authentication. Have both peers signed each otherscertificates? </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Firewalls. If both peers are behind firewalls then they cannotconnect directly. RetroShare has a built in proxy system to circumventfirewalls - However this can only function if both peers can connect to a common third party that is not behind a firewall. Thisis the most likely reason for initial connections to fail. The only solution to find a common friend that isn't firewalled (know anyone with Broadband?)</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(3) IP Addresses are wrong. You can manually examine and change these using the Certificate configuration.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +</body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="ABOUT"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">見網é Retroshare更多細節. ( http://Retroshare.sf.net ) / About RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShare is a private peer to peer communication platform created by Dr. Bob.This program enables you to securely share files and chat with your friends (and no-one else!).</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, and the latest release go to http://www.lunamutt.com.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="START"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Quick Start Guide to RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If this is your first time using Retroshare, it is recommended that you readthis guide for instructions on how to get started. The first step is:<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Connecting to Your Friends</span></a>. Once you have managed this you can <a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">Download Files</span></a> and<a href="#START-SHARE"><span style=" text-decoration: underline; color:#0000ff;">Share with Others</span></a></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Some of the key concepts related to ensuring your sharing remains private aredescribed in the <a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">Frequently Asked Questions</span></a>. Some Key security questions are:<a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">What is a Web of Trust?</span></a>, <a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">Should I Sign this Certificate?</span></a>, and finally<a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">What does "Trust" Mean?</span></a>.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is also worthwhile reading the <a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">GUI Overview</span></a>which describes the featureson available through the User Interface.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Connecting to your Friends </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">There are four steps to connecting to a Friend:</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Get Friend's Certificate</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Load Certificate</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Sign Certificate</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect to Friend.</li></ul><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The instructions might initially appear long and daunting, however thesesteps are required to ensure that your sharing is private and secure.These steps are only required a couple of times, to add new friends, and become quite straight forward after the first time.</p><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (1) EXCHANGE CERTIFICATES </span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Before you can connect, you need send your certificate to your friend, and get your friends certificate. Follow these steps to get your certificate:</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on Your Certificate to Select it.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on the "Export Friend" Button to bring up a file save dialog.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select directory to save the certificate to.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Enter desired filename. (with a file type of .pqi), and Click OK.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Email this File to your Friend. (It is recommended you put thecertificate in a zip file before sending, as some email programsdon't transmit the file correctly).</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Ask your friend to do the same.</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Once you have received your friend's certificate, removed itfrom the zip file and saved it to disk, you can proceed to step (2).</li></ul><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Note: This exchange of certificates is only necessary to get you started.Once you are connected to some friends the exchange of certificates becomeautomated by the autoDiscovery system. See<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">GUI: Connecting</span></a> for more information.------------------------------------------------------------------------<br /><br /><br /></p><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (2) LOAD YOUR FRIEND'S CERTIFICATE </span></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Import Friend"</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select your friends certificate file, then click "Okay". Their certificate should appear in the top window of the "Connect" Tab.</li></ul><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">------------------------------------------------------------------------<br /><br /><br /></p><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (3) SIGN CERTIFICATE </span></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select their Certificate by clicking on their name.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Configure Friend" Button. This will bring up a configuration window. which allows you to look at the detailsof the certificate.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click the "Sign Certificate" button near the bottom of the "Certificate Configuration" Window.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Now close the window by clicking on the "Done" button.</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Your Friends certificate should now say "Trusted (S)", indicating it is ready for connections.</li></ul><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can only share with "Trusted" Peers. You must sign your Friend'scertificate to prove that you know the certificate belongs to your Friend. Do not sign any/all certificates - only the people youtrust. For more information see: <br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br />------------------------------------------------------------------------<br /><br /> <br /></p><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (4) AUTOCONNECT TO PEER </span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Finally You need to activate the connection:</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click in the Box, next to your friends Name.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> A Tick should appear in the box, a connection will be started.</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> The "Offline" will change to "Online" when you have successfullyconnected.</li></ul><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Remember: Your initial connection attempts will fail, until your friend has signed your certificate and ticked the Auto-Connect Box.This ensures that both peers trust each other, and stops random peopleaccessing your files.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>. <br />------------------------------------------------------------------------<br /><br /><br /></p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-DOWNLOAD"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Downloading Files </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have connected to friends, you can download their shared files.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can search for the files you want using either:</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) File Listing Tab: This gives you a directory view of the files being shared by your peers. Double clickon the directory name (not the arrow) to diplay its subdirectories and files.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 1: This can take up to 5 seconds to fetch the information for your peer.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 2: If the directory is empty, or the person is offline, then the request will silently fail.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Search Tab: Retroshare also allows you to search your peers computers for filenames. Enter yourterm(s) in the search box at the top of the TAB and click the "Search" button. This willsearch all of the peers that you are currently connected to.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 3: If any matching files are found they will be displayed within 5 - 10 seconds.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have found the files you want, Select the file(s), and click "Download" to begin the download process.If you click over the "File Transfer" TAB, the status of the files will appear.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 4: The files can take up to 10 seconds to appear in the transfer window.</p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-SHARING"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Sharing Files </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can specify which files you want to share in the "Config" Tab.In the "Share Directories" section, click the "Add Directory" Button, and select the directory you want to share.The files and subdirectories will become available for you peers.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can remove a directory from the Shared Directories List by clicking onthe directory name in the list, and then clicking "Remove Directory".</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="GUI"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Gui Overview (Tab Description) </span><span style=" font-size:medium;"> </span></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The GUI is divided up into several sections which can be accessed by clicking on the Tabs along the top of the main window. </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect: Manage Connections and Friends.(<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">getting started</span></a> and<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Listing: A directory view of available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Search: Search for available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Messages: For Sending/Recving Message. (Coming Soon)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Channels: A broadcast/subscription system. (Coming Soon)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Transfer: Listing of Current and completed Transfers.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Config: Specify of share diectories and IP Addresses.(<a href="#GUI-CONFIG"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> About: Help and other Information.</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Chat: Accessed by the clicking on the "Chat" button.</li></ul><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Connect Tab </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Connect TAB consists of two windows. The upper windowshows a list of your friends. This window indicates each friendscurrent trust level, as well as their connection state.The "Trust_Lvl" Column indicates if the certificate has beenAuthenticated using the web of trust. You can only connect to "Trusted" certificates. Tick the "Auto_Connect" box to connect to your trusted friends.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The lower window provides a list of the friends of your friends.This window shows the neighbour's name and how long ago they attempted to connect to you. This window is automatically populatedby the autoDiscovery system, and should be used to expand yourretroShare network. A word of warning: Do not automatically trust (or sign) anyonethat appears in this window. First verify by some other means (email/phone)that certificate belongs to the person you think it does.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use the "Neighbour List" window to expand your friend list. Select the desired entry in the lower window by clicking on it, then click the "Add to Friends" Button to move it to the upper window.Likewise the "Remove from Friends" button moved a person from the upper window to the lower window.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The "Configure Friend" Button opens a Certificate Configuration window.This window can be used to examine the certificate details, sign the certificate or manually change the peer's IP Address.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">See Also:<br /><a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Getting Started: Connecting to your friends</span></a>.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>.<br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br /></p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONFIG"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Config Tab </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Configuration Tab allows you to select the share directories, as well as the directory that downloaded files are saved to.<br />See <a href="#STARTUP-SHARING"><span style=" text-decoration: underline; color:#0000ff;">Sharing you Files</span></a> for details. </p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Config Tab also allows you to control the IP Address and Portused by RetroShare. Under most cirumstances you do not need to changethese setting. If you are behind a firewall and can setup a forwarded port, the selected IP Address and Port should be specified here.</p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="FAQ"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Frequently Asked Questions </span><span style=" font-size:medium;"> </span></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">How does the security/privacy work? </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShares uses a Web of Trust Authentication system to ensurethat your "friends" are your friends, and uses SSL to encryptthe communcications between peers. </p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What is a Web of Trust? </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Web of Trust relies on a collection of peers to identify eachother. Look it up on the Web!</p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-TRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What does "Trust" Mean in RetroShare?</span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Anyone can generate a certificate, with any name on it. So howdo you know that the certificate that claims to be from "Joe Bloggs"is really from your mate Joe. This is the "AuthenticationProblem". RetroShare uses a Web of Trust to Authenticate your peers.</p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-SIGN"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Should I Sign this Certificate? </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should only sign a certificate if you are completely surethat it comes from the "right" person. If you sign a certificateyou are "Authenticating" the person to yourself and others.If you sign certificates that you haven't checked, then you aredestroying your own privacy and security.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">How do you verify a certificate? Use an alternative method ofcommunication to send the certificate: E.g. email or USB stick. This will improve you confidence that the certificate belongsto the correct person. </p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><span style=" font-size:small;"> </span><a name="FAQ-CONNECT"></a><span style=" font-size:small;">W</span><span style=" font-size:small;">hy won't it Connect?</span><span style=" font-size:small;"> </span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A connection can fail for a number of reasons:</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) Failed Authentication. Have both peers signed each otherscertificates? </p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Firewalls. If both peers are behind firewalls then they cannotconnect directly. RetroShare has a built in proxy system to circumventfirewalls - However this can only function if both peers can connect to a common third party that is not behind a firewall. Thisis the most likely reason for initial connections to fail. The only solution to find a common friend that isn't firewalled (know anyone with Broadband?)</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(3) IP Addresses are wrong. You can manually examine and change these using the Certificate configuration.</p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table></body></html> + + + + MainWindow + + + Preferences + 喜好 + + + + Network + 网絡 + + + + Friends + èŠå¤©æœ‹å‹ + + + + Transfers + 文件 + + + + Messages + é›»å­éƒµä»¶ + + + + Channels + é »é“ + + + + Options + é¸é … + + + + Users: 0 Files: 0 + 用戶: 0 / 檔案: 0 + + + + Down: 0.0 Up: 0.0 + 下載速度 - Down: 0.0 Up: 0.0 + + + + Connections: 0/45 + 連線: 0/45 + + + + System tray is unavailable + 系統托盤ä¸å¯ç”¨ + + + + System tray unavailable + 系統托盤ä¸å¯ç”¨ + + + + RetroShare System tray + Retroshare 系統托盤 + + + + Application will continue running. Quit using context menu in the system tray + 程å¼å°‡ç¹¼çºŒé‹è¡Œ. 退出請使用系統托盤的上下文èœå–®. + + + + Hide + éš±è— + + + + Show + 顯示 + + + + RetroShare + Retroshare + + + + Home + ä¸»é  + + + + General + 一般 + + + + Invite Friend + é‚€è«‹æœ‹å‹ + + + + Add Friend + æ·»åŠ æœ‹å‹ + + + + Add Share + 添加共享 + + + + Advanced + 高級é¸é … + + + + QTextBrowser { + background-color: rgb(192,192,192); + +} + QTextBrowser { background-color: rgb(192,192,192);} + + + + QPushButton +{ + border-image: url(:/images/console-small-up.png) +} + +QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + +} + +QPushButton:pressed { + border-image: url(:/images/console-small-down.png) +} + + QPushButton{ border-image: url(:/images/console-small-up.png) }QPushButton:hover { border-image: url(:/images/console-small-hover.png) }QPushButton:pressed { border-image: url(:/images/console-small-down.png) } + + + + Exit + 退出 + + + + Search + æœç´¢ + + + + Files + 文案 + + + + Chat + èŠå¤© + + + + Add Shared Directory + 添加共享目禄錄 + + + + About/Help + + + + + Messenger + + + + + Show/Hide + + + + + &Quit + + + + + Bandwidth Graph + + + + + Open Messenger + + + + + RetroShare %1 + + + + + Add a Friend + + + + + Invite a Friend + + + + + Add a Share + + + + + Quit + + + + + Minimize + + + + + Maximize + + + + + Hide Console + + + + + Show Console + + + + + Hide ToolBox + + + + + :images/hide_toolbox_frame.png + + + + + Show ToolBox + + + + + :images/show_toolbox_frame.png + + + + + QTextBrowser { + background-color: rgb(192,192,192); + + } + + + + + QPushButton + { + border-image: url(:/images/console-small-up.png) + } + + QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + + } + + QPushButton:pressed { + border-image: url(:/images/console-small-down.png) + } + + + + + + Apps + + + + + MessageToaster + + + message + 電文 + + + + MessagesDialog + + + New Message + æ–°è¨Šæ¯ + + + + Reply to Message + å›žè¦†è¨Šæ¯ + + + + Remove Message + æ¸…é™¤è¨Šæ¯ + + + + Date + 日期 + + + + From + 從 + + + + Title + 標題 + + + + Msg + 電文 + + + + Count + è‹¥å¹²è¨Šæ¯ + + + + Size + å¤§å° + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Recommended Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">推薦檔案</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">remove selected message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">刪除é¸ä¸­éƒµä»¶</p></body></html> + + + + QPushButton +{ +border-image: url(:/images/deletemail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/deletemail-hover.png); +} + QPushButton{border-image: url(:/images/deletemail24.png);}QPushButton:pressed{border-image: url(:/images/deletemail-hover.png);} + + + + Inbox + 收件箱 + + + + Outbox + 發件箱 + + + + Draft + è‰ç¨¿ + + + + Sent + 發é€é›»å­éƒµä»¶ + + + + Timestamp + 時間點 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">reply to selected message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">回覆é¸å®šæ¶ˆæ¯</p></body></html> + + + + +QPushButton +{ +border-image: url(:/images/replymail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/replymail-hover.png); +} + + QPushButton{border-image: url(:/images/replymail24.png);}QPushButton:pressed{border-image: url(:/images/replymail-hover.png);} + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">New Message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">新郵件 </p></body></html> + + + + QPushButton +{ +border-image: url(:/images/folder-draft24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/folder-draft24-hover.png); +} + + QPushButton{border-image: url(:/images/folder-draft24.png);}QPushButton:pressed {border-image: url(:/images/folder-draft24-hover.png);} + + + + You get Message testing + 您得到這個訊æ¯æ¸¬è©¦ + + + + Download All + 下載所有 + + + + QPushButton +{ +border-image: url(:/images/deletemail24.png); +} + +QPushButton:hover +{ +border-image: url(:/images/deletemail-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/deletemail-pressed.png); +} + + + + + +QPushButton +{ +border-image: url(:/images/replymail24.png); +} + +QPushButton:hover +{ +border-image: url(:/images/replymail24-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/replymail-pressed.png); +} + + + + + + QPushButton +{ +border-image: url(:/images/folder-draft24.png); +} +QPushButton:hover +{ +border-image: url(:/images/folder-draft24-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/folder-draft24-pressed.png); +} + + + + + + MessengerWindow + + + QWidget#MessengerWindow { +background-color: #ECF3F6; background-image:url(:/images/backgroundimage.png); +background-position: top right; +background-repeat: no-repeat +} + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click to change your avatar</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Change your Status and your display</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">picture here.</p></body></html> + + + + + Online + + + + + Busy + + + + + Be right Back + + + + + Away + + + + + In a Call + + + + + Out of lunch + + + + + Apear Offline + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Share a personal message with your contacts</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Add a Friend</p></body></html> + + + + + Chat + + + + + Connect To Friend + + + + + NetworkDialog + + + Peer Details / Authenticate + çµç‚¹è©³ç´°ä¿¡æ¯/èªè­‰ + + + + Load Certificate + 加載證書 + + + + Select a pem/pqi File + é¸æ“‡ä¸€å€‹æ–‡ä»¶ PEM/PQI + + + + File Not Found + 未找到文件 + + + + %1 does not exist. Would you like to create it? + %1 ä¸å­˜åœ¨. 你想創建它嗎? + + + + Failed to Create File + 創建文件失敗 + + + + Unable to create %1 [%2] + 無法創建 %1 [%2] + + + + Select Certificate + é¸æ“‡è­‰æ›¸ + + + + Certificates (*.pqi *.pem) + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">网絡:</span></p></body></html> + + + + # + + + + + Accept + æŽ¥å— + + + + Trust + 信託 + + + + Last Contact + 最後一次è¯ç³» + + + + Name + 姓å + + + + Peer Address + çµç‚¹åœ°å€ + + + + Organisation + 組織 + + + + Location + ä½ç½® + + + + Country + 國別 + + + + Cert Id + 證書編號 + + + + Auth Code + èªè¨¼ç¢¼ (Authenticate Code èªè­‰) + + + + NetworkPage + + + Rate Options + 速度é¸é … + + + + Max Total Data Rate (KB/S): + 你的最大上傳速度 (KB/S): + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Rate per Person (KB/S):</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">速æ¯äºº (KB/S):</p></body></html> + + + + PeersDialog + + + Chat + èŠå¤© + + + + Configure Friend + é…ç½®æœ‹å‹ + + + + Export Friend + å¯¼å‡ºæœ‹å‹ + + + + Remove Friend + åˆªé™¤æœ‹å‹ + + + + Save Certificate + ä¿å­˜è­‰æ›¸ + + + + Certificates (*.pqi) + 證書 (*.pqi) + + + + Status + 状態 + + + + Person + 人 + + + + Auto Connect + 自動連接 + + + + Trust Level + 信任水平 + + + + Peer Address + çµç‚¹åœ°å€ + + + + Last Contact + 最後一次è¯ç³» + + + + Organisation + 組織 + + + + Location + ä½ç½® + + + + Country + 國別 + + + + Person Id + 個人識別號碼 + + + + Auth Code + èªè¨¼ç¢¼ (Authenticate Code èªè­‰) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Friends</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">朋å‹</span></p></body></html> + + + + Connect To Friend + é€£æŽ¥åˆ°æœ‹å‹ + + + + # + + + + + PopupChatDialog + + + RetroShare Friend Chat + Retroshare 朋å‹èŠå¤© + + + + RetroShare User Chat + + + + + PreferencesDialog + + + Language + 語言(Language) + + + + Style + 風格 + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">改變語言æ‰ç”Ÿæ•ˆå¾Œé‡å•Ÿ Retroshare!</p></body></html> + + + + Style Sheet + 樣å¼è¡¨ + + + + Default + é»˜èª (Default) + + + + Pagefold + Pagefold + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose RetroShare's interface style</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">é¸æ“‡ç•Œé¢é¢¨æ ¼ Retroshare</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose the language used in RetroShare</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">é¸æ“‡èªžè¨€ Retroshare</p></body></html> + + + + blue + è— + + + + silver + 銀牌 + + + + ed2k + emule.sf.net - ed2k (é›»å­æ¯›é©¢) + + + + over + over + + + + black + 黑色 + + + + arachnophobia + arachnophobia + + + + Skin2 + 皮膚 2 + + + + Login + Login 登陸 + + + + Remove Auto Login + å–消自動登陸 + + + + PreferencesWindow + + + Directories + 目禄 + + + + Error Saving Configuration + ä¿å­˜é…置出錯 + + + + About + 關於 + + + + General + 一般 + + + + Server + æœå‹™å™¨ + + + + Options + é¸é … + + + + Cancel + å–消 + + + + OK + 確定 + + + + QObject + + + Name + 姓å + + + + Path + + + + + Extension + + + + + Date + + + + + Size + + + + + Popularity + + + + + contains + + + + + contains all + + + + + is + + + + + less than + + + + + less than or equal + + + + + greater than or equal + + + + + greater than + + + + + is in range + + + + + and + + + + + and / or + + + + + or + + + + + equals + + + + + Rshare + + + Invalid language code specified: + 無效的語言代碼指定: + + + + Invalid GUI style specified: + 無效桂å¼æŒ‡å®š: + + + + SearchDialog + + + File Name + 文案å稱 + + + + Sources + ä¾†æº + + + + Search Pattern + æœç´¢æ¨¡å¼ + + + + Results + çµæžœ + + + + File Size + æ–‡æ¡ˆå¤§å° + + + + Download + 下載 + + + + Broadcast on Channel + 在頻é“内广播 + + + + Recommend to Friends + æŽ¨è–¦çµ¦æœ‹å‹ + + + + Remove + 移除 + + + + Remove All + 清除所有 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Keywords</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Keywords</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Format</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Format</p></body></html> + + + + Any + 任何 + + + + Audio + 音頻 + + + + Video + 視頻 + + + + Images + 圖片 + + + + Programs + 節目 + + + + Archives + 文件夾 + + + + Documents + 文件 + + + + search + æœç´¢ + + + + download + 下載 (download) + + + + Toggle advanced searching on and off. + + + + + <h3>Simple Search:</h3> + + + + + Keywords + + + + + Perform simple search + + + + + Show Advanced Search Tool + + + + + Filename + + + + + Hash + + + + + KeyWords + + + + + Search Id + + + + + <h3>Advanced Search:</h3> + + + + + ServerDialog + + + Transfer Rates + 傳輸速度 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Total Rate (kb/s) </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">您的總上傳速度 / 總速度 (kb/s) </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Per Person </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">速æ¯äºº </p></body></html> + + + + Server Settings + æœå‹™å™¨è¨­ç½® + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">本地地å€:</p></body></html> + + + + Port: + IP-Port (IP端å£): + + + + behind zee Firewall + ä½äºŽé˜²ç«ç‰† ä¹‹åŽ + + + + Forwarded External Port + è½‰ç™¼å¤–éƒ¨ç«¯å£ + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">IP-Port (IP的端å£/ 港å£):</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">å°å¤–å稱</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">外部地å€:</p></body></html> + + + + Check Settings + 檢察設置 + + + + Firewall/Router Configuration + + + + + Manual router setup. + + + + + Use uPnP to configure router + + + + + Network Address Configuration (takes effect after restart) + + + + + Use DHT to locate friends + + + + + Manual IP Addresses + + + + + Server Status And Network Settings + + + + + Firewalled + + + + + Forwarded Port + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">DHT Status</p></body></html> + + + + + uPnP Status + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Local Address:</p></body></html> + + + + + ServerPage + + + Change + Restart Server + 改變+é‡ç¶®å‹• + + + + Server Settings + æœå‹™å™¨è¨­ç½® + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">外部地å€:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">本地地å€:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">IP-Port (IP的端å£/ 港å£):</p></body></html> + + + + Port: + IP-Port (IP的端å£): + + + + Misc + Misc + + + + behinde Firewall + 防ç«ç‰† + + + + Forwarded External Port + è½‰ç™¼å¤–éƒ¨ç«¯å£ + + + + Settings + + + Settings + 設置 + + + + Cancel + å–消 + + + + Apply + 應用 + + + + OK + 確定 + + + + General + 一般 + + + + Network + 网絡 + + + + Server + æœå‹™å™¨ + + + + Directories + 目禄 + + + + SharedFilesDialog + + + Download + 下載 + + + + Recommend + 推薦 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">檔案</span></p></body></html> + + + + Add to Recommend List + + + + + Recommend To + + + + + Message Friend + + + + + StartDialog + + + Select Trusted Friend + é¸æ“‡ä¿¡è³´çš„æœ‹å‹ + + + + Certificates (*.pqi *.pem) + 證書 (*.pqi *.pem) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:13pt; font-weight:600; color:#8b0000;">Welcome to RetroShare</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:13pt; font-weight:600; color:#8b0000;">æ­¡è¿Ž Retroshare</span></p></body></html> + + + + Please Login .... + 登陸 (Login) .... + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">姓å:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Pasword</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">密碼 (Password)</span></p></body></html> + + + + Load Existing User + 加載ç¾æœ‰ç”¨æˆ¸æˆ¶ + + + + Or create a New User + 或創建一個新用戸戶 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Organisation:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">組織:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Location:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ä½ç½®:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Password (Again)</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">密碼(å†) (Password Again)</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">New Password</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">新密碼 (New Password)</span></p></body></html> + + + + Load Trusted Certificate (Optional) + 加載å¯ä¿¡ä»»è­‰æ›¸(å¯é¸) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">朋å‹</span></p></body></html> + + + + Select File + é¸æ“‡æ–‡æ¡ˆ + + + + Generate New Certificate + 生æˆæ–°çš„證書 + + + + RetroShare setup + Retroshare 設置 + + + + Automatically Login in Future + 自動登陸 + + + + RetroShare + + + + + QWidget { + background-color: #ECF3F6; +} + + + + + Auto-login + + + + + Name: + + + + + Log In + + + + + Password: + + + + + Create a Account + + + + + QToolButton{ +border-image: url(:/images/avatar_background.png); + +} + + + + + + StatisticDialog + + + Statistics + 統計 (Statistics) + + + + Download + 下載中 + + + + Session: + Session: + + + + Downloaded: + 下載完æˆ: + + + + Average Downloadspeed: + Average Downloadspeed: + + + + Count of Downloads: + 下載統計: + + + + Overall + Overall + + + + Upload + Upload + + + + Session + Session + + + + Uploaded: + Uploaded: + + + + Average Uploadspeed: + Average Uploadspeed: + + + + Count of Uploads: + 上載統計: + + + + Uploaded + Uploaded + + + + Connections: + 連接: + + + + Peers: + Peers: + + + + Misc + Misc + + + + Uptime: + Uptime: + + + + Overall: + Overall: + + + + Uptime + Uptime + + + + Records + Records + + + + Uploadspeed: + Uploadspeed: + + + + Downloadspeed: + 下載速度: + + + + Show Settings + Show Settings + + + + Reset + Reset + + + + Receive Rate + Receive Rate + + + + Send Rate + Send Rate + + + + Always On Top + Always On Top + + + + 100 + 100 + + + + % Opaque + % Opaque + + + + Changes the transparency of the Bandwidth Graph + Changes the transparency of the Bandwidth Graph / 改變é€æ˜Žåº¦çš„頻寬圖 + + + + Save + 拯救 + + + + Cancel + å–消 + + + + Hide Settings + éš±è—設置 + + + + TransfersDialog + + + Cancel + å–消 + + + + Clear Completed + æ˜Žç¢ºå®Œæˆ + + + + File Name + 文案å稱 + + + + Sources + æ¥æº + + + + Status + 状態 + + + + File Size + æ–‡æ¡ˆå¤§å° + + + + Speed + 速度 + + + + Progress + 進度 + + + + Completed + å®Œæˆ + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Downloads:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">下載 (Downloads):</span></p></body></html> + + + + Peer Name + çµç‚¹å稱 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Uploads:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">上傳 (Uploads):</span></p></body></html> + + + + Name + i.e: file name + 姓å + + + + Size + i.e: file size + + + + + Progress + i.e: % downloaded + 進度 + + + + Speed + i.e: Download speed + 速度 + + + + Sources + i.e: Sources + æ¥æº + + + + Remaining + i.e: Estimated Time of Arrival / Time left + + + + + Core-ID + + + + + User Name + i.e: user name + + + + + Progress + i.e: % uploaded + 進度 + + + + Speed + i.e: upload speed + 速度 + + + + Transferred + + + + + ULListDelegate + + + B + + + + + KB + + + + + MB + + + + + GB + + + + + VMessageBox + + + OK + 確定 + + + + Cancel + å–消 + + + + Yes + Yes + + + + No + No + + + + Help + 幇助 + + + + Retry + å†è©¦ + + + + Show Log + 顯示記祿 + + + + Show Settings + 顯示設置 + + + + moreinfo + + + Details + 詳情 + + + + OK + OK + + + + Name + 姓å + + + + Value + Value值 + + + diff --git a/retroshare-gui/src/lang/retroshare_de.qm b/retroshare-gui/src/lang/retroshare_de.qm new file mode 100644 index 000000000..529f71980 Binary files /dev/null and b/retroshare-gui/src/lang/retroshare_de.qm differ diff --git a/retroshare-gui/src/lang/retroshare_de.ts b/retroshare-gui/src/lang/retroshare_de.ts new file mode 100644 index 000000000..94bbe23bb --- /dev/null +++ b/retroshare-gui/src/lang/retroshare_de.ts @@ -0,0 +1,4032 @@ + + + + + + + Arial + Arial + + + + AddFriendDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;"> To add a new Friend, cut and paste their email </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">invitation into the box below, and click done.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;"> Um eine neie Freundin oder einen neuen Freund hinzuzufügen, schneide die E-Mail-Einladung aus</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">und füge sie in die Box unterhalb ein, sodann clicke "Fertig".</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;"></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + Cancel + Abbrechen + + + + Done + Fertig + + + + Load From File + Laden von Datei + + + + RetroShare + Retroshare + + + + Certificate Load Failed + Das Zertifikat konnte nicht geladen werden + + + + Add a Friend + Einen Freund hinzufügen + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"><span style=" font-size:16pt;">Add a new Friend</span><br /><br /><span style=" font-size:10pt;">To add a new Friend, cut and paste their email </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">invitation into the box below, and click done.</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"><span style=" font-size:16pt;">Add a new Friend</span><br /><br /><span style=" font-size:10pt;">Um einen neuen Freund hinzuzufügen, schneiden </span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">Sie die Email-Einladung aus und fügen Sie sie in die Box unten ein und klicken Sie "Fertig".</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + + + + + AddFriendWizard + + + < Back + < Zurück + + + + Next > + Weiter > + + + + Cancel + Abbrechen + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">This Wizard helps to Connect to your Friends</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Dieser Assistent hilft Ihnen bei der Verbindungsaufnahme mit Ihren Freunden.</span></p></body></html> + + + + I have a .pqi/.pem file received from a Friend + Ich habe eine .pqi/.pem - Datei von einem Freund empfangen + + + + I have Key received from a Friend + Ich habe einen Schlüssel von einem Freund empfangen + + + + I want to invite a friend to my RetroShare network + Ich möchte einen Freund in das Retroshare-Netzwerk einladen + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Cut and paste the text below into an email.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;"> and send it to all your friends!</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">When you press next RetroShare will attempt to launch a Email client.</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Schneiden Sie den Text aus und fügen Sie ihn unten in die Email ein.</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;"> und senden Sie ihn allen Ihren Freunden!</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">Wenn Sie "Weiter" klicken, wird Retroshare versuchen ein Email Programm zu öffnen.</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Invite your Friends to join with RetroShare</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Laden Sie Freunde ein, zu Retroshare zu kommen.</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Enter the Key code you got from your friend:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Geben Sie den Schlüssel ein, den Sie von Ihren Freunden bekommen haben:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">When you press next RetroShare will attempt to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">connect using the key.</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Wenn Sie "Weiter" klicken wird Retroshare versuchen</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">mit dem Schlüssel zu verbinden.</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Select a pqi/pem file:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Wählen Sie eine pqi/pem - Datei:</span></p></body></html> + + + + Browse + Durchsuchen + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">When you press next RetroShare will attempt to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">connect using the .pqi/.pem file.</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Wenn Sie "Weiter" klicken, wird Retroshare versuchen</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">mit der .pqi/.pem - Datei zu verbinden.</p></body></html> + + + + Add Friend to my network Wizard + Einen Freund zum Netzwerk-Assistenten hinzufügen + + + + Add Friend to my netowork Wizard + + + + + AdvancedSearchDialog + + + RetrosShare: Advanced Search + Retroshare: Erweiterte Suche + + + + Add a further search criterion. + Ein weiteres Such-Kriterium hinzufügen. + + + + Add a selection criterion + Ein Auswahl-Kriterium hinzufügen + + + + Reset + Zurücksetzen + + + + Cancels the search. + Bricht die Suche ab. + + + + Cancel + Abbrechen + + + + Perform the advanced search. + Die erweiterte Suche durchführen. + + + + Search + Suchen + + + + Search Criteria + Suchkriterien + + + + Reset the search criteria. + + + + + ApplicationWindow + + + RetroShare %1 + RetroShare %1 + + + + Example Application + + + + + Application Users: 0 Files: 0 + + + + + Down: 0.0 Up: 0.0 + Down: 0.0 Up: 0.0 + + + + Connections: 0/45 + Verbindungen: 0/45 + + + + Hide + Verbergen + + + + Show + Zeigen + + + + RetroShare + Retroshare + + + + Home + Home + + + + General + Allgemein + + + + Advanced + Erweitert + + + + QTextBrowser { + background-color: rgb(192,192,192); + + } + QTextBrowser { background-color: rgb(192,192,192); } + + + + QPushButton + { + border-image: url(:/images/console-small-up.png) + } + + QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + + } + + QPushButton:pressed { + border-image: url(:/images/console-small-down.png) + } + + QPushButton { border-image: url(:/images/console-small-up.png) } QPushButton:hover { border-image: url(:/images/console-small-hover.png) } QPushButton:pressed { border-image: url(:/images/console-small-down.png) } + + + + AuthorizationDialog + + + Authenticate + Echtheit bestätigen (AUTHentifizieren) + + + + Authenticate Friend By Entering Their Code + Echtheit des Freundes durch Eingabe des AUTH-Codes prüfen + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + + + + OK + OK + + + + Cancel + Abbrechen + + + + BandwidthGraph + + + Since: + Seit: + + + + Hide Settings + Einstellungen verbergen + + + + Show Settings + Einstellungen anzeigen + + + + RetroShare Bandwidth Usage + Retroshare Bandbreiten Nutzung + + + + Reset + Zurücksetzen + + + + Receive Rate + Empfangsrate + + + + Send Rate + Senderate + + + + Always on Top + Immer im Vordergrund + + + + Style + Stil + + + + Changes the transparency of the Bandwidth Graph + Ändert die Transparenz des Bandbreiten-Graphen + + + + 100 + 100 + + + + % Opaque + % Transparent + + + + Save + Speichern + + + + Cancel + Abbrechen + + + + CallToaster + + + Message + Nachricht + + + + ChanCreateDialog + + + Create a new Broadcast Channel + Erstelle einen neuen Sende-Kanal + + + + Create A New Broadcast Channel + Erstelle einen neuen Sende-Kanal + + + + Channel Name: + Name des Kanals: + + + + Type: + Typ: + + + + Public Channel (Signed) + Öffentlicher Kanal (unterzeichnet) + + + + Private Channel (Encrypted) + Privater Kanal (verschlüsselt) + + + + Cancel Channel + Den Kanal stornieren + + + + Create Channel + Kanal erstellen + + + + ChanMsgDialog + + + Compose + Erstellen + + + + Recommended Files + Empfohlene Dateien + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-weight:400;"><span style=" font-weight:600;">Subject:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-weight:400;"><span style=" font-weight:600;">Thema:</span></p></body></html> + + + + Send To: + Senden An: + + + + Send + Senden + + + + Delete Channel + Kanal löschen + + + + Create Channel MSG + Erstelle eine Nachricht für den Kanal + + + + 1 + 1 + + + + Reply + + + + + ChannelsDialog + + + New Message + Neue Nachricht + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Messages</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Nachrichten</span></p></body></html> + + + + Date + Datum + + + + Rank + Platzierung + + + + From + Von + + + + Title + Titel + + + + Msg + Nachricht + + + + Count + Häufigkeit + + + + Size + Grösse + + + + Type + Typ + + + + Rs[Cert/Chan]IdSize + Rs[Cert/Chan]IdSize + + + + RsMsgId + RsMsgId + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Message Text</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Nachrichtentext</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Recommended Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Empfohlene Dateien</span></p></body></html> + + + + New Channel + Neuer Kanal + + + + Subscribe To Channel + Kanal beitreten + + + + Unsubscribe To Channel + Kanal stornieren + + + + Delete Your Channel + Ihren Kanal löschen + + + + Download + Herunterladen + + + + Download All + Alles Herunterladen + + + + ChatDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:9pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:400;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:9pt; font-weight:600; font-style:normal; text-decoration:none;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:400;"></p></body></html> + + + + Chat History: + Unterhaltungsverlauf: + + + + Chat With: + Unterhaltung mit: + + + + Chat + Unterhalten + + + + Users: + Teilnehmer: + + + + ChatToaster + + + message + anschreiben + + + + You Get a New Message + Du bekommst eine neue Nachricht + + + + Message + Nachricht + + + + ConfCertDialog + + + Cancel + Abbrechen + + + + Done + Fertig + + + + Apply + Bestätigen + + + + Peer Settings + Programmvorgaben + + + + Port: + Port: + + + + behind zee Firewall + Hinter einer Firewall + + + + Forwarded External Port + Weitergeleiteter externer Port im Router + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Externe Addresse:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Externer Name</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokale Address:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Max Transfer Rate (kb/s) </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Max Transfer Rate (kb/s) </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Org / Loc:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Org / Lok:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Country/State:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Land/Staat:</p></body></html> + + + + Trust Settings + Vertraulichkeitseinstellungen + + + + Trust Level + Höhe der Vertraulichkeit + + + + Trust Their Signature + Der Signatur vertrauen + + + + Sign The Certificate + Bestätige das Zertifikat + + + + OK + OK + + + + Peer Adress + Peer Adresse + + + + Peer Info + Peer Info + + + + ConfirmQuitDialog + + + Exit RetroShare + Retroshare beenden + + + + You are about to exit the RetroShare application and therefore stop all transfers. <br><br>Are you sure you want to stop and exit RetroShare? + Sie Sind dabei Retroshare zu beenden und dafür müssen alle Transfers gestoppt werden. <br>br>Sind Sie sicher, das Sie stoppen und Retroshare beenden möchten? + + + + Do not show this message again. + Die Meldung nicht wieder anzeigen. + + + + ConnectDialog + + + Peer Details + Peer-Details + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Land:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Org:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Org:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Trust:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Vertraulichkeit:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Loc:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Lok:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Certificate</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">signers:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Certificate</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">Unterzeichner:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + + + + Make Friend + Als Freund wählen + + + + Close + Schliessen + + + + ConnectionsDialog + + + Load Certificate + Lade das Zertifikat + + + + Select a pem/pqi File + Wähle eine PEM- oder PQI-Datei + + + + File Not Found + Datei nicht gefunden + + + + %1 does not exist. Would you like to create it? + %1 ist nicht vorhanden. Möchtest Du es jetzt erstellen? + + + + Failed to Create File + Es ist nicht gelungen, die Datei zu erstellen. + + + + Unable to create %1 [%2] + Kann nicht erstellt werden %1 [%2] + + + + Select Certificate + Wähle das Zertifikat + + + + Certificates (*.pqi *.pem) + Zertifikate (*.pqi *.pem) + + + + Accept + Bestätigen + + + + Trust + Vertrautheit + + + + Last Contact + Letzter Kontakt + + + + Name + Name + + + + Organisation + Organisation + + + + Location + Ort + + + + Country + Land + + + + Peer Address + Adresse des Peers + + + + Cert Id + ID des Zertifikates + + + + Auth Code + Bestätigungs-(AUTH)-Code + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + + + + Peer Details / Authenticate + Details zum Peers / Bestätigen (Authenticate) + + + + CryptographyDialog + + + RSA Key Size + Größe des RSA-Schlüssels + + + + Rijndael Block size + Rijndael Block Grösse + + + + 128 Bits + 128 Bits + + + + 192 Bits + 192 Bits + + + + 256 Bits + 256 Bits + + + + Rijndael Key Size + Rijndael Schlüssel Grösse + + + + Rijndael Mode + Rijndael Modus + + + + CBC + CBC + + + + ECB + ECB + + + + CFB + CFB + + + + Rijndael Padding + Rijndael Auffüllung + + + + PKCS7 + PKCS7 + + + + Zeros + Nullen + + + + ANSIX923 + ANSIX923 + + + + ISO10126 + ISO10126 + + + + Rijndael Feedback Size + Rijndael Feedback Grösse + + + + Key Size: + Größe des Schlüssels: + + + + Block Size: + Block Grösse: + + + + Feedback Size: + Feedback Grösse: + + + + Mode: + Modus: + + + + Padding: + Auffüllung: + + + + DLListDelegate + + + B + B + + + + KB + kB + + + + MB + MB + + + + GB + GB + + + + DirectoriesDialog + + + Shared Directories + Freigegebene Verzeichnisse + + + + Other Directories + Andere Verzeichnisse + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Incoming Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Incoming Files</span></p></body></html> + + + + Add Shared Directory + Freigabe-Verzeichnis hinzufügen + + + + DirectoriesPage + + + Shared Directories + Freigegebene Verzeichnisse + + + + Incoming files + Eingehende Dateien + + + + ExampleDialog + + + Vote Up + + + + + Vote Down + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Friends</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Freunde</span></p></body></html> + + + + # + # + + + + Status + Status + + + + Person + Person + + + + Auto Connect + Auto-Verbindung + + + + Trust Level + + + + + Peer Address + Adresse des Peers + + + + Last Contact + Letzter Kontakt + + + + Organisation + Organisation + + + + Location + Ort + + + + Country + Land + + + + Person Id + personale ID + + + + Auth Code + + + + + ExprParamElement + + + to + + + + + ignore case + + + + + dd.MM.yyyy + + + + + KB + kB + + + + MB + MB + + + + GB + GB + + + + ExpressionWidget + + + Expression Widget + Ausdruck Oberfläche + + + + Delete this expression + Den Ausdruck löschen + + + + FileHashDialog + + + Download + Herunterladen + + + + GSettingsWin + + + General + Allgemein + + + + Network + Netzwerk + + + + Directories + Verzeichnisse + + + + Server + Einstellungen des Peers + + + + %1 + %1 + + + + GenCertDialog + + + Select Trusted Friend + Wähle vertrauten Freund + + + + Certificates (*.pqi *.pem) + Zertifikate (*.pqi *.pem) + + + + RetroShare setup + Retroshare Setup + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16pt;">Generate a new profile</span><br /><br />Please fill in the information which will<br />allow your RetroShare to connect to</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Friends.</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16pt;">Generate a new profile</span><br /><br />Please fill in the information which will<br />allow your RetroShare to connect to</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Friends.</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Organisation:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Organisation:</p></body></html> + + + + Password (Again) + Passwort (Wdh) + + + + Location: + Ort: + + + + Load Trusted Certificate (Optional) + Lade vertrautes Zertifikat (Optional) + + + + Password + Passwort + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + + + + Select File + Dateiauswahl + + + + Country: + Land: + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + + + + Generate New Certificate + Erstelle ein neues Zertifikat + + + + GeneralPage + + + Keys manager + Schlüsselverwaltung + + + + Style + Stil + + + + Choose RetroShare's interface style + Wähle den Stil der Benutzeroberfläche + + + + Language + Sprache + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Änderungen in der Sprachwahl wirken sich erst nach einem Neustart von Retroshare aus!</p></body></html> + + + + Choose the language used in RetroShare + Sprachauswahl für Retroshare + + + + GraphFrame + + + Recv: + Recv: + + + + %1 KB/s + %1 KB/s + + + + Sent: + gesendet: + + + + %1 KB + %1 KB + + + + %1 MB + %1 MB + + + + %1 GB + %1 GB + + + + HelpDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">About/Help</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">About/Help</span></p></body></html> + + + + About + Ãœber + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:large; font-weight:600; text-decoration: underline; color:#0000ff;"><span style=" font-size:xx-large; text-decoration:none;">About RetroShare.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />Retroshare is a private and secure decentralised commmunication platform.<br />You can use it chat, send messages and share files with your friends.<br /><br />This is just a placeholder page for the moment. You can<br />improve retroshare's in-built help (this text) by<br />updating the retroshare wiki: <a href="http://retroshare.wiki.sourceforge.net/help_tab"><span style=" text-decoration: underline; color:#0000ff;">This Page in the retroshare Wiki</span></a><br /><br />The About/Help Tab is regularly updated from the Wiki page.<br /><br />External Links to more information:<br /></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.sourceforge.net"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Webpage</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.wiki.sourceforge.net/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Wiki</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://sourceforge.net/projects/retroshare/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Project Page</span></a></li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.lunamutt.com"><span style=" text-decoration: underline; color:#0000ff;">Lunamutt Homepage.</span></a></li></ul></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:large; font-weight:600; text-decoration: underline; color:#0000ff;"><span style=" font-size:xx-large; text-decoration:none;">Ãœber RetroShare.</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />Retroshare ist eine private und sicher dezentralisierte Kommunikationsplattform.<br />Sie können Retroshare verwenden zum chatten und tauschen von Dateien mit Ihren Freunden.<br /><br />This is just a placeholder page for the moment. You can<br />improve retroshare's in-built help (this text) by<br />updating the retroshare wiki: <a href="http://retroshare.wiki.sourceforge.net/help_tab"><span style=" text-decoration: underline; color:#0000ff;">This Page in the retroshare Wiki</span></a><br /><br />The About/Help Tab is regularly updated from the Wiki page.<br /><br />External Links to more information:<br /></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.sourceforge.net"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Webseite</span></a></li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.wiki.sourceforge.net/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Wiki</span></a></li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://sourceforge.net/projects/retroshare/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Projekt Seite</span></a></li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.lunamutt.com"><span style=" text-decoration: underline; color:#0000ff;">Lunamutt Homepage.</span></a></li></ul></body></html> + + + + Authors + Authoren + + + + Thanks to + Dank an + + + + Translation + Ãœbersetzung + + + + License Agreement + Lizenzvereinbarung + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-weight:600;">We've had a number of new people join the Retroshare <br />project over the last couple of months. <br />A quick introduction: </span><br /> <br /><span style=" color:#0000ff;">defnax</span>: Lead GUI developer <br /><span style=" color:#0000ff;">drbob7</span>: Lead Core developer. <br /> <br /><span style=" color:#0000ff;">bmeck</span> : Our new web-developer. Joined retroshare a couple <br />of weeks ago, and already starting on an exciting new <br />design for the web-page. <br /> <br /><span style=" color:#0000ff;">noragen</span> : Developer from the SIM-IM project. Working on a retroshare plugin to SIM-IM. <br /> <br /><span style=" color:#0000ff;">linuxsmarre</span> : Helping out defnax with GUI development. <br /> <br /><span style=" color:#0000ff;">agent725</span>: Manages the 'local' Retroshare release, <br />and beta-testing retroshare on a large scale. <br /> <br /><span style=" color:#0000ff;">the_mgt</span>: Maintains the Gentoo and generic linux <br />installation/compilation scripts. <br /> <br /><span style=" color:#0000ff;">lindisfarne</span>: Helping out with retroshare web-page. <br /> <br /><span style=" color:#0000ff;">dolfcao</span>: Developer from TStone VOIP project <br />leonwangcn: Developer from TStone VOIP project. </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-weight:600;">Wir haben eine Anzahl von Personen, die zum Retroshare- <br />Project innerhalb der letzen Monte dazugekommen sind. <br />Eine flinke Vorstellung:</span><br /> <br /><span style=" color:#0000ff;">defnax</span>: Lead GUI developer <br /><span style=" color:#0000ff;">drbob7</span>: Lead Core developer. <br /> <br /><span style=" color:#0000ff;">bmeck</span> : Unsere neuen Web-Developer, die zu retroshare in den letzten paar Wochen <br />dazugekommen sind, und ein neues, aufregendes<br />Design for the web-page beginnen. <br /> <br /><span style=" color:#0000ff;">noragen</span> : Entwickler vom SIM-IM Projekt. Bindeglied zwischen SIM-IM und Retroshare um Anwendungskompatiblität herzustellen.<br /> <br /><span style=" color:#0000ff;">linuxsmarre</span> : Hilft defnax in GUI development. <br /> <br /><span style=" color:#0000ff;">agent725</span>: Managed das 'local' Retroshare Release, <br />und beta-testet retroshare auf einer breiten Skala. <br /> <br /><span style=" color:#0000ff;">the_mgt</span>: Maintained die Gentoo und generischen Linux <br />installation/compilation Skripte. <br /> <br /><span style=" color:#0000ff;">lindisfarne</span>: Hilft bei der Retroshare-Webseite. <br /> <br /><span style=" color:#0000ff;">dolfcao</span>: Developer from TStone VOIP project <br />leonwangcn: Developer vom TStone VOIP Projekt. </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:xx-large; font-weight:600; color:#0000ff;">About RetroShare.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-weight:600;">Retroshare is a private and secure decentralised commmunication platform.<br />You can use it chat, send messages and share files with your friends.</span><br /><br />This is just a placeholder page for the moment. You can<br />improve retroshare's in-built help (this text) by<br />updating the retroshare wiki: <a href="http://retroshare.wiki.sourceforge.net/help_tab"><span style=" text-decoration: underline; color:#0000ff;">This Page in the retroshare Wiki</span></a><br /><br />The About/Help Tab is regularly updated from the Wiki page.<br /><br />External Links to more information:<br /></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.sourceforge.net"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Webpage</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.wiki.sourceforge.net/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Wiki</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://sourceforge.net/projects/retroshare/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Project Page</span></a></li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.lunamutt.com"><span style=" text-decoration: underline; color:#0000ff;">Lunamutt Homepage.</span></a></li></ul></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-size:19pt; font-weight:600; color:#0000ff;">The RetroShare Team:</span><br /> <br /><span style=" font-size:9pt; color:#0000ff;">defnax</span>: Lead GUI developer <br /><span style=" font-size:9pt; color:#0000ff;">drbob7</span>: Lead Core developer. <br /> <br /><span style=" font-size:9pt; color:#0000ff;">bmeck</span> : Our new web-developer. Joined retroshare a couple <br />of weeks ago, and already starting on an exciting new <br />design for the web-page. <br /> <br /><span style=" font-size:9pt; color:#0000ff;">noragen</span> : Developer from the SIM-IM project. Working on a retroshare plugin to SIM-IM. <br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">kernelpanix</span> : Gui and skin developer</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">libris</span><span style=" font-size:9pt;">:</span> core developer</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-size:9pt; color:#0000ff;">kashif: </span><span style=" color:#000000;">core developer</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt; color:#000000;"><span style=" font-size:8pt;"><br /></span><span style=" color:#0000ff;">agent725</span><span style=" font-size:8pt;">: Manages the 'local' Retroshare release, <br />and beta-testing retroshare on a large scale. <br /> <br /></span><span style=" color:#0000ff;">the_mgt</span><span style=" font-size:8pt;">: Maintains the Gentoo and generic linux <br />installation/compilation scripts. </span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">notdefine:</span> Maintains the .rpm, .deb installation/compilation scripts.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">zhouk</span>: developer</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Translators:</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Serbian</span>: Kunalagon Umuhanik &lt;kunalagon@gmail.com&gt;</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Polish: </span>Jarek</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">French</span>:Temet</p></body></html> + + + + + InviteDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">To </span><span style=" font-size:10pt; font-weight:600;">Invite your friends to join you with Retroshare: </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">Cut and paste the text below into an email.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">and send it to all your friends!</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">To </span><span style=" font-size:10pt; font-weight:600;">Lade Deine Freunde zum Mitmachen bei Retroshare ein: </span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">Kopiere den Text unterhalb aus und füge ihn in ein E-Mail ein.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">and send it to all your friends!</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + Done + Fertig + + + + Cancel + Abbrechen + + + + Launch Email + Starte das Standard-Emailprogramm + + + + Invite a Friend + Einen Freund einladen + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html><html><head><meta name="qrichtext" content="1" /><style type="text/css"> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"><span style=" font-size:16pt;">Invite a Friend</span><br /><br /><span style=" font-size:10pt;">To Invite your friends to join you with Retroshare: </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">Cut and paste the text below into an email.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">and send it to all your friends!</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"><span style=" font-size:16pt;">Einen Freund einalden</span><br /><br /><span style=" font-size:10pt;">Um einen Freund zu Retroshare einzuladen: </span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">Kopieren Sie den Text unten und fügen Sie ihn in eine Email ein.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">und schicken Sie ihn an all Ihre Freunde!</p></body></html> + + + + LogDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> + +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="ABOUT"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">About RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShare is a private peer to peer communication platform created by Dr. Bob.This program enables you to securely share files and chat with your friends (and no-one else!).</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, and the latest release go to http://www.lunamutt.com.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="START"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Quick Start Guide to RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If this is your first time using Retroshare, it is recommended that you readthis guide for instructions on how to get started. The first step is:<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Connecting to Your Friends</span></a>. Once you have managed this you can <a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">Download Files</span></a> and<a href="#START-SHARE"><span style=" text-decoration: underline; color:#0000ff;">Share with Others</span></a></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Some of the key concepts related to ensuring your sharing remains private aredescribed in the <a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">Frequently Asked Questions</span></a>. Some Key security questions are:<a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">What is a Web of Trust?</span></a>, <a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">Should I Sign this Certificate?</span></a>, and finally<a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">What does "Trust" Mean?</span></a>.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is also worthwhile reading the <a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">GUI Overview</span></a>which describes the featureson available through the User Interface.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Connecting to your Friends </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">There are four steps to connecting to a Friend:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Get Friend's Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Load Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Sign Certificate</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect to Friend.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The instructions might initially appear long and daunting, however thesesteps are required to ensure that your sharing is private and secure.These steps are only required a couple of times, to add new friends, and become quite straight forward after the first time.</p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (1) EXCHANGE CERTIFICATES </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Before you can connect, you need send your certificate to your friend, and get your friends certificate. Follow these steps to get your certificate:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on Your Certificate to Select it.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on the "Export Friend" Button to bring up a file save dialog.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select directory to save the certificate to.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Enter desired filename. (with a file type of .pqi), and Click OK.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Email this File to your Friend. (It is recommended you put thecertificate in a zip file before sending, as some email programsdon't transmit the file correctly).</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Ask your friend to do the same.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Once you have received your friend's certificate, removed itfrom the zip file and saved it to disk, you can proceed to step (2).</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Note: This exchange of certificates is only necessary to get you started.Once you are connected to some friends the exchange of certificates becomeautomated by the autoDiscovery system. See<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">GUI: Connecting</span></a> for more information.------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (2) LOAD YOUR FRIEND'S CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Import Friend"</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select your friends certificate file, then click "Okay". Their certificate should appear in the top window of the "Connect" Tab.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (3) SIGN CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select their Certificate by clicking on their name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Configure Friend" Button. This will bring up a configuration window. which allows you to look at the detailsof the certificate.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click the "Sign Certificate" button near the bottom of the "Certificate Configuration" Window.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Now close the window by clicking on the "Done" button.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Your Friends certificate should now say "Trusted (S)", indicating it is ready for connections.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can only share with "Trusted" Peers. You must sign your Friend'scertificate to prove that you know the certificate belongs to your Friend. Do not sign any/all certificates - only the people youtrust. For more information see: <br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br />------------------------------------------------------------------------<br /><br /> <br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (4) AUTOCONNECT TO PEER </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Finally You need to activate the connection:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click in the Box, next to your friends Name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> A Tick should appear in the box, a connection will be started.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> The "Offline" will change to "Online" when you have successfullyconnected.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Remember: Your initial connection attempts will fail, until your friend has signed your certificate and ticked the Auto-Connect Box.This ensures that both peers trust each other, and stops random peopleaccessing your files.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>. <br />------------------------------------------------------------------------<br /><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-DOWNLOAD"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Downloading Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have connected to friends, you can download their shared files.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can search for the files you want using either:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) File Listing Tab: This gives you a directory view of the files being shared by your peers. Double clickon the directory name (not the arrow) to diplay its subdirectories and files.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 1: This can take up to 5 seconds to fetch the information for your peer.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 2: If the directory is empty, or the person is offline, then the request will silently fail.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Search Tab: Retroshare also allows you to search your peers computers for filenames. Enter yourterm(s) in the search box at the top of the TAB and click the "Search" button. This willsearch all of the peers that you are currently connected to.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 3: If any matching files are found they will be displayed within 5 - 10 seconds.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have found the files you want, Select the file(s), and click "Download" to begin the download process.If you click over the "File Transfer" TAB, the status of the files will appear.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 4: The files can take up to 10 seconds to appear in the transfer window.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-SHARING"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Sharing Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can specify which files you want to share in the "Config" Tab.In the "Share Directories" section, click the "Add Directory" Button, and select the directory you want to share.The files and subdirectories will become available for you peers.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can remove a directory from the Shared Directories List by clicking onthe directory name in the list, and then clicking "Remove Directory".</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="GUI"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Gui Overview (Tab Description) </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The GUI is divided up into several sections which can be accessed by clicking on the Tabs along the top of the main window. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect: Manage Connections and Friends.(<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">getting started</span></a> and<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Listing: A directory view of available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Search: Search for available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Messages: For Sending/Recving Message. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Channels: A broadcast/subscription system. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Transfer: Listing of Current and completed Transfers.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Config: Specify of share diectories and IP Addresses.(<a href="#GUI-CONFIG"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> About: Help and other Information.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Chat: Accessed by the clicking on the "Chat" button.</li></ul> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Connect Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Connect TAB consists of two windows. The upper windowshows a list of your friends. This window indicates each friendscurrent trust level, as well as their connection state.The "Trust_Lvl" Column indicates if the certificate has beenAuthenticated using the web of trust. You can only connect to "Trusted" certificates. Tick the "Auto_Connect" box to connect to your trusted friends.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The lower window provides a list of the friends of your friends.This window shows the neighbour's name and how long ago they attempted to connect to you. This window is automatically populatedby the autoDiscovery system, and should be used to expand yourretroShare network. A word of warning: Do not automatically trust (or sign) anyonethat appears in this window. First verify by some other means (email/phone)that certificate belongs to the person you think it does.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use the "Neighbour List" window to expand your friend list. Select the desired entry in the lower window by clicking on it, then click the "Add to Friends" Button to move it to the upper window.Likewise the "Remove from Friends" button moved a person from the upper window to the lower window.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The "Configure Friend" Button opens a Certificate Configuration window.This window can be used to examine the certificate details, sign the certificate or manually change the peer's IP Address.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">See Also:<br /><a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Getting Started: Connecting to your friends</span></a>.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>.<br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONFIG"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Config Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Configuration Tab allows you to select the share directories, as well as the directory that downloaded files are saved to.<br />See <a href="#STARTUP-SHARING"><span style=" text-decoration: underline; color:#0000ff;">Sharing you Files</span></a> for details. </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Config Tab also allows you to control the IP Address and Portused by RetroShare. Under most cirumstances you do not need to changethese setting. If you are behind a firewall and can setup a forwarded port, the selected IP Address and Port should be specified here.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="FAQ"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Frequently Asked Questions </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">How does the security/privacy work? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShares uses a Web of Trust Authentication system to ensurethat your "friends" are your friends, and uses SSL to encryptthe communcications between peers. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What is a Web of Trust? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Web of Trust relies on a collection of peers to identify eachother. Look it up on the Web!</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-TRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What does "Trust" Mean in RetroShare?</span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Anyone can generate a certificate, with any name on it. So howdo you know that the certificate that claims to be from "Joe Bloggs"is really from your mate Joe. This is the "AuthenticationProblem". RetroShare uses a Web of Trust to Authenticate your peers.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-SIGN"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Should I Sign this Certificate? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should only sign a certificate if you are completely surethat it comes from the "right" person. If you sign a certificateyou are "Authenticating" the person to yourself and others.If you sign certificates that you haven't checked, then you aredestroying your own privacy and security.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">How do you verify a certificate? Use an alternative method ofcommunication to send the certificate: E.g. email or USB stick. This will improve you confidence that the certificate belongsto the correct person. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><span style=" font-size:small;"> </span><a name="FAQ-CONNECT"></a><span style=" font-size:small;">W</span><span style=" font-size:small;">hy won't it Connect?</span><span style=" font-size:small;"> </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A connection can fail for a number of reasons:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) Failed Authentication. Have both peers signed each otherscertificates? </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Firewalls. If both peers are behind firewalls then they cannotconnect directly. RetroShare has a built in proxy system to circumventfirewalls - However this can only function if both peers can connect to a common third party that is not behind a firewall. Thisis the most likely reason for initial connections to fail. The only solution to find a common friend that isn't firewalled (know anyone with Broadband?)</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(3) IP Addresses are wrong. You can manually examine and change these using the Certificate configuration.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +</body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="ABOUT"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Ãœber RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">Ãœber</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Einführung</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Retroshare ist eine private Peer-to-Peer Kommunikationsplattform, geschrieben von Dr. Bob. Das Programm ermöglicht Ihnen Dateien über einen sicheren Kanal zu tauschen und mit Freunden zu chatten (und niemand anderem!).</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Für Informationen und die letzte Programm-Veröffentlichung schauen Sie bitte aufdie Seite http://www.lunamutt.com.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="START"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Schnell Start Anleitung zu RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Schnell-Links: </p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">Ãœber</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Einführung</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Falls Sie Retroshare zum ersten Mal verwenden, ist es ratsam, dass sie diese Anleitung und die enthaltenen Instruktionen lesen. Der erste Schritt ist:<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Mit den Freunden verbinden</span></a>. Wenn dies durchgeführt ist, können Sie <a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">Dateien herunterladen</span></a> und<a href="#START-SHARE"><span style=" text-decoration: underline; color:#0000ff;">und anderen zugänglich machen</span></a></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Einige der Schlüssel-Konzepte zum Sichern des Austausches bleiben private und sind in den <a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">Frequently Asked Questions</span></a> beschrieben. Einige Schlüssel-Sicherheitsfragen sind:<a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">Was ist ein Netz, dem ich vertrauen kann?</span></a>, <a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">Sollte ich dieses Zertifikat bestätigen?</span></a>, und schließlich<a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">Was heisst in diesem Fall "Vertrauen"?</span></a>.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Es ist ausserdem wertvoll den <a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">GUI Ãœberblick</span></a> zu lesen, dass beschreibt welche Funktionen über die Benutzerschnittstelle verfügbar sind.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Zu Freunden verbinden </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Es sind vier Schritte zu vollführen, damit man sich mit einem Freund verbinden kann:</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;">?</p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Besorgen Sie sich das Zertifikat eines Freundes ?</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Laden Sie das Zertifikat?</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Unterschreiben Sie das Zertifikat?</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Verbinden Sie zum Freund.</li></ul><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Die Instruktionen mögen anfangs lang undThe instructions might initially appear long und abschreckend erscheinen, jedoch sind diese Schritte notwendig um abzusichern, dass der Austausch privat und wirklich sicher ist.Diese Schritte nur ein paar Mal nötig, um neue Freunde hinzuzufügen und schneller zu agieren, nach dem ersten Mal.</p><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (1) ZERTIFIKATE AUSTAUSCHEN </span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Bevor Sie sich verbinden können, müssen Sie ein Zertifikat an Ihren Freund schicken und im Gegenzug dessen Zertifikat erhalten.Folgen Sie diesen Schritten um Ihr eigenes Zertifikat zu erhalten:</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;">?</p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab?</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Klicken Sie auf "Freunde" und dort rechts auf ihren Benutzernamen in der Liste. </li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Klicken Sie auf den "Zertifikat des Freundes exportieren" Knopf und den Speichern-Dialog zu öffnen. </li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Wählen Sie das Verzeichnis, wo Sie das Zertifikat abspeichern möchten. </li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Geben Sie den gewünschten Dateinamen ein. (z.Bsp. .pqi), und klicken Sie OK.?</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Emailen Sie die Datei zu Ihren Freunden. (Es ist empfehlenswert, das Zertifikat vor dem Senden in eine Zip-Datei zu packen, da einige EMail-Programme Probleme haben, die Datei korrekt zu versenden.) </li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Bitten Sie Ihren Freund, das Gleiche zu tun. </li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Wenn Sie Ihr Freund-Zertifikat, löschen Sie es aus der Zip-Datei und speichern Sie es auf der Disk und Sie können mit Schritt (2) fortfahren. </li></ul><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Achtung: Der Austausch der Zertifikate ist nur notwendig um zu beginnen.Wenn Sie einmal verbunden sind zu einem Freund, wird der Zertifikataustausche automatisch vom AutoDiscovery-System vorgenommen. Sehen Sie hierzu <a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">GUI: Verbinden</span></a> für weitere informationen.------------------------------------------------------------------------<br /><br /><br /></p><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (2) DAS FREUND-ZERTIFIKA LADEN </span></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;">?</p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab?</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Klicken Sie "Einen Freund hinzufügen"?</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Wählen Sie das Zertifikat ihres Freundes, dann klicken Sie "Ok".Deren Zertifikat sollte oben im Fenster "Freunde" erscheinen.</li></ul><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">------------------------------------------------------------------------<br /><br /><br /></p><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (3) ZERTIFIKAT UNTERSCHREIBEN </span></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;">?</p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Wählen Sie das Freund-Zertifikat und klicken rechts auf den Namen. </li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Klicken Sie den "Freund konfigurieren" Button. Das wird das Konfigurationsfenster anzeigen. Es erlaubt einen Blick auf die Details des Zertifikats. </li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Klicken Sie "Vertraue der Signatur" weiter unten im "Zertifikat-Konfigurations-Fenster" </li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Jetzt schließen Sie das Fenster mit deinem Klick auf den "Fertig" Button. </li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Ihre Freund-Zertifikat sollte nun "Trusted (S)" ausgeben, ein Indiz für Verbindungsaufnahmebereitschaft. </li></ul><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Sie können nur mit "Trusted" Peers Dateien tauschen. Sie müssen Ihr Freund-Zertifikat unterzeichnen (signen) um zu beweisen, dass Sie wissen, dass das Zertifikat zu Ihren Freunden gehört.Signen Sie nich nur/alle Zertifikate - deren Inhabern sie trauen. Für weitere Informationen schauen Sie in: <br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Sollte ich dieses Zertifikat bestätigen?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Was bedeutet "Trust"?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Was ist ein Netz, dem ich vertraue?</span></a>. <br />------------------------------------------------------------------------<br /><br /> <br /></p><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (4) AUTOCONNECT ZUM PEER </span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Schließlich müssen Sie die Verbindung aktivieren:?</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;">?</p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Klicken Sie in die Box in der Nähe des Freund-Namens.?</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Ein Haken sollte in der Box erscheinen und eine Verbindung wird gestartet werden.?</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Das "Offline" wird sich zu "Online" ändern, wenn Sie erfolgreich verbunden wurden. </li></ul><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Nicht vergessen:: Ihre anfänglichen Verbindungsversuche werden solange scheitern, bis Ihr Freund Ihr Zertifikat unterschrieben hat und ebenfalls die "Auto-Connect"-Box angehakt hat.Das sichert ab, dass beide Peers einander trauen und stoppt zufällige Leute, die Zugang zu Ihren Dateien versuchen zu bekommen. <br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Warum verbindet es nicht?</span></a>. <br />------------------------------------------------------------------------<br /><br /><br /></p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-DOWNLOAD"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Dateien herunterladen </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Wenn Sie einmal verbunden sind zu Freunden , können Sie ihre freigegebenen Dateien herunterladen. </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Sie können nach Dateien suchen, die Sie haben möchten, oder:</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) Datei Listing Tab:Sie erhalten eine Verzeichnis Ansicht von Dateien, die mit den Peers geteilt wird. Ein Doppelklick auf den Verzeichnis-Namen (nicht den Pfeil) zeigt die Unterverzeichnisse und Dateien. </p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ACHTUNG 1: Es kann bis zu fünf Sekunden dauern, um Informationen von Ihrem Peer zu holen. </p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ACHTUNG 2: Wenn ein Verzeiczhnis leer ist, oder eine Person offline, dann wird die Anfrage stumm fehllaufen.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Such Tab: Retroshare wird erlaubt es ebenfalls die Peer-Computer nach Dateinamen zu durchsuchen. Dieser Vorgang durchsucht alle verbundenen Peers nach Dateinamen. Geben Sie Ihre Suchausdrücke in die Suchbox oben im Tab ein und klicken Sie "Suchen". Das wird die Suche starten. </p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ACHTUNG 3: Wenn irgendwelche Dateien gefunden werden, dann werden Sie innerhalb von 5-10 Sekunden angezeigt. </p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Wenn Sie ersteinmal die Dateien, die Sie möchten, gefunden haben, klicken Sie "Download" oder "Herunterladen" um damit anzufangen. Wenn sie auf den "Dateitransfer"-Tab klicken, können Sie den Status der Dateinen begutachten. </p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ACHTUNG 4: Es kann bis zu 10 Sekunden dauern, bis die Dateien im Transfer-Fenster erscheinen. </p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-SHARING"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Dateien tauschen </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Sie können Dateinen, die Sie tauschen möchten im "Optionen"-Dialog festlegen.Im "Verzeichnisse"-Tab dort können Sie das Verzeichnis wählen, das Sie freigeben möchten.Die Dateien und Unterordner werden verfügbar für die verbundenen Peers gemacht. </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Sie können Verzeichnis von den freigebenen löschen, in dem Sie auf den Verzeichnisnamen klicken und dann auf "Verzeichnis löschen". </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="GUI"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Gui Ãœberblick (Tab Beschreibung) </span><span style=" font-size:medium;"> </span></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Schnell Links: </p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">Ãœber</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Einführung</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Die GUI ist in verschiedene Sektionen unterteilt, die per Klick auf die Tabs oben erreicht werden können. </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;">?</p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Verbindung: Verbindungen und Friends verwalten.??(<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Einführung</span></a> und??<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">weitere Informationen</span></a>)?</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Dateilisting: Eine Verzeichnis-Ansicht aller verfügbaren Dateien.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">herunterladend</span></a>)??</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Suche: Suche nache verfügbaren Dateien.?(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">herunterladend</span></a>)?</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Nachrichten: Zum Senden/Empfangen von Nachrichten. (Kommt bald)?</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Kanäle: Eine Sende/Abbonier System. (Kommt bald)?</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Dateitransfer: Auflisten von momentan und fertigen Transfers?</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Konfig: Verzeichnisse und IP-Adressen freigeben??(<a href="#GUI-CONFIG"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)?</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Ãœber: Hilfe und andere Informationen.?</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Chat: Zugriff über den "Chat" Button.</li></ul><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Das Verbindungs-Tab </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Das Verbindungs-TAB besteht aus zwei Fenstern. Das obere zeigt eine Liste Ihrer Freunde. Das zeigt für den Freund das Vertrauensniveau an, genau wie den Verbindungsstatus.Das Vertrauensniveau zeigt, ob die Zertifikate mittels Vertrauensnetzwerk authentifiziert wurden.Man kann nur zu "vertrauten" Zertifikaten verbinden. Haken Sie die "Auto-Verbinden" Box an um zu Ihren vertrauten Freunden zu verbinden.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Das untere Fenster sieht eine Liste von Freunden Ihrer Freunde vor. Das Fenster zeigt den Nachbar-Namen und wie lange sie versucht haben Sich mit Ihnen zu verbinden. Das Fenster wird automatisch gefüllt vom AutoDiscovery System und sollte verwendet werden um Ihre Netzwerkkontakte zu vergrössern.Ein warnendes Wort: Trauen (oder bestätigen) Sie nicht automatisch jedem, der in diesem Fenster erscheint. Verifizieren Sie erst durch jemanden anderen, bedeutet (email/Telefon), dass das Zertifikat wirklich zu der Person gehört, die sie vorgibt zu sein.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Verwenden des "Nachbarliste"-Fensters um Ihre Freundesliste zu vergrössern. Wählen Sie den gewünschten Eintrag im unteren Fenster durch daraufklicken, dann klicken Sie den "Als Freund hinzufügen" Button um Ihn in den oberen Teil des Fensters zu verschieben. Analog verschiebt der "Freund entfernen" Button eine Person vom oberen in das untere Fenster.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Der "Freund konfigurieren" Button öffnet ein Zertifikat-Konfigurationsfenster. Das Fenster kann verwendet werden um Zertifikatdetails zu begutachten, Zertifikate zu bestätigen oder selber die IP-Adresse des Freundes zu ändern.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Sehen Sie hierzu auch:<br /><a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Einführung: Mit Freunden verbinden</span></a>.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Warum verbindet es nicht?</span></a>.<br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Sollte ich dieses Zertifikat bestätigen?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Was bedeutet "Vertraulichkeit"?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Was ist ein Netz, dem ich vertraue?</span></a>. <br /></p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONFIG"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Das Konfig-Tab </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Das Verbindungs-Tab erlaubt Ihnen freigebene Verzeichnisse auszuwählen, genau wie Verzeichnisse, von denen heruntergeladene Verzeichnisse gespeichert wurden.<br />Sehen Sie auch hierzu <a href="#STARTUP-SHARING"><span style=" text-decoration: underline; color:#0000ff;">Freigeben von Dateien</span></a> für weitere Details an.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Das Konfig-Tab erlaubt Ihnen ebenfalls die IP-Adresen und Ports, verwendet von Retroshare, zu kontrollieren. Under der meisten Umständen müssen Sie hier nichts an dieser Einstellung ändern.Wenn Sie hinter einer Firewall sind und einen Forward-Port einrichten können, dann sollte die ausgewählte IP-Adresse und der Port hier festgelegt werden.</p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="FAQ"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">FAQ (Häufig gestellte Fragen)</span><span style=" font-size:medium;"> </span></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Schnell-Links: </p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">Ãœber</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Einleitung</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Wie funktioniert die Sicherheit/Privatsphäre?</span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Retroshare verwendet ein Vertrauensnetzwerk-Systen um abzusichern, das Ihre "Freunde" wirklich Ihre Freunde sind und ebenfalls verwendet es SSL um die Kommunikation zu verschlüsseln zwischen den verbundenen Parteien.</p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Was ist ein Vertrauensnetzwerk? </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ein Vertrauensnetzwerk ist eine Sammlung von Peers um jeden anderen zu identifizieren.Suchen Sie danach im Web!</p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-TRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Was bedeutet "Vertrauen" in RetroShare?</span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Jeder kann ein Zertifikat generieren, mit irgendeinem Namen in demselben. Also wie weiss man, ob das Zertifikat das von "Joe Bloggs" zu kommen scheint, wirklich von Ihrem Bekannten Joe ist?Das ist das "Authetifizierungsproblem". Retroshare verwendet a Vertrauensnetzwerk um Peers zu authentifizieren.</p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-SIGN"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Sollte ich diese Zertifikat bestätigen? </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Sie sollten ein Zertifikat bestätigen, wenn sie vollständig sicher sind, dass es von der "richtigen" Person kommt. Wenn Sie ein Zertifikat bestätigen, sind "Authentifizierende" diese Person für Sie und andere. Wenn Sie ein Zertifikat bestätigen, das Sie nicht überprüft haben, dann zerstören Sie Ihre Privatsspäre und Sicherheit.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Wie überprüft man ein Zertifikat? Verwenden Sie eine alternative Kommunitaktionsmethode umd um das Zertifikat zu senden, z.Bsp. Email oder USB-Stick. Das erhöht die Sicherheit des Vertrauens erheblich, dass das Zertifikat der richtigen Person gehört.</p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><span style=" font-size:small;"> </span><a name="FAQ-CONNECT"></a><span style=" font-size:small;">W</span><span style=" font-size:small;">arum verbindet es nicht?</span><span style=" font-size:small;"> </span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Eine Verbindung kann aus unterschiedlich Gründen fehlschlagen:</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) Fehlgeschlagene Authentifizierung. Haben beide Peers gegenseitig die Zertifikate bestätigt?</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Firewalls. Wenn beide Peers hinter einer Firewall sind, dann kann Retroshare nicht direkt verbinden.Retroshare besitzt ein eingebautes Proxysystem, um Firewalls zu umgehen. - Wie auch immer, dies kann nur funktionieren, wenn beide Peers zu einer dritten Peer verbindet, der nicht hinter einer Firewall ist. Dies ist der häufigste Grund dafür, dass eine erste Verbindung fehlschlägt. Die einzige Lösung ist, einen gemeinsamen Freund zu finden, der nicht "firewalled" ist.(Kennen Sie einen mit Breitband?)</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(3) IP Adressen sind falsch.Sie können selbst manuell untersuchen und diese ändern, in dem Sie die Zertifikat-Konfiguation verwenden.</p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Schenll-Links: </p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">Ãœber</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Einführung</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table></body></html> + + + + MainWindow + + + Preferences + Präferenzen + + + + Network + Netzwerk + + + + Friends + Freunde + + + + Transfers + Transfers + + + + Messages + E-Mail-Nachrichten + + + + Channels + Kanäle (Channels) + + + + Options + Optionen + + + + Users: 0 Files: 0 + Users: 0 Files: 0 + + + + Down: 0.0 Up: 0.0 + Down: 0.0 Up: 0.0 + + + + Connections: 0/45 + Verbindungen: 0/45 + + + + System tray is unavailable + Der System Tray ist nicht verfügbar + + + + System tray unavailable + System Tray nicht verfügbar + + + + RetroShare System tray + Retroshare System Tray + + + + Application will continue running. Quit using context menu in the system tray + Das Programm läuft weiter. Beenden über Kontext-Menü im System Tray (neben der Uhr). + + + + Hide + Verbergen + + + + Show + Zeigen + + + + RetroShare + Retroshare + + + + Home + Home + + + + General + Allgemein + + + + Invite Friend + Freund einladen + + + + Add Friend + Freund hinzufügen + + + + Add Share + Dateien freigeben + + + + Advanced + Erweitert + + + + Exit + Beenden + + + + Search + Suchen + + + + Files + Dateien + + + + Chat + Gruppen-Chat + + + + Add Shared Directory + Freigabeverzeichnis hinzufügen + + + + About/Help + Ãœber/Hilfe + + + + Messenger + Nachrichtendienst + + + + Show/Hide + Anzeigen/Verbergen + + + + &Quit + &Schliessen + + + + Bandwidth Graph + Bandbreiten-Graph + + + + Open Messenger + Nachrichtendienst öffnen + + + + RetroShare %1 + RetroShare %1 + + + + Add a Friend + Einen Freund hinzufügen + + + + Invite a Friend + Einen Freund einladen + + + + Add a Share + Eine Freigabe hinzufügen + + + + Quit + Schliessen + + + + Minimize + Minimieren + + + + Maximize + Maximieren + + + + Hide Console + Konsole verbergen + + + + Show Console + Konsole anzeigen + + + + Hide ToolBox + Toolbox verbergen + + + + :images/hide_toolbox_frame.png + :images/hide_toolbox_frame.png + + + + Show ToolBox + ToolBox anzeigen + + + + :images/show_toolbox_frame.png + :images/show_toolbox_frame.png + + + + QTextBrowser { + background-color: rgb(192,192,192); + + } + QTextBrowser { background-color: rgb(192,192,192); } + + + + QPushButton + { + border-image: url(:/images/console-small-up.png) + } + + QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + + } + + QPushButton:pressed { + border-image: url(:/images/console-small-down.png) + } + + QPushButton { border-image: url(:/images/console-small-up.png) } QPushButton:hover { border-image: url(:/images/console-small-hover.png) } QPushButton:pressed { border-image: url(:/images/console-small-down.png) } + + + + Apps + + + + + MessageToaster + + + message + anschreiben + + + + MessagesDialog + + + New Message + Neue Nachricht + + + + Reply to Message + Auf die Nachricht antworten + + + + Remove Message + Nachricht entfernen + + + + Date + Datum + + + + From + Von + + + + Title + Betreff + + + + Msg + Text der Nachricht + + + + Count + Zähler + + + + Size + Grösse + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Recommended Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Empfohlene Dateien</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">remove selected message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ausgewählte Nachricht entfernen</p></body></html> + + + + QPushButton +{ +border-image: url(:/images/deletemail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/deletemail-hover.png); +} + QPushButton{border-image: url(:/images/deletemail24.png);}QPushButton:pressed{border-image: url(:/images/deletemail-hover.png);} + + + + Inbox + E-Mail-Eingang + + + + Outbox + E-Mail-Ausgang + + + + Draft + Entwürfe + + + + Sent + Gesendete E-Mails + + + + Timestamp + Zeitpunkt + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">reply to selected message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Auf die ausgewählte Email antworten</p></body></html> + + + + +QPushButton +{ +border-image: url(:/images/replymail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/replymail-hover.png); +} + + QPushButton{border-image: url(:/images/replymail24.png);}QPushButton:pressed{border-image: url(:/images/replymail-hover.png);} + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">New Message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Neue Nachricht</p></body></html> + + + + QPushButton +{ +border-image: url(:/images/folder-draft24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/folder-draft24-hover.png); +} + + QPushButton{border-image: url(:/images/folder-draft24.png);}QPushButton:pressed {border-image: url(:/images/folder-draft24-hover.png);} + + + + You get Message testing + Du bekommst eine Testnachricht + + + + Download All + Alle herunterladen + + + + QPushButton +{ +border-image: url(:/images/deletemail24.png); +} + +QPushButton:hover +{ +border-image: url(:/images/deletemail-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/deletemail-pressed.png); +} + + + + + +QPushButton +{ +border-image: url(:/images/replymail24.png); +} + +QPushButton:hover +{ +border-image: url(:/images/replymail24-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/replymail-pressed.png); +} + + + + + + QPushButton +{ +border-image: url(:/images/folder-draft24.png); +} +QPushButton:hover +{ +border-image: url(:/images/folder-draft24-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/folder-draft24-pressed.png); +} + + + + + + MessengerWindow + + + Chat + Unterhaltung + + + + Connect To Friend + Zum Freund verbinden + + + + QWidget#MessengerWindow { +background-color: #ECF3F6; background-image:url(:/images/backgroundimage.png); +background-position: top right; +background-repeat: no-repeat +} + QWidget#MessengerWindow {background-color: #ECF3F6; background-image:url(:/images/backgroundimage.png);background-position: top right;background-repeat: no-repeat} + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click to change your avatar</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Klicken, um den Avatar zu ändern</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Change your Status and your display</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">picture here.</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ändern Sie Ihren Status und zeigen Sie hier</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ihr Bild an.</p></body></html> + + + + Online + Online + + + + Busy + Beschäftigt + + + + Be right Back + Bin gleich wieder da + + + + Away + Abwesend + + + + In a Call + Am Telefonieren + + + + Out of lunch + Zum Mittagessen + + + + Apear Offline + Scheint offline + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Share a personal message with your contacts</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ändern Sie Ihren Status und zeigen Sie hier</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ihr Bild an.</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Add a Friend</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Einen Freund hinzufügen</p></body></html> + + + + NetworkDialog + + + Peer Details / Authenticate + Details zum Peers / Bestätigen (Authenticate) + + + + Load Certificate + Zertifikat laden + + + + Select a pem/pqi File + Wählen einer PEM- oder PQI-Datei + + + + File Not Found + Datei nicht gefunden + + + + %1 does not exist. Would you like to create it? + %1 ist nicht vorhanden. Möchtem Sie es jetzt erstellen? + + + + Failed to Create File + Es ist nicht gelungen, die Datei zu erstellen + + + + Unable to create %1 [%2] + Kann nicht erstellt werden %1 [%2] + + + + Select Certificate + Zertifikat auswählen + + + + Certificates (*.pqi *.pem) + Zertifikate (*.pqi *.pem) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Netzwerk:</span></p></body></html> + + + + # + # + + + + Accept + Bestätigen + + + + Trust + Vertrautheit + + + + Last Contact + Letzter Kontakt + + + + Name + Name + + + + Peer Address + Adresse des Peers + + + + Organisation + Organisation + + + + Location + Ort + + + + Country + Land + + + + Cert Id + ID des Zertifikates + + + + Auth Code + Bestätigungs-(AUTH)-Code + + + + NetworkPage + + + Rate Options + Geschwindigkeits-Optionen + + + + Max Total Data Rate (KB/S): + Deine max. Uploadgeschwindigkeit (in KB/S): + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Rate per Person (KB/S):</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Transfer-Geschwindigkeit pro Person (KB/S):</p></body></html> + + + + PeersDialog + + + Chat + Chat + + + + Configure Friend + Freund konfigurieren + + + + Export Friend + Zertifikat des Freundes exportieren + + + + Remove Friend + Freund entfernen + + + + Save Certificate + Zertifikat speichern + + + + Certificates (*.pqi) + Zertifikate (*.pqi) + + + + Status + Status + + + + Person + Person + + + + Auto Connect + Auto-Verbindung + + + + Trust Level + Vertrauensniveau + + + + Peer Address + Adresse des Peers + + + + Last Contact + Letzter Kontakt + + + + Organisation + Organisation + + + + Location + Ort + + + + Country + Land + + + + Person Id + personale ID + + + + Auth Code + AUTH Code + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Friends</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Freunde</span></p></body></html> + + + + Connect To Friend + Verbinde zum Freund + + + + # + # + + + + PopupChatDialog + + + RetroShare Friend Chat + Retroshare Chat zum Freund + + + + RetroShare User Chat + RetroShare User Chat + + + + PreferencesDialog + + + Language + Sprache + + + + Style + Stil + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Die veränderte Einstellung der Sprache wird sich erst nach einem Neustart von Retroshare auswirken!</p></body></html> + + + + Style Sheet + Style Auswahl + + + + Default + Standard + + + + Pagefold + Pagefold + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose RetroShare's interface style</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Wählen Sie den Look der Benutzeroberfläche von Retroshare</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose the language used in RetroShare</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Wählen Sie die Sprache für Retroshare</p></body></html> + + + + blue + blau + + + + silver + silber + + + + ed2k + emule-ed2k + + + + over + über + + + + black + schwarz + + + + arachnophobia + arachnophobia + + + + Skin2 + Skin2 + + + + Login + Login + + + + Remove Auto Login + Entferne Auto-Login + + + + PreferencesWindow + + + Directories + Verzeichnisse + + + + Error Saving Configuration + Fehler beim Speicherung der Einstellungen + + + + About + Ãœber + + + + General + Allgemein + + + + Server + Peer-Einstellungen + + + + Options + Optionen + + + + Cancel + Abbrechen + + + + OK + OK + + + + QObject + + + And + Und + + + + Or + Oder + + + + And / or + Und / oder + + + + Name + Name + + + + Path + Pfad + + + + Extension + Erweiterung + + + + Keywords + Schlüsselwörter + + + + Comments + Komentare + + + + Meta + Meta + + + + Date + Datum + + + + Size + Grösse + + + + Popularity + Beliebtheit + + + + contains + enthält + + + + contains all + enthält alles + + + + is + ist + + + + less than + kleiner als + + + + less than or equal + kleiner als oder gleich + + + + equal + gleich + + + + greater than or equal + grösser als oder gleich + + + + greater than + grösser als + + + + is in range + im Bereich + + + + and + + + + + and / or + + + + + or + + + + + equals + + + + + Rshare + + + Invalid language code specified: + Ungültige Sprach-Codierung ausgewählt: + + + + Invalid GUI style specified: + Ungültigen Stil der Benutzeroberfläche ausgewählt: + + + + SearchDialog + + + File Name + Dateiname + + + + Sources + Quellen + + + + Search Pattern + Such-Eingabe + + + + Results + Ergebnisse + + + + File Size + Größe + + + + Download + Herunterladen + + + + Broadcast on Channel + Im Kanal bekanntgeben + + + + Recommend to Friends + Freunden empfehlen + + + + Remove + Entfernen + + + + Remove All + Alle Entfernen + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Keywords</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Keywords</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Format</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Format</p></body></html> + + + + Any + Alle + + + + Audio + Audio + + + + Video + Video + + + + Images + Bilder + + + + Programs + Programme + + + + Archives + Archive + + + + Documents + Dokumente + + + + search + Suchen + + + + download + Herunterladen + + + + Toggle advanced searching on and off. + Schaltet erweiterte Suchfunktionen an- oder ab. + + + + <h3>Simple Search:</h3> + <h3>Einfache Suche:</h3> + + + + Keywords + Schlüsselwörter + + + + Perform simple search + Einfache Suche durchführen + + + + <h3>Advanced Search: <i>disabled</i></h3> + <h3>Erweiterte Suche: <i>abgeschaltet</i></h3> + + + + Show Advanced Search Tool + Zeige erweiterte Suchmöglichkeit + + + + Filename + Dateiname + + + + Hash + Prüfsumme + + + + KeyWords + Schlüsselwörter + + + + Search Id + Such ID + + + + <h3>Advanced Search:</h3> + + + + + ServerDialog + + + Transfer Rates + Ãœbertragungsgeschwindigkeit + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Total Rate (kb/s) </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Gesamtübertragungsrate (kb/s) </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Per Person </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Pro Person </p></body></html> + + + + Server Settings + Einstellungen des Peers + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + + + + Port: + Port: + + + + behind zee Firewall + Hinter einer Firewall + + + + Forwarded External Port + Externer Port wird im Router weitergeleitet + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Externe Adresse:</p></body></html> + + + + Check Settings + Ãœberprüfe die Einstellungen + + + + Firewall/Router Configuration + Firewall/Router Konfiguration + + + + Manual router setup. + Manuelle Routereinstellung. + + + + Use uPnP to configure router + uPnP verwenden, um Router zu konfigurieren + + + + Network Address Configuration (takes effect after restart) + Netzwerk Address-Konfiguration (funktioniert erst nach Neustart) + + + + Use DHT to locate friends + DHT verwenden um Freunde zu lokalisieren + + + + Manual IP Addresses + Manuelle IP-Adressen + + + + Server Status And Network Settings + Server-Status und Netzwerkeinstellungen + + + + Firewalled + Firewalled + + + + Forwarded Port + Weitergeleiteter Port + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">DHT Status</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">DHT Status</p></body></html> + + + + uPnP Status + uPnP Status + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Local Address:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokale Adresse:</p></body></html> + + + + ServerPage + + + Change + Restart Server + Ändern und Server neustarten + + + + Server Settings + Einstellungen dieses Peers + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Externe Adresse:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokale Adresse:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + + + + Port: + Port: + + + + Misc + Verschiedenes + + + + behinde Firewall + Hinter einer Firewall + + + + Forwarded External Port + Externer Port wird im Router weitergeleitet + + + + Settings + + + Settings + Einstellungen + + + + Cancel + Abbrechen + + + + Apply + Bestätigen + + + + OK + OK + + + + General + Allgemein + + + + Network + Netzwerk + + + + Server + Einstellungen dieses Peers + + + + Directories + Verzeichnisse + + + + SharedFilesDialog + + + Download + Herunterladen + + + + Recommend + Empfehlen + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Dateien</span></p></body></html> + + + + Add to Recommend List + Zur Empfehlungsliste hinzufügen + + + + Recommend To + Empfohlen an + + + + Message Friend + Freund benachrichtigen + + + + StartDialog + + + Select Trusted Friend + Wähle vertrauten Freund + + + + Certificates (*.pqi *.pem) + Zertifikat (*.pqi *.pem) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:13pt; font-weight:600; color:#8b0000;">Welcome to RetroShare</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:13pt; font-weight:600; color:#8b0000;">Willkommen bei Retroshare</span></p></body></html> + + + + Please Login .... + Bitte Einloggen.... + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Pasword</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Pasword</span></p></body></html> + + + + Load Existing User + Lade bestehenden Nutzer + + + + Or create a New User + Oder erstelle einen neuen Nutzer + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Organisation:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Organisation:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Land:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Location:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Ort:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Password (Again)</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Password (Again)</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">New Password</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">New Password</span></p></body></html> + + + + Load Trusted Certificate (Optional) + Lade vertrautes Zertifikat (Optional) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Freund</span></p></body></html> + + + + Select File + Wähle Datei + + + + Generate New Certificate + Erstelle ein neues Zertifikat + + + + RetroShare setup + Retroshare Setup + + + + Automatically Login in Future + zukünftig automatisch einloggen + + + + RetroShare + Retroshare + + + + QWidget { + background-color: #ECF3F6; +} + QWidget { background-color: #ECF3F6;} + + + + Auto-login + Auto-login + + + + Name: + Name: + + + + QToolButton{ +border-image: url(:/images/mystatus_bg.png); +background-image: url(:/images/amsn.png); +} + + QToolButton{border-image: url(:/images/mystatus_bg.png);background-image: url(:/images/amsn.png);} + + + + Log In + Log In + + + + Password: + Passwort: + + + + Create a Account + + + + + QToolButton{ +border-image: url(:/images/avatar_background.png); + +} + + + + + + StatisticDialog + + + Statistics + Statistiken + + + + Download + Herunterladen + + + + Session: + Sitzung: + + + + Downloaded: + Heruntergeladen: + + + + Average Downloadspeed: + Durchschnittliche Geschwindigkeit beim Herunterladen: + + + + Count of Downloads: + Anzahl an heruntergeladenen Dateien: + + + + Overall + Insgesamt + + + + Upload + Hochladen + + + + Session + Sitzung + + + + Uploaded: + Hochgeladen: + + + + Average Uploadspeed: + Durchschnittliche Geschwindigkeit beim Hochladen: + + + + Count of Uploads: + Anzahl an hochgeladenen Dateien: + + + + Uploaded + Hochgeladen + + + + Connections: + Verbindungen: + + + + Peers: + Peers: + + + + Misc + Verschiedenes + + + + Uptime: + Laufzeit online: + + + + Overall: + Insgesamt: + + + + Uptime + Laufzeit online + + + + Records + Rekorde + + + + Uploadspeed: + Geschwindigkeit beim Hochladen: + + + + Downloadspeed: + Geschwindigkeit beim Herunterladen: + + + + Show Settings + Einstellungen anzeigen + + + + Reset + Reset + + + + Receive Rate + Eingehend + + + + Send Rate + Ausgehend + + + + Always On Top + Immer obenauf + + + + 100 + 100 + + + + % Opaque + % Transparent + + + + Changes the transparency of the Bandwidth Graph + Verändert die Transparentz des Bandbreitengraphen + + + + Save + Speichern + + + + Cancel + Abbrechen + + + + Hide Settings + Einstellungen verbergen + + + + TransfersDialog + + + Cancel + Abbrechen + + + + Clear Completed + Fertige ausblenden + + + + File Name + Dateiname + + + + Sources + Quellen + + + + Status + Status + + + + File Size + Größe + + + + Speed + Geschwindigkeit + + + + Progress + Fortschritt + + + + Completed + Fertiggestellt + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Downloads:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Herunterladend:</span></p></body></html> + + + + Peer Name + Benutzername + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Uploads:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Hochladend:</span></p></body></html> + + + + Name + i.e: file name + Name + + + + Size + i.e: file size + Grösse + + + + Progress + i.e: % downloaded + Fortschritt + + + + Speed + i.e: Download speed + Geschwindigkeit + + + + Sources + i.e: Sources + Quellen + + + + Remaining + i.e: Estimated Time of Arrival / Time left + Verbleibend + + + + Core-ID + Kern-ID + + + + User Name + i.e: user name + Benutzername + + + + Progress + i.e: % uploaded + Fortschritt + + + + Speed + i.e: upload speed + Geschwindigkeit + + + + Transferred + Ãœbertragen + + + + ULListDelegate + + + B + B + + + + KB + kB + + + + MB + MB + + + + GB + GB + + + + VMessageBox + + + OK + OK + + + + Cancel + Abbrechen + + + + Yes + Ja + + + + No + Nein + + + + Help + Hilfe + + + + Retry + Erneut versuchen + + + + Show Log + Log anzeigen + + + + Show Settings + Einstellungen anzeigen + + + + moreinfo + + + Details + Details + + + + OK + OK + + + + Name + Name + + + + Value + Wert + + + diff --git a/retroshare-gui/src/lang/retroshare_dk.qm b/retroshare-gui/src/lang/retroshare_dk.qm new file mode 100644 index 000000000..dbda8f7cf Binary files /dev/null and b/retroshare-gui/src/lang/retroshare_dk.qm differ diff --git a/retroshare-gui/src/lang/retroshare_dk.ts b/retroshare-gui/src/lang/retroshare_dk.ts new file mode 100644 index 000000000..a38c027ec --- /dev/null +++ b/retroshare-gui/src/lang/retroshare_dk.ts @@ -0,0 +1,3545 @@ + + + + + + + Arial + + + + + AddFriendDialog + + + Cancel + Afbryd + + + + Done + Færdig + + + + Load From File + Hent fra fil + + + + RetroShare + RetroShare + + + + Certificate Load Failed + Certifikat indlæsning fejlede + + + + Add a Friend + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"><span style=" font-size:16pt;">Add a new Friend</span><br /><br /><span style=" font-size:10pt;">To add a new Friend, cut and paste their email </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">invitation into the box below, and click done.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + + + + + AddFriendWizard + + + < Back + + + + + Next > + + + + + Cancel + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">This Wizard helps to Connect to your Friends</span></p></body></html> + + + + + I have a .pqi/.pem file received from a Friend + + + + + I have Key received from a Friend + + + + + I want to invite a friend to my RetroShare network + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Cut and paste the text below into an email.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;"> and send it to all your friends!</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">When you press next RetroShare will attempt to launch a Email client.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Invite your Friends to join with RetroShare</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Enter the Key code you got from your friend:</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">When you press next RetroShare will attempt to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">connect using the key.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Select a pqi/pem file:</span></p></body></html> + + + + + Browse + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">When you press next RetroShare will attempt to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">connect using the .pqi/.pem file.</p></body></html> + + + + + Add Friend to my netowork Wizard + + + + + AdvancedSearchDialog + + + RetrosShare: Advanced Search + + + + + Add a further search criterion. + + + + + Add a selection criterion + + + + + Reset + + + + + Cancels the search. + + + + + Cancel + + + + + Perform the advanced search. + + + + + Search + + + + + Search Criteria + + + + + Reset the search criteria. + + + + + ApplicationWindow + + + RetroShare %1 + + + + + Example Application + + + + + Application Users: 0 Files: 0 + + + + + Down: 0.0 Up: 0.0 + + + + + Connections: 0/45 + + + + + Hide + + + + + Show + + + + + RetroShare + + + + + Home + + + + + General + + + + + Advanced + + + + + QTextBrowser { + background-color: rgb(192,192,192); + + } + + + + + QPushButton + { + border-image: url(:/images/console-small-up.png) + } + + QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + + } + + QPushButton:pressed { + border-image: url(:/images/console-small-down.png) + } + + + + + + AuthorizationDialog + + + Authenticate + Autorisér + + + + Authenticate Friend By Entering Their Code + Autorisér ven ved at indtaste deres kode + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + + + + OK + O.k. + + + + Cancel + Afbryd + + + + BandwidthGraph + + + RetroShare Bandwidth Usage + + + + + Show Settings + + + + + Reset + + + + + Receive Rate + + + + + Send Rate + + + + + Always on Top + + + + + Style + + + + + Changes the transparency of the Bandwidth Graph + + + + + 100 + + + + + % Opaque + + + + + Save + + + + + Cancel + + + + + Since: + + + + + Hide Settings + + + + + CallToaster + + + Message + + + + + ChanCreateDialog + + + Create a new Broadcast Channel + Opret en ny udsendelseskanal + + + + Create A New Broadcast Channel + Opret en ny udsendelseskanal + + + + Channel Name: + Kanalnavn: + + + + Type: + Type: + + + + Public Channel (Signed) + Offentlig kanal (signeret) + + + + Private Channel (Encrypted) + Privat kanal (krypteret) + + + + Cancel Channel + Afbryd kanal + + + + Create Channel + Opret kanal + + + + ChanMsgDialog + + + Compose + Komponér + + + + Recommended Files + Anbefalede filer + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-weight:400;"><span style=" font-weight:600;">Subject:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-weight:400;"><span style=" font-weight:600;">Subject:</span></p></body></html> + + + + Send To: + Send til: + + + + Send + Send + + + + Delete Channel + Slet kanal + + + + Create Channel MSG + Opret kanal MSG + + + + 1 + + + + + Reply + + + + + ChannelsDialog + + + New Message + Ny besked + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Messages</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Messages</span></p></body></html> + + + + Date + Dato + + + + Rank + Placering + + + + From + Fra + + + + Title + Titel + + + + Msg + Msg + + + + Count + Antal + + + + Size + Størrelse + + + + Type + Type + + + + Rs[Cert/Chan]IdSize + Rs[Cert/Chan]IdSize + + + + RsMsgId + RsMsgId + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Message Text</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Recommended Files</span></p></body></html> + + + + + New Channel + Ny kanal + + + + Subscribe To Channel + Abonnér pÃ¥ kanal + + + + Unsubscribe To Channel + Frameld kanal + + + + Delete Your Channel + Slet din kanal + + + + Download + Hent + + + + Download All + Hent alle + + + + ChatDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:9pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:400;"></p></body></html> + + + + + Chat History: + Samtale historik: + + + + Chat With: + Tal med: + + + + Chat + Samtale + + + + Users: + + + + + ChatToaster + + + message + besked + + + + You Get a New Message + Du fÃ¥r en ny besked + + + + Message + + + + + ConfCertDialog + + + Cancel + Afbryd + + + + Done + Færdig + + + + Apply + Anvend + + + + Peer Settings + Peer indstillinger + + + + Port: + Port: + + + + behind zee Firewall + bag zee firewall + + + + Forwarded External Port + Vidresendte ekstern port + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Max Transfer Rate (kb/s) </p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Org / Loc:</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Country/State:</p></body></html> + + + + + Trust Settings + Trust indstillinger + + + + Trust Level + Trust niveau + + + + Trust Their Signature + Stol pÃ¥ deres signatur + + + + Sign The Certificate + Underskriv certifikatet + + + + OK + + + + + Peer Adress + + + + + Peer Info + + + + + ConfirmQuitDialog + + + Exit RetroShare + + + + + You are about to exit the RetroShare application and therefore stop all transfers. <br><br>Are you sure you want to stop and exit RetroShare? + + + + + Do not show this message again. + + + + + ConnectDialog + + + Peer Details + Peer detaljer + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Org:</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Trust:</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Loc:</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Certificate</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">signers:</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + + + + + Make Friend + Bliv venner + + + + Close + Luk + + + + ConnectionsDialog + + + Load Certificate + Hent certifikat + + + + Select a pem/pqi File + Vælg en pem/pqi fil + + + + File Not Found + Fil ikke fundet + + + + %1 does not exist. Would you like to create it? + %1 findes ikke. Vil du oprette den? + + + + Failed to Create File + Kunne ikke oprette fil + + + + Unable to create %1 [%2] + Kunne ikke oprette %1 [%2] + + + + Select Certificate + Vælg certifikat + + + + Certificates (*.pqi *.pem) + Certifikater (*.pqi *.pem) + + + + Accept + Acceptér + + + + Trust + Trust + + + + Last Contact + Sidste kontakt + + + + Name + Navn + + + + Organisation + Organisation + + + + Location + Lokation + + + + Country + Land + + + + Peer Address + Peer adresse + + + + Cert Id + Cert Id + + + + Auth Code + Auth Kode + + + + Peer Details / Authenticate + Peer detaljer / Autorisér + + + + CryptographyDialog + + + RSA Key Size + + + + + Rijndael Block size + + + + + 128 Bits + + + + + 192 Bits + + + + + 256 Bits + + + + + Rijndael Key Size + + + + + Rijndael Mode + + + + + CBC + + + + + ECB + + + + + CFB + + + + + Rijndael Padding + + + + + PKCS7 + + + + + Zeros + + + + + ANSIX923 + + + + + ISO10126 + + + + + Rijndael Feedback Size + + + + + Key Size: + + + + + Block Size: + + + + + Feedback Size: + + + + + Mode: + + + + + Padding: + + + + + DLListDelegate + + + B + + + + + KB + + + + + MB + + + + + GB + + + + + DirectoriesDialog + + + Shared Directories + + + + + Other Directories + + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Incoming Files</span></p></body></html> + + + + + Add Shared Directory + + + + + DirectoriesPage + + + Shared Directories + + + + + Incoming files + + + + + ExampleDialog + + + Vote Up + + + + + Vote Down + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Friends</span></p></body></html> + + + + + # + + + + + Status + + + + + Person + + + + + Auto Connect + + + + + Trust Level + + + + + Peer Address + Peer adresse + + + + Last Contact + Sidste kontakt + + + + Organisation + Organisation + + + + Location + Lokation + + + + Country + Land + + + + Person Id + + + + + Auth Code + Auth Kode + + + + ExprParamElement + + + to + + + + + ignore case + + + + + dd.MM.yyyy + + + + + KB + + + + + MB + + + + + GB + + + + + ExpressionWidget + + + Expression Widget + + + + + Delete this expression + + + + + FileHashDialog + + + Download + + + + + GSettingsWin + + + General + + + + + Network + + + + + Directories + + + + + Server + + + + + %1 + + + + + GenCertDialog + + + RetroShare setup + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16pt;">Generate a new profile</span><br /><br />Please fill in the information which will<br />allow your RetroShare to connect to</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Friends.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Organisation:</p></body></html> + + + + + Password (Again) + + + + + Location: + + + + + Load Trusted Certificate (Optional) + + + + + Password + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + + + + + Select File + + + + + Country: + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + + + + + Generate New Certificate + + + + + Select Trusted Friend + + + + + Certificates (*.pqi *.pem) + Certifikater (*.pqi *.pem) + + + + GeneralPage + + + Keys manager + + + + + Style + + + + + Choose RetroShare's interface style + + + + + Language + + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + + + + + Choose the language used in RetroShare + + + + + GraphFrame + + + Recv: + + + + + %1 KB/s + + + + + Sent: + + + + + %1 KB + + + + + %1 MB + + + + + %1 GB + + + + + HelpDialog + + + About + + + + + Authors + + + + + Thanks to + + + + + Translation + + + + + License Agreement + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">About/Help</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:xx-large; font-weight:600; color:#0000ff;">About RetroShare.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-weight:600;">Retroshare is a private and secure decentralised commmunication platform.<br />You can use it chat, send messages and share files with your friends.</span><br /><br />This is just a placeholder page for the moment. You can<br />improve retroshare's in-built help (this text) by<br />updating the retroshare wiki: <a href="http://retroshare.wiki.sourceforge.net/help_tab"><span style=" text-decoration: underline; color:#0000ff;">This Page in the retroshare Wiki</span></a><br /><br />The About/Help Tab is regularly updated from the Wiki page.<br /><br />External Links to more information:<br /></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.sourceforge.net"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Webpage</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.wiki.sourceforge.net/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Wiki</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://sourceforge.net/projects/retroshare/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Project Page</span></a></li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.lunamutt.com"><span style=" text-decoration: underline; color:#0000ff;">Lunamutt Homepage.</span></a></li></ul></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-size:19pt; font-weight:600; color:#0000ff;">The RetroShare Team:</span><br /> <br /><span style=" font-size:9pt; color:#0000ff;">defnax</span>: Lead GUI developer <br /><span style=" font-size:9pt; color:#0000ff;">drbob7</span>: Lead Core developer. <br /> <br /><span style=" font-size:9pt; color:#0000ff;">bmeck</span> : Our new web-developer. Joined retroshare a couple <br />of weeks ago, and already starting on an exciting new <br />design for the web-page. <br /> <br /><span style=" font-size:9pt; color:#0000ff;">noragen</span> : Developer from the SIM-IM project. Working on a retroshare plugin to SIM-IM. <br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">kernelpanix</span> : Gui and skin developer</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">libris</span><span style=" font-size:9pt;">:</span> core developer</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-size:9pt; color:#0000ff;">kashif: </span><span style=" color:#000000;">core developer</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt; color:#000000;"><span style=" font-size:8pt;"><br /></span><span style=" color:#0000ff;">agent725</span><span style=" font-size:8pt;">: Manages the 'local' Retroshare release, <br />and beta-testing retroshare on a large scale. <br /> <br /></span><span style=" color:#0000ff;">the_mgt</span><span style=" font-size:8pt;">: Maintains the Gentoo and generic linux <br />installation/compilation scripts. </span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">notdefine:</span> Maintains the .rpm, .deb installation/compilation scripts.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">zhouk</span>: developer</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Translators:</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Serbian</span>: Kunalagon Umuhanik &lt;kunalagon@gmail.com&gt;</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Polish: </span>Jarek</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">French</span>:Temet</p></body></html> + + + + + InviteDialog + + + Done + Færdig + + + + Cancel + + + + + Launch Email + + + + + Invite a Friend + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"><span style=" font-size:16pt;">Invite a Friend</span><br /><br /><span style=" font-size:10pt;">To Invite your friends to join you with Retroshare: </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">Cut and paste the text below into an email.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">and send it to all your friends!</p></body></html> + + + + + LogDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> + +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="ABOUT"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">About RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShare is a private peer to peer communication platform created by Dr. Bob.This program enables you to securely share files and chat with your friends (and no-one else!).</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, and the latest release go to http://www.lunamutt.com.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="START"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Quick Start Guide to RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If this is your first time using Retroshare, it is recommended that you readthis guide for instructions on how to get started. The first step is:<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Connecting to Your Friends</span></a>. Once you have managed this you can <a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">Download Files</span></a> and<a href="#START-SHARE"><span style=" text-decoration: underline; color:#0000ff;">Share with Others</span></a></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Some of the key concepts related to ensuring your sharing remains private aredescribed in the <a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">Frequently Asked Questions</span></a>. Some Key security questions are:<a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">What is a Web of Trust?</span></a>, <a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">Should I Sign this Certificate?</span></a>, and finally<a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">What does "Trust" Mean?</span></a>.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is also worthwhile reading the <a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">GUI Overview</span></a>which describes the featureson available through the User Interface.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Connecting to your Friends </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">There are four steps to connecting to a Friend:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Get Friend's Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Load Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Sign Certificate</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect to Friend.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The instructions might initially appear long and daunting, however thesesteps are required to ensure that your sharing is private and secure.These steps are only required a couple of times, to add new friends, and become quite straight forward after the first time.</p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (1) EXCHANGE CERTIFICATES </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Before you can connect, you need send your certificate to your friend, and get your friends certificate. Follow these steps to get your certificate:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on Your Certificate to Select it.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on the "Export Friend" Button to bring up a file save dialog.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select directory to save the certificate to.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Enter desired filename. (with a file type of .pqi), and Click OK.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Email this File to your Friend. (It is recommended you put thecertificate in a zip file before sending, as some email programsdon't transmit the file correctly).</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Ask your friend to do the same.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Once you have received your friend's certificate, removed itfrom the zip file and saved it to disk, you can proceed to step (2).</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Note: This exchange of certificates is only necessary to get you started.Once you are connected to some friends the exchange of certificates becomeautomated by the autoDiscovery system. See<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">GUI: Connecting</span></a> for more information.------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (2) LOAD YOUR FRIEND'S CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Import Friend"</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select your friends certificate file, then click "Okay". Their certificate should appear in the top window of the "Connect" Tab.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (3) SIGN CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select their Certificate by clicking on their name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Configure Friend" Button. This will bring up a configuration window. which allows you to look at the detailsof the certificate.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click the "Sign Certificate" button near the bottom of the "Certificate Configuration" Window.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Now close the window by clicking on the "Done" button.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Your Friends certificate should now say "Trusted (S)", indicating it is ready for connections.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can only share with "Trusted" Peers. You must sign your Friend'scertificate to prove that you know the certificate belongs to your Friend. Do not sign any/all certificates - only the people youtrust. For more information see: <br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br />------------------------------------------------------------------------<br /><br /> <br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (4) AUTOCONNECT TO PEER </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Finally You need to activate the connection:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click in the Box, next to your friends Name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> A Tick should appear in the box, a connection will be started.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> The "Offline" will change to "Online" when you have successfullyconnected.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Remember: Your initial connection attempts will fail, until your friend has signed your certificate and ticked the Auto-Connect Box.This ensures that both peers trust each other, and stops random peopleaccessing your files.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>. <br />------------------------------------------------------------------------<br /><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-DOWNLOAD"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Downloading Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have connected to friends, you can download their shared files.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can search for the files you want using either:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) File Listing Tab: This gives you a directory view of the files being shared by your peers. Double clickon the directory name (not the arrow) to diplay its subdirectories and files.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 1: This can take up to 5 seconds to fetch the information for your peer.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 2: If the directory is empty, or the person is offline, then the request will silently fail.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Search Tab: Retroshare also allows you to search your peers computers for filenames. Enter yourterm(s) in the search box at the top of the TAB and click the "Search" button. This willsearch all of the peers that you are currently connected to.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 3: If any matching files are found they will be displayed within 5 - 10 seconds.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have found the files you want, Select the file(s), and click "Download" to begin the download process.If you click over the "File Transfer" TAB, the status of the files will appear.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 4: The files can take up to 10 seconds to appear in the transfer window.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-SHARING"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Sharing Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can specify which files you want to share in the "Config" Tab.In the "Share Directories" section, click the "Add Directory" Button, and select the directory you want to share.The files and subdirectories will become available for you peers.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can remove a directory from the Shared Directories List by clicking onthe directory name in the list, and then clicking "Remove Directory".</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="GUI"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Gui Overview (Tab Description) </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The GUI is divided up into several sections which can be accessed by clicking on the Tabs along the top of the main window. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect: Manage Connections and Friends.(<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">getting started</span></a> and<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Listing: A directory view of available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Search: Search for available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Messages: For Sending/Recving Message. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Channels: A broadcast/subscription system. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Transfer: Listing of Current and completed Transfers.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Config: Specify of share diectories and IP Addresses.(<a href="#GUI-CONFIG"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> About: Help and other Information.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Chat: Accessed by the clicking on the "Chat" button.</li></ul> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Connect Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Connect TAB consists of two windows. The upper windowshows a list of your friends. This window indicates each friendscurrent trust level, as well as their connection state.The "Trust_Lvl" Column indicates if the certificate has beenAuthenticated using the web of trust. You can only connect to "Trusted" certificates. Tick the "Auto_Connect" box to connect to your trusted friends.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The lower window provides a list of the friends of your friends.This window shows the neighbour's name and how long ago they attempted to connect to you. This window is automatically populatedby the autoDiscovery system, and should be used to expand yourretroShare network. A word of warning: Do not automatically trust (or sign) anyonethat appears in this window. First verify by some other means (email/phone)that certificate belongs to the person you think it does.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use the "Neighbour List" window to expand your friend list. Select the desired entry in the lower window by clicking on it, then click the "Add to Friends" Button to move it to the upper window.Likewise the "Remove from Friends" button moved a person from the upper window to the lower window.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The "Configure Friend" Button opens a Certificate Configuration window.This window can be used to examine the certificate details, sign the certificate or manually change the peer's IP Address.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">See Also:<br /><a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Getting Started: Connecting to your friends</span></a>.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>.<br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONFIG"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Config Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Configuration Tab allows you to select the share directories, as well as the directory that downloaded files are saved to.<br />See <a href="#STARTUP-SHARING"><span style=" text-decoration: underline; color:#0000ff;">Sharing you Files</span></a> for details. </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Config Tab also allows you to control the IP Address and Portused by RetroShare. Under most cirumstances you do not need to changethese setting. If you are behind a firewall and can setup a forwarded port, the selected IP Address and Port should be specified here.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="FAQ"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Frequently Asked Questions </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">How does the security/privacy work? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShares uses a Web of Trust Authentication system to ensurethat your "friends" are your friends, and uses SSL to encryptthe communcications between peers. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What is a Web of Trust? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Web of Trust relies on a collection of peers to identify eachother. Look it up on the Web!</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-TRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What does "Trust" Mean in RetroShare?</span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Anyone can generate a certificate, with any name on it. So howdo you know that the certificate that claims to be from "Joe Bloggs"is really from your mate Joe. This is the "AuthenticationProblem". RetroShare uses a Web of Trust to Authenticate your peers.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-SIGN"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Should I Sign this Certificate? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should only sign a certificate if you are completely surethat it comes from the "right" person. If you sign a certificateyou are "Authenticating" the person to yourself and others.If you sign certificates that you haven't checked, then you aredestroying your own privacy and security.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">How do you verify a certificate? Use an alternative method ofcommunication to send the certificate: E.g. email or USB stick. This will improve you confidence that the certificate belongsto the correct person. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><span style=" font-size:small;"> </span><a name="FAQ-CONNECT"></a><span style=" font-size:small;">W</span><span style=" font-size:small;">hy won't it Connect?</span><span style=" font-size:small;"> </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A connection can fail for a number of reasons:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) Failed Authentication. Have both peers signed each otherscertificates? </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Firewalls. If both peers are behind firewalls then they cannotconnect directly. RetroShare has a built in proxy system to circumventfirewalls - However this can only function if both peers can connect to a common third party that is not behind a firewall. Thisis the most likely reason for initial connections to fail. The only solution to find a common friend that isn't firewalled (know anyone with Broadband?)</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(3) IP Addresses are wrong. You can manually examine and change these using the Certificate configuration.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +</body></html> + + + + + MainWindow + + + Network + + + + + Friends + + + + + Transfers + + + + + Messages + + + + + Channels + + + + + Options + + + + + Users: 0 Files: 0 + + + + + Down: 0.0 Up: 0.0 + + + + + Connections: 0/45 + + + + + Hide + + + + + Show + + + + + RetroShare + + + + + Home + + + + + General + + + + + Advanced + + + + + Search + + + + + Files + + + + + Chat + + + + + Add Shared Directory + + + + + About/Help + + + + + Messenger + + + + + Show/Hide + + + + + &Quit + + + + + Bandwidth Graph + + + + + Open Messenger + + + + + RetroShare %1 + + + + + Add a Friend + + + + + Invite a Friend + + + + + Add a Share + + + + + Quit + + + + + Minimize + + + + + Maximize + + + + + Hide Console + + + + + Show Console + + + + + Hide ToolBox + + + + + :images/hide_toolbox_frame.png + + + + + Show ToolBox + + + + + :images/show_toolbox_frame.png + + + + + QTextBrowser { + background-color: rgb(192,192,192); + + } + + + + + QPushButton + { + border-image: url(:/images/console-small-up.png) + } + + QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + + } + + QPushButton:pressed { + border-image: url(:/images/console-small-down.png) + } + + + + + + Apps + + + + + MessageToaster + + + message + besked + + + + MessagesDialog + + + New Message + + + + + Reply to Message + + + + + Remove Message + + + + + Date + + + + + From + + + + + Title + + + + + Msg + + + + + Count + + + + + Size + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Recommended Files</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">remove selected message</p></body></html> + + + + + Inbox + + + + + Outbox + + + + + Draft + + + + + Sent + + + + + Timestamp + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">reply to selected message</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">New Message</p></body></html> + + + + + Download All + + + + + QPushButton +{ +border-image: url(:/images/deletemail24.png); +} + +QPushButton:hover +{ +border-image: url(:/images/deletemail-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/deletemail-pressed.png); +} + + + + + +QPushButton +{ +border-image: url(:/images/replymail24.png); +} + +QPushButton:hover +{ +border-image: url(:/images/replymail24-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/replymail-pressed.png); +} + + + + + + QPushButton +{ +border-image: url(:/images/folder-draft24.png); +} +QPushButton:hover +{ +border-image: url(:/images/folder-draft24-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/folder-draft24-pressed.png); +} + + + + + + MessengerWindow + + + QWidget#MessengerWindow { +background-color: #ECF3F6; background-image:url(:/images/backgroundimage.png); +background-position: top right; +background-repeat: no-repeat +} + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click to change your avatar</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Change your Status and your display</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">picture here.</p></body></html> + + + + + Online + + + + + Busy + + + + + Be right Back + + + + + Away + + + + + In a Call + + + + + Out of lunch + + + + + Apear Offline + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Share a personal message with your contacts</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Add a Friend</p></body></html> + + + + + Chat + + + + + Connect To Friend + + + + + NetworkDialog + + + Peer Details / Authenticate + Peer detaljer / Autorisér + + + + Load Certificate + Hent certifikat + + + + Select a pem/pqi File + Vælg en pem/pqi fil + + + + File Not Found + Fil ikke fundet + + + + %1 does not exist. Would you like to create it? + %1 findes ikke. Vil du oprette den? + + + + Failed to Create File + Kunne ikke oprette fil + + + + Unable to create %1 [%2] + Kunne ikke oprette %1 [%2] + + + + Select Certificate + Vælg certifikat + + + + Certificates (*.pqi *.pem) + Certifikater (*.pqi *.pem) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + + + + + # + + + + + Accept + Acceptér + + + + Trust + Trust + + + + Last Contact + Sidste kontakt + + + + Name + Navn + + + + Peer Address + Peer adresse + + + + Organisation + Organisation + + + + Location + Lokation + + + + Country + Land + + + + Cert Id + Cert Id + + + + Auth Code + Auth Kode + + + + NetworkPage + + + Rate Options + + + + + Max Total Data Rate (KB/S): + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Rate per Person (KB/S):</p></body></html> + + + + + PeersDialog + + + Chat + + + + + Configure Friend + + + + + Export Friend + + + + + Remove Friend + + + + + Save Certificate + + + + + Certificates (*.pqi) + + + + + Status + + + + + Person + + + + + Auto Connect + + + + + Trust Level + + + + + Peer Address + Peer adresse + + + + Last Contact + Sidste kontakt + + + + Organisation + Organisation + + + + Location + Lokation + + + + Country + Land + + + + Person Id + + + + + Auth Code + Auth Kode + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Friends</span></p></body></html> + + + + + Connect To Friend + + + + + # + + + + + PopupChatDialog + + + RetroShare User Chat + + + + + PreferencesDialog + + + Language + + + + + Style + + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + + + + + Style Sheet + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose RetroShare's interface style</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose the language used in RetroShare</p></body></html> + + + + + Login + + + + + Remove Auto Login + + + + + PreferencesWindow + + + Directories + + + + + Error Saving Configuration + + + + + About + + + + + General + + + + + Server + + + + + Options + + + + + Cancel + + + + + OK + + + + + QObject + + + Name + Navn + + + + Path + + + + + Extension + + + + + Date + + + + + Size + + + + + Popularity + + + + + contains + + + + + contains all + + + + + is + + + + + less than + + + + + less than or equal + + + + + greater than or equal + + + + + greater than + + + + + is in range + + + + + and + + + + + and / or + + + + + or + + + + + equals + + + + + Rshare + + + Invalid language code specified: + + + + + Invalid GUI style specified: + + + + + SearchDialog + + + Sources + + + + + Results + + + + + Download + + + + + Broadcast on Channel + + + + + Recommend to Friends + + + + + Remove + + + + + Remove All + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Format</p></body></html> + + + + + Any + + + + + Audio + + + + + Video + + + + + Images + + + + + Programs + + + + + Archives + + + + + Documents + + + + + Toggle advanced searching on and off. + + + + + <h3>Simple Search:</h3> + + + + + Keywords + + + + + Perform simple search + + + + + Show Advanced Search Tool + + + + + Filename + + + + + Hash + + + + + KeyWords + + + + + Search Id + + + + + <h3>Advanced Search:</h3> + + + + + ServerDialog + + + Transfer Rates + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Total Rate (kb/s) </p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Per Person </p></body></html> + + + + + Port: + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + + + + + Firewall/Router Configuration + + + + + Manual router setup. + + + + + Use uPnP to configure router + + + + + Network Address Configuration (takes effect after restart) + + + + + Use DHT to locate friends + + + + + Manual IP Addresses + + + + + Server Status And Network Settings + + + + + Firewalled + + + + + Forwarded Port + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">DHT Status</p></body></html> + + + + + uPnP Status + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Local Address:</p></body></html> + + + + + ServerPage + + + Change + Restart Server + + + + + Server Settings + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Adress:</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + + + + + Port: + + + + + Misc + + + + + behinde Firewall + + + + + Forwarded External Port + + + + + Settings + + + Settings + + + + + Cancel + + + + + Apply + Anvend + + + + OK + + + + + General + + + + + Network + + + + + Server + + + + + Directories + + + + + SharedFilesDialog + + + Download + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Files</span></p></body></html> + + + + + Add to Recommend List + + + + + Recommend To + + + + + Message Friend + + + + + StartDialog + + + RetroShare + + + + + QWidget { + background-color: #ECF3F6; +} + + + + + Auto-login + + + + + Name: + + + + + Log In + + + + + Password: + + + + + Create a Account + + + + + QToolButton{ +border-image: url(:/images/avatar_background.png); + +} + + + + + + StatisticDialog + + + Statistics + + + + + Download + + + + + Session: + + + + + Downloaded: + + + + + Average Downloadspeed: + + + + + Count of Downloads: + + + + + Overall + + + + + Upload + + + + + Session + + + + + Uploaded: + + + + + Average Uploadspeed: + + + + + Count of Uploads: + + + + + Uploaded + + + + + Connections: + + + + + Peers: + + + + + Misc + + + + + Uptime: + + + + + Overall: + + + + + Uptime + + + + + Records + + + + + Uploadspeed: + + + + + Downloadspeed: + + + + + Show Settings + + + + + Reset + + + + + Receive Rate + + + + + Send Rate + + + + + Always On Top + + + + + 100 + + + + + % Opaque + + + + + Changes the transparency of the Bandwidth Graph + + + + + Save + + + + + Cancel + + + + + Hide Settings + + + + + TransfersDialog + + + Cancel + + + + + Clear Completed + + + + + Status + + + + + Completed + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Downloads:</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Uploads:</span></p></body></html> + + + + + Name + i.e: file name + Navn + + + + Size + i.e: file size + + + + + Progress + i.e: % downloaded + + + + + Speed + i.e: Download speed + + + + + Sources + i.e: Sources + + + + + Remaining + i.e: Estimated Time of Arrival / Time left + + + + + Core-ID + + + + + User Name + i.e: user name + + + + + Progress + i.e: % uploaded + + + + + Speed + i.e: upload speed + + + + + Transferred + + + + + ULListDelegate + + + B + + + + + KB + + + + + MB + + + + + GB + + + + + VMessageBox + + + OK + + + + + Cancel + + + + + Yes + + + + + No + + + + + Help + + + + + Retry + + + + + Show Log + + + + + Show Settings + + + + + moreinfo + + + Details + + + + + OK + + + + + Name + Navn + + + + Value + + + + diff --git a/retroshare-gui/src/lang/retroshare_en.qm b/retroshare-gui/src/lang/retroshare_en.qm new file mode 100644 index 000000000..3cd04ae9e Binary files /dev/null and b/retroshare-gui/src/lang/retroshare_en.qm differ diff --git a/retroshare-gui/src/lang/retroshare_en.ts b/retroshare-gui/src/lang/retroshare_en.ts new file mode 100644 index 000000000..9441264d8 --- /dev/null +++ b/retroshare-gui/src/lang/retroshare_en.ts @@ -0,0 +1,3408 @@ + + + + + + + Arial + + + + + AddFriendDialog + + + Cancel + + + + + Done + + + + + Load From File + + + + + RetroShare + + + + + Certificate Load Failed + + + + + Add a Friend + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"><span style=" font-size:16pt;">Add a new Friend</span><br /><br /><span style=" font-size:10pt;">To add a new Friend, cut and paste their email </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">invitation into the box below, and click done.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + + + + + AddFriendWizard + + + < Back + + + + + Next > + + + + + Cancel + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">This Wizard helps to Connect to your Friends</span></p></body></html> + + + + + I have a .pqi/.pem file received from a Friend + + + + + I have Key received from a Friend + + + + + I want to invite a friend to my RetroShare network + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Cut and paste the text below into an email.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;"> and send it to all your friends!</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">When you press next RetroShare will attempt to launch a Email client.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Invite your Friends to join with RetroShare</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Enter the Key code you got from your friend:</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">When you press next RetroShare will attempt to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">connect using the key.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Select a pqi/pem file:</span></p></body></html> + + + + + Browse + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">When you press next RetroShare will attempt to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">connect using the .pqi/.pem file.</p></body></html> + + + + + Add Friend to my netowork Wizard + + + + + AdvancedSearchDialog + + + RetrosShare: Advanced Search + + + + + Add a further search criterion. + + + + + Add a selection criterion + + + + + Reset + + + + + Cancels the search. + + + + + Cancel + + + + + Perform the advanced search. + + + + + Search + + + + + Search Criteria + + + + + Reset the search criteria. + + + + + ApplicationWindow + + + RetroShare %1 + + + + + Example Application + + + + + Application Users: 0 Files: 0 + + + + + Down: 0.0 Up: 0.0 + + + + + Connections: 0/45 + + + + + Hide + + + + + Show + + + + + RetroShare + + + + + Home + + + + + General + + + + + Advanced + + + + + QTextBrowser { + background-color: rgb(192,192,192); + + } + + + + + QPushButton + { + border-image: url(:/images/console-small-up.png) + } + + QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + + } + + QPushButton:pressed { + border-image: url(:/images/console-small-down.png) + } + + + + + + AuthorizationDialog + + + Authenticate + + + + + Authenticate Friend By Entering Their Code + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + + + + + OK + + + + + Cancel + + + + + BandwidthGraph + + + RetroShare Bandwidth Usage + + + + + Show Settings + + + + + Reset + + + + + Receive Rate + + + + + Send Rate + + + + + Always on Top + + + + + Style + + + + + Changes the transparency of the Bandwidth Graph + + + + + 100 + + + + + % Opaque + + + + + Save + + + + + Cancel + + + + + Since: + + + + + Hide Settings + + + + + CallToaster + + + Message + + + + + ChanCreateDialog + + + Create a new Broadcast Channel + + + + + Create A New Broadcast Channel + + + + + Channel Name: + + + + + Type: + + + + + Public Channel (Signed) + + + + + Private Channel (Encrypted) + + + + + Cancel Channel + + + + + Create Channel + + + + + ChanMsgDialog + + + Compose + + + + + Recommended Files + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-weight:400;"><span style=" font-weight:600;">Subject:</span></p></body></html> + + + + + Send To: + + + + + Send + + + + + Delete Channel + + + + + Create Channel MSG + + + + + 1 + + + + + Reply + + + + + ChannelsDialog + + + New Message + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Messages</span></p></body></html> + + + + + Date + + + + + Rank + + + + + From + + + + + Title + + + + + Msg + + + + + Count + + + + + Size + + + + + Type + + + + + Rs[Cert/Chan]IdSize + + + + + RsMsgId + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Message Text</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Recommended Files</span></p></body></html> + + + + + New Channel + + + + + Subscribe To Channel + + + + + Unsubscribe To Channel + + + + + Delete Your Channel + + + + + Download + + + + + Download All + + + + + ChatDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:9pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:400;"></p></body></html> + + + + + Chat History: + + + + + Chat + + + + + Users: + + + + + ChatToaster + + + Message + + + + + ConfCertDialog + + + Cancel + + + + + Port: + + + + + behind zee Firewall + + + + + Forwarded External Port + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Max Transfer Rate (kb/s) </p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Org / Loc:</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Country/State:</p></body></html> + + + + + Trust Settings + + + + + Trust Level + + + + + Trust Their Signature + + + + + Sign The Certificate + + + + + OK + + + + + Peer Adress + + + + + Peer Info + + + + + ConfirmQuitDialog + + + Exit RetroShare + + + + + You are about to exit the RetroShare application and therefore stop all transfers. <br><br>Are you sure you want to stop and exit RetroShare? + + + + + Do not show this message again. + + + + + ConnectDialog + + + Peer Details + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Org:</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Trust:</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Loc:</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Certificate</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">signers:</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + + + + + Make Friend + + + + + Close + + + + + CryptographyDialog + + + RSA Key Size + + + + + Rijndael Block size + + + + + 128 Bits + + + + + 192 Bits + + + + + 256 Bits + + + + + Rijndael Key Size + + + + + Rijndael Mode + + + + + CBC + + + + + ECB + + + + + CFB + + + + + Rijndael Padding + + + + + PKCS7 + + + + + Zeros + + + + + ANSIX923 + + + + + ISO10126 + + + + + Rijndael Feedback Size + + + + + Key Size: + + + + + Block Size: + + + + + Feedback Size: + + + + + Mode: + + + + + Padding: + + + + + DLListDelegate + + + B + + + + + KB + + + + + MB + + + + + GB + + + + + DirectoriesDialog + + + Shared Directories + + + + + Other Directories + + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Incoming Files</span></p></body></html> + + + + + Add Shared Directory + + + + + DirectoriesPage + + + Shared Directories + + + + + Incoming files + + + + + ExampleDialog + + + Vote Up + + + + + Vote Down + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Friends</span></p></body></html> + + + + + # + + + + + Status + + + + + Person + + + + + Auto Connect + + + + + Trust Level + + + + + Peer Address + + + + + Last Contact + + + + + Organisation + + + + + Location + + + + + Country + + + + + Person Id + + + + + Auth Code + + + + + ExprParamElement + + + to + + + + + ignore case + + + + + dd.MM.yyyy + + + + + KB + + + + + MB + + + + + GB + + + + + ExpressionWidget + + + Expression Widget + + + + + Delete this expression + + + + + FileHashDialog + + + Download + + + + + GSettingsWin + + + General + + + + + Network + + + + + Directories + + + + + Server + + + + + %1 + + + + + GenCertDialog + + + RetroShare setup + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16pt;">Generate a new profile</span><br /><br />Please fill in the information which will<br />allow your RetroShare to connect to</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Friends.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Organisation:</p></body></html> + + + + + Password (Again) + + + + + Location: + + + + + Load Trusted Certificate (Optional) + + + + + Password + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + + + + + Select File + + + + + Country: + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + + + + + Generate New Certificate + + + + + Select Trusted Friend + + + + + Certificates (*.pqi *.pem) + + + + + GeneralPage + + + Keys manager + + + + + Style + + + + + Choose RetroShare's interface style + + + + + Language + + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + + + + + Choose the language used in RetroShare + + + + + GraphFrame + + + Recv: + + + + + %1 KB/s + + + + + Sent: + + + + + %1 KB + + + + + %1 MB + + + + + %1 GB + + + + + HelpDialog + + + About + + + + + Authors + + + + + Thanks to + + + + + Translation + + + + + License Agreement + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">About/Help</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:xx-large; font-weight:600; color:#0000ff;">About RetroShare.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-weight:600;">Retroshare is a private and secure decentralised commmunication platform.<br />You can use it chat, send messages and share files with your friends.</span><br /><br />This is just a placeholder page for the moment. You can<br />improve retroshare's in-built help (this text) by<br />updating the retroshare wiki: <a href="http://retroshare.wiki.sourceforge.net/help_tab"><span style=" text-decoration: underline; color:#0000ff;">This Page in the retroshare Wiki</span></a><br /><br />The About/Help Tab is regularly updated from the Wiki page.<br /><br />External Links to more information:<br /></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.sourceforge.net"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Webpage</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.wiki.sourceforge.net/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Wiki</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://sourceforge.net/projects/retroshare/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Project Page</span></a></li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.lunamutt.com"><span style=" text-decoration: underline; color:#0000ff;">Lunamutt Homepage.</span></a></li></ul></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-size:19pt; font-weight:600; color:#0000ff;">The RetroShare Team:</span><br /> <br /><span style=" font-size:9pt; color:#0000ff;">defnax</span>: Lead GUI developer <br /><span style=" font-size:9pt; color:#0000ff;">drbob7</span>: Lead Core developer. <br /> <br /><span style=" font-size:9pt; color:#0000ff;">bmeck</span> : Our new web-developer. Joined retroshare a couple <br />of weeks ago, and already starting on an exciting new <br />design for the web-page. <br /> <br /><span style=" font-size:9pt; color:#0000ff;">noragen</span> : Developer from the SIM-IM project. Working on a retroshare plugin to SIM-IM. <br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">kernelpanix</span> : Gui and skin developer</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">libris</span><span style=" font-size:9pt;">:</span> core developer</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-size:9pt; color:#0000ff;">kashif: </span><span style=" color:#000000;">core developer</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt; color:#000000;"><span style=" font-size:8pt;"><br /></span><span style=" color:#0000ff;">agent725</span><span style=" font-size:8pt;">: Manages the 'local' Retroshare release, <br />and beta-testing retroshare on a large scale. <br /> <br /></span><span style=" color:#0000ff;">the_mgt</span><span style=" font-size:8pt;">: Maintains the Gentoo and generic linux <br />installation/compilation scripts. </span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">notdefine:</span> Maintains the .rpm, .deb installation/compilation scripts.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">zhouk</span>: developer</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Translators:</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Serbian</span>: Kunalagon Umuhanik &lt;kunalagon@gmail.com&gt;</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Polish: </span>Jarek</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">French</span>:Temet</p></body></html> + + + + + InviteDialog + + + Done + + + + + Cancel + + + + + Launch Email + + + + + Invite a Friend + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"><span style=" font-size:16pt;">Invite a Friend</span><br /><br /><span style=" font-size:10pt;">To Invite your friends to join you with Retroshare: </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">Cut and paste the text below into an email.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">and send it to all your friends!</p></body></html> + + + + + LogDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> + +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="ABOUT"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">About RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShare is a private peer to peer communication platform created by Dr. Bob.This program enables you to securely share files and chat with your friends (and no-one else!).</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, and the latest release go to http://www.lunamutt.com.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="START"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Quick Start Guide to RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If this is your first time using Retroshare, it is recommended that you readthis guide for instructions on how to get started. The first step is:<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Connecting to Your Friends</span></a>. Once you have managed this you can <a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">Download Files</span></a> and<a href="#START-SHARE"><span style=" text-decoration: underline; color:#0000ff;">Share with Others</span></a></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Some of the key concepts related to ensuring your sharing remains private aredescribed in the <a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">Frequently Asked Questions</span></a>. Some Key security questions are:<a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">What is a Web of Trust?</span></a>, <a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">Should I Sign this Certificate?</span></a>, and finally<a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">What does "Trust" Mean?</span></a>.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is also worthwhile reading the <a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">GUI Overview</span></a>which describes the featureson available through the User Interface.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Connecting to your Friends </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">There are four steps to connecting to a Friend:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Get Friend's Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Load Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Sign Certificate</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect to Friend.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The instructions might initially appear long and daunting, however thesesteps are required to ensure that your sharing is private and secure.These steps are only required a couple of times, to add new friends, and become quite straight forward after the first time.</p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (1) EXCHANGE CERTIFICATES </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Before you can connect, you need send your certificate to your friend, and get your friends certificate. Follow these steps to get your certificate:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on Your Certificate to Select it.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on the "Export Friend" Button to bring up a file save dialog.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select directory to save the certificate to.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Enter desired filename. (with a file type of .pqi), and Click OK.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Email this File to your Friend. (It is recommended you put thecertificate in a zip file before sending, as some email programsdon't transmit the file correctly).</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Ask your friend to do the same.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Once you have received your friend's certificate, removed itfrom the zip file and saved it to disk, you can proceed to step (2).</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Note: This exchange of certificates is only necessary to get you started.Once you are connected to some friends the exchange of certificates becomeautomated by the autoDiscovery system. See<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">GUI: Connecting</span></a> for more information.------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (2) LOAD YOUR FRIEND'S CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Import Friend"</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select your friends certificate file, then click "Okay". Their certificate should appear in the top window of the "Connect" Tab.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (3) SIGN CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select their Certificate by clicking on their name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Configure Friend" Button. This will bring up a configuration window. which allows you to look at the detailsof the certificate.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click the "Sign Certificate" button near the bottom of the "Certificate Configuration" Window.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Now close the window by clicking on the "Done" button.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Your Friends certificate should now say "Trusted (S)", indicating it is ready for connections.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can only share with "Trusted" Peers. You must sign your Friend'scertificate to prove that you know the certificate belongs to your Friend. Do not sign any/all certificates - only the people youtrust. For more information see: <br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br />------------------------------------------------------------------------<br /><br /> <br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (4) AUTOCONNECT TO PEER </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Finally You need to activate the connection:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click in the Box, next to your friends Name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> A Tick should appear in the box, a connection will be started.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> The "Offline" will change to "Online" when you have successfullyconnected.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Remember: Your initial connection attempts will fail, until your friend has signed your certificate and ticked the Auto-Connect Box.This ensures that both peers trust each other, and stops random peopleaccessing your files.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>. <br />------------------------------------------------------------------------<br /><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-DOWNLOAD"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Downloading Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have connected to friends, you can download their shared files.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can search for the files you want using either:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) File Listing Tab: This gives you a directory view of the files being shared by your peers. Double clickon the directory name (not the arrow) to diplay its subdirectories and files.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 1: This can take up to 5 seconds to fetch the information for your peer.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 2: If the directory is empty, or the person is offline, then the request will silently fail.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Search Tab: Retroshare also allows you to search your peers computers for filenames. Enter yourterm(s) in the search box at the top of the TAB and click the "Search" button. This willsearch all of the peers that you are currently connected to.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 3: If any matching files are found they will be displayed within 5 - 10 seconds.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have found the files you want, Select the file(s), and click "Download" to begin the download process.If you click over the "File Transfer" TAB, the status of the files will appear.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 4: The files can take up to 10 seconds to appear in the transfer window.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-SHARING"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Sharing Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can specify which files you want to share in the "Config" Tab.In the "Share Directories" section, click the "Add Directory" Button, and select the directory you want to share.The files and subdirectories will become available for you peers.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can remove a directory from the Shared Directories List by clicking onthe directory name in the list, and then clicking "Remove Directory".</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="GUI"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Gui Overview (Tab Description) </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The GUI is divided up into several sections which can be accessed by clicking on the Tabs along the top of the main window. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect: Manage Connections and Friends.(<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">getting started</span></a> and<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Listing: A directory view of available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Search: Search for available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Messages: For Sending/Recving Message. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Channels: A broadcast/subscription system. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Transfer: Listing of Current and completed Transfers.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Config: Specify of share diectories and IP Addresses.(<a href="#GUI-CONFIG"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> About: Help and other Information.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Chat: Accessed by the clicking on the "Chat" button.</li></ul> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Connect Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Connect TAB consists of two windows. The upper windowshows a list of your friends. This window indicates each friendscurrent trust level, as well as their connection state.The "Trust_Lvl" Column indicates if the certificate has beenAuthenticated using the web of trust. You can only connect to "Trusted" certificates. Tick the "Auto_Connect" box to connect to your trusted friends.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The lower window provides a list of the friends of your friends.This window shows the neighbour's name and how long ago they attempted to connect to you. This window is automatically populatedby the autoDiscovery system, and should be used to expand yourretroShare network. A word of warning: Do not automatically trust (or sign) anyonethat appears in this window. First verify by some other means (email/phone)that certificate belongs to the person you think it does.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use the "Neighbour List" window to expand your friend list. Select the desired entry in the lower window by clicking on it, then click the "Add to Friends" Button to move it to the upper window.Likewise the "Remove from Friends" button moved a person from the upper window to the lower window.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The "Configure Friend" Button opens a Certificate Configuration window.This window can be used to examine the certificate details, sign the certificate or manually change the peer's IP Address.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">See Also:<br /><a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Getting Started: Connecting to your friends</span></a>.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>.<br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONFIG"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Config Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Configuration Tab allows you to select the share directories, as well as the directory that downloaded files are saved to.<br />See <a href="#STARTUP-SHARING"><span style=" text-decoration: underline; color:#0000ff;">Sharing you Files</span></a> for details. </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Config Tab also allows you to control the IP Address and Portused by RetroShare. Under most cirumstances you do not need to changethese setting. If you are behind a firewall and can setup a forwarded port, the selected IP Address and Port should be specified here.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="FAQ"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Frequently Asked Questions </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">How does the security/privacy work? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShares uses a Web of Trust Authentication system to ensurethat your "friends" are your friends, and uses SSL to encryptthe communcications between peers. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What is a Web of Trust? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Web of Trust relies on a collection of peers to identify eachother. Look it up on the Web!</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-TRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What does "Trust" Mean in RetroShare?</span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Anyone can generate a certificate, with any name on it. So howdo you know that the certificate that claims to be from "Joe Bloggs"is really from your mate Joe. This is the "AuthenticationProblem". RetroShare uses a Web of Trust to Authenticate your peers.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-SIGN"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Should I Sign this Certificate? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should only sign a certificate if you are completely surethat it comes from the "right" person. If you sign a certificateyou are "Authenticating" the person to yourself and others.If you sign certificates that you haven't checked, then you aredestroying your own privacy and security.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">How do you verify a certificate? Use an alternative method ofcommunication to send the certificate: E.g. email or USB stick. This will improve you confidence that the certificate belongsto the correct person. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><span style=" font-size:small;"> </span><a name="FAQ-CONNECT"></a><span style=" font-size:small;">W</span><span style=" font-size:small;">hy won't it Connect?</span><span style=" font-size:small;"> </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A connection can fail for a number of reasons:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) Failed Authentication. Have both peers signed each otherscertificates? </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Firewalls. If both peers are behind firewalls then they cannotconnect directly. RetroShare has a built in proxy system to circumventfirewalls - However this can only function if both peers can connect to a common third party that is not behind a firewall. Thisis the most likely reason for initial connections to fail. The only solution to find a common friend that isn't firewalled (know anyone with Broadband?)</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(3) IP Addresses are wrong. You can manually examine and change these using the Certificate configuration.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +</body></html> + + + + + MainWindow + + + Network + + + + + Friends + + + + + Transfers + + + + + Messages + + + + + Channels + + + + + Options + + + + + Users: 0 Files: 0 + + + + + Down: 0.0 Up: 0.0 + + + + + Connections: 0/45 + + + + + Hide + + + + + Show + + + + + RetroShare + + + + + Home + + + + + General + + + + + Advanced + + + + + Search + + + + + Files + + + + + Chat + + + + + Add Shared Directory + + + + + About/Help + + + + + Messenger + + + + + Show/Hide + + + + + &Quit + + + + + Bandwidth Graph + + + + + Open Messenger + + + + + RetroShare %1 + + + + + Add a Friend + + + + + Invite a Friend + + + + + Add a Share + + + + + Quit + + + + + Minimize + + + + + Maximize + + + + + Hide Console + + + + + Show Console + + + + + Hide ToolBox + + + + + :images/hide_toolbox_frame.png + + + + + Show ToolBox + + + + + :images/show_toolbox_frame.png + + + + + QTextBrowser { + background-color: rgb(192,192,192); + + } + + + + + QPushButton + { + border-image: url(:/images/console-small-up.png) + } + + QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + + } + + QPushButton:pressed { + border-image: url(:/images/console-small-down.png) + } + + + + + + Apps + + + + + MessageToaster + + + message + + + + + MessagesDialog + + + New Message + + + + + Reply to Message + + + + + Remove Message + + + + + Date + + + + + From + + + + + Title + + + + + Msg + + + + + Count + + + + + Size + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Recommended Files</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">remove selected message</p></body></html> + + + + + Inbox + + + + + Outbox + + + + + Draft + + + + + Sent + + + + + Timestamp + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">reply to selected message</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">New Message</p></body></html> + + + + + Download All + + + + + QPushButton +{ +border-image: url(:/images/deletemail24.png); +} + +QPushButton:hover +{ +border-image: url(:/images/deletemail-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/deletemail-pressed.png); +} + + + + + +QPushButton +{ +border-image: url(:/images/replymail24.png); +} + +QPushButton:hover +{ +border-image: url(:/images/replymail24-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/replymail-pressed.png); +} + + + + + + QPushButton +{ +border-image: url(:/images/folder-draft24.png); +} +QPushButton:hover +{ +border-image: url(:/images/folder-draft24-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/folder-draft24-pressed.png); +} + + + + + + MessengerWindow + + + QWidget#MessengerWindow { +background-color: #ECF3F6; background-image:url(:/images/backgroundimage.png); +background-position: top right; +background-repeat: no-repeat +} + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click to change your avatar</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Change your Status and your display</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">picture here.</p></body></html> + + + + + Online + + + + + Busy + + + + + Be right Back + + + + + Away + + + + + In a Call + + + + + Out of lunch + + + + + Apear Offline + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Share a personal message with your contacts</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Add a Friend</p></body></html> + + + + + Chat + + + + + Connect To Friend + + + + + NetworkDialog + + + Peer Details / Authenticate + + + + + Load Certificate + + + + + Select a pem/pqi File + + + + + File Not Found + + + + + %1 does not exist. Would you like to create it? + + + + + Failed to Create File + + + + + Unable to create %1 [%2] + + + + + Select Certificate + + + + + Certificates (*.pqi *.pem) + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + + + + + # + + + + + Accept + + + + + Trust + + + + + Last Contact + + + + + Name + + + + + Peer Address + + + + + Organisation + + + + + Location + + + + + Country + + + + + Cert Id + + + + + Auth Code + + + + + NetworkPage + + + Rate Options + + + + + Max Total Data Rate (KB/S): + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Rate per Person (KB/S):</p></body></html> + + + + + PeersDialog + + + Chat + + + + + Configure Friend + + + + + Export Friend + + + + + Remove Friend + + + + + Save Certificate + + + + + Certificates (*.pqi) + + + + + Status + + + + + Person + + + + + Auto Connect + + + + + Trust Level + + + + + Peer Address + + + + + Last Contact + + + + + Organisation + + + + + Location + + + + + Country + + + + + Person Id + + + + + Auth Code + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Friends</span></p></body></html> + + + + + Connect To Friend + + + + + # + + + + + PopupChatDialog + + + RetroShare User Chat + + + + + PreferencesDialog + + + Language + + + + + Style + + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + + + + + Style Sheet + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose RetroShare's interface style</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose the language used in RetroShare</p></body></html> + + + + + Login + + + + + Remove Auto Login + + + + + PreferencesWindow + + + Directories + + + + + Error Saving Configuration + + + + + About + + + + + General + + + + + Server + + + + + Options + + + + + Cancel + + + + + OK + + + + + QObject + + + Name + + + + + Path + + + + + Extension + + + + + Date + + + + + Size + + + + + Popularity + + + + + contains + + + + + contains all + + + + + is + + + + + less than + + + + + less than or equal + + + + + greater than or equal + + + + + greater than + + + + + is in range + + + + + and + + + + + and / or + + + + + or + + + + + equals + + + + + Rshare + + + Invalid language code specified: + + + + + Invalid GUI style specified: + + + + + SearchDialog + + + Sources + + + + + Results + + + + + Download + + + + + Broadcast on Channel + + + + + Recommend to Friends + + + + + Remove + + + + + Remove All + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Format</p></body></html> + + + + + Any + + + + + Audio + + + + + Video + + + + + Images + + + + + Programs + + + + + Archives + + + + + Documents + + + + + Toggle advanced searching on and off. + + + + + <h3>Simple Search:</h3> + + + + + Keywords + + + + + Perform simple search + + + + + Show Advanced Search Tool + + + + + Filename + + + + + Hash + + + + + KeyWords + + + + + Search Id + + + + + <h3>Advanced Search:</h3> + + + + + ServerDialog + + + Transfer Rates + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Total Rate (kb/s) </p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Per Person </p></body></html> + + + + + Port: + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + + + + + Firewall/Router Configuration + + + + + Manual router setup. + + + + + Use uPnP to configure router + + + + + Network Address Configuration (takes effect after restart) + + + + + Use DHT to locate friends + + + + + Manual IP Addresses + + + + + Server Status And Network Settings + + + + + Firewalled + + + + + Forwarded Port + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">DHT Status</p></body></html> + + + + + uPnP Status + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Local Address:</p></body></html> + + + + + ServerPage + + + Change + Restart Server + + + + + Server Settings + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Adress:</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + + + + + Port: + + + + + Misc + + + + + behinde Firewall + + + + + Forwarded External Port + + + + + Settings + + + Settings + + + + + Cancel + + + + + Apply + + + + + OK + + + + + General + + + + + Network + + + + + Server + + + + + Directories + + + + + SharedFilesDialog + + + Download + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Files</span></p></body></html> + + + + + Add to Recommend List + + + + + Recommend To + + + + + Message Friend + + + + + StartDialog + + + RetroShare + + + + + QWidget { + background-color: #ECF3F6; +} + + + + + Auto-login + + + + + Name: + + + + + Log In + + + + + Password: + + + + + Create a Account + + + + + QToolButton{ +border-image: url(:/images/avatar_background.png); + +} + + + + + + StatisticDialog + + + Statistics + + + + + Download + + + + + Session: + + + + + Downloaded: + + + + + Average Downloadspeed: + + + + + Count of Downloads: + + + + + Overall + + + + + Upload + + + + + Session + + + + + Uploaded: + + + + + Average Uploadspeed: + + + + + Count of Uploads: + + + + + Uploaded + + + + + Connections: + + + + + Peers: + + + + + Misc + + + + + Uptime: + + + + + Overall: + + + + + Uptime + + + + + Records + + + + + Uploadspeed: + + + + + Downloadspeed: + + + + + Show Settings + + + + + Reset + + + + + Receive Rate + + + + + Send Rate + + + + + Always On Top + + + + + 100 + + + + + % Opaque + + + + + Changes the transparency of the Bandwidth Graph + + + + + Save + + + + + Cancel + + + + + Hide Settings + + + + + TransfersDialog + + + Cancel + + + + + Clear Completed + + + + + Status + + + + + Completed + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Downloads:</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Uploads:</span></p></body></html> + + + + + Name + i.e: file name + + + + + Size + i.e: file size + + + + + Progress + i.e: % downloaded + + + + + Speed + i.e: Download speed + + + + + Sources + i.e: Sources + + + + + Remaining + i.e: Estimated Time of Arrival / Time left + + + + + Core-ID + + + + + User Name + i.e: user name + + + + + Progress + i.e: % uploaded + + + + + Speed + i.e: upload speed + + + + + Transferred + + + + + ULListDelegate + + + B + + + + + KB + + + + + MB + + + + + GB + + + + + VMessageBox + + + OK + + + + + Cancel + + + + + Yes + + + + + No + + + + + Help + + + + + Retry + + + + + Show Log + + + + + Show Settings + + + + + moreinfo + + + Details + + + + + OK + + + + + Name + + + + + Value + + + + diff --git a/retroshare-gui/src/lang/retroshare_es.qm b/retroshare-gui/src/lang/retroshare_es.qm new file mode 100644 index 000000000..32b01ada6 Binary files /dev/null and b/retroshare-gui/src/lang/retroshare_es.qm differ diff --git a/retroshare-gui/src/lang/retroshare_es.ts b/retroshare-gui/src/lang/retroshare_es.ts new file mode 100644 index 000000000..7eae22bc9 --- /dev/null +++ b/retroshare-gui/src/lang/retroshare_es.ts @@ -0,0 +1,3974 @@ + + + + + + + Arial + Arial + + + + AddFriendDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;"> To add a new Friend, cut and paste their email </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">invitation into the box below, and click done.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;"> To add a new Friend, cut and paste their email </span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">invitation into the box below, and click done.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;"></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + Cancel + Cancelación + + + + Done + Hecho + + + + Load From File + Carga del archivo + + + + RetroShare + Retroshare + + + + Certificate Load Failed + La carga del certificado falló + + + + Add a Friend + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"><span style=" font-size:16pt;">Add a new Friend</span><br /><br /><span style=" font-size:10pt;">To add a new Friend, cut and paste their email </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">invitation into the box below, and click done.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + + + + + AddFriendWizard + + + < Back + + + + + Next > + + + + + Cancel + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">This Wizard helps to Connect to your Friends</span></p></body></html> + + + + + I have a .pqi/.pem file received from a Friend + + + + + I have Key received from a Friend + + + + + I want to invite a friend to my RetroShare network + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Cut and paste the text below into an email.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;"> and send it to all your friends!</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">When you press next RetroShare will attempt to launch a Email client.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Invite your Friends to join with RetroShare</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Enter the Key code you got from your friend:</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">When you press next RetroShare will attempt to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">connect using the key.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Select a pqi/pem file:</span></p></body></html> + + + + + Browse + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">When you press next RetroShare will attempt to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">connect using the .pqi/.pem file.</p></body></html> + + + + + Add Friend to my netowork Wizard + + + + + AdvancedSearchDialog + + + RetrosShare: Advanced Search + + + + + Add a further search criterion. + + + + + Add a selection criterion + + + + + Reset + + + + + Cancels the search. + + + + + Cancel + + + + + Perform the advanced search. + + + + + Search + + + + + Search Criteria + + + + + Reset the search criteria. + + + + + ApplicationWindow + + + RetroShare %1 + + + + + Example Application + + + + + Application Users: 0 Files: 0 + + + + + Down: 0.0 Up: 0.0 + + + + + Connections: 0/45 + + + + + Hide + + + + + Show + + + + + RetroShare + + + + + Home + + + + + General + + + + + Advanced + + + + + QTextBrowser { + background-color: rgb(192,192,192); + + } + + + + + QPushButton + { + border-image: url(:/images/console-small-up.png) + } + + QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + + } + + QPushButton:pressed { + border-image: url(:/images/console-small-down.png) + } + + + + + + AuthorizationDialog + + + Authenticate + Authenticar + + + + Authenticate Friend By Entering Their Code + Authenticar a amigo introduciendo tu código + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + + + + OK + OK + + + + Cancel + Cancelación + + + + BandwidthGraph + + + RetroShare Bandwidth Usage + + + + + Show Settings + + + + + Reset + + + + + Receive Rate + + + + + Send Rate + + + + + Always on Top + + + + + Style + + + + + Changes the transparency of the Bandwidth Graph + + + + + 100 + + + + + % Opaque + + + + + Save + + + + + Cancel + + + + + Since: + + + + + Hide Settings + + + + + CallToaster + + + Message + + + + + ChanCreateDialog + + + Create a new Broadcast Channel + Crear un nuevo canal + + + + Create A New Broadcast Channel + Crear un nuevo canal + + + + Channel Name: + Nombre del canal: + + + + Type: + Tipo: + + + + Public Channel (Signed) + Canal público (firmado) + + + + Private Channel (Encrypted) + Canal privado (cifrado) + + + + Cancel Channel + Cancelar el canal + + + + Create Channel + Crear el canal + + + + ChanMsgDialog + + + Compose + Componer + + + + Recommended Files + Archivos recomendados + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-weight:400;"><span style=" font-weight:600;">Subject:</span></p></body></html> + + + + + Send To: + Enviar a: + + + + Send + Enviar + + + + Delete Channel + Canal cancelación + + + + Create Channel MSG + Crear el mensaje del canal + + + + 1 + + + + + Reply + + + + + ChannelsDialog + + + New Message + Nuevo mensaje + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Messages</span></p></body></html> + + + + + Date + Fecha + + + + Rank + Fila + + + + From + De + + + + Title + Título + + + + Msg + mensaje + + + + Count + Cuenta + + + + Size + Tamaño + + + + Type + Tipo + + + + Rs[Cert/Chan]IdSize + Rs[Cert/Chan]IdSize + + + + RsMsgId + RsMsgId + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Message Text</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Message Text</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Recommended Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Recommended Files</span></p></body></html> + + + + New Channel + Nuevo canal + + + + Subscribe To Channel + Suscribir al canal + + + + Unsubscribe To Channel + Unsubscribe al canal + + + + Delete Your Channel + Suprimir tu canal + + + + Download + Transferencia directa + + + + Download All + Transferencia directa todos + + + + ChatDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:9pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:400;"></p></body></html> + + + + + Chat History: + Historia de la charla: + + + + Chat With: + Charla con: + + + + Chat + Charla + + + + Users: + + + + + ChatToaster + + + message + mensaje + + + + You Get a New Message + Consigues un nuevo mensaje + + + + Message + + + + + ConfCertDialog + + + Cancel + Cancelar + + + + Done + Hecho + + + + Apply + Aplicarte + + + + Peer Settings + Ajustes del par + + + + Port: + Port: + + + + behind zee Firewall + detrás de un cortafuego (Firewall) + + + + Forwarded External Port + Puerto externo remitido + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Dirección externa:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Adress local:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Max Transfer Rate (kb/s) </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Tu max velocidad del Upload (kb/s) </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Org / Loc:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Org / Loc:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Nombre:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Country/State:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">País/estado:</p></body></html> + + + + Trust Settings + Ajustes de la confianza + + + + Trust Level + Nivel de la confianza + + + + Trust Their Signature + Confiar en tu firma + + + + Sign The Certificate + Firmar el certificado + + + + OK + + + + + Peer Adress + + + + + Peer Info + + + + + ConfirmQuitDialog + + + Exit RetroShare + + + + + You are about to exit the RetroShare application and therefore stop all transfers. <br><br>Are you sure you want to stop and exit RetroShare? + + + + + Do not show this message again. + + + + + ConnectDialog + + + Peer Details + Detalles del peer + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">País:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Org:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Org:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Nombre:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Trust:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Confianza:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Loc:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Loc:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Certificate</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">signers:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Certificado</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">signers:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTHenticar el código:</span></p></body></html> + + + + Make Friend + Hacer a amigo + + + + Close + Cierre + + + + ConnectionsDialog + + + Load Certificate + Certificado de la carga + + + + Select a pem/pqi File + Seleccionar un archivo del PEM/PQI + + + + File Not Found + Archivo no encontrado + + + + %1 does not exist. Would you like to create it? + %1 no existe. ¿Tienes gusto de crearlo? + + + + Failed to Create File + No pudo crear el archivo + + + + Unable to create %1 [%2] + Incapaz crear %1 [%2] + + + + Select Certificate + Seleccionar el certificado + + + + Certificates (*.pqi *.pem) + Certificado (*.pqi *.pem) + + + + Accept + Aceptar + + + + Trust + Confianza + + + + Last Contact + Contacto pasado + + + + Name + Nombre + + + + Organisation + Organización + + + + Location + Localización + + + + Country + País + + + + Peer Address + Dirección del peer + + + + Cert Id + Cert ID + + + + Auth Code + Auth Code + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + + + + Peer Details / Authenticate + Los detalles del peer/authentican + + + + CryptographyDialog + + + RSA Key Size + RSA Key Size + + + + Rijndael Block size + Rijndael Block size + + + + 128 Bits + 128 Bits + + + + 192 Bits + 192 Bits + + + + 256 Bits + 256 Bits + + + + Rijndael Key Size + Rijndael Key Size + + + + Rijndael Mode + Rijndael Mode + + + + CBC + CBC + + + + ECB + ECB + + + + CFB + CFB + + + + Rijndael Padding + Rijndael Padding + + + + PKCS7 + PKCS7 + + + + Zeros + Zeros + + + + ANSIX923 + ANSIX923 + + + + ISO10126 + ISO10126 + + + + Rijndael Feedback Size + Rijndael Feedback Size + + + + Key Size: + Key Size: + + + + Block Size: + Block Size: + + + + Feedback Size: + Feedback Size: + + + + Mode: + Mode: + + + + Padding: + Padding: + + + + DLListDelegate + + + B + + + + + KB + + + + + MB + + + + + GB + + + + + DirectoriesDialog + + + Shared Directories + Directorios compartidos + + + + Other Directories + Otros directorios + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Incoming Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Incoming Files</span></p></body></html> + + + + Add Shared Directory + Agregar el directorio compartido + + + + DirectoriesPage + + + Shared Directories + Directorios compartidos + + + + Incoming files + Archivos entrantes + + + + ExampleDialog + + + Vote Up + + + + + Vote Down + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Friends</span></p></body></html> + + + + + # + + + + + Status + + + + + Person + + + + + Auto Connect + + + + + Trust Level + + + + + Peer Address + Dirección del peer + + + + Last Contact + Contacto pasado + + + + Organisation + Organización + + + + Location + Localización + + + + Country + País + + + + Person Id + + + + + Auth Code + Auth Code + + + + ExprParamElement + + + to + + + + + ignore case + + + + + dd.MM.yyyy + + + + + KB + + + + + MB + + + + + GB + + + + + ExpressionWidget + + + Expression Widget + + + + + Delete this expression + + + + + FileHashDialog + + + Download + Transferencia directa (Download) + + + + GSettingsWin + + + General + General + + + + Network + Red (Network) + + + + Directories + Directorios + + + + Server + Ajustes del peer + + + + %1 + %1 + + + + GenCertDialog + + + RetroShare setup + Setup: Disposición de Retroshare + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16pt;">Generate a new profile</span><br /><br />Please fill in the information which will<br />allow your RetroShare to connect to</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Friends.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Organisation:</p></body></html> + + + + + Password (Again) + + + + + Location: + + + + + Load Trusted Certificate (Optional) + Load Trusted Certificate (Optional) + + + + Password + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Amigo</span></p></body></html> + + + + Select File + Seleccionar el archivo + + + + Country: + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + + + + + Generate New Certificate + Generar el certificado nuevo + + + + Select Trusted Friend + Seleccionar a amigo confiado en + + + + Certificates (*.pqi *.pem) + Certificados (*.pqi *.pem) + + + + GeneralPage + + + Keys manager + Manager del Llaves (Keys manager) + + + + Style + Estilo + + + + Choose RetroShare's interface style + Elegir el estilo del interfaz Retroshare + + + + Language + Lengua + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">¡Los cambios a la lengua tomarán solamente efecto después de recomenzar Retroshare!</p></body></html> + + + + Choose the language used in RetroShare + Elegir la lengua usada en Retroshare + + + + GraphFrame + + + Recv: + + + + + %1 KB/s + + + + + Sent: + + + + + %1 KB + + + + + %1 MB + + + + + %1 GB + + + + + HelpDialog + + + About + + + + + Authors + + + + + Thanks to + + + + + Translation + + + + + License Agreement + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">About/Help</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:xx-large; font-weight:600; color:#0000ff;">About RetroShare.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-weight:600;">Retroshare is a private and secure decentralised commmunication platform.<br />You can use it chat, send messages and share files with your friends.</span><br /><br />This is just a placeholder page for the moment. You can<br />improve retroshare's in-built help (this text) by<br />updating the retroshare wiki: <a href="http://retroshare.wiki.sourceforge.net/help_tab"><span style=" text-decoration: underline; color:#0000ff;">This Page in the retroshare Wiki</span></a><br /><br />The About/Help Tab is regularly updated from the Wiki page.<br /><br />External Links to more information:<br /></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.sourceforge.net"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Webpage</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.wiki.sourceforge.net/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Wiki</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://sourceforge.net/projects/retroshare/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Project Page</span></a></li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.lunamutt.com"><span style=" text-decoration: underline; color:#0000ff;">Lunamutt Homepage.</span></a></li></ul></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-size:19pt; font-weight:600; color:#0000ff;">The RetroShare Team:</span><br /> <br /><span style=" font-size:9pt; color:#0000ff;">defnax</span>: Lead GUI developer <br /><span style=" font-size:9pt; color:#0000ff;">drbob7</span>: Lead Core developer. <br /> <br /><span style=" font-size:9pt; color:#0000ff;">bmeck</span> : Our new web-developer. Joined retroshare a couple <br />of weeks ago, and already starting on an exciting new <br />design for the web-page. <br /> <br /><span style=" font-size:9pt; color:#0000ff;">noragen</span> : Developer from the SIM-IM project. Working on a retroshare plugin to SIM-IM. <br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">kernelpanix</span> : Gui and skin developer</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">libris</span><span style=" font-size:9pt;">:</span> core developer</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-size:9pt; color:#0000ff;">kashif: </span><span style=" color:#000000;">core developer</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt; color:#000000;"><span style=" font-size:8pt;"><br /></span><span style=" color:#0000ff;">agent725</span><span style=" font-size:8pt;">: Manages the 'local' Retroshare release, <br />and beta-testing retroshare on a large scale. <br /> <br /></span><span style=" color:#0000ff;">the_mgt</span><span style=" font-size:8pt;">: Maintains the Gentoo and generic linux <br />installation/compilation scripts. </span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">notdefine:</span> Maintains the .rpm, .deb installation/compilation scripts.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">zhouk</span>: developer</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Translators:</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Serbian</span>: Kunalagon Umuhanik &lt;kunalagon@gmail.com&gt;</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Polish: </span>Jarek</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">French</span>:Temet</p></body></html> + + + + + InviteDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">To </span><span style=" font-size:10pt; font-weight:600;">Invite your friends to join you with Retroshare: </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">Cut and paste the text below into an email.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">and send it to all your friends!</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">To </span><span style=" font-size:10pt; font-weight:600;">Invitar a tus amigos que te ensamblen con Retroshare: </span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">Corte y goma el texto abajo en un email.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">and send it to all your friends!</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + Done + Hecho + + + + Cancel + Cancelación + + + + Launch Email + Email del lanzamiento + + + + Invite a Friend + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"><span style=" font-size:16pt;">Invite a Friend</span><br /><br /><span style=" font-size:10pt;">To Invite your friends to join you with Retroshare: </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">Cut and paste the text below into an email.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">and send it to all your friends!</p></body></html> + + + + + LogDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> + +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="ABOUT"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">About RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShare is a private peer to peer communication platform created by Dr. Bob.This program enables you to securely share files and chat with your friends (and no-one else!).</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, and the latest release go to http://www.lunamutt.com.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="START"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Quick Start Guide to RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If this is your first time using Retroshare, it is recommended that you readthis guide for instructions on how to get started. The first step is:<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Connecting to Your Friends</span></a>. Once you have managed this you can <a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">Download Files</span></a> and<a href="#START-SHARE"><span style=" text-decoration: underline; color:#0000ff;">Share with Others</span></a></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Some of the key concepts related to ensuring your sharing remains private aredescribed in the <a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">Frequently Asked Questions</span></a>. Some Key security questions are:<a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">What is a Web of Trust?</span></a>, <a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">Should I Sign this Certificate?</span></a>, and finally<a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">What does "Trust" Mean?</span></a>.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is also worthwhile reading the <a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">GUI Overview</span></a>which describes the featureson available through the User Interface.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Connecting to your Friends </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">There are four steps to connecting to a Friend:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Get Friend's Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Load Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Sign Certificate</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect to Friend.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The instructions might initially appear long and daunting, however thesesteps are required to ensure that your sharing is private and secure.These steps are only required a couple of times, to add new friends, and become quite straight forward after the first time.</p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (1) EXCHANGE CERTIFICATES </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Before you can connect, you need send your certificate to your friend, and get your friends certificate. Follow these steps to get your certificate:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on Your Certificate to Select it.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on the "Export Friend" Button to bring up a file save dialog.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select directory to save the certificate to.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Enter desired filename. (with a file type of .pqi), and Click OK.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Email this File to your Friend. (It is recommended you put thecertificate in a zip file before sending, as some email programsdon't transmit the file correctly).</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Ask your friend to do the same.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Once you have received your friend's certificate, removed itfrom the zip file and saved it to disk, you can proceed to step (2).</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Note: This exchange of certificates is only necessary to get you started.Once you are connected to some friends the exchange of certificates becomeautomated by the autoDiscovery system. See<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">GUI: Connecting</span></a> for more information.------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (2) LOAD YOUR FRIEND'S CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Import Friend"</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select your friends certificate file, then click "Okay". Their certificate should appear in the top window of the "Connect" Tab.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (3) SIGN CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select their Certificate by clicking on their name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Configure Friend" Button. This will bring up a configuration window. which allows you to look at the detailsof the certificate.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click the "Sign Certificate" button near the bottom of the "Certificate Configuration" Window.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Now close the window by clicking on the "Done" button.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Your Friends certificate should now say "Trusted (S)", indicating it is ready for connections.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can only share with "Trusted" Peers. You must sign your Friend'scertificate to prove that you know the certificate belongs to your Friend. Do not sign any/all certificates - only the people youtrust. For more information see: <br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br />------------------------------------------------------------------------<br /><br /> <br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (4) AUTOCONNECT TO PEER </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Finally You need to activate the connection:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click in the Box, next to your friends Name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> A Tick should appear in the box, a connection will be started.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> The "Offline" will change to "Online" when you have successfullyconnected.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Remember: Your initial connection attempts will fail, until your friend has signed your certificate and ticked the Auto-Connect Box.This ensures that both peers trust each other, and stops random peopleaccessing your files.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>. <br />------------------------------------------------------------------------<br /><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-DOWNLOAD"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Downloading Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have connected to friends, you can download their shared files.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can search for the files you want using either:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) File Listing Tab: This gives you a directory view of the files being shared by your peers. Double clickon the directory name (not the arrow) to diplay its subdirectories and files.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 1: This can take up to 5 seconds to fetch the information for your peer.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 2: If the directory is empty, or the person is offline, then the request will silently fail.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Search Tab: Retroshare also allows you to search your peers computers for filenames. Enter yourterm(s) in the search box at the top of the TAB and click the "Search" button. This willsearch all of the peers that you are currently connected to.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 3: If any matching files are found they will be displayed within 5 - 10 seconds.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have found the files you want, Select the file(s), and click "Download" to begin the download process.If you click over the "File Transfer" TAB, the status of the files will appear.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 4: The files can take up to 10 seconds to appear in the transfer window.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-SHARING"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Sharing Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can specify which files you want to share in the "Config" Tab.In the "Share Directories" section, click the "Add Directory" Button, and select the directory you want to share.The files and subdirectories will become available for you peers.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can remove a directory from the Shared Directories List by clicking onthe directory name in the list, and then clicking "Remove Directory".</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="GUI"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Gui Overview (Tab Description) </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The GUI is divided up into several sections which can be accessed by clicking on the Tabs along the top of the main window. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect: Manage Connections and Friends.(<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">getting started</span></a> and<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Listing: A directory view of available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Search: Search for available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Messages: For Sending/Recving Message. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Channels: A broadcast/subscription system. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Transfer: Listing of Current and completed Transfers.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Config: Specify of share diectories and IP Addresses.(<a href="#GUI-CONFIG"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> About: Help and other Information.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Chat: Accessed by the clicking on the "Chat" button.</li></ul> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Connect Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Connect TAB consists of two windows. The upper windowshows a list of your friends. This window indicates each friendscurrent trust level, as well as their connection state.The "Trust_Lvl" Column indicates if the certificate has beenAuthenticated using the web of trust. You can only connect to "Trusted" certificates. Tick the "Auto_Connect" box to connect to your trusted friends.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The lower window provides a list of the friends of your friends.This window shows the neighbour's name and how long ago they attempted to connect to you. This window is automatically populatedby the autoDiscovery system, and should be used to expand yourretroShare network. A word of warning: Do not automatically trust (or sign) anyonethat appears in this window. First verify by some other means (email/phone)that certificate belongs to the person you think it does.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use the "Neighbour List" window to expand your friend list. Select the desired entry in the lower window by clicking on it, then click the "Add to Friends" Button to move it to the upper window.Likewise the "Remove from Friends" button moved a person from the upper window to the lower window.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The "Configure Friend" Button opens a Certificate Configuration window.This window can be used to examine the certificate details, sign the certificate or manually change the peer's IP Address.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">See Also:<br /><a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Getting Started: Connecting to your friends</span></a>.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>.<br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONFIG"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Config Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Configuration Tab allows you to select the share directories, as well as the directory that downloaded files are saved to.<br />See <a href="#STARTUP-SHARING"><span style=" text-decoration: underline; color:#0000ff;">Sharing you Files</span></a> for details. </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Config Tab also allows you to control the IP Address and Portused by RetroShare. Under most cirumstances you do not need to changethese setting. If you are behind a firewall and can setup a forwarded port, the selected IP Address and Port should be specified here.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="FAQ"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Frequently Asked Questions </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">How does the security/privacy work? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShares uses a Web of Trust Authentication system to ensurethat your "friends" are your friends, and uses SSL to encryptthe communcications between peers. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What is a Web of Trust? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Web of Trust relies on a collection of peers to identify eachother. Look it up on the Web!</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-TRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What does "Trust" Mean in RetroShare?</span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Anyone can generate a certificate, with any name on it. So howdo you know that the certificate that claims to be from "Joe Bloggs"is really from your mate Joe. This is the "AuthenticationProblem". RetroShare uses a Web of Trust to Authenticate your peers.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-SIGN"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Should I Sign this Certificate? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should only sign a certificate if you are completely surethat it comes from the "right" person. If you sign a certificateyou are "Authenticating" the person to yourself and others.If you sign certificates that you haven't checked, then you aredestroying your own privacy and security.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">How do you verify a certificate? Use an alternative method ofcommunication to send the certificate: E.g. email or USB stick. This will improve you confidence that the certificate belongsto the correct person. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><span style=" font-size:small;"> </span><a name="FAQ-CONNECT"></a><span style=" font-size:small;">W</span><span style=" font-size:small;">hy won't it Connect?</span><span style=" font-size:small;"> </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A connection can fail for a number of reasons:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) Failed Authentication. Have both peers signed each otherscertificates? </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Firewalls. If both peers are behind firewalls then they cannotconnect directly. RetroShare has a built in proxy system to circumventfirewalls - However this can only function if both peers can connect to a common third party that is not behind a firewall. Thisis the most likely reason for initial connections to fail. The only solution to find a common friend that isn't firewalled (know anyone with Broadband?)</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(3) IP Addresses are wrong. You can manually examine and change these using the Certificate configuration.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +</body></html> + + + + + MainWindow + + + Preferences + Preferencias + + + + Network + Red (Network Settings) + + + + Friends + Amigos + + + + Transfers + Transferencias + + + + Messages + Email Mensajes + + + + Channels + Canales + + + + Options + Opciones + + + + Users: 0 Files: 0 + Usuarios: 0 Files: 0 + + + + Down: 0.0 Up: 0.0 + Abajo (Down): 0.0 Encima de (Up): 0.0 + + + + Connections: 0/45 + Conexiones: 0/45 + + + + System tray is unavailable + La bandeja del sistema es inasequible + + + + System tray unavailable + Bandeja del sistema inasequible + + + + RetroShare System tray + Bandeja del sistema de Retroshare + + + + Application will continue running. Quit using context menu in the system tray + El uso continuará funcionando. Menú parado del contexto que usa en la bandeja del sistema + + + + Hide + Piel + + + + Show + Demostración + + + + RetroShare + Retroshare + + + + Home + Home + + + + General + General + + + + Invite Friend + Invitar a amigo + + + + Add Friend + Agregar a amigo + + + + Add Share + Agregar la parte + + + + Advanced + Avanzado + + + + QTextBrowser { + background-color: rgb(192,192,192); + +} + QTextBrowser { background-color: rgb(192,192,192);} + + + + QPushButton +{ + border-image: url(:/images/console-small-up.png) +} + +QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + +} + +QPushButton:pressed { + border-image: url(:/images/console-small-down.png) +} + + QPushButton{ border-image: url(:/images/console-small-up.png) }QPushButton:hover { border-image: url(:/images/console-small-hover.png) }QPushButton:pressed { border-image: url(:/images/console-small-down.png) } + + + + Exit + Salida + + + + Search + Búsqueda + + + + Files + Archivos del Biblioteca + + + + Chat + Charla del grupo + + + + Add Shared Directory + Agregar el directorio compartido + + + + About/Help + + + + + Messenger + + + + + Show/Hide + + + + + &Quit + + + + + Bandwidth Graph + + + + + Open Messenger + + + + + RetroShare %1 + + + + + Add a Friend + + + + + Invite a Friend + + + + + Add a Share + + + + + Quit + + + + + Minimize + + + + + Maximize + + + + + Hide Console + + + + + Show Console + + + + + Hide ToolBox + + + + + :images/hide_toolbox_frame.png + + + + + Show ToolBox + + + + + :images/show_toolbox_frame.png + + + + + QTextBrowser { + background-color: rgb(192,192,192); + + } + + + + + QPushButton + { + border-image: url(:/images/console-small-up.png) + } + + QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + + } + + QPushButton:pressed { + border-image: url(:/images/console-small-down.png) + } + + + + + + Apps + + + + + MessageToaster + + + message + mensaje + + + + MessagesDialog + + + New Message + Nuevo mensaje + + + + Reply to Message + Contestación al mensaje + + + + Remove Message + Quitar el mensaje + + + + Date + Fecha/Tiempo + + + + From + De + + + + Title + Título + + + + Msg + Mensaje + + + + Count + Cuenta + + + + Size + Tamaño + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Recommended Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Archivos recomendados</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">remove selected message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">remove selected message</p></body></html> + + + + QPushButton +{ +border-image: url(:/images/deletemail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/deletemail-hover.png); +} + QPushButton{border-image: url(:/images/deletemail24.png);}QPushButton:pressed{border-image: url(:/images/deletemail-hover.png);} + + + + Inbox + Email Inbox + + + + Outbox + Email Outbox + + + + Draft + Bosquejos + + + + Sent + Email Enviado + + + + Timestamp + Timestamp + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">reply to selected message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">reply to selected message</p></body></html> + + + + +QPushButton +{ +border-image: url(:/images/replymail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/replymail-hover.png); +} + + QPushButton{border-image: url(:/images/replymail24.png);}QPushButton:pressed{border-image: url(:/images/replymail-hover.png);} + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">New Message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Nuevo mensaje</p></body></html> + + + + QPushButton +{ +border-image: url(:/images/folder-draft24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/folder-draft24-hover.png); +} + + QPushButton{border-image: url(:/images/folder-draft24.png);}QPushButton:pressed {border-image: url(:/images/folder-draft24-hover.png);} + + + + You get Message testing + Consigues un mensaje para probar + + + + Download All + Descargar todos + + + + QPushButton +{ +border-image: url(:/images/deletemail24.png); +} + +QPushButton:hover +{ +border-image: url(:/images/deletemail-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/deletemail-pressed.png); +} + + + + + +QPushButton +{ +border-image: url(:/images/replymail24.png); +} + +QPushButton:hover +{ +border-image: url(:/images/replymail24-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/replymail-pressed.png); +} + + + + + + QPushButton +{ +border-image: url(:/images/folder-draft24.png); +} +QPushButton:hover +{ +border-image: url(:/images/folder-draft24-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/folder-draft24-pressed.png); +} + + + + + + MessengerWindow + + + QWidget#MessengerWindow { +background-color: #ECF3F6; background-image:url(:/images/backgroundimage.png); +background-position: top right; +background-repeat: no-repeat +} + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click to change your avatar</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Change your Status and your display</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">picture here.</p></body></html> + + + + + Online + + + + + Busy + + + + + Be right Back + + + + + Away + + + + + In a Call + + + + + Out of lunch + + + + + Apear Offline + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Share a personal message with your contacts</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Add a Friend</p></body></html> + + + + + Chat + + + + + Connect To Friend + + + + + NetworkDialog + + + Peer Details / Authenticate + Los detalles del peer/authentican + + + + Load Certificate + Certificado de la carga + + + + Select a pem/pqi File + Seleccionar un archivo del PEM/PQI + + + + File Not Found + Archivo no encontrado + + + + %1 does not exist. Would you like to create it? + %1 no existe. ¿Tienes gusto de crearlo? + + + + Failed to Create File + No pudo crear el archivo + + + + Unable to create %1 [%2] + Incapaz crear %1 [%2] + + + + Select Certificate + Seleccionar el certificado + + + + Certificates (*.pqi *.pem) + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + + + + # + + + + + Accept + Aceptar + + + + Trust + Confianza + + + + Last Contact + Contacto pasado + + + + Name + Nombre + + + + Peer Address + Dirección del peer + + + + Organisation + Organización + + + + Location + Localización + + + + Country + País + + + + Cert Id + Cert ID + + + + Auth Code + Auth Code + + + + NetworkPage + + + Rate Options + Todos de Descargar + + + + Max Total Data Rate (KB/S): + Velocidad de datos total máxima (KB/S): + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Rate per Person (KB/S):</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Rate per Person (KB/S):</p></body></html> + + + + PeersDialog + + + Chat + Charla + + + + Configure Friend + Configurar a amigo + + + + Export Friend + Amigo de la exportación + + + + Remove Friend + Quitar a amigo + + + + Save Certificate + Excepto certificado + + + + Certificates (*.pqi) + Certificados (*.pqi) + + + + Status + Estado + + + + Person + Persona + + + + Auto Connect + Auto Connecta + + + + Trust Level + Nivel de la confianza + + + + Peer Address + Dirección del peer + + + + Last Contact + Contacto pasado + + + + Organisation + Organización + + + + Location + Localización + + + + Country + País + + + + Person Id + Persona ID + + + + Auth Code + Auth Code + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Friends</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Amigos</span></p></body></html> + + + + Connect To Friend + Conectar con el amigo + + + + # + + + + + PopupChatDialog + + + RetroShare Friend Chat + Charla del amigo + + + + RetroShare User Chat + + + + + PreferencesDialog + + + Language + Lengua + + + + Style + Estilo + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">¡Los cambios a la lengua tomarán solamente efecto después de recomenzar Retroshare!</p></body></html> + + + + Style Sheet + Hoja del estilo + + + + Default + Default + + + + Pagefold + Pagefold + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose RetroShare's interface style</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Elegir el estilo del interfaz de Retroshare</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose the language used in RetroShare</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Elegir la lengua usada en Retroshare</p></body></html> + + + + blue + azul + + + + silver + plata + + + + ed2k + emule-ed2k + + + + over + over + + + + black + negro + + + + arachnophobia + arachnophobia + + + + Skin2 + Piel2 + + + + Login + Login + + + + Remove Auto Login + Quitar Auto Login + + + + PreferencesWindow + + + Directories + Directorios + + + + Error Saving Configuration + Configuración del ahorro del error + + + + About + Sobre + + + + General + General + + + + Server + Peer Ajustes + + + + Options + Opciones + + + + Cancel + Cancelación + + + + OK + OK + + + + QObject + + + Name + Nombre + + + + Path + + + + + Extension + + + + + Date + + + + + Size + + + + + Popularity + + + + + contains + + + + + contains all + + + + + is + + + + + less than + + + + + less than or equal + + + + + greater than or equal + + + + + greater than + + + + + is in range + + + + + and + + + + + and / or + + + + + or + + + + + equals + + + + + Rshare + + + Invalid language code specified: + Código inválido de la lengua especificado: + + + + Invalid GUI style specified: + El estilo inválido del GUI especificó: + + + + SearchDialog + + + File Name + Nombre del archivo + + + + Sources + Fuentes + + + + Search Pattern + Patrón de la búsqueda + + + + Results + Resultados + + + + File Size + Tamaño del archivo + + + + Download + Transferencia directa (Download) + + + + Broadcast on Channel + Difusión en el canal + + + + Recommend to Friends + Recomendar a los amigos + + + + Remove + Quitar + + + + Remove All + Quitar todos + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Keywords</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Keywords</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Format</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Format</p></body></html> + + + + Any + Cualesquiera + + + + Audio + Audio + + + + Video + Video + + + + Images + Imágenes + + + + Programs + Programas + + + + Archives + Archivos + + + + Documents + Documentos + + + + search + búsqueda + + + + download + transferencia directa (download) + + + + Toggle advanced searching on and off. + + + + + <h3>Simple Search:</h3> + + + + + Keywords + + + + + Perform simple search + + + + + Show Advanced Search Tool + + + + + Filename + + + + + Hash + + + + + KeyWords + + + + + Search Id + + + + + <h3>Advanced Search:</h3> + + + + + ServerDialog + + + Transfer Rates + Velocidad de la transferencia + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Total Rate (kb/s) </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Total Rate (kb/s) </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Per Person </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Per Person </p></body></html> + + + + Server Settings + Ajustes del peer + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Adress local:</p></body></html> + + + + Port: + Puerto: + + + + behind zee Firewall + detrás de un cortafuego (Firewall) + + + + Forwarded External Port + Puerto externo remitido + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Dirección externa:</p></body></html> + + + + Check Settings + Comprobar los ajustes + + + + Firewall/Router Configuration + + + + + Manual router setup. + + + + + Use uPnP to configure router + + + + + Network Address Configuration (takes effect after restart) + + + + + Use DHT to locate friends + + + + + Manual IP Addresses + + + + + Server Status And Network Settings + + + + + Firewalled + + + + + Forwarded Port + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">DHT Status</p></body></html> + + + + + uPnP Status + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Local Address:</p></body></html> + + + + + ServerPage + + + Change + Restart Server + Cambio + recomenzar + + + + Server Settings + Ajustes del peer + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Adress externo:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Adress local:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Puerto:</p></body></html> + + + + Port: + Puerto: + + + + Misc + Misc + + + + behinde Firewall + detrás de cortafuego (Firewall) + + + + Forwarded External Port + Puerto externo remitido + + + + Settings + + + Settings + Ajustes + + + + Cancel + Cancelación + + + + Apply + Aplicarte + + + + OK + OK + + + + General + General + + + + Network + Red (Network) + + + + Server + Peer + + + + Directories + Directorios + + + + SharedFilesDialog + + + Download + Transferencia directa (Download) + + + + Recommend + Recomendar + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Archivos</span></p></body></html> + + + + Add to Recommend List + + + + + Recommend To + + + + + Message Friend + + + + + StartDialog + + + Select Trusted Friend + Seleccionar a amigo confiado en + + + + Certificates (*.pqi *.pem) + Certificados (*.pqi *.pem) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:13pt; font-weight:600; color:#8b0000;">Welcome to RetroShare</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:13pt; font-weight:600; color:#8b0000;">Recepción a Retroshare</span></p></body></html> + + + + Please Login .... + Por favor Login .... + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Nombre:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Pasword</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Contraseña (Password)</span></p></body></html> + + + + Load Existing User + Usuario existente de la carga + + + + Or create a New User + O crear a nuevo usuario + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Organisation:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Organización:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">País:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Location:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Localización:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Password (Again)</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Password (Again)</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">New Password</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">New Password</span></p></body></html> + + + + Load Trusted Certificate (Optional) + Load Trusted Certificate (Optional) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Amigo</span></p></body></html> + + + + Select File + Seleccionar el archivo + + + + Generate New Certificate + Generar el certificado nuevo + + + + RetroShare setup + Setup: Disposición de Retroshare + + + + Automatically Login in Future + Automáticamente conexión en futuro + + + + RetroShare + + + + + QWidget { + background-color: #ECF3F6; +} + + + + + Auto-login + + + + + Name: + + + + + Log In + + + + + Password: + + + + + Create a Account + + + + + QToolButton{ +border-image: url(:/images/avatar_background.png); + +} + + + + + + StatisticDialog + + + Statistics + Estadística + + + + Download + Download + + + + Session: + Sesión: + + + + Downloaded: + Downloaded: + + + + Average Downloadspeed: + Promedio Downloadspeed: + + + + Count of Downloads: + Count of Downloads: + + + + Overall + Overall + + + + Upload + Upload + + + + Session + Sesión + + + + Uploaded: + Uploaded: + + + + Average Uploadspeed: + Promedio Uploadspeed: + + + + Count of Uploads: + Cuenta de Uploads: + + + + Uploaded + Uploaded + + + + Connections: + Conexiones: + + + + Peers: + Peers: + + + + Misc + Misc + + + + Uptime: + Uptime: + + + + Overall: + Overall: + + + + Uptime + Uptime + + + + Records + Records + + + + Uploadspeed: + Uploadspeed: + + + + Downloadspeed: + Downloadspeed: + + + + Show Settings + Demostrar los ajustes + + + + Reset + Reajuste + + + + Receive Rate + Velocidad de Recieve + + + + Send Rate + velocidad enviada + + + + Always On Top + Siempre en tapa + + + + 100 + 100 + + + + % Opaque + % Opaque + + + + Changes the transparency of the Bandwidth Graph + Cambia la transparencia del gráfico de la anchura de banda + + + + Save + Excepto + + + + Cancel + Cancelación + + + + Hide Settings + Ajustes de la piel + + + + TransfersDialog + + + Cancel + Cancelación + + + + Clear Completed + El claro acabó + + + + File Name + Nombre del archivo + + + + Sources + Fuentes + + + + Status + Estado + + + + File Size + Tamaño del archivo + + + + Speed + Velocidad + + + + Progress + Progreso + + + + Completed + Cabado + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Downloads:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Downloads:</span></p></body></html> + + + + Peer Name + Nombre del Peer + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Uploads:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Uploads:</span></p></body></html> + + + + Name + i.e: file name + Nombre + + + + Size + i.e: file size + + + + + Progress + i.e: % downloaded + Progreso + + + + Speed + i.e: Download speed + Velocidad + + + + Sources + i.e: Sources + Fuentes + + + + Remaining + i.e: Estimated Time of Arrival / Time left + + + + + Core-ID + + + + + User Name + i.e: user name + + + + + Progress + i.e: % uploaded + Progreso + + + + Speed + i.e: upload speed + Velocidad + + + + Transferred + + + + + ULListDelegate + + + B + + + + + KB + + + + + MB + + + + + GB + + + + + VMessageBox + + + OK + OK + + + + Cancel + Cancelación + + + + Yes + Sí + + + + No + No + + + + Help + Ayuda + + + + Retry + Recomprobación + + + + Show Log + Demostrar la historia + + + + Show Settings + Demostrar los ajustes + + + + moreinfo + + + Details + Detalles + + + + OK + OK + + + + Name + Nombre + + + + Value + Valor + + + diff --git a/retroshare-gui/src/lang/retroshare_fi.qm b/retroshare-gui/src/lang/retroshare_fi.qm new file mode 100644 index 000000000..bd6fc5268 Binary files /dev/null and b/retroshare-gui/src/lang/retroshare_fi.qm differ diff --git a/retroshare-gui/src/lang/retroshare_fi.ts b/retroshare-gui/src/lang/retroshare_fi.ts new file mode 100644 index 000000000..1d4d8e836 --- /dev/null +++ b/retroshare-gui/src/lang/retroshare_fi.ts @@ -0,0 +1,4463 @@ + + + + + + + Arial + Arial + + + + AddFriendDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;"> To add a new Friend, cut and paste their email </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">invitation into the box below, and click done.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;"> Lisätäksesi ystävän, leikkaa ja liitä hänen sähköposti- </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">kutsunsa alla olevaan laatikkoon, ja napsauta valmis.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;"></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + Cancel + Peru + + + + Done + Valmis + + + + Load From File + Lataa tiedostosta + + + + RetroShare + RetroShare + + + + Certificate Load Failed + Varmenteen lataus epäonnistui + + + + Add a Friend + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"><span style=" font-size:16pt;">Add a new Friend</span><br /><br /><span style=" font-size:10pt;">To add a new Friend, cut and paste their email </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">invitation into the box below, and click done.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + + + + + AddFriendWizard + + + < Back + + + + + Next > + + + + + Cancel + Peru + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">This Wizard helps to Connect to your Friends</span></p></body></html> + + + + + I have a .pqi/.pem file received from a Friend + + + + + I have Key received from a Friend + + + + + I want to invite a friend to my RetroShare network + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Cut and paste the text below into an email.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;"> and send it to all your friends!</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">When you press next RetroShare will attempt to launch a Email client.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Invite your Friends to join with RetroShare</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Enter the Key code you got from your friend:</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">When you press next RetroShare will attempt to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">connect using the key.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Select a pqi/pem file:</span></p></body></html> + + + + + Browse + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">When you press next RetroShare will attempt to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">connect using the .pqi/.pem file.</p></body></html> + + + + + Add Friend to my netowork Wizard + + + + + AdvancedSearchDialog + + + RetrosShare: Advanced Search + + + + + Add a further search criterion. + + + + + Add a selection criterion + + + + + Reset + + + + + Cancels the search. + + + + + Cancel + Peru + + + + Perform the advanced search. + + + + + Search + Etsi + + + + Search Criteria + + + + + Reset the search criteria. + + + + + ApplicationWindow + + + RetroShare %1 + + + + + Example Application + + + + + Application Users: 0 Files: 0 + + + + + Down: 0.0 Up: 0.0 + Vast: 0,0 Läh: 0,0 + + + + Connections: 0/45 + Yhteyksiä: 0/45 + + + + Hide + Piilota + + + + Show + Näytä + + + + RetroShare + RetroShare + + + + Home + Koti + + + + General + Yleiset + + + + Advanced + Lisäasetukset + + + + QTextBrowser { + background-color: rgb(192,192,192); + + } + + + + + QPushButton + { + border-image: url(:/images/console-small-up.png) + } + + QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + + } + + QPushButton:pressed { + border-image: url(:/images/console-small-down.png) + } + + + + + + AuthorizationDialog + + + Authenticate + Varmenna + + + + Authenticate Friend By Entering Their Code + Varmenna ystävä syöttämällä koodi + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Varmennekoodi:</span></p></body></html> + + + + OK + OK + + + + Cancel + Peru + + + + BandwidthGraph + + + RetroShare Bandwidth Usage + + + + + Show Settings + Näytä asetukset + + + + Reset + Palauta asetukset + + + + Receive Rate + Vastaanottonopeus + + + + Send Rate + Lähetysnopeus + + + + Always on Top + + + + + Style + Tyyli + + + + Changes the transparency of the Bandwidth Graph + Muuttaa siirtonopeuskuvaajan läpinäkyvyyttä + + + + 100 + 100 + + + + % Opaque + % näkyvä + + + + Save + Tallenna + + + + Cancel + Peru + + + + Since: + + + + + Hide Settings + Piilota asetukset + + + + CallToaster + + + Message + + + + + ChanCreateDialog + + + Create a new Broadcast Channel + Luo (sp)(sp) uusi yleislähetyskanava + + + + Create A New Broadcast Channel + Luo uusi yleislähetyskanava + + + + Channel Name: + Kanavan nimi: + + + + Type: + Tyyppi: + + + + Public Channel (Signed) + Julkinen kanava(sp)(sp)(allekirjoitettu) + + + + Private Channel (Encrypted) + Yksityiskanava (salattu) + + + + Cancel Channel + Peru kanava + + + + Create Channel + Luo kanava + + + + ChanMsgDialog + + + Compose + Muodosta + + + + Recommended Files + Suositellut tiedostot + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-weight:400;"><span style=" font-weight:600;">Subject:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-weight:400;"><span style=" font-weight:600;">Subject:</span></p></body></html> + + + + Send To: + Lähetä: + + + + Send + Lähetä + + + + Delete Channel + Poista kanava + + + + Create Channel MSG + Luo kanavaviesti + + + + 1 + 1 + + + + Reply + + + + + ChannelsDialog + + + New Message + Uusi viesti + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Messages</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Viestit</span></p></body></html> + + + + Date + Päiväys + + + + Rank + Sijaluku + + + + From + Lähettäjä + + + + Title + Otsikko + + + + Msg + Viesti + + + + Count + Lukumäärä + + + + Size + Koko + + + + Type + Tyyppi + + + + Rs[Cert/Chan]IdSize + Rs[Cert/Chan]IdSize + + + + RsMsgId + RsMsgId + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Message Text</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Viestin teksti</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Recommended Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Suositellut tiedostot</span></p></body></html> + + + + New Channel + Uusi kanava + + + + Subscribe To Channel + Tilaa kanava + + + + Unsubscribe To Channel + Peru kanavan tilaus + + + + Delete Your Channel + Poista kanava + + + + Download + Lataa + + + + Download All + Lataa kaikki + + + + ChatDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:9pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:400;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:9pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:400;"></p></body></html> + + + + Chat History: + Keskusteluhistoria: + + + + Chat With: + Keskustelu: + + + + Chat + Keskustelu + + + + Users: + + + + + ChatToaster + + + message + viesti + + + + You Get a New Message + Sinulle on uusi viesti + + + + Message + + + + + ConfCertDialog + + + Cancel + Peru + + + + Done + Valmis + + + + Apply + Toteuta + + + + Peer Settings + Vertaisasetukset + + + + Port: + Portti: + + + + behind zee Firewall + Palomuurin takana + + + + Forwarded External Port + Edelleenvälitetty ulkoinen portti + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Portti:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ulkoinen osoite:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ulkoinen nimi</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Paikallinen osoite:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Max Transfer Rate (kb/s) </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Suurin siirtonopeus (kB/s) </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Org / Loc:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Org / Sij:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Nimi:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Country/State:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Maa/osavaltio:</p></body></html> + + + + Trust Settings + Luottamusasetukset + + + + Trust Level + Luottamustaso + + + + Trust Their Signature + Luota allekirjoituksiin + + + + Sign The Certificate + Allekirjoita varmenne + + + + OK + OK + + + + Peer Adress + + + + + Peer Info + + + + + ConfirmQuitDialog + + + Exit RetroShare + + + + + You are about to exit the RetroShare application and therefore stop all transfers. <br><br>Are you sure you want to stop and exit RetroShare? + + + + + Do not show this message again. + + + + + ConnectDialog + + + Peer Details + Vertaisen yksityiskohdat + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Maa:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Org:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Org:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Nimi:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Trust:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Luottamus:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Loc:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Sij:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Certificate</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">signers:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Certificate</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">allekirjoittajat:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Varmennekoodi:</span></p></body></html> + + + + Make Friend + Tee ystäväksi + + + + Close + Sulje + + + + ConnectionsDialog + + + Load Certificate + Lataa varmenne + + + + Select a pem/pqi File + Valitse pem/pqi-tiedosto + + + + File Not Found + Tiedostoa ei löytynyt + + + + %1 does not exist. Would you like to create it? + %1 ei ole olemassa. Luodaanko se? + + + + Failed to Create File + Tiedostoa ei voitu luoda + + + + Unable to create %1 [%2] + Ei voitu luoda kohdetta %1 [%2] + + + + Select Certificate + Valitse varmenne + + + + Certificates (*.pqi *.pem) + Varmenteet (*.pqi *.pem) + + + + Accept + Hyväksy + + + + Trust + Luottamus + + + + Last Contact + Viimeisin kontakti + + + + Name + Nimi + + + + Organisation + Organisaatio + + + + Location + Sijainti + + + + Country + Maa + + + + Peer Address + Vertaisen osoite + + + + Cert Id + Varmenne-ID + + + + Auth Code + Varmennekoodi + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Verkko:</span></p></body></html> + + + + Peer Details / Authenticate + Vertaisen yksityiskohdat / Varmenna + + + + CryptographyDialog + + + RSA Key Size + RSA-avainkoko + + + + Rijndael Block size + Rijndael-lohkokoko + + + + 128 Bits + 128 bittiä + + + + 192 Bits + 192 bittiä + + + + 256 Bits + 256 bittiä + + + + Rijndael Key Size + Rijndael-avaimen koko + + + + Rijndael Mode + Rijndael-tila + + + + CBC + CBC + + + + ECB + ECB + + + + CFB + CFB + + + + Rijndael Padding + Rijndael-täyte + + + + PKCS7 + PKCS7 + + + + Zeros + Zeros + + + + ANSIX923 + ANSIX923 + + + + ISO10126 + ISO10126 + + + + Rijndael Feedback Size + Rijndael-palautteen koko + + + + Key Size: + Avaimen koko: + + + + Block Size: + Lohkon koko: + + + + Feedback Size: + Palautteen koko: + + + + Mode: + Tila: + + + + Padding: + Täyte: + + + + DLListDelegate + + + B + + + + + KB + + + + + MB + + + + + GB + + + + + DirectoriesDialog + + + Shared Directories + + + + + Other Directories + + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Incoming Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Sisääntulevat tiedostot</span></p></body></html> + + + + Add Shared Directory + Lisää jaettu hakemisto + + + + DirectoriesPage + + + Shared Directories + Jaetut hakemistot + + + + Incoming files + Sisääntulevat tiedostot + + + + ExampleDialog + + + Vote Up + + + + + Vote Down + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Friends</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Ystävät</span></p></body></html> + + + + # + + + + + Status + Tila + + + + Person + Henkilö + + + + Auto Connect + Yhdistä automaattisesti + + + + Trust Level + Luottamustaso + + + + Peer Address + Vertaisen osoite + + + + Last Contact + Viimeisin kontakti + + + + Organisation + Organisaatio + + + + Location + Sijainti + + + + Country + Maa + + + + Person Id + Henkilö-ID + + + + Auth Code + Varmennekoodi + + + + ExprParamElement + + + to + + + + + ignore case + + + + + dd.MM.yyyy + + + + + KB + + + + + MB + + + + + GB + + + + + ExpressionWidget + + + Expression Widget + + + + + Delete this expression + + + + + FileHashDialog + + + Download + + + + + GSettingsWin + + + General + Yleiset + + + + Network + Verkko + + + + Directories + Hakemistot + + + + Server + Palvelin + + + + %1 + %1 + + + + GenCertDialog + + + RetroShare setup + RetroShare-asetukset + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16pt;">Generate a new profile</span><br /><br />Please fill in the information which will<br />allow your RetroShare to connect to</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Friends.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Organisation:</p></body></html> + + + + + Password (Again) + + + + + Location: + + + + + Load Trusted Certificate (Optional) + Lataa luotettu varmenne (valinnainen) + + + + Password + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Ystävä</span></p></body></html> + + + + Select File + Valitse tiedosto + + + + Country: + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Nimi:</p></body></html> + + + + Generate New Certificate + Luo uusi varmenne + + + + Select Trusted Friend + Valitse luotettu ystävä + + + + Certificates (*.pqi *.pem) + Varmenteet (*.pqi *.pem) + + + + GeneralPage + + + Keys manager + Avainten hallinta + + + + Style + Tyyli + + + + Choose RetroShare's interface style + Valitse RetroSharen käyttöliittymän tyyli + + + + Language + Kieli + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Muutokset kieleen tulevat voimaan vasta RetroSharen uudelleenkäynnistyksen jälkeen.</p></body></html> + + + + Choose the language used in RetroShare + Valitse RetroSharessa käytettävä kieli + + + + GraphFrame + + + Recv: + Vast: + + + + %1 KB/s + %1 kB/s + + + + Sent: + Läh: + + + + %1 KB + %1 kB + + + + %1 MB + %1 MB + + + + %1 GB + %1 GB + + + + HelpDialog + + + About + Tietoja + + + + Authors + + + + + Thanks to + + + + + Translation + + + + + License Agreement + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">About/Help</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:xx-large; font-weight:600; color:#0000ff;">About RetroShare.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-weight:600;">Retroshare is a private and secure decentralised commmunication platform.<br />You can use it chat, send messages and share files with your friends.</span><br /><br />This is just a placeholder page for the moment. You can<br />improve retroshare's in-built help (this text) by<br />updating the retroshare wiki: <a href="http://retroshare.wiki.sourceforge.net/help_tab"><span style=" text-decoration: underline; color:#0000ff;">This Page in the retroshare Wiki</span></a><br /><br />The About/Help Tab is regularly updated from the Wiki page.<br /><br />External Links to more information:<br /></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.sourceforge.net"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Webpage</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.wiki.sourceforge.net/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Wiki</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://sourceforge.net/projects/retroshare/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Project Page</span></a></li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.lunamutt.com"><span style=" text-decoration: underline; color:#0000ff;">Lunamutt Homepage.</span></a></li></ul></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-size:19pt; font-weight:600; color:#0000ff;">The RetroShare Team:</span><br /> <br /><span style=" font-size:9pt; color:#0000ff;">defnax</span>: Lead GUI developer <br /><span style=" font-size:9pt; color:#0000ff;">drbob7</span>: Lead Core developer. <br /> <br /><span style=" font-size:9pt; color:#0000ff;">bmeck</span> : Our new web-developer. Joined retroshare a couple <br />of weeks ago, and already starting on an exciting new <br />design for the web-page. <br /> <br /><span style=" font-size:9pt; color:#0000ff;">noragen</span> : Developer from the SIM-IM project. Working on a retroshare plugin to SIM-IM. <br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">kernelpanix</span> : Gui and skin developer</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">libris</span><span style=" font-size:9pt;">:</span> core developer</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-size:9pt; color:#0000ff;">kashif: </span><span style=" color:#000000;">core developer</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt; color:#000000;"><span style=" font-size:8pt;"><br /></span><span style=" color:#0000ff;">agent725</span><span style=" font-size:8pt;">: Manages the 'local' Retroshare release, <br />and beta-testing retroshare on a large scale. <br /> <br /></span><span style=" color:#0000ff;">the_mgt</span><span style=" font-size:8pt;">: Maintains the Gentoo and generic linux <br />installation/compilation scripts. </span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">notdefine:</span> Maintains the .rpm, .deb installation/compilation scripts.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">zhouk</span>: developer</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Translators:</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Serbian</span>: Kunalagon Umuhanik &lt;kunalagon@gmail.com&gt;</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Polish: </span>Jarek</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">French</span>:Temet</p></body></html> + + + + + InviteDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">To </span><span style=" font-size:10pt; font-weight:600;">Invite your friends to join you with Retroshare: </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">Cut and paste the text below into an email.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">and send it to all your friends!</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">To </span><span style=" font-size:10pt; font-weight:600;">Kutsu ihmisiä liittymään kanssasi RetroShareen: </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">Leikkaa ja liimaa alla oleva teksti sähköpostiin.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">ja lähetä se tuttavillesi.</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + Done + Valmis + + + + Cancel + Peru + + + + Launch Email + Käynnistä sähköposti + + + + Invite a Friend + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"><span style=" font-size:16pt;">Invite a Friend</span><br /><br /><span style=" font-size:10pt;">To Invite your friends to join you with Retroshare: </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">Cut and paste the text below into an email.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">and send it to all your friends!</p></body></html> + + + + + LogDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> + +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="ABOUT"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">About RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShare is a private peer to peer communication platform created by Dr. Bob.This program enables you to securely share files and chat with your friends (and no-one else!).</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, and the latest release go to http://www.lunamutt.com.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="START"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Quick Start Guide to RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If this is your first time using Retroshare, it is recommended that you readthis guide for instructions on how to get started. The first step is:<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Connecting to Your Friends</span></a>. Once you have managed this you can <a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">Download Files</span></a> and<a href="#START-SHARE"><span style=" text-decoration: underline; color:#0000ff;">Share with Others</span></a></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Some of the key concepts related to ensuring your sharing remains private aredescribed in the <a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">Frequently Asked Questions</span></a>. Some Key security questions are:<a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">What is a Web of Trust?</span></a>, <a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">Should I Sign this Certificate?</span></a>, and finally<a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">What does "Trust" Mean?</span></a>.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is also worthwhile reading the <a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">GUI Overview</span></a>which describes the featureson available through the User Interface.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Connecting to your Friends </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">There are four steps to connecting to a Friend:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Get Friend's Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Load Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Sign Certificate</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect to Friend.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The instructions might initially appear long and daunting, however thesesteps are required to ensure that your sharing is private and secure.These steps are only required a couple of times, to add new friends, and become quite straight forward after the first time.</p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (1) EXCHANGE CERTIFICATES </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Before you can connect, you need send your certificate to your friend, and get your friends certificate. Follow these steps to get your certificate:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on Your Certificate to Select it.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on the "Export Friend" Button to bring up a file save dialog.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select directory to save the certificate to.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Enter desired filename. (with a file type of .pqi), and Click OK.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Email this File to your Friend. (It is recommended you put thecertificate in a zip file before sending, as some email programsdon't transmit the file correctly).</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Ask your friend to do the same.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Once you have received your friend's certificate, removed itfrom the zip file and saved it to disk, you can proceed to step (2).</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Note: This exchange of certificates is only necessary to get you started.Once you are connected to some friends the exchange of certificates becomeautomated by the autoDiscovery system. See<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">GUI: Connecting</span></a> for more information.------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (2) LOAD YOUR FRIEND'S CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Import Friend"</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select your friends certificate file, then click "Okay". Their certificate should appear in the top window of the "Connect" Tab.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (3) SIGN CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select their Certificate by clicking on their name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Configure Friend" Button. This will bring up a configuration window. which allows you to look at the detailsof the certificate.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click the "Sign Certificate" button near the bottom of the "Certificate Configuration" Window.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Now close the window by clicking on the "Done" button.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Your Friends certificate should now say "Trusted (S)", indicating it is ready for connections.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can only share with "Trusted" Peers. You must sign your Friend'scertificate to prove that you know the certificate belongs to your Friend. Do not sign any/all certificates - only the people youtrust. For more information see: <br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br />------------------------------------------------------------------------<br /><br /> <br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (4) AUTOCONNECT TO PEER </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Finally You need to activate the connection:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click in the Box, next to your friends Name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> A Tick should appear in the box, a connection will be started.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> The "Offline" will change to "Online" when you have successfullyconnected.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Remember: Your initial connection attempts will fail, until your friend has signed your certificate and ticked the Auto-Connect Box.This ensures that both peers trust each other, and stops random peopleaccessing your files.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>. <br />------------------------------------------------------------------------<br /><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-DOWNLOAD"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Downloading Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have connected to friends, you can download their shared files.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can search for the files you want using either:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) File Listing Tab: This gives you a directory view of the files being shared by your peers. Double clickon the directory name (not the arrow) to diplay its subdirectories and files.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 1: This can take up to 5 seconds to fetch the information for your peer.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 2: If the directory is empty, or the person is offline, then the request will silently fail.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Search Tab: Retroshare also allows you to search your peers computers for filenames. Enter yourterm(s) in the search box at the top of the TAB and click the "Search" button. This willsearch all of the peers that you are currently connected to.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 3: If any matching files are found they will be displayed within 5 - 10 seconds.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have found the files you want, Select the file(s), and click "Download" to begin the download process.If you click over the "File Transfer" TAB, the status of the files will appear.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 4: The files can take up to 10 seconds to appear in the transfer window.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-SHARING"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Sharing Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can specify which files you want to share in the "Config" Tab.In the "Share Directories" section, click the "Add Directory" Button, and select the directory you want to share.The files and subdirectories will become available for you peers.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can remove a directory from the Shared Directories List by clicking onthe directory name in the list, and then clicking "Remove Directory".</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="GUI"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Gui Overview (Tab Description) </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The GUI is divided up into several sections which can be accessed by clicking on the Tabs along the top of the main window. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect: Manage Connections and Friends.(<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">getting started</span></a> and<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Listing: A directory view of available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Search: Search for available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Messages: For Sending/Recving Message. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Channels: A broadcast/subscription system. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Transfer: Listing of Current and completed Transfers.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Config: Specify of share diectories and IP Addresses.(<a href="#GUI-CONFIG"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> About: Help and other Information.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Chat: Accessed by the clicking on the "Chat" button.</li></ul> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Connect Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Connect TAB consists of two windows. The upper windowshows a list of your friends. This window indicates each friendscurrent trust level, as well as their connection state.The "Trust_Lvl" Column indicates if the certificate has beenAuthenticated using the web of trust. You can only connect to "Trusted" certificates. Tick the "Auto_Connect" box to connect to your trusted friends.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The lower window provides a list of the friends of your friends.This window shows the neighbour's name and how long ago they attempted to connect to you. This window is automatically populatedby the autoDiscovery system, and should be used to expand yourretroShare network. A word of warning: Do not automatically trust (or sign) anyonethat appears in this window. First verify by some other means (email/phone)that certificate belongs to the person you think it does.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use the "Neighbour List" window to expand your friend list. Select the desired entry in the lower window by clicking on it, then click the "Add to Friends" Button to move it to the upper window.Likewise the "Remove from Friends" button moved a person from the upper window to the lower window.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The "Configure Friend" Button opens a Certificate Configuration window.This window can be used to examine the certificate details, sign the certificate or manually change the peer's IP Address.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">See Also:<br /><a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Getting Started: Connecting to your friends</span></a>.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>.<br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONFIG"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Config Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Configuration Tab allows you to select the share directories, as well as the directory that downloaded files are saved to.<br />See <a href="#STARTUP-SHARING"><span style=" text-decoration: underline; color:#0000ff;">Sharing you Files</span></a> for details. </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Config Tab also allows you to control the IP Address and Portused by RetroShare. Under most cirumstances you do not need to changethese setting. If you are behind a firewall and can setup a forwarded port, the selected IP Address and Port should be specified here.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="FAQ"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Frequently Asked Questions </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">How does the security/privacy work? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShares uses a Web of Trust Authentication system to ensurethat your "friends" are your friends, and uses SSL to encryptthe communcications between peers. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What is a Web of Trust? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Web of Trust relies on a collection of peers to identify eachother. Look it up on the Web!</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-TRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What does "Trust" Mean in RetroShare?</span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Anyone can generate a certificate, with any name on it. So howdo you know that the certificate that claims to be from "Joe Bloggs"is really from your mate Joe. This is the "AuthenticationProblem". RetroShare uses a Web of Trust to Authenticate your peers.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-SIGN"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Should I Sign this Certificate? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should only sign a certificate if you are completely surethat it comes from the "right" person. If you sign a certificateyou are "Authenticating" the person to yourself and others.If you sign certificates that you haven't checked, then you aredestroying your own privacy and security.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">How do you verify a certificate? Use an alternative method ofcommunication to send the certificate: E.g. email or USB stick. This will improve you confidence that the certificate belongsto the correct person. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><span style=" font-size:small;"> </span><a name="FAQ-CONNECT"></a><span style=" font-size:small;">W</span><span style=" font-size:small;">hy won't it Connect?</span><span style=" font-size:small;"> </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A connection can fail for a number of reasons:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) Failed Authentication. Have both peers signed each otherscertificates? </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Firewalls. If both peers are behind firewalls then they cannotconnect directly. RetroShare has a built in proxy system to circumventfirewalls - However this can only function if both peers can connect to a common third party that is not behind a firewall. Thisis the most likely reason for initial connections to fail. The only solution to find a common friend that isn't firewalled (know anyone with Broadband?)</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(3) IP Addresses are wrong. You can manually examine and change these using the Certificate configuration.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +</body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> + +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="ABOUT"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Tietoja RetroSharesta </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Pikalinkit: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">Tietoja</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Alkuunpääsy</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Käyttöliittymän perusteet</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">UKK</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShare on yksityisiin vertaisverkkoihin tarkoitettu viestintäalusta, jonka on luonut "Dr. Bob". Tämä ohjelma mahdollistaa tiedostojen jakamisen ja keskustelun turvallisesti ystäviesi kanssa (eikä kenenkään muun!).</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lisätietoja ja uusimman julkaisun löydät osoitteesta http://www.lunamutt.com.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="START"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Quick Start Guide to RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If this is your first time using Retroshare, it is recommended that you readthis guide for instructions on how to get started. The first step is:<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Connecting to Your Friends</span></a>. Once you have managed this you can <a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">Download Files</span></a> and<a href="#START-SHARE"><span style=" text-decoration: underline; color:#0000ff;">Share with Others</span></a></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Some of the key concepts related to ensuring your sharing remains private aredescribed in the <a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">Frequently Asked Questions</span></a>. Some Key security questions are:<a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">What is a Web of Trust?</span></a>, <a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">Should I Sign this Certificate?</span></a>, and finally<a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">What does "Trust" Mean?</span></a>.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is also worthwhile reading the <a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">GUI Overview</span></a>which describes the featureson available through the User Interface.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Connecting to your Friends </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">There are four steps to connecting to a Friend:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Get Friend's Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Load Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Sign Certificate</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect to Friend.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The instructions might initially appear long and daunting, however thesesteps are required to ensure that your sharing is private and secure.These steps are only required a couple of times, to add new friends, and become quite straight forward after the first time.</p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (1) EXCHANGE CERTIFICATES </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Before you can connect, you need send your certificate to your friend, and get your friends certificate. Follow these steps to get your certificate:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on Your Certificate to Select it.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on the "Export Friend" Button to bring up a file save dialog.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select directory to save the certificate to.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Enter desired filename. (with a file type of .pqi), and Click OK.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Email this File to your Friend. (It is recommended you put thecertificate in a zip file before sending, as some email programsdon't transmit the file correctly).</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Ask your friend to do the same.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Once you have received your friend's certificate, removed itfrom the zip file and saved it to disk, you can proceed to step (2).</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Note: This exchange of certificates is only necessary to get you started.Once you are connected to some friends the exchange of certificates becomeautomated by the autoDiscovery system. See<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">GUI: Connecting</span></a> for more information.------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (2) LOAD YOUR FRIEND'S CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Import Friend"</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select your friends certificate file, then click "Okay". Their certificate should appear in the top window of the "Connect" Tab.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (3) SIGN CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select their Certificate by clicking on their name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Configure Friend" Button. This will bring up a configuration window. which allows you to look at the detailsof the certificate.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click the "Sign Certificate" button near the bottom of the "Certificate Configuration" Window.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Now close the window by clicking on the "Done" button.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Your Friends certificate should now say "Trusted (S)", indicating it is ready for connections.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can only share with "Trusted" Peers. You must sign your Friend'scertificate to prove that you know the certificate belongs to your Friend. Do not sign any/all certificates - only the people youtrust. For more information see: <br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br />------------------------------------------------------------------------<br /><br /> <br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (4) AUTOCONNECT TO PEER </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Finally You need to activate the connection:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click in the Box, next to your friends Name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> A Tick should appear in the box, a connection will be started.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> The "Offline" will change to "Online" when you have successfullyconnected.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Remember: Your initial connection attempts will fail, until your friend has signed your certificate and ticked the Auto-Connect Box.This ensures that both peers trust each other, and stops random peopleaccessing your files.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>. <br />------------------------------------------------------------------------<br /><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-DOWNLOAD"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Downloading Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have connected to friends, you can download their shared files.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can search for the files you want using either:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) File Listing Tab: This gives you a directory view of the files being shared by your peers. Double clickon the directory name (not the arrow) to diplay its subdirectories and files.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 1: This can take up to 5 seconds to fetch the information for your peer.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 2: If the directory is empty, or the person is offline, then the request will silently fail.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Search Tab: Retroshare also allows you to search your peers computers for filenames. Enter yourterm(s) in the search box at the top of the TAB and click the "Search" button. This willsearch all of the peers that you are currently connected to.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 3: If any matching files are found they will be displayed within 5 - 10 seconds.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have found the files you want, Select the file(s), and click "Download" to begin the download process.If you click over the "File Transfer" TAB, the status of the files will appear.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 4: The files can take up to 10 seconds to appear in the transfer window.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-SHARING"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Sharing Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can specify which files you want to share in the "Config" Tab.In the "Share Directories" section, click the "Add Directory" Button, and select the directory you want to share.The files and subdirectories will become available for you peers.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can remove a directory from the Shared Directories List by clicking onthe directory name in the list, and then clicking "Remove Directory".</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="GUI"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Gui Overview (Tab Description) </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The GUI is divided up into several sections which can be accessed by clicking on the Tabs along the top of the main window. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect: Manage Connections and Friends.(<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">getting started</span></a> and<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Listing: A directory view of available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Search: Search for available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Messages: For Sending/Recving Message. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Channels: A broadcast/subscription system. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Transfer: Listing of Current and completed Transfers.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Config: Specify of share diectories and IP Addresses.(<a href="#GUI-CONFIG"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> About: Help and other Information.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Chat: Accessed by the clicking on the "Chat" button.</li></ul> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Connect Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Connect TAB consists of two windows. The upper windowshows a list of your friends. This window indicates each friendscurrent trust level, as well as their connection state.The "Trust_Lvl" Column indicates if the certificate has beenAuthenticated using the web of trust. You can only connect to "Trusted" certificates. Tick the "Auto_Connect" box to connect to your trusted friends.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The lower window provides a list of the friends of your friends.This window shows the neighbour's name and how long ago they attempted to connect to you. This window is automatically populatedby the autoDiscovery system, and should be used to expand yourretroShare network. A word of warning: Do not automatically trust (or sign) anyonethat appears in this window. First verify by some other means (email/phone)that certificate belongs to the person you think it does.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use the "Neighbour List" window to expand your friend list. Select the desired entry in the lower window by clicking on it, then click the "Add to Friends" Button to move it to the upper window.Likewise the "Remove from Friends" button moved a person from the upper window to the lower window.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The "Configure Friend" Button opens a Certificate Configuration window.This window can be used to examine the certificate details, sign the certificate or manually change the peer's IP Address.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">See Also:<br /><a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Getting Started: Connecting to your friends</span></a>.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>.<br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONFIG"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Config Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Configuration Tab allows you to select the share directories, as well as the directory that downloaded files are saved to.<br />See <a href="#STARTUP-SHARING"><span style=" text-decoration: underline; color:#0000ff;">Sharing you Files</span></a> for details. </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Config Tab also allows you to control the IP Address and Portused by RetroShare. Under most cirumstances you do not need to changethese setting. If you are behind a firewall and can setup a forwarded port, the selected IP Address and Port should be specified here.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="FAQ"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Frequently Asked Questions </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">How does the security/privacy work? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShares uses a Web of Trust Authentication system to ensurethat your "friends" are your friends, and uses SSL to encryptthe communcications between peers. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What is a Web of Trust? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Web of Trust relies on a collection of peers to identify eachother. Look it up on the Web!</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-TRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What does "Trust" Mean in RetroShare?</span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Anyone can generate a certificate, with any name on it. So howdo you know that the certificate that claims to be from "Joe Bloggs"is really from your mate Joe. This is the "AuthenticationProblem". RetroShare uses a Web of Trust to Authenticate your peers.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-SIGN"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Should I Sign this Certificate? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should only sign a certificate if you are completely surethat it comes from the "right" person. If you sign a certificateyou are "Authenticating" the person to yourself and others.If you sign certificates that you haven't checked, then you aredestroying your own privacy and security.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">How do you verify a certificate? Use an alternative method ofcommunication to send the certificate: E.g. email or USB stick. This will improve you confidence that the certificate belongsto the correct person. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><span style=" font-size:small;"> </span><a name="FAQ-CONNECT"></a><span style=" font-size:small;">W</span><span style=" font-size:small;">hy won't it Connect?</span><span style=" font-size:small;"> </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A connection can fail for a number of reasons:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) Failed Authentication. Have both peers signed each otherscertificates? </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Firewalls. If both peers are behind firewalls then they cannotconnect directly. RetroShare has a built in proxy system to circumventfirewalls - However this can only function if both peers can connect to a common third party that is not behind a firewall. Thisis the most likely reason for initial connections to fail. The only solution to find a common friend that isn't firewalled (know anyone with Broadband?)</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(3) IP Addresses are wrong. You can manually examine and change these using the Certificate configuration.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +</body></html> + + + + MainWindow + + + Preferences + Asetukset + + + + Network + Verkko + + + + Friends + Ystävät + + + + Transfers + Siirrot + + + + Messages + Viestit + + + + Channels + Kanavat + + + + Options + Valinnat + + + + Users: 0 Files: 0 + Käyttäjiä: 0 Tiedostoja: 0 + + + + Down: 0.0 Up: 0.0 + Vast: 0,0 Läh: 0,0 + + + + Connections: 0/45 + Yhteyksiä: 0/45 + + + + System tray is unavailable + Ilmoitusalue ei ole saatavilla + + + + System tray unavailable + Ilmoitusalue ei ole saatavilla + + + + RetroShare System tray + RetroShare-ilmoitusalue + + + + Application will continue running. Quit using context menu in the system tray + Sovellus pysyy käynnissä. Poistu sovelluksesta ilmoitusalueen kuvakkeen valikosta + + + + Hide + Piilota + + + + Show + Näytä + + + + RetroShare + RetroShare + + + + Home + Koti + + + + General + Yleiset + + + + Invite Friend + Kutsu ystävä + + + + Add Friend + Lisää ystävä + + + + Add Share + Lisää jako + + + + Advanced + Lisäasetukset + + + + QTextBrowser { + background-color: rgb(192,192,192); + +} + QTextBrowser { + background-color: rgb(192,192,192); + +} + + + + QPushButton +{ + border-image: url(:/images/console-small-up.png) +} + +QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + +} + +QPushButton:pressed { + border-image: url(:/images/console-small-down.png) +} + + QPushButton +{ + border-image: url(:/images/console-small-up.png) +} + +QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + +} + +QPushButton:pressed { + border-image: url(:/images/console-small-down.png) +} + + + + + Exit + Poistu + + + + Search + Etsi + + + + Files + Tiedostot + + + + Chat + Keskustelu + + + + Add Shared Directory + Lisää jaettu hakemisto + + + + Default + Oletus + + + + blue + sininen + + + + silver + hopea + + + + ed2k + ed2k + + + + over + over + + + + black + musta + + + + arachnophobia + araknofobia + + + + Skin2 + Skin2 + + + + Pagefold + Sivutaitto + + + + About/Help + + + + + Messenger + + + + + Show/Hide + + + + + &Quit + + + + + Bandwidth Graph + + + + + Open Messenger + + + + + RetroShare %1 + + + + + Add a Friend + + + + + Invite a Friend + + + + + Add a Share + + + + + Quit + + + + + Minimize + + + + + Maximize + + + + + Hide Console + + + + + Show Console + + + + + Hide ToolBox + + + + + :images/hide_toolbox_frame.png + + + + + Show ToolBox + + + + + :images/show_toolbox_frame.png + + + + + QTextBrowser { + background-color: rgb(192,192,192); + + } + + + + + QPushButton + { + border-image: url(:/images/console-small-up.png) + } + + QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + + } + + QPushButton:pressed { + border-image: url(:/images/console-small-down.png) + } + + + + + + Apps + + + + + MessageToaster + + + message + viesti + + + + MessagesDialog + + + New Message + Uusi viesti + + + + Reply to Message + Vastaa viestiin + + + + Remove Message + Poista viesti + + + + Date + Päiväys + + + + From + Lähettäjä + + + + Title + Otsikko + + + + Msg + Viesti + + + + Count + Lukumäärä + + + + Size + Koko + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Recommended Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Suositellut tiedostot</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">remove selected message</p></body></html> + poista valittu viesti + + + + QPushButton +{ +border-image: url(:/images/deletemail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/deletemail-hover.png); +} + QPushButton +{ +border-image: url(:/images/deletemail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/deletemail-hover.png); +} + + + + Inbox + Saapuneet + + + + Outbox + Lähtevät + + + + Draft + Luonnokset + + + + Sent + Lähetetyt + + + + Timestamp + Aikaleima + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">reply to selected message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">vastaa valittuun viestiin</p></body></html> + + + + +QPushButton +{ +border-image: url(:/images/replymail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/replymail-hover.png); +} + + +QPushButton +{ +border-image: url(:/images/replymail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/replymail-hover.png); +} + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">New Message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Uusi viesti</p></body></html> + + + + QPushButton +{ +border-image: url(:/images/folder-draft24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/folder-draft24-hover.png); +} + + QPushButton +{ +border-image: url(:/images/folder-draft24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/folder-draft24-hover.png); +} + + + + + You get Message testing + Vastaanotit testiviestin + + + + Download All + Lataa kaikki + + + + QPushButton +{ +border-image: url(:/images/deletemail24.png); +} + +QPushButton:hover +{ +border-image: url(:/images/deletemail-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/deletemail-pressed.png); +} + + + + + +QPushButton +{ +border-image: url(:/images/replymail24.png); +} + +QPushButton:hover +{ +border-image: url(:/images/replymail24-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/replymail-pressed.png); +} + + + + + + QPushButton +{ +border-image: url(:/images/folder-draft24.png); +} +QPushButton:hover +{ +border-image: url(:/images/folder-draft24-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/folder-draft24-pressed.png); +} + + + + + + MessengerWindow + + + QWidget#MessengerWindow { +background-color: #ECF3F6; background-image:url(:/images/backgroundimage.png); +background-position: top right; +background-repeat: no-repeat +} + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click to change your avatar</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Change your Status and your display</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">picture here.</p></body></html> + + + + + Online + + + + + Busy + + + + + Be right Back + + + + + Away + + + + + In a Call + + + + + Out of lunch + + + + + Apear Offline + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Share a personal message with your contacts</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Add a Friend</p></body></html> + + + + + Chat + Keskustelu + + + + Connect To Friend + Yhdistä ystävään + + + + NetworkDialog + + + Peer Details / Authenticate + Vertaisen yksityiskohdat / Varmenna + + + + Load Certificate + Lataa varmenne + + + + Select a pem/pqi File + Valitse pem/pqi-tiedosto + + + + File Not Found + Tiedostoa ei löytynyt + + + + %1 does not exist. Would you like to create it? + %1 ei ole olemassa. Luodaanko se? + + + + Failed to Create File + Tiedostoa ei voitu luoda + + + + Unable to create %1 [%2] + Ei voitu luoda kohdetta %1 [%2] + + + + Select Certificate + Valitse varmenne + + + + Certificates (*.pqi *.pem) + Varmenteet (*.pqi *.pem) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Verkko:</span></p></body></html> + + + + # + + + + + Accept + Hyväksy + + + + Trust + Luottamus + + + + Last Contact + Viimeisin kontakti + + + + Name + Nimi + + + + Peer Address + Vertaisen osoite + + + + Organisation + Organisaatio + + + + Location + Sijainti + + + + Country + Maa + + + + Cert Id + Varmenne-ID + + + + Auth Code + Varmennekoodi + + + + NetworkPage + + + Rate Options + Siirtonopeusvalinnat + + + + Max Total Data Rate (KB/S): + Suurin kokonaissiirtonopeus (kB/s): + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Rate per Person (KB/S):</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Siirtonopeus henkilöä kohden (kB/s):</p></body></html> + + + + PeersDialog + + + Chat + Keskustelu + + + + Configure Friend + Määrittele ystävän asetukset + + + + Export Friend + Vie ystävä + + + + Remove Friend + Poista ystävä + + + + Save Certificate + Tallenna varmenne + + + + Certificates (*.pqi) + Varmeneet (*.pqi) + + + + Status + Tila + + + + Person + Henkilö + + + + Auto Connect + Yhdistä automaattisesti + + + + Trust Level + Luottamustaso + + + + Peer Address + Vertaisen osoite + + + + Last Contact + Viimeisin kontakti + + + + Organisation + Organisaatio + + + + Location + Sijainti + + + + Country + Maa + + + + Person Id + Henkilö-ID + + + + Auth Code + Varmennekoodi + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Friends</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Ystävät</span></p></body></html> + + + + Connect To Friend + Yhdistä ystävään + + + + # + + + + + PopupChatDialog + + + RetroShare Friend Chat + RetroShare-ystäväkeskustelu + + + + RetroShare User Chat + + + + + PreferencesDialog + + + Language + Kieli + + + + Style + Tyyli + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Muutokset kieleen tulevat voimaan vasta RetroSharen uudelleenkäynnistyksen jälkeen.</p></body></html> + + + + Style Sheet + Tyylitiedosto + + + + Default + Oletus + + + + Pagefold + Sivutaitto + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose RetroShare's interface style</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Valitse RetroSharen käyttöliittymän tyyli</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose the language used in RetroShare</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Valitse RetroSharessa käytetty kieli</p></body></html> + + + + blue + sininen + + + + silver + hopea + + + + ed2k + ed2k + + + + over + over + + + + black + musta + + + + arachnophobia + araknofobia + + + + Skin2 + Skin2 + + + + Login + Kirjautuminen + + + + Remove Auto Login + Poista automaattinen kirjautuminen + + + + PreferencesWindow + + + Directories + Hakemistot + + + + Error Saving Configuration + Virhe tallennettaessa asetuksia + + + + About + Tietoja + + + + General + Yleiset + + + + Server + Palvelin + + + + Options + Valinnat + + + + Cancel + Peru + + + + OK + OK + + + + QObject + + + Name + Nimi + + + + Path + + + + + Extension + + + + + Date + Päiväys + + + + Size + Koko + + + + Popularity + + + + + contains + + + + + contains all + + + + + is + + + + + less than + + + + + less than or equal + + + + + greater than or equal + + + + + greater than + + + + + is in range + + + + + and + + + + + and / or + + + + + or + + + + + equals + + + + + Rshare + + + Invalid language code specified: + Määritelty kielikoodi on virheellinen: + + + + Invalid GUI style specified: + Määritelty käyttöliittymän tyyli on virheellinen: + + + + SearchDialog + + + File Name + Tiedoston nimi + + + + Sources + Lähteet + + + + Search Pattern + Hakulauseke + + + + Results + Tulokset + + + + File Size + Tiedoston koko + + + + Download + Lataa + + + + Broadcast on Channel + Yleislähetä kanavalla + + + + Recommend to Friends + Suosittele kavereille + + + + Remove + Poista + + + + Remove All + Poista kaikki + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Keywords</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Avainsanat</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Format</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Muoto</p></body></html> + + + + Any + Mikä tahansa + + + + Audio + Ääni + + + + Video + Video + + + + Images + Kuvat + + + + Programs + Ohjelmat + + + + Archives + Pakatut tiedostot + + + + Documents + Asiakirjat + + + + search + etsi + + + + download + lataa + + + + Toggle advanced searching on and off. + + + + + <h3>Simple Search:</h3> + + + + + Keywords + + + + + Perform simple search + + + + + Show Advanced Search Tool + + + + + Filename + + + + + Hash + + + + + KeyWords + + + + + Search Id + + + + + <h3>Advanced Search:</h3> + + + + + ServerDialog + + + Transfer Rates + Siirtonopeudet + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Total Rate (kb/s) </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Kokonaisnopeus (kB/s) </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Per Person </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Henkilöä kohden </p></body></html> + + + + Server Settings + Palvelimen asetukset + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Paikallinen osoite:</p></body></html> + + + + Port: + Portti: + + + + behind zee Firewall + Palomuurin takana + + + + Forwarded External Port + Edelleenvälitetty ulkoinen portti + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Portti:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ulkoinen nimi</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ulkoinen osoite:</p></body></html> + + + + Check Settings + Tarjusta asetukset + + + + Firewall/Router Configuration + + + + + Manual router setup. + + + + + Use uPnP to configure router + + + + + Network Address Configuration (takes effect after restart) + + + + + Use DHT to locate friends + + + + + Manual IP Addresses + + + + + Server Status And Network Settings + + + + + Firewalled + + + + + Forwarded Port + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">DHT Status</p></body></html> + + + + + uPnP Status + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Local Address:</p></body></html> + + + + + ServerPage + + + Change + Restart Server + Vaihda ja uudelleenkäynnistä palvelin + + + + Server Settings + Palvelinasetukset + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ulkoinen osoite:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Paikallinen osoite:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Portti:</p></body></html> + + + + Port: + Portti: + + + + Misc + Sekalaiset + + + + behinde Firewall + Palomuurin takana + + + + Forwarded External Port + Edelleenvälitetty ulkoinen portti + + + + Settings + + + Settings + Asetukset + + + + Cancel + Peru + + + + Apply + Toteuta + + + + OK + OK + + + + General + Yleiset + + + + Network + Verkko + + + + Server + Palvelin + + + + Directories + Hakemistot + + + + SharedFilesDialog + + + Download + Lataa + + + + Recommend + Suosittele + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Tiedostot</span></p></body></html> + + + + Add to Recommend List + + + + + Recommend To + + + + + Message Friend + + + + + StartDialog + + + Select Trusted Friend + Valitse luotettu ystävä + + + + Certificates (*.pqi *.pem) + Varmenteet (*.pqi *.pem) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:13pt; font-weight:600; color:#8b0000;">Welcome to RetroShare</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:13pt; font-weight:600; color:#8b0000;">Tervetuloa RetroShareen</span></p></body></html> + + + + Please Login .... + Ole hyvä ja kirjaudu... + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Nimi:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Pasword</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Salasana</span></p></body></html> + + + + Load Existing User + Lataa olemassaoleva käyttäjä + + + + Or create a New User + Tai luo uusi käyttäjä + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Organisation:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Organisaatio:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Maa:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Location:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Sijainti:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Password (Again)</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Salasana (uudestaan)</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">New Password</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Uusi salasana</span></p></body></html> + + + + Load Trusted Certificate (Optional) + Lataa luotettu varmenne (valinnainen) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Ystävä</span></p></body></html> + + + + Select File + Valitse tiedosto + + + + Generate New Certificate + Luo uusi varmenne + + + + RetroShare setup + RetroShare-asetukset + + + + Automatically Login in Future + Kirjaudu jatkossa automaattisesti + + + + RetroShare + RetroShare + + + + QWidget { + background-color: #ECF3F6; +} + + + + + Auto-login + + + + + Name: + + + + + Log In + + + + + Password: + + + + + Create a Account + + + + + QToolButton{ +border-image: url(:/images/avatar_background.png); + +} + + + + + + StatisticDialog + + + Statistics + + + + + Download + + + + + Session: + Istunto: + + + + Downloaded: + Ladattu: + + + + Average Downloadspeed: + Keskimääräinen latausnopeus: + + + + Count of Downloads: + Latausten määrä: + + + + Overall + Yhteensä + + + + Upload + Lähetys + + + + Session + Istunto + + + + Uploaded: + Lähetetty: + + + + Average Uploadspeed: + Keskimääräinen lähetysnopeus: + + + + Count of Uploads: + Lähetettyjen lukumäärä: + + + + Uploaded + Lähetetty + + + + Connections: + Yhteydet: + + + + Peers: + Vertaiset: + + + + Misc + Sekalaiset + + + + Uptime: + Päällä: + + + + Overall: + Yhteensä: + + + + Uptime + Päällä + + + + Records + Tietueet + + + + Uploadspeed: + Lähetysnopeus: + + + + Downloadspeed: + Latausnopeus: + + + + Show Settings + Näytä asetukset + + + + Reset + Palauta asetukset + + + + Receive Rate + Vastaanottonopeus + + + + Send Rate + Lähetysnopeus + + + + Always On Top + Aina päällimmäisenä + + + + 100 + 100 + + + + % Opaque + % näkyvä + + + + Changes the transparency of the Bandwidth Graph + Muuttaa siirtonopeuskuvaajan läpinäkyvyyttä + + + + Save + Tallenna + + + + Cancel + Peru + + + + Hide Settings + Piilota asetukset + + + + TransfersDialog + + + Cancel + Peru + + + + Clear Completed + Poista valmistuneet + + + + File Name + Tiedoston nimi + + + + Sources + Lähteet + + + + Status + Tila + + + + File Size + Tiedoston koko + + + + Speed + Nopeus + + + + Progress + Edistyminen + + + + Completed + Valmis + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Downloads:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Lataukset:</span></p></body></html> + + + + Peer Name + Vertaisen nimi + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Uploads:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Lähetykset:</span></p></body></html> + + + + Name + i.e: file name + Nimi + + + + Size + i.e: file size + Koko + + + + Progress + i.e: % downloaded + Edistyminen + + + + Speed + i.e: Download speed + Nopeus + + + + Sources + i.e: Sources + Lähteet + + + + Remaining + i.e: Estimated Time of Arrival / Time left + + + + + Core-ID + + + + + User Name + i.e: user name + + + + + Progress + i.e: % uploaded + Edistyminen + + + + Speed + i.e: upload speed + Nopeus + + + + Transferred + + + + + ULListDelegate + + + B + + + + + KB + + + + + MB + + + + + GB + + + + + VMessageBox + + + OK + OK + + + + Cancel + Peru + + + + Yes + Kyllä + + + + No + Ei + + + + Help + Ohje + + + + Retry + Yritä uudelleen + + + + Show Log + Näytä loki + + + + Show Settings + Näytä asetukset + + + + moreinfo + + + Details + Yksityiskohdat + + + + OK + OK + + + + Name + Nimi + + + + Value + Arvo + + + diff --git a/retroshare-gui/src/lang/retroshare_fr.qm b/retroshare-gui/src/lang/retroshare_fr.qm new file mode 100644 index 000000000..1079fcd77 Binary files /dev/null and b/retroshare-gui/src/lang/retroshare_fr.qm differ diff --git a/retroshare-gui/src/lang/retroshare_fr.ts b/retroshare-gui/src/lang/retroshare_fr.ts new file mode 100644 index 000000000..9199d2cd2 --- /dev/null +++ b/retroshare-gui/src/lang/retroshare_fr.ts @@ -0,0 +1,4584 @@ + + + + + + + Arial + Arial + + + + AddFriendDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;"> To add a new Friend, cut and paste their email </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">invitation into the box below, and click done.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;"> Pour ajouter un nouvel ami, copiez/collez son email </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">d'invitation dans la zone ci-dessous et cliquez sur Ok.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;"></p></body></html> + + + + Cancel + Annuler + + + + Done + Ok + + + + Load From File + Charger un fichier + + + + RetroShare + RetroShare + + + + Certificate Load Failed + Le certificat n'a pas pu être chargé + + + + Add a Friend + Ajouter un ami + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"><span style=" font-size:16pt;">Add a new Friend</span><br /><br /><span style=" font-size:10pt;">To add a new Friend, cut and paste their email </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">invitation into the box below, and click done.</p></body></html> + + + + + AddFriendWizard + + + Add Friend to my netowork Wizard + Ajouter un ami à mon assistant réseau + + + + < Back + < Précédent + + + + Next > + Suivant > + + + + Cancel + Annuler + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">This Wizard helps to Connect to your Friends</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Cet assistant vous aide à vous connecter à vos amis</span></p></body></html> + + + + I have a .pqi/.pem file received from a Friend + J'ai reçu un fichier .pqi/.pem d'un ami + + + + I have Key received from a Friend + J'ai reçu une clé d'un ami + + + + I want to invite a friend to my RetroShare network + Je veux inviter un ami à mon réseau RestroShare + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Cut and paste the text below into an email.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;"> and send it to all your friends!</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">When you press next RetroShare will attempt to launch a Email client.</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Coupez/collez le texte ci-dessous dans un email</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;"> et envoyez le à tous vos amis!</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">Si vous appuyez sur "suivant", RetroShare essaiera de lancer un client mail.</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Invite your Friends to join with RetroShare</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Invitez vos amis à vous rejoindre sur RetroShare</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Enter the Key code you got from your friend:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Entrez le code clé que vous reçu de votre ami:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">When you press next RetroShare will attempt to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">connect using the key.</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Si vous appuyez sur "suivant", RetroShare essaiera de se</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">connecter and utilisant la clé.</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Select a pqi/pem file:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Choisissez un fichier pqi/pem:</span></p></body></html> + + + + Browse + Parcourir + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">When you press next RetroShare will attempt to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">connect using the .pqi/.pem file.</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Si vous appuyez sur "suivant", RetroShare essaiera de se</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">connecter en utilisant le fichier .pqi/.pem.</p></body></html> + + + + AdvancedSearchDialog + + + RetrosShare: Advanced Search + + + + + Add a further search criterion. + + + + + Add a selection criterion + + + + + Reset the search criteria. + + + + + Reset + + + + + Cancels the search. + + + + + Cancel + Annuler + + + + Perform the advanced search. + + + + + Search + Recherche + + + + Search Criteria + + + + + ApplicationWindow + + + RetroShare %1 + + + + + Example Application + + + + + Application Users: 0 Files: 0 + + + + + Down: 0.0 Up: 0.0 + Down: 0.0 Up: 0.0 + + + + Connections: 0/45 + Connexions: 0/45 + + + + Hide + Cacher + + + + Show + Montrer + + + + RetroShare + + + + + Home + Home + + + + General + Généralités + + + + Advanced + Avancé + + + + QTextBrowser { + background-color: rgb(192,192,192); + + } + + + + + QPushButton + { + border-image: url(:/images/console-small-up.png) + } + + QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + + } + + QPushButton:pressed { + border-image: url(:/images/console-small-down.png) + } + + + + + + AuthorizationDialog + + + Authenticate + Identifier + + + + Authenticate Friend By Entering Their Code + Identifier un ami en écrivant son code + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">CODE D'IDENTIFICATION:</span></p></body></html> + + + + OK + OK + + + + Cancel + Annuler + + + + BandwidthGraph + + + RetroShare Bandwidth Usage + Bande passante utilisée par RetroShare + + + + Show Settings + Montrer les options + + + + Reset + RAZ + + + + Receive Rate + Vitesse de réception + + + + Send Rate + Vitesse d'émission + + + + Always on Top + Toujours visible + + + + Style + Style + + + + Changes the transparency of the Bandwidth Graph + Change la transparence du graph de bande passante + + + + 100 + 100 + + + + % Opaque + % Opaque + + + + Save + Enregistrer + + + + Cancel + Annuler + + + + Since: + Depuis: + + + + Hide Settings + Cacher les réglages + + + + CallToaster + + + Message + Message + + + + ChanCreateDialog + + + Create a new Broadcast Channel + Créer un nouveau canal d'émission + + + + Create A New Broadcast Channel + Créer un nouveau canal d'émission + + + + Channel Name: + Nom du canal: + + + + Type: + Type: + + + + Public Channel (Signed) + Canal public (signé) + + + + Private Channel (Encrypted) + Canal privé (chiffré) + + + + Cancel Channel + Annuler le canal + + + + Create Channel + Créer le canal + + + + ChanMsgDialog + + + Compose + Composer + + + + Recommended Files + Fichiers recommandés + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-weight:400;"><span style=" font-weight:600;">Subject:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-weight:400;"><span style=" font-weight:600;">Sujet:</span></p></body></html> + + + + Send To: + Envoyer à: + + + + Send + Envoyer + + + + Delete Channel + Supprimer le canal + + + + Create Channel MSG + Créer un canal MSG + + + + 1 + 1 + + + + Reply + + + + + ChannelsDialog + + + New Message + Nouveau message + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Messages</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Messages</span></p></body></html> + + + + Date + Date + + + + Rank + Classement + + + + From + De + + + + Title + Titre + + + + Msg + Message + + + + Count + Compte + + + + Size + Taille + + + + Type + Type + + + + Rs[Cert/Chan]IdSize + Rs[Cert/Chan]IdSize + + + + RsMsgId + RsMsgId + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Message Text</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Texte du message</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Recommended Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Fichiers recommandés</span></p></body></html> + + + + New Channel + Nouveau canal + + + + Subscribe To Channel + S'inscrire à un canal + + + + Unsubscribe To Channel + Se désinscrire d'un canal + + + + Delete Your Channel + Supprimer votre canal + + + + Download + Téléchargement + + + + Download All + Tout télécharger + + + + ChatDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:9pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:400;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:9pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:400;"></p></body></html> + + + + Chat History: + Historique des conversations: + + + + Chat With: + Discuter avec: + + + + Chat + Discussion + + + + Users: + + + + + ChatToaster + + + message + message + + + + You Get a New Message + Vous recevez un nouveau message + + + + Message + Message + + + + ConfCertDialog + + + Cancel + Annuler + + + + Done + Fait + + + + Apply + Appliquer + + + + Peer Settings + Arrangements de peer + + + + Port: + Port: + + + + behind zee Firewall + derrière un pare-feu + + + + Forwarded External Port + Port externe transmis + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Addresse externe:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Nom externe</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Adresse locale:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Max Transfer Rate (kb/s) </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Vitesse de transfert max (kb/s) </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Org / Loc:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Organisation / Lieu:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Nom:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Country/State:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Pays/État:</p></body></html> + + + + Trust Settings + Réglages de la confiance + + + + Trust Level + Niveau de confiance + + + + Trust Their Signature + Faire confiance à leur signature + + + + Sign The Certificate + Signer le certificat + + + + OK + OK + + + + Peer Adress + Addresse du peer + + + + Peer Info + Info du peer + + + + ConfirmQuitDialog + + + Exit RetroShare + + + + + You are about to exit the RetroShare application and therefore stop all transfers. <br><br>Are you sure you want to stop and exit RetroShare? + + + + + Do not show this message again. + + + + + ConnectDialog + + + Peer Details + Détails du peer + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Pays:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Org:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Org:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Nom:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Trust:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Confiance:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Loc:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Lieu:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Certificate</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">signers:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Certificat</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">signataires:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">CODE D'IDENTIFICATION:</span></p></body></html> + + + + Make Friend + Devenir ami + + + + Close + Fermer + + + + ConnectionsDialog + + + Load Certificate + Charger le certificat + + + + Select a pem/pqi File + Choisir un fichier pem/pqi + + + + File Not Found + Fichier non trouvé + + + + %1 does not exist. Would you like to create it? + %1 n'existe pas. Voulez-vous le créer ? + + + + Failed to Create File + La création du fichier a échoué + + + + Unable to create %1 [%2] + Impossible de créer %1 [%2] + + + + Select Certificate + Choisir le certificat + + + + Certificates (*.pqi *.pem) + Certificats (*.pqi *.pem) + + + + Accept + Accepter + + + + Trust + Confiance + + + + Last Contact + Dernier contact + + + + Name + Nom + + + + Organisation + Organisation + + + + Location + Lieu + + + + Country + Pays + + + + Peer Address + Adresse de peer + + + + Cert Id + Id du certificat + + + + Auth Code + Code d'identification + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Réseau:</span></p></body></html> + + + + Peer Details / Authenticate + Détails du peer / Identification + + + + # + # + + + + CryptographyDialog + + + RSA Key Size + Taille de la clé RSA + + + + Rijndael Block size + Taille des blocs Rijndael + + + + 128 Bits + 128 Bits + + + + 192 Bits + 192 Bits + + + + 256 Bits + 256 Bits + + + + Rijndael Key Size + Taille de la clé Rijndael + + + + Rijndael Mode + Mode Rijndael + + + + CBC + CBC + + + + ECB + ECB + + + + CFB + CFB + + + + Rijndael Padding + Padding Rijndael + + + + PKCS7 + PKCS7 + + + + Zeros + Zeros + + + + ANSIX923 + ANSIX923 + + + + ISO10126 + ISO10126 + + + + Rijndael Feedback Size + Taille feedback Rijndael + + + + Key Size: + Taille de la clé: + + + + Block Size: + Taille du bloc: + + + + Feedback Size: + Taille du Feedback: + + + + Mode: + Mode: + + + + Padding: + Padding: + + + + DLListDelegate + + + B + + + + + KB + + + + + MB + + + + + GB + + + + + DirectoriesDialog + + + Shared Directories + Dossiers partagés + + + + Other Directories + Autres dossiers + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Incoming Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Fichiers entrants</span></p></body></html> + + + + Add Shared Directory + Ajouter un dossier partagé + + + + DirectoriesPage + + + Shared Directories + Dossiers partagés + + + + Incoming files + Fichiers entrants + + + + ExampleDialog + + + Vote Up + + + + + Vote Down + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Friends</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Amis</span></p></body></html> + + + + # + # + + + + Status + Statut + + + + Person + Personne + + + + Auto Connect + Connexion automatique + + + + Trust Level + Niveau de confiance + + + + Peer Address + + + + + Last Contact + Dernier contact + + + + Organisation + Organisation + + + + Location + Lieu + + + + Country + Pays + + + + Person Id + Id de la personne + + + + Auth Code + Code d'identification + + + + ExprParamElement + + + to + + + + + ignore case + + + + + dd.MM.yyyy + + + + + KB + + + + + MB + + + + + GB + + + + + ExpressionWidget + + + Expression Widget + + + + + Delete this expression + + + + + FileHashDialog + + + Download + Téléchargement + + + + GSettingsWin + + + General + Généralités + + + + Network + Réseau + + + + Directories + Dossiers + + + + Server + Serveur + + + + %1 + %1 + + + + GenCertDialog + + + RetroShare setup + Installation de RetroShare + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16pt;">Generate a new profile</span><br /><br />Please fill in the information which will<br />allow your RetroShare to connect to</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Friends.</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16pt;">Créez un nouveau profil</span><br /><br />Remplissez svp les informations qui<br />permettront à RetroShare de se connecter aux</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">amis.</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Organisation:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Organisation:</p></body></html> + + + + Password (Again) + Mot de passe (encore) + + + + Location: + Lieu: + + + + Load Trusted Certificate (Optional) + Charger les certificats sûrs (facultatif) + + + + Password + Mot de passe + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Ami</span></p></body></html> + + + + Select File + Choisir un fichier + + + + Country: + Pays: + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Nom:</p></body></html> + + + + Generate New Certificate + Créer un nouveau certificat + + + + Select Trusted Friend + Choisir les ami sûrs + + + + Certificates (*.pqi *.pem) + Certificats (*.pqi *.pem) + + + + GeneralPage + + + Keys manager + Gestionnaire de clés + + + + Style + Style + + + + Choose RetroShare's interface style + Choisir le style de l'interface de RetroShare + + + + Language + Langue + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Les changements de langue entreront en vigueur seulement après un redémarrage de RetroShare!</p></body></html> + + + + Choose the language used in RetroShare + Choisir la langue utilisée dans Retroshare + + + + GraphFrame + + + Recv: + Recv: + + + + %1 KB/s + %1 KB/s + + + + Sent: + Envoyé: + + + + %1 KB + %1 KB + + + + %1 MB + %1 MB + + + + %1 GB + %1 GB + + + + HelpDialog + + + About + À propos + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:large; font-weight:600; text-decoration: underline; color:#0000ff;"><span style=" font-size:xx-large; text-decoration:none;">About RetroShare.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />Retroshare is a private and secure decentralised commmunication platform.<br />You can use it chat, send messages and share files with your friends.<br /><br />This is just a placeholder page for the moment. You can<br />improve retroshare's in-built help (this text) by<br />updating the retroshare wiki: <a href="http://retroshare.wiki.sourceforge.net/help_tab"><span style=" text-decoration: underline; color:#0000ff;">This Page in the retroshare Wiki</span></a><br /><br />The About/Help Tab is regularly updated from the Wiki page.<br /><br />External Links to more information:<br /></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.sourceforge.net"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Webpage</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.wiki.sourceforge.net/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Wiki</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://sourceforge.net/projects/retroshare/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Project Page</span></a></li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.lunamutt.com"><span style=" text-decoration: underline; color:#0000ff;">Lunamutt Homepage.</span></a></li></ul></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:large; font-weight:600; text-decoration: underline; color:#0000ff;"><span style=" font-size:xx-large; text-decoration:none;">À propos RetroShare.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />RetroShare est une plateforme de communication privée et sécurisée.<br />Vous pouvez l'utiliser pour discuter avec vos amis, leur envoyer des messages ou partager des fichiers avec eux.<br /><br />Cette page n'est pas complète pour le moment. Vous pouvez<br />améliorer l'aide intégrée à RetroShare (ce texte) en<br />contribuant au wiki de RetroShare: <a href="http://retroshare.wiki.sourceforge.net/help_tab"><span style=" text-decoration: underline; color:#0000ff;">Cette page dans le wiki de RetroShare</span></a><br /><br />L'onglet "À propos/Aide" est régulièrement mis à jour à partir du Wiki.<br /><br />Plus d'informations:<br /></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.sourceforge.net"><span style=" text-decoration: underline; color:#0000ff;">Site de Retroshare</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.wiki.sourceforge.net/"><span style=" text-decoration: underline; color:#0000ff;">Wiki de Retroshare</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://sourceforge.net/projects/retroshare/"><span style=" text-decoration: underline; color:#0000ff;">La page du projet RetroShare</span></a></li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.lunamutt.com"><span style=" text-decoration: underline; color:#0000ff;">Site de Lunamutt.</span></a></li></ul></body></html> + + + + Authors + Auteurs + + + + Thanks to + Remerciements + + + + Translation + Traduction + + + + License Agreement + Accord de la licence + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">About/Help</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">À propos/Aide</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:xx-large; font-weight:600; color:#0000ff;">About RetroShare.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-weight:600;">Retroshare is a private and secure decentralised commmunication platform.<br />You can use it chat, send messages and share files with your friends.</span><br /><br />This is just a placeholder page for the moment. You can<br />improve retroshare's in-built help (this text) by<br />updating the retroshare wiki: <a href="http://retroshare.wiki.sourceforge.net/help_tab"><span style=" text-decoration: underline; color:#0000ff;">This Page in the retroshare Wiki</span></a><br /><br />The About/Help Tab is regularly updated from the Wiki page.<br /><br />External Links to more information:<br /></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.sourceforge.net"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Webpage</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.wiki.sourceforge.net/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Wiki</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://sourceforge.net/projects/retroshare/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Project Page</span></a></li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.lunamutt.com"><span style=" text-decoration: underline; color:#0000ff;">Lunamutt Homepage.</span></a></li></ul></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-size:19pt; font-weight:600; color:#0000ff;">The RetroShare Team:</span><br /> <br /><span style=" font-size:9pt; color:#0000ff;">defnax</span>: Lead GUI developer <br /><span style=" font-size:9pt; color:#0000ff;">drbob7</span>: Lead Core developer. <br /> <br /><span style=" font-size:9pt; color:#0000ff;">bmeck</span> : Our new web-developer. Joined retroshare a couple <br />of weeks ago, and already starting on an exciting new <br />design for the web-page. <br /> <br /><span style=" font-size:9pt; color:#0000ff;">noragen</span> : Developer from the SIM-IM project. Working on a retroshare plugin to SIM-IM. <br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">kernelpanix</span> : Gui and skin developer</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">libris</span><span style=" font-size:9pt;">:</span> core developer</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-size:9pt; color:#0000ff;">kashif: </span><span style=" color:#000000;">core developer</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt; color:#000000;"><span style=" font-size:8pt;"><br /></span><span style=" color:#0000ff;">agent725</span><span style=" font-size:8pt;">: Manages the 'local' Retroshare release, <br />and beta-testing retroshare on a large scale. <br /> <br /></span><span style=" color:#0000ff;">the_mgt</span><span style=" font-size:8pt;">: Maintains the Gentoo and generic linux <br />installation/compilation scripts. </span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">notdefine:</span> Maintains the .rpm, .deb installation/compilation scripts.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">zhouk</span>: developer</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Translators:</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Serbian</span>: Kunalagon Umuhanik &lt;kunalagon@gmail.com&gt;</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Polish: </span>Jarek</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">French</span>:Temet</p></body></html> + + + + + InviteDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">To </span><span style=" font-size:10pt; font-weight:600;">Invite your friends to join you with Retroshare: </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">Cut and paste the text below into an email.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">and send it to all your friends!</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">To </span><span style=" font-size:10pt; font-weight:600;">Inviter vos amis à vous rejoindre sur Retroshare: </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">Coupez/coller le texte ci-dessous dans un email.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">et envoyez le à tous vos amis!</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + Done + OK + + + + Cancel + Annuler + + + + Launch Email + Lancer le client mail + + + + Invite a Friend + Inviter un ami + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"><span style=" font-size:16pt;">Invite a Friend</span><br /><br /><span style=" font-size:10pt;">To Invite your friends to join you with Retroshare: </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">Cut and paste the text below into an email.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">and send it to all your friends!</p></body></html> + + + + + LogDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> + +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="ABOUT"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">About RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShare is a private peer to peer communication platform created by Dr. Bob.This program enables you to securely share files and chat with your friends (and no-one else!).</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, and the latest release go to http://www.lunamutt.com.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="START"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Quick Start Guide to RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If this is your first time using Retroshare, it is recommended that you readthis guide for instructions on how to get started. The first step is:<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Connecting to Your Friends</span></a>. Once you have managed this you can <a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">Download Files</span></a> and<a href="#START-SHARE"><span style=" text-decoration: underline; color:#0000ff;">Share with Others</span></a></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Some of the key concepts related to ensuring your sharing remains private aredescribed in the <a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">Frequently Asked Questions</span></a>. Some Key security questions are:<a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">What is a Web of Trust?</span></a>, <a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">Should I Sign this Certificate?</span></a>, and finally<a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">What does "Trust" Mean?</span></a>.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is also worthwhile reading the <a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">GUI Overview</span></a>which describes the featureson available through the User Interface.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Connecting to your Friends </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">There are four steps to connecting to a Friend:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Get Friend's Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Load Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Sign Certificate</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect to Friend.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The instructions might initially appear long and daunting, however thesesteps are required to ensure that your sharing is private and secure.These steps are only required a couple of times, to add new friends, and become quite straight forward after the first time.</p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (1) EXCHANGE CERTIFICATES </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Before you can connect, you need send your certificate to your friend, and get your friends certificate. Follow these steps to get your certificate:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on Your Certificate to Select it.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on the "Export Friend" Button to bring up a file save dialog.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select directory to save the certificate to.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Enter desired filename. (with a file type of .pqi), and Click OK.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Email this File to your Friend. (It is recommended you put thecertificate in a zip file before sending, as some email programsdon't transmit the file correctly).</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Ask your friend to do the same.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Once you have received your friend's certificate, removed itfrom the zip file and saved it to disk, you can proceed to step (2).</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Note: This exchange of certificates is only necessary to get you started.Once you are connected to some friends the exchange of certificates becomeautomated by the autoDiscovery system. See<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">GUI: Connecting</span></a> for more information.------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (2) LOAD YOUR FRIEND'S CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Import Friend"</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select your friends certificate file, then click "Okay". Their certificate should appear in the top window of the "Connect" Tab.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (3) SIGN CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select their Certificate by clicking on their name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Configure Friend" Button. This will bring up a configuration window. which allows you to look at the detailsof the certificate.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click the "Sign Certificate" button near the bottom of the "Certificate Configuration" Window.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Now close the window by clicking on the "Done" button.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Your Friends certificate should now say "Trusted (S)", indicating it is ready for connections.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can only share with "Trusted" Peers. You must sign your Friend'scertificate to prove that you know the certificate belongs to your Friend. Do not sign any/all certificates - only the people youtrust. For more information see: <br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br />------------------------------------------------------------------------<br /><br /> <br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (4) AUTOCONNECT TO PEER </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Finally You need to activate the connection:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click in the Box, next to your friends Name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> A Tick should appear in the box, a connection will be started.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> The "Offline" will change to "Online" when you have successfullyconnected.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Remember: Your initial connection attempts will fail, until your friend has signed your certificate and ticked the Auto-Connect Box.This ensures that both peers trust each other, and stops random peopleaccessing your files.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>. <br />------------------------------------------------------------------------<br /><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-DOWNLOAD"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Downloading Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have connected to friends, you can download their shared files.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can search for the files you want using either:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) File Listing Tab: This gives you a directory view of the files being shared by your peers. Double clickon the directory name (not the arrow) to diplay its subdirectories and files.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 1: This can take up to 5 seconds to fetch the information for your peer.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 2: If the directory is empty, or the person is offline, then the request will silently fail.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Search Tab: Retroshare also allows you to search your peers computers for filenames. Enter yourterm(s) in the search box at the top of the TAB and click the "Search" button. This willsearch all of the peers that you are currently connected to.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 3: If any matching files are found they will be displayed within 5 - 10 seconds.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have found the files you want, Select the file(s), and click "Download" to begin the download process.If you click over the "File Transfer" TAB, the status of the files will appear.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 4: The files can take up to 10 seconds to appear in the transfer window.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-SHARING"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Sharing Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can specify which files you want to share in the "Config" Tab.In the "Share Directories" section, click the "Add Directory" Button, and select the directory you want to share.The files and subdirectories will become available for you peers.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can remove a directory from the Shared Directories List by clicking onthe directory name in the list, and then clicking "Remove Directory".</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="GUI"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Gui Overview (Tab Description) </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The GUI is divided up into several sections which can be accessed by clicking on the Tabs along the top of the main window. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect: Manage Connections and Friends.(<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">getting started</span></a> and<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Listing: A directory view of available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Search: Search for available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Messages: For Sending/Recving Message. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Channels: A broadcast/subscription system. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Transfer: Listing of Current and completed Transfers.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Config: Specify of share diectories and IP Addresses.(<a href="#GUI-CONFIG"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> About: Help and other Information.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Chat: Accessed by the clicking on the "Chat" button.</li></ul> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Connect Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Connect TAB consists of two windows. The upper windowshows a list of your friends. This window indicates each friendscurrent trust level, as well as their connection state.The "Trust_Lvl" Column indicates if the certificate has beenAuthenticated using the web of trust. You can only connect to "Trusted" certificates. Tick the "Auto_Connect" box to connect to your trusted friends.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The lower window provides a list of the friends of your friends.This window shows the neighbour's name and how long ago they attempted to connect to you. This window is automatically populatedby the autoDiscovery system, and should be used to expand yourretroShare network. A word of warning: Do not automatically trust (or sign) anyonethat appears in this window. First verify by some other means (email/phone)that certificate belongs to the person you think it does.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use the "Neighbour List" window to expand your friend list. Select the desired entry in the lower window by clicking on it, then click the "Add to Friends" Button to move it to the upper window.Likewise the "Remove from Friends" button moved a person from the upper window to the lower window.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The "Configure Friend" Button opens a Certificate Configuration window.This window can be used to examine the certificate details, sign the certificate or manually change the peer's IP Address.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">See Also:<br /><a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Getting Started: Connecting to your friends</span></a>.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>.<br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONFIG"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Config Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Configuration Tab allows you to select the share directories, as well as the directory that downloaded files are saved to.<br />See <a href="#STARTUP-SHARING"><span style=" text-decoration: underline; color:#0000ff;">Sharing you Files</span></a> for details. </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Config Tab also allows you to control the IP Address and Portused by RetroShare. Under most cirumstances you do not need to changethese setting. If you are behind a firewall and can setup a forwarded port, the selected IP Address and Port should be specified here.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="FAQ"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Frequently Asked Questions </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">How does the security/privacy work? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShares uses a Web of Trust Authentication system to ensurethat your "friends" are your friends, and uses SSL to encryptthe communcications between peers. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What is a Web of Trust? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Web of Trust relies on a collection of peers to identify eachother. Look it up on the Web!</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-TRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What does "Trust" Mean in RetroShare?</span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Anyone can generate a certificate, with any name on it. So howdo you know that the certificate that claims to be from "Joe Bloggs"is really from your mate Joe. This is the "AuthenticationProblem". RetroShare uses a Web of Trust to Authenticate your peers.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-SIGN"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Should I Sign this Certificate? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should only sign a certificate if you are completely surethat it comes from the "right" person. If you sign a certificateyou are "Authenticating" the person to yourself and others.If you sign certificates that you haven't checked, then you aredestroying your own privacy and security.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">How do you verify a certificate? Use an alternative method ofcommunication to send the certificate: E.g. email or USB stick. This will improve you confidence that the certificate belongsto the correct person. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><span style=" font-size:small;"> </span><a name="FAQ-CONNECT"></a><span style=" font-size:small;">W</span><span style=" font-size:small;">hy won't it Connect?</span><span style=" font-size:small;"> </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A connection can fail for a number of reasons:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) Failed Authentication. Have both peers signed each otherscertificates? </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Firewalls. If both peers are behind firewalls then they cannotconnect directly. RetroShare has a built in proxy system to circumventfirewalls - However this can only function if both peers can connect to a common third party that is not behind a firewall. Thisis the most likely reason for initial connections to fail. The only solution to find a common friend that isn't firewalled (know anyone with Broadband?)</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(3) IP Addresses are wrong. You can manually examine and change these using the Certificate configuration.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +</body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> + +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="ABOUT"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">À propos de RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Liens: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">À propos</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShare is a private peer to peer communication platform created by Dr. Bob.This program enables you to securely share files and chat with your friends (and no-one else!).</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, and the latest release go to http://www.lunamutt.com.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="START"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Quick Start Guide to RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If this is your first time using Retroshare, it is recommended that you readthis guide for instructions on how to get started. The first step is:<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Connecting to Your Friends</span></a>. Once you have managed this you can <a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">Download Files</span></a> and<a href="#START-SHARE"><span style=" text-decoration: underline; color:#0000ff;">Share with Others</span></a></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Some of the key concepts related to ensuring your sharing remains private aredescribed in the <a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">Frequently Asked Questions</span></a>. Some Key security questions are:<a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">What is a Web of Trust?</span></a>, <a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">Should I Sign this Certificate?</span></a>, and finally<a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">What does "Trust" Mean?</span></a>.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is also worthwhile reading the <a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">GUI Overview</span></a>which describes the featureson available through the User Interface.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Connecting to your Friends </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">There are four steps to connecting to a Friend:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Get Friend's Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Load Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Sign Certificate</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect to Friend.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The instructions might initially appear long and daunting, however thesesteps are required to ensure that your sharing is private and secure.These steps are only required a couple of times, to add new friends, and become quite straight forward after the first time.</p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (1) EXCHANGE CERTIFICATES </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Before you can connect, you need send your certificate to your friend, and get your friends certificate. Follow these steps to get your certificate:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on Your Certificate to Select it.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on the "Export Friend" Button to bring up a file save dialog.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select directory to save the certificate to.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Enter desired filename. (with a file type of .pqi), and Click OK.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Email this File to your Friend. (It is recommended you put thecertificate in a zip file before sending, as some email programsdon't transmit the file correctly).</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Ask your friend to do the same.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Once you have received your friend's certificate, removed itfrom the zip file and saved it to disk, you can proceed to step (2).</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Note: This exchange of certificates is only necessary to get you started.Once you are connected to some friends the exchange of certificates becomeautomated by the autoDiscovery system. See<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">GUI: Connecting</span></a> for more information.------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (2) LOAD YOUR FRIEND'S CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Import Friend"</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select your friends certificate file, then click "Okay". Their certificate should appear in the top window of the "Connect" Tab.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (3) SIGN CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select their Certificate by clicking on their name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Configure Friend" Button. This will bring up a configuration window. which allows you to look at the detailsof the certificate.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click the "Sign Certificate" button near the bottom of the "Certificate Configuration" Window.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Now close the window by clicking on the "Done" button.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Your Friends certificate should now say "Trusted (S)", indicating it is ready for connections.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can only share with "Trusted" Peers. You must sign your Friend'scertificate to prove that you know the certificate belongs to your Friend. Do not sign any/all certificates - only the people youtrust. For more information see: <br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br />------------------------------------------------------------------------<br /><br /> <br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (4) AUTOCONNECT TO PEER </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Finally You need to activate the connection:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click in the Box, next to your friends Name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> A Tick should appear in the box, a connection will be started.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> The "Offline" will change to "Online" when you have successfullyconnected.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Remember: Your initial connection attempts will fail, until your friend has signed your certificate and ticked the Auto-Connect Box.This ensures that both peers trust each other, and stops random peopleaccessing your files.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>. <br />------------------------------------------------------------------------<br /><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-DOWNLOAD"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Downloading Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have connected to friends, you can download their shared files.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can search for the files you want using either:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) File Listing Tab: This gives you a directory view of the files being shared by your peers. Double clickon the directory name (not the arrow) to diplay its subdirectories and files.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 1: This can take up to 5 seconds to fetch the information for your peer.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 2: If the directory is empty, or the person is offline, then the request will silently fail.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Search Tab: Retroshare also allows you to search your peers computers for filenames. Enter yourterm(s) in the search box at the top of the TAB and click the "Search" button. This willsearch all of the peers that you are currently connected to.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 3: If any matching files are found they will be displayed within 5 - 10 seconds.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have found the files you want, Select the file(s), and click "Download" to begin the download process.If you click over the "File Transfer" TAB, the status of the files will appear.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 4: The files can take up to 10 seconds to appear in the transfer window.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-SHARING"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Sharing Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can specify which files you want to share in the "Config" Tab.In the "Share Directories" section, click the "Add Directory" Button, and select the directory you want to share.The files and subdirectories will become available for you peers.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can remove a directory from the Shared Directories List by clicking onthe directory name in the list, and then clicking "Remove Directory".</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="GUI"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Gui Overview (Tab Description) </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The GUI is divided up into several sections which can be accessed by clicking on the Tabs along the top of the main window. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect: Manage Connections and Friends.(<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">getting started</span></a> and<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Listing: A directory view of available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Search: Search for available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Messages: For Sending/Recving Message. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Channels: A broadcast/subscription system. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Transfer: Listing of Current and completed Transfers.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Config: Specify of share diectories and IP Addresses.(<a href="#GUI-CONFIG"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> About: Help and other Information.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Chat: Accessed by the clicking on the "Chat" button.</li></ul> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Connect Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Connect TAB consists of two windows. The upper windowshows a list of your friends. This window indicates each friendscurrent trust level, as well as their connection state.The "Trust_Lvl" Column indicates if the certificate has beenAuthenticated using the web of trust. You can only connect to "Trusted" certificates. Tick the "Auto_Connect" box to connect to your trusted friends.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The lower window provides a list of the friends of your friends.This window shows the neighbour's name and how long ago they attempted to connect to you. This window is automatically populatedby the autoDiscovery system, and should be used to expand yourretroShare network. A word of warning: Do not automatically trust (or sign) anyonethat appears in this window. First verify by some other means (email/phone)that certificate belongs to the person you think it does.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use the "Neighbour List" window to expand your friend list. Select the desired entry in the lower window by clicking on it, then click the "Add to Friends" Button to move it to the upper window.Likewise the "Remove from Friends" button moved a person from the upper window to the lower window.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The "Configure Friend" Button opens a Certificate Configuration window.This window can be used to examine the certificate details, sign the certificate or manually change the peer's IP Address.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">See Also:<br /><a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Getting Started: Connecting to your friends</span></a>.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>.<br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONFIG"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Config Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Configuration Tab allows you to select the share directories, as well as the directory that downloaded files are saved to.<br />See <a href="#STARTUP-SHARING"><span style=" text-decoration: underline; color:#0000ff;">Sharing you Files</span></a> for details. </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Config Tab also allows you to control the IP Address and Portused by RetroShare. Under most cirumstances you do not need to changethese setting. If you are behind a firewall and can setup a forwarded port, the selected IP Address and Port should be specified here.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="FAQ"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Frequently Asked Questions </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">How does the security/privacy work? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShares uses a Web of Trust Authentication system to ensurethat your "friends" are your friends, and uses SSL to encryptthe communcications between peers. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What is a Web of Trust? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Web of Trust relies on a collection of peers to identify eachother. Look it up on the Web!</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-TRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What does "Trust" Mean in RetroShare?</span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Anyone can generate a certificate, with any name on it. So howdo you know that the certificate that claims to be from "Joe Bloggs"is really from your mate Joe. This is the "AuthenticationProblem". RetroShare uses a Web of Trust to Authenticate your peers.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-SIGN"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Should I Sign this Certificate? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should only sign a certificate if you are completely surethat it comes from the "right" person. If you sign a certificateyou are "Authenticating" the person to yourself and others.If you sign certificates that you haven't checked, then you aredestroying your own privacy and security.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">How do you verify a certificate? Use an alternative method ofcommunication to send the certificate: E.g. email or USB stick. This will improve you confidence that the certificate belongsto the correct person. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><span style=" font-size:small;"> </span><a name="FAQ-CONNECT"></a><span style=" font-size:small;">W</span><span style=" font-size:small;">hy won't it Connect?</span><span style=" font-size:small;"> </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A connection can fail for a number of reasons:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) Failed Authentication. Have both peers signed each otherscertificates? </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Firewalls. If both peers are behind firewalls then they cannotconnect directly. RetroShare has a built in proxy system to circumventfirewalls - However this can only function if both peers can connect to a common third party that is not behind a firewall. Thisis the most likely reason for initial connections to fail. The only solution to find a common friend that isn't firewalled (know anyone with Broadband?)</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(3) IP Addresses are wrong. You can manually examine and change these using the Certificate configuration.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +</body></html> + + + + MainWindow + + + Preferences + Préférences + + + + Network + Réseau + + + + Friends + Amis + + + + Transfers + Transferts + + + + Messages + Messages + + + + Channels + Canaux + + + + Options + Options + + + + Users: 0 Files: 0 + Utilisateurs: 0 Fichiers: 0 + + + + Down: 0.0 Up: 0.0 + Down: 0.0 Up: 0.0 + + + + Connections: 0/45 + Connexions: 0/45 + + + + System tray is unavailable + Le plateau de système est indisponible + + + + System tray unavailable + Plateau de système indisponible + + + + RetroShare System tray + Icône systray Retroshare + + + + Application will continue running. Quit using context menu in the system tray + L'application continuera de fonctionner. Pour quitter, faites un clic droit sur l'icône dans le systray + + + + Hide + Cacher + + + + Show + Montrer + + + + RetroShare + Retroshare + + + + Home + Home + + + + General + Généralités + + + + Invite Friend + Inviter un ami + + + + Add Friend + Ajouter un ami + + + + Add Share + Ajouter un partage + + + + Advanced + Avancé + + + + QTextBrowser { + background-color: rgb(192,192,192); + +} + QTextBrowser { + background-color: rgb(192,192,192); + +} + + + + QPushButton +{ + border-image: url(:/images/console-small-up.png) +} + +QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + +} + +QPushButton:pressed { + border-image: url(:/images/console-small-down.png) +} + + QPushButton +{ + border-image: url(:/images/console-small-up.png) +} + +QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + +} + +QPushButton:pressed { + border-image: url(:/images/console-small-down.png) +} + + + + + Exit + Sortie + + + + Search + Recherche + + + + Files + Fichiers + + + + Chat + Chat + + + + Add Shared Directory + Ajouter un dossier partagé + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Select StyleSheet</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Sélection de la feuille de style</p></body></html> + + + + Default + Défaut + + + + blue + bleu + + + + silver + argent + + + + ed2k + ed2k + + + + over + over + + + + black + noir + + + + arachnophobia + arachnophobie + + + + Skin2 + Skin2 + + + + Pagefold + Pagefold + + + + About/Help + À propos/Aide + + + + Messenger + Messenger + + + + Show/Hide + Montrer/Cacher + + + + &Quit + &Quitter + + + + Bandwidth Graph + Graph de bande passante + + + + Open Messenger + Ouvrir Messenger + + + + RetroShare %1 + + + + + Add a Friend + Ajouter un ami + + + + Invite a Friend + Inviter un ami + + + + Add a Share + + + + + Quit + + + + + Apps + + + + + Minimize + + + + + Maximize + + + + + Hide Console + + + + + Show Console + + + + + Hide ToolBox + + + + + :images/hide_toolbox_frame.png + + + + + Show ToolBox + + + + + :images/show_toolbox_frame.png + + + + + QTextBrowser { + background-color: rgb(192,192,192); + + } + + + + + QPushButton + { + border-image: url(:/images/console-small-up.png) + } + + QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + + } + + QPushButton:pressed { + border-image: url(:/images/console-small-down.png) + } + + + + + + MessageToaster + + + message + message + + + + MessagesDialog + + + New Message + Nouveau message + + + + Reply to Message + Répondre au message + + + + Remove Message + Supprimer le message + + + + Date + Date + + + + From + De + + + + Title + Titre + + + + Msg + Message + + + + Count + Compte + + + + Size + Taille + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Recommended Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Fichiers recommandés</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">remove selected message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">supprimer le message sélectionné</p></body></html> + + + + QPushButton +{ +border-image: url(:/images/deletemail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/deletemail-hover.png); +} + QPushButton +{ +border-image: url(:/images/deletemail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/deletemail-hover.png); +} + + + + Inbox + Boîte de réception + + + + Outbox + Boîte d'émission + + + + Draft + Brouillons + + + + Sent + Envoyés + + + + Timestamp + Horodateur + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">reply to selected message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">répondre au message sélectionné</p></body></html> + + + + +QPushButton +{ +border-image: url(:/images/replymail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/replymail-hover.png); +} + + +QPushButton +{ +border-image: url(:/images/replymail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/replymail-hover.png); +} + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">New Message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Nouveau message</p></body></html> + + + + QPushButton +{ +border-image: url(:/images/folder-draft24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/folder-draft24-hover.png); +} + + QPushButton +{ +border-image: url(:/images/folder-draft24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/folder-draft24-hover.png); +} + + + + + You get Message testing + Vous recevez un message de test + + + + Download All + Tout télécharger + + + + QPushButton +{ +border-image: url(:/images/deletemail24.png); +} + +QPushButton:hover +{ +border-image: url(:/images/deletemail-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/deletemail-pressed.png); +} + + + + + +QPushButton +{ +border-image: url(:/images/replymail24.png); +} + +QPushButton:hover +{ +border-image: url(:/images/replymail24-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/replymail-pressed.png); +} + + + + + + QPushButton +{ +border-image: url(:/images/folder-draft24.png); +} +QPushButton:hover +{ +border-image: url(:/images/folder-draft24-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/folder-draft24-pressed.png); +} + + + + + + MessengerWindow + + + QWidget#MessengerWindow { +background-color: #ECF3F6; background-image:url(:/images/backgroundimage.png); +background-position: top right; +background-repeat: no-repeat +} + QWidget#MessengerWindow { +background-color: #ECF3F6; background-image:url(:/images/backgroundimage.png); +background-position: top right; +background-repeat: no-repeat +} + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click to change your avatar</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Cliquez pour changer votre avatar</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Change your Status and your display</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">picture here.</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changez votre état et votre</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">image ici.</p></body></html> + + + + Online + En ligne + + + + Busy + Occupé(e) + + + + Be right Back + De retour dans un instant + + + + Away + Parti(e) + + + + In a Call + Au téléphone + + + + Out of lunch + Parti(e) manger + + + + Apear Offline + Apparaître hors-ligne + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Share a personal message with your contacts</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Partager un message personnel avec vos contacts</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Add a Friend</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ajouter un ami</p></body></html> + + + + Chat + Chat + + + + Connect To Friend + Se connecter à un ami + + + + NetworkDialog + + + Peer Details / Authenticate + Détails du peer / Identification + + + + Load Certificate + Charger le certificat + + + + Select a pem/pqi File + Choisir un fichier pem/pqi + + + + File Not Found + Fichier non trouvé + + + + %1 does not exist. Would you like to create it? + %1 n'existe pas. Voulez-vous le créer ? + + + + Failed to Create File + La création du fichier a échoué + + + + Unable to create %1 [%2] + Impossible de créer %1 [%2] + + + + Select Certificate + Choisir le certificat + + + + Certificates (*.pqi *.pem) + Certificats (*.pqi *.pem) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Réseau:</span></p></body></html> + + + + # + # + + + + Accept + Accepter + + + + Trust + Confiance + + + + Last Contact + Dernier contact + + + + Name + Nom + + + + Peer Address + + + + + Organisation + Organisation + + + + Location + Lieu + + + + Country + Pays + + + + Cert Id + Id du certificat + + + + Auth Code + Code d'identification + + + + NetworkPage + + + Rate Options + Options de vitesse + + + + Max Total Data Rate (KB/S): + Vitesse max totale de téléchargement (KB/S): + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Rate per Person (KB/S):</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Vitesse par personne (KB/S):</p></body></html> + + + + PeersDialog + + + Chat + Chat + + + + Configure Friend + Configurer un ami + + + + Export Friend + Exporter un ami + + + + Remove Friend + Enlever un ami + + + + Save Certificate + Enregistrer un certificat + + + + Certificates (*.pqi) + Certificats (*.pqi) + + + + Status + Statut + + + + Person + Personne + + + + Auto Connect + Connexion automatique + + + + Trust Level + Niveau de confiance + + + + Peer Address + Adresse du peer + + + + Last Contact + Dernier contact + + + + Organisation + Organisation + + + + Location + Lieu + + + + Country + Pays + + + + Person Id + Id de la personne + + + + Auth Code + Code d'identification + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Friends</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Amis</span></p></body></html> + + + + Connect To Friend + Se connecter à un ami + + + + # + # + + + + PopupChatDialog + + + RetroShare Friend Chat + Causerie d'ami de Retroshare / Entretien à + + + + RetroShare User Chat + Chat avec un utilisateur RetroShare + + + + PreferencesDialog + + + Language + Langue + + + + Style + Style + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Les changements de langue entreront en vigueur seulement après un redémarrage de RetroShare!</p></body></html> + + + + Style Sheet + Feuille de style + + + + Default + Défaut + + + + Pagefold + Pagefold + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose RetroShare's interface style</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choisir l'interface de Retroshare style</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose the language used in RetroShare</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choisir la langue utilisée dans Retroshare</p></body></html> + + + + blue + bleu + + + + silver + argent + + + + ed2k + emule-ed2k + + + + over + over + + + + black + noir + + + + arachnophobia + arachnophobie + + + + Skin2 + Skin2 + + + + Login + Login + + + + Remove Auto Login + Enlever l'auto login + + + + PreferencesWindow + + + Directories + Dossiers + + + + Error Saving Configuration + Erreur pendant l'enregistrement de la configuration + + + + About + À propos + + + + General + Généralités + + + + Server + Serveur + + + + Options + Options + + + + Cancel + Annuler + + + + OK + OK + + + + QObject + + + and + + + + + and / or + + + + + or + + + + + Name + Nom + + + + Path + + + + + Extension + + + + + Date + Date + + + + Size + Taille + + + + Popularity + + + + + contains + + + + + contains all + + + + + is + + + + + less than + + + + + less than or equal + + + + + equals + + + + + greater than or equal + + + + + greater than + + + + + is in range + + + + + Rshare + + + Invalid language code specified: + Le code de langue indiqué n'est pas valide: + + + + Invalid GUI style specified: + Le style d'interface indiqué n'est pas valide: + + + + SearchDialog + + + File Name + Nom du fichier + + + + Sources + Sources + + + + Search Pattern + Chercher un motif + + + + Results + Résultats + + + + File Size + Taille du fichier + + + + Download + Téléchargement + + + + Broadcast on Channel + Émission sur le canal + + + + Recommend to Friends + Recommander aux amis + + + + Remove + Supprimer + + + + Remove All + Tout supprimer + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Keywords</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mots-clés</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Format</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Format</p></body></html> + + + + Any + Tout + + + + Audio + Audio + + + + Video + Vidéo + + + + Images + Images + + + + Programs + Programmes + + + + Archives + Archives + + + + Documents + Documents + + + + search + recherche + + + + download + téléchargement + + + + Toggle advanced searching on and off. + + + + + <h3>Simple Search:</h3> + + + + + Keywords + + + + + Perform simple search + + + + + <h3>Advanced Search:</h3> + + + + + Show Advanced Search Tool + + + + + Filename + + + + + Hash + + + + + KeyWords + + + + + Search Id + + + + + ServerDialog + + + Transfer Rates + Vitesses de transfert + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Total Rate (kb/s) </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Vitesse totale (kb/s) </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Per Person </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Par Personne </p></body></html> + + + + Server Settings + Options du serveur + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Adresse locale:</p></body></html> + + + + Port: + Port: + + + + behind zee Firewall + derrière un pare-feu + + + + Forwarded External Port + Port externe transmis + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Nom externe</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Adresse externe:</p></body></html> + + + + Check Settings + Vérifier les arrangements + + + + DHT + DHT + + + + DHT Enabled (requires restart) + DHT activé (nécessite un redémarrage) + + + + Network Configuration: + Configuration du réseau: + + + + I'm a Noobie, and will hide behind my firewall. + Je suis un noob et je vais me cacher derrière un pare-feu. + + + + I'm a real man, let me do it myself: Manual settings. + Je suis un homme, un vrai, laisse moi me démerder: configuration manuelle. + + + + Use uPnP to configure my router. (default) + Utiliser uPnP pour configurer mon routeur. (défaut) + + + + Firewall/Router Configuration + + + + + Manual router setup. + + + + + Use uPnP to configure router + + + + + Network Address Configuration (takes effect after restart) + + + + + Use DHT to locate friends + + + + + Manual IP Addresses + + + + + Server Status And Network Settings + + + + + Firewalled + + + + + Forwarded Port + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">DHT Status</p></body></html> + + + + + uPnP Status + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Local Address:</p></body></html> + + + + + ServerPage + + + Change + Restart Server + Appliquer + redémarrer le serveur + + + + Server Settings + Options du serveur + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Adresse externe:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Adresse locale:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + + + + Port: + Port: + + + + Misc + Misc + + + + behinde Firewall + derrière un pare-feu + + + + Forwarded External Port + Port externe transmis + + + + Settings + + + Settings + Options + + + + Cancel + Annuler + + + + Apply + Appliquer + + + + OK + OK + + + + General + Généralités + + + + Network + Réseau + + + + Server + Serveur + + + + Directories + Dossiers + + + + SharedFilesDialog + + + Download + Téléchargement + + + + Recommend + recommander + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Fichiers</span></p></body></html> + + + + Add to Recommend List + Ajouter à la liste des recommandations + + + + Recommend To + Recommander à + + + + Message Friend + Message ami + + + + StartDialog + + + Select Trusted Friend + Choisir l'ami de confiance + + + + Certificates (*.pqi *.pem) + Certificats (*.pqi *.pem) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:13pt; font-weight:600; color:#8b0000;">Welcome to RetroShare</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:13pt; font-weight:600; color:#8b0000;">Bienvenue à Retroshare</span></p></body></html> + + + + Please Login .... + Svp Login .... + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Nom:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Pasword</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Mot de passe (Password)</span></p></body></html> + + + + Load Existing User + Utilisateur existant de charge + + + + Or create a New User + Ou créer un nouvel utilisateur + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Organisation:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Organisation:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Pays:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Location:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Endroit:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Password (Again)</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Mot de passe (encore)</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">New Password</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">nouveau mot de passe</span></p></body></html> + + + + Load Trusted Certificate (Optional) + La charge a fait confiance au certificat (facultatif) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Ami</span></p></body></html> + + + + Select File + Choisir le dossier + + + + Generate New Certificate + Produire du nouveau certificat + + + + RetroShare setup + Installation de Retroshare + + + + Automatically Login in Future + Automatiquement Login à l'aveni + + + + RetroShare + RetroShare + + + + QWidget { + background-color: #ECF3F6; +} + QWidget { + background-color: #ECF3F6; +} + + + + Auto-login + Auto-login + + + + Name: + Nom: + + + + Pasword: + Mot de passe: + + + + QToolButton{ +border-image: url(:/images/mystatus_bg.png); +background-image: url(:/images/amsn.png); +} + + QToolButton{ +border-image: url(:/images/mystatus_bg.png); +background-image: url(:/images/amsn.png); +} + + + + + Log In + Entrer + + + + Create a Account + + + + + Password: + + + + + QToolButton{ +border-image: url(:/images/avatar_background.png); + +} + + + + + + StatisticDialog + + + Statistics + Statistiques + + + + Download + Téléchargement + + + + Session: + Session: + + + + Downloaded: + Téléchargé: + + + + Average Downloadspeed: + Vitesse moyenne de téléchargement: + + + + Count of Downloads: + Nombre de téléchargements: + + + + Overall + Global + + + + Upload + Émission + + + + Session + Session + + + + Uploaded: + Émis: + + + + Average Uploadspeed: + Vitesse moyenne d'émission: + + + + Count of Uploads: + Nombre d'émis: + + + + Uploaded + Émis + + + + Connections: + Connexions: + + + + Peers: + Peers: + + + + Misc + Misc + + + + Uptime: + Uptime: + + + + Overall: + Overall: + + + + Uptime + Uptime + + + + Records + Records + + + + Uploadspeed: + Vitesse d'émission: + + + + Downloadspeed: + Vitesse de téléchargement: + + + + Show Settings + Montrer les options + + + + Reset + RAZ + + + + Receive Rate + Vitesse de réception + + + + Send Rate + Vitesse d'émission + + + + Always On Top + Toujours visible + + + + 100 + 100 + + + + % Opaque + % Opaque + + + + Changes the transparency of the Bandwidth Graph + Change la transparence du graphique de bande passante + + + + Save + Enregistrer + + + + Cancel + Annuler + + + + Hide Settings + Cacher les options + + + + TransfersDialog + + + Cancel + Annuler + + + + Clear Completed + Nettoyage terminé + + + + File Name + Nom du fichier + + + + Sources + Sources + + + + Status + Statut + + + + File Size + Taille du fichier + + + + Speed + Vitesse + + + + Progress + Progression + + + + Completed + Accompli + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Downloads:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Téléchargements / Téléchargements:</span></p></body></html> + + + + Peer Name + Nom du peer + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Uploads:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Téléchargements / Émis:</span></p></body></html> + + + + % + % + + + + Name + i.e: file name + Nom + + + + Size + i.e: file size + Taille + + + + Progress + i.e: % downloaded + Progression + + + + Speed + i.e: Download speed + Vitesse + + + + Sources + i.e: Sources + Sources + + + + Remaining + i.e: Estimated Time of Arrival / Time left + + + + + Core-ID + + + + + User Name + i.e: user name + + + + + Progress + i.e: % uploaded + Progression + + + + Speed + i.e: upload speed + Vitesse + + + + Transferred + + + + + ULListDelegate + + + B + + + + + KB + + + + + MB + + + + + GB + + + + + VMessageBox + + + OK + OK + + + + Cancel + Annuler + + + + Yes + Oui + + + + No + Non + + + + Help + Aide + + + + Retry + Réessayer + + + + Show Log + Montrer le log + + + + Show Settings + Montrer les options + + + + moreinfo + + + Details + Détails + + + + OK + OK + + + + Name + Nom + + + + Value + Valeur + + + diff --git a/retroshare-gui/src/lang/retroshare_gr.qm b/retroshare-gui/src/lang/retroshare_gr.qm new file mode 100644 index 000000000..4c940cb75 Binary files /dev/null and b/retroshare-gui/src/lang/retroshare_gr.qm differ diff --git a/retroshare-gui/src/lang/retroshare_gr.ts b/retroshare-gui/src/lang/retroshare_gr.ts new file mode 100644 index 000000000..e508842bb --- /dev/null +++ b/retroshare-gui/src/lang/retroshare_gr.ts @@ -0,0 +1,3974 @@ + + + + + + + Arial + Arial + + + + AddFriendDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;"> To add a new Friend, cut and paste their email </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">invitation into the box below, and click done.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;"> To add a new Friend, cut and paste their email </span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">invitation into the box below, and click done.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;"></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + Cancel + ακυÏώνω + + + + Done + καμωμένος + + + + Load From File + γεμίζω από λίμα + + + + RetroShare + Retroshare + + + + Certificate Load Failed + πτυχίο γεμίζω αποτυχημένος + + + + Add a Friend + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"><span style=" font-size:16pt;">Add a new Friend</span><br /><br /><span style=" font-size:10pt;">To add a new Friend, cut and paste their email </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">invitation into the box below, and click done.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + + + + + AddFriendWizard + + + < Back + + + + + Next > + + + + + Cancel + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">This Wizard helps to Connect to your Friends</span></p></body></html> + + + + + I have a .pqi/.pem file received from a Friend + + + + + I have Key received from a Friend + + + + + I want to invite a friend to my RetroShare network + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Cut and paste the text below into an email.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;"> and send it to all your friends!</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">When you press next RetroShare will attempt to launch a Email client.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Invite your Friends to join with RetroShare</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Enter the Key code you got from your friend:</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">When you press next RetroShare will attempt to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">connect using the key.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Select a pqi/pem file:</span></p></body></html> + + + + + Browse + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">When you press next RetroShare will attempt to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">connect using the .pqi/.pem file.</p></body></html> + + + + + Add Friend to my netowork Wizard + + + + + AdvancedSearchDialog + + + RetrosShare: Advanced Search + + + + + Add a further search criterion. + + + + + Add a selection criterion + + + + + Reset + + + + + Cancels the search. + + + + + Cancel + + + + + Perform the advanced search. + + + + + Search + + + + + Search Criteria + + + + + Reset the search criteria. + + + + + ApplicationWindow + + + RetroShare %1 + + + + + Example Application + + + + + Application Users: 0 Files: 0 + + + + + Down: 0.0 Up: 0.0 + + + + + Connections: 0/45 + + + + + Hide + + + + + Show + + + + + RetroShare + + + + + Home + + + + + General + + + + + Advanced + + + + + QTextBrowser { + background-color: rgb(192,192,192); + + } + + + + + QPushButton + { + border-image: url(:/images/console-small-up.png) + } + + QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + + } + + QPushButton:pressed { + border-image: url(:/images/console-small-down.png) + } + + + + + + AuthorizationDialog + + + Authenticate + πιστοποιώ την αυθεντικότητα + + + + Authenticate Friend By Entering Their Code + πιστοποιώ την αυθεντικότητα φίλος συν εισέÏχομαι ο κÏυπτογÏάφημα + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;"> αυθεντικότητα κÏυπτογÏάφημα:</span></p></body></html> + + + + OK + εγκÏίνω OK + + + + Cancel + ακυÏώνω + + + + BandwidthGraph + + + RetroShare Bandwidth Usage + + + + + Show Settings + + + + + Reset + + + + + Receive Rate + + + + + Send Rate + + + + + Always on Top + + + + + Style + + + + + Changes the transparency of the Bandwidth Graph + + + + + 100 + + + + + % Opaque + + + + + Save + + + + + Cancel + + + + + Since: + + + + + Hide Settings + + + + + CallToaster + + + Message + + + + + ChanCreateDialog + + + Create a new Broadcast Channel + δημιουÏγώ καινοÏÏγιος αναμετάδοση κανάλι + + + + Create A New Broadcast Channel + δημιουÏγώ καινοÏÏγιος αναμετάδοση κανάλι + + + + Channel Name: + κανάλι όνομα: + + + + Type: + Ï„Ïπος: + + + + Public Channel (Signed) + δημόσιος κανάλι (υπογÏάφω) + + + + Private Channel (Encrypted) + απλός στÏατιώτης κανάλι (κÏÏπτη) + + + + Cancel Channel + ακυÏώνω κανάλι + + + + Create Channel + δημιουÏγώ κανάλι + + + + ChanMsgDialog + + + Compose + συνθέτω + + + + Recommended Files + συνιστώ λίμα + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-weight:400;"><span style=" font-weight:600;">Subject:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-weight:400;"><span style=" font-weight:600;">τίτλος εφημεÏίδας:</span></p></body></html> + + + + Send To: + στέλλω εις: + + + + Send + στέλλω + + + + Delete Channel + αφαιÏÏŽ κανάλι + + + + Create Channel MSG + δημιουÏγώ κανάλι μήνυμα + + + + 1 + + + + + Reply + + + + + ChannelsDialog + + + New Message + καινοÏÏγιος μήνυμα + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Messages</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">μήνυμα</span></p></body></html> + + + + Date + Date + + + + Rank + Rank + + + + From + από + + + + Title + τίτλος εφημεÏίδας + + + + Msg + μήνυμα + + + + Count + Count + + + + Size + Size + + + + Type + Ï„Ïπος + + + + Rs[Cert/Chan]IdSize + Rs[Cert/Chan]IdSize + + + + RsMsgId + RsMsgId + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Message Text</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;"> μήνυμα κείμενο</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Recommended Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">συνιστώ λίμα</span></p></body></html> + + + + New Channel + καινοÏÏγιος κανάλι + + + + Subscribe To Channel + Subscribe To κανάλι + + + + Unsubscribe To Channel + Unsubscribe To κανάλι + + + + Delete Your Channel + αφαιÏÏŽ δικός σας κανάλι + + + + Download + Download + + + + Download All + Download όλως + + + + ChatDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:9pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:400;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:9pt; font-weight:600; font-style:normal; text-decoration:none;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:400;"></p></body></html> + + + + Chat History: + φιλική συζήτηση ιστοÏία: + + + + Chat With: + φιλική συζήτηση συν: + + + + Chat + φιλική συζήτηση + + + + Users: + + + + + ChatToaster + + + message + μήνυμα + + + + You Get a New Message + καινοÏÏγιος μήνυμα εισεÏχόμενος + + + + Message + + + + + ConfCertDialog + + + Cancel + ακυÏώνω + + + + Done + καμωμένος + + + + Apply + επιθέτω + + + + Peer Settings + Peer τοποθέτηση + + + + Port: + Port: + + + + behind zee Firewall + καθυστεÏημένος Firewall + + + + Forwarded External Port + Forwarded External Port + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Max Transfer Rate (kb/s) </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Max Transfer Rate (kb/s) </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Org / Loc:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Org / Loc:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Country/State:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Country/State:</p></body></html> + + + + Trust Settings + εμπιστοσÏνη τοποθέτηση + + + + Trust Level + εμπιστοσÏνη αλφάδι + + + + Trust Their Signature + εμπιστοσÏνη από υπογÏαφή + + + + Sign The Certificate + υπογÏάφω πτυχίο + + + + OK + + + + + Peer Adress + + + + + Peer Info + + + + + ConfirmQuitDialog + + + Exit RetroShare + + + + + You are about to exit the RetroShare application and therefore stop all transfers. <br><br>Are you sure you want to stop and exit RetroShare? + + + + + Do not show this message again. + + + + + ConnectDialog + + + Peer Details + Peer καθέκαστα + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Org:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Org:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Trust:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">εμπιστοσÏνη:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Loc:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Loc:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Certificate</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">signers:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Certificate</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">υπογÏάφω / signers:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">αυθεντικότητα κÏυπτογÏάφημα:</span></p></body></html> + + + + Make Friend + κατασκευή φίλος + + + + Close + λήξη + + + + ConnectionsDialog + + + Load Certificate + γεμίζω πτυχίο + + + + Select a pem/pqi File + Select a pem/pqi File + + + + File Not Found + File Not Found + + + + %1 does not exist. Would you like to create it? + %1 does not exist. Would you like to create it? + + + + Failed to Create File + Failed to Create File + + + + Unable to create %1 [%2] + Unable to create %1 [%2] + + + + Select Certificate + Select Certificate + + + + Certificates (*.pqi *.pem) + Certificates (*.pqi *.pem) + + + + Accept + Accept + + + + Trust + εμπιστοσÏνη + + + + Last Contact + Last Contact + + + + Name + Name + + + + Organisation + Organisation + + + + Location + Location + + + + Country + Country + + + + Peer Address + Peer Address + + + + Cert Id + Cert Id + + + + Auth Code + αυθεντικότητα κÏυπτογÏάφημα: + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + + + + Peer Details / Authenticate + Peer Details / Authenticate + + + + CryptographyDialog + + + RSA Key Size + RSA Key Size + + + + Rijndael Block size + Rijndael Block size + + + + 128 Bits + 128 Bits + + + + 192 Bits + 192 Bits + + + + 256 Bits + 256 Bits + + + + Rijndael Key Size + Rijndael Key Size + + + + Rijndael Mode + Rijndael Mode + + + + CBC + CBC + + + + ECB + ECB + + + + CFB + CFB + + + + Rijndael Padding + Rijndael Padding + + + + PKCS7 + PKCS7 + + + + Zeros + Zeros + + + + ANSIX923 + ANSIX923 + + + + ISO10126 + ISO10126 + + + + Rijndael Feedback Size + Rijndael Feedback Size + + + + Key Size: + Key Size: + + + + Block Size: + Block Size: + + + + Feedback Size: + Feedback Size: + + + + Mode: + Mode: + + + + Padding: + Padding: + + + + DLListDelegate + + + B + + + + + KB + + + + + MB + + + + + GB + + + + + DirectoriesDialog + + + Shared Directories + Shared Directories + + + + Other Directories + Other Directories + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Incoming Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Incoming Files</span></p></body></html> + + + + Add Shared Directory + Add Shared Directory + + + + DirectoriesPage + + + Shared Directories + Shared Directories + + + + Incoming files + Incoming files + + + + ExampleDialog + + + Vote Up + + + + + Vote Down + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Friends</span></p></body></html> + + + + + # + + + + + Status + + + + + Person + + + + + Auto Connect + + + + + Trust Level + + + + + Peer Address + Peer Address + + + + Last Contact + Last Contact + + + + Organisation + Organisation + + + + Location + Location + + + + Country + Country + + + + Person Id + + + + + Auth Code + αυθεντικότητα κÏυπτογÏάφημα: + + + + ExprParamElement + + + to + + + + + ignore case + + + + + dd.MM.yyyy + + + + + KB + + + + + MB + + + + + GB + + + + + ExpressionWidget + + + Expression Widget + + + + + Delete this expression + + + + + FileHashDialog + + + Download + Download + + + + GSettingsWin + + + General + General + + + + Network + Network + + + + Directories + Directories + + + + Server + Peer Settings + + + + %1 + %1 + + + + GenCertDialog + + + RetroShare setup + Retroshare setup + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16pt;">Generate a new profile</span><br /><br />Please fill in the information which will<br />allow your RetroShare to connect to</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Friends.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Organisation:</p></body></html> + + + + + Password (Again) + + + + + Location: + + + + + Load Trusted Certificate (Optional) + Load Trusted Certificate (Optional) + + + + Password + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + + + + Select File + Select File + + + + Country: + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + + + + + Generate New Certificate + Generate New Certificate + + + + Select Trusted Friend + εκλεκτός έμπιστος φίλος + + + + Certificates (*.pqi *.pem) + Certificates (*.pqi *.pem) + + + + GeneralPage + + + Keys manager + Keys manager + + + + Style + Style + + + + Choose RetroShare's interface style + Choose RetroShare's interface style + + + + Language + Language + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + + + + Choose the language used in RetroShare + Choose the language used in RetroShare + + + + GraphFrame + + + Recv: + Recv: + + + + %1 KB/s + %1 KB/s + + + + Sent: + Sent: + + + + %1 KB + %1 KB + + + + %1 MB + %1 MB + + + + %1 GB + %1 GB + + + + HelpDialog + + + About + + + + + Authors + + + + + Thanks to + + + + + Translation + + + + + License Agreement + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">About/Help</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:xx-large; font-weight:600; color:#0000ff;">About RetroShare.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-weight:600;">Retroshare is a private and secure decentralised commmunication platform.<br />You can use it chat, send messages and share files with your friends.</span><br /><br />This is just a placeholder page for the moment. You can<br />improve retroshare's in-built help (this text) by<br />updating the retroshare wiki: <a href="http://retroshare.wiki.sourceforge.net/help_tab"><span style=" text-decoration: underline; color:#0000ff;">This Page in the retroshare Wiki</span></a><br /><br />The About/Help Tab is regularly updated from the Wiki page.<br /><br />External Links to more information:<br /></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.sourceforge.net"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Webpage</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.wiki.sourceforge.net/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Wiki</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://sourceforge.net/projects/retroshare/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Project Page</span></a></li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.lunamutt.com"><span style=" text-decoration: underline; color:#0000ff;">Lunamutt Homepage.</span></a></li></ul></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-size:19pt; font-weight:600; color:#0000ff;">The RetroShare Team:</span><br /> <br /><span style=" font-size:9pt; color:#0000ff;">defnax</span>: Lead GUI developer <br /><span style=" font-size:9pt; color:#0000ff;">drbob7</span>: Lead Core developer. <br /> <br /><span style=" font-size:9pt; color:#0000ff;">bmeck</span> : Our new web-developer. Joined retroshare a couple <br />of weeks ago, and already starting on an exciting new <br />design for the web-page. <br /> <br /><span style=" font-size:9pt; color:#0000ff;">noragen</span> : Developer from the SIM-IM project. Working on a retroshare plugin to SIM-IM. <br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">kernelpanix</span> : Gui and skin developer</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">libris</span><span style=" font-size:9pt;">:</span> core developer</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-size:9pt; color:#0000ff;">kashif: </span><span style=" color:#000000;">core developer</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt; color:#000000;"><span style=" font-size:8pt;"><br /></span><span style=" color:#0000ff;">agent725</span><span style=" font-size:8pt;">: Manages the 'local' Retroshare release, <br />and beta-testing retroshare on a large scale. <br /> <br /></span><span style=" color:#0000ff;">the_mgt</span><span style=" font-size:8pt;">: Maintains the Gentoo and generic linux <br />installation/compilation scripts. </span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">notdefine:</span> Maintains the .rpm, .deb installation/compilation scripts.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">zhouk</span>: developer</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Translators:</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Serbian</span>: Kunalagon Umuhanik &lt;kunalagon@gmail.com&gt;</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Polish: </span>Jarek</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">French</span>:Temet</p></body></html> + + + + + InviteDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">To </span><span style=" font-size:10pt; font-weight:600;">Invite your friends to join you with Retroshare: </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">Cut and paste the text below into an email.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">and send it to all your friends!</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">To </span><span style=" font-size:10pt; font-weight:600;">Invite your friends to join you with Retroshare: </span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">Cut and paste the text below into an email.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">and send it to all your friends!</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + Done + καμωμένος + + + + Cancel + ακυÏώνω + + + + Launch Email + εκτοξεÏω Email + + + + Invite a Friend + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"><span style=" font-size:16pt;">Invite a Friend</span><br /><br /><span style=" font-size:10pt;">To Invite your friends to join you with Retroshare: </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">Cut and paste the text below into an email.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">and send it to all your friends!</p></body></html> + + + + + LogDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> + +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="ABOUT"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">About RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShare is a private peer to peer communication platform created by Dr. Bob.This program enables you to securely share files and chat with your friends (and no-one else!).</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, and the latest release go to http://www.lunamutt.com.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="START"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Quick Start Guide to RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If this is your first time using Retroshare, it is recommended that you readthis guide for instructions on how to get started. The first step is:<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Connecting to Your Friends</span></a>. Once you have managed this you can <a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">Download Files</span></a> and<a href="#START-SHARE"><span style=" text-decoration: underline; color:#0000ff;">Share with Others</span></a></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Some of the key concepts related to ensuring your sharing remains private aredescribed in the <a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">Frequently Asked Questions</span></a>. Some Key security questions are:<a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">What is a Web of Trust?</span></a>, <a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">Should I Sign this Certificate?</span></a>, and finally<a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">What does "Trust" Mean?</span></a>.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is also worthwhile reading the <a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">GUI Overview</span></a>which describes the featureson available through the User Interface.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Connecting to your Friends </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">There are four steps to connecting to a Friend:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Get Friend's Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Load Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Sign Certificate</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect to Friend.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The instructions might initially appear long and daunting, however thesesteps are required to ensure that your sharing is private and secure.These steps are only required a couple of times, to add new friends, and become quite straight forward after the first time.</p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (1) EXCHANGE CERTIFICATES </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Before you can connect, you need send your certificate to your friend, and get your friends certificate. Follow these steps to get your certificate:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on Your Certificate to Select it.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on the "Export Friend" Button to bring up a file save dialog.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select directory to save the certificate to.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Enter desired filename. (with a file type of .pqi), and Click OK.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Email this File to your Friend. (It is recommended you put thecertificate in a zip file before sending, as some email programsdon't transmit the file correctly).</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Ask your friend to do the same.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Once you have received your friend's certificate, removed itfrom the zip file and saved it to disk, you can proceed to step (2).</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Note: This exchange of certificates is only necessary to get you started.Once you are connected to some friends the exchange of certificates becomeautomated by the autoDiscovery system. See<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">GUI: Connecting</span></a> for more information.------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (2) LOAD YOUR FRIEND'S CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Import Friend"</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select your friends certificate file, then click "Okay". Their certificate should appear in the top window of the "Connect" Tab.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (3) SIGN CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select their Certificate by clicking on their name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Configure Friend" Button. This will bring up a configuration window. which allows you to look at the detailsof the certificate.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click the "Sign Certificate" button near the bottom of the "Certificate Configuration" Window.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Now close the window by clicking on the "Done" button.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Your Friends certificate should now say "Trusted (S)", indicating it is ready for connections.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can only share with "Trusted" Peers. You must sign your Friend'scertificate to prove that you know the certificate belongs to your Friend. Do not sign any/all certificates - only the people youtrust. For more information see: <br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br />------------------------------------------------------------------------<br /><br /> <br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (4) AUTOCONNECT TO PEER </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Finally You need to activate the connection:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click in the Box, next to your friends Name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> A Tick should appear in the box, a connection will be started.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> The "Offline" will change to "Online" when you have successfullyconnected.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Remember: Your initial connection attempts will fail, until your friend has signed your certificate and ticked the Auto-Connect Box.This ensures that both peers trust each other, and stops random peopleaccessing your files.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>. <br />------------------------------------------------------------------------<br /><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-DOWNLOAD"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Downloading Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have connected to friends, you can download their shared files.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can search for the files you want using either:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) File Listing Tab: This gives you a directory view of the files being shared by your peers. Double clickon the directory name (not the arrow) to diplay its subdirectories and files.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 1: This can take up to 5 seconds to fetch the information for your peer.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 2: If the directory is empty, or the person is offline, then the request will silently fail.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Search Tab: Retroshare also allows you to search your peers computers for filenames. Enter yourterm(s) in the search box at the top of the TAB and click the "Search" button. This willsearch all of the peers that you are currently connected to.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 3: If any matching files are found they will be displayed within 5 - 10 seconds.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have found the files you want, Select the file(s), and click "Download" to begin the download process.If you click over the "File Transfer" TAB, the status of the files will appear.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 4: The files can take up to 10 seconds to appear in the transfer window.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-SHARING"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Sharing Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can specify which files you want to share in the "Config" Tab.In the "Share Directories" section, click the "Add Directory" Button, and select the directory you want to share.The files and subdirectories will become available for you peers.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can remove a directory from the Shared Directories List by clicking onthe directory name in the list, and then clicking "Remove Directory".</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="GUI"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Gui Overview (Tab Description) </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The GUI is divided up into several sections which can be accessed by clicking on the Tabs along the top of the main window. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect: Manage Connections and Friends.(<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">getting started</span></a> and<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Listing: A directory view of available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Search: Search for available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Messages: For Sending/Recving Message. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Channels: A broadcast/subscription system. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Transfer: Listing of Current and completed Transfers.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Config: Specify of share diectories and IP Addresses.(<a href="#GUI-CONFIG"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> About: Help and other Information.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Chat: Accessed by the clicking on the "Chat" button.</li></ul> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Connect Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Connect TAB consists of two windows. The upper windowshows a list of your friends. This window indicates each friendscurrent trust level, as well as their connection state.The "Trust_Lvl" Column indicates if the certificate has beenAuthenticated using the web of trust. You can only connect to "Trusted" certificates. Tick the "Auto_Connect" box to connect to your trusted friends.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The lower window provides a list of the friends of your friends.This window shows the neighbour's name and how long ago they attempted to connect to you. This window is automatically populatedby the autoDiscovery system, and should be used to expand yourretroShare network. A word of warning: Do not automatically trust (or sign) anyonethat appears in this window. First verify by some other means (email/phone)that certificate belongs to the person you think it does.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use the "Neighbour List" window to expand your friend list. Select the desired entry in the lower window by clicking on it, then click the "Add to Friends" Button to move it to the upper window.Likewise the "Remove from Friends" button moved a person from the upper window to the lower window.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The "Configure Friend" Button opens a Certificate Configuration window.This window can be used to examine the certificate details, sign the certificate or manually change the peer's IP Address.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">See Also:<br /><a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Getting Started: Connecting to your friends</span></a>.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>.<br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONFIG"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Config Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Configuration Tab allows you to select the share directories, as well as the directory that downloaded files are saved to.<br />See <a href="#STARTUP-SHARING"><span style=" text-decoration: underline; color:#0000ff;">Sharing you Files</span></a> for details. </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Config Tab also allows you to control the IP Address and Portused by RetroShare. Under most cirumstances you do not need to changethese setting. If you are behind a firewall and can setup a forwarded port, the selected IP Address and Port should be specified here.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="FAQ"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Frequently Asked Questions </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">How does the security/privacy work? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShares uses a Web of Trust Authentication system to ensurethat your "friends" are your friends, and uses SSL to encryptthe communcications between peers. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What is a Web of Trust? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Web of Trust relies on a collection of peers to identify eachother. Look it up on the Web!</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-TRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What does "Trust" Mean in RetroShare?</span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Anyone can generate a certificate, with any name on it. So howdo you know that the certificate that claims to be from "Joe Bloggs"is really from your mate Joe. This is the "AuthenticationProblem". RetroShare uses a Web of Trust to Authenticate your peers.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-SIGN"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Should I Sign this Certificate? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should only sign a certificate if you are completely surethat it comes from the "right" person. If you sign a certificateyou are "Authenticating" the person to yourself and others.If you sign certificates that you haven't checked, then you aredestroying your own privacy and security.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">How do you verify a certificate? Use an alternative method ofcommunication to send the certificate: E.g. email or USB stick. This will improve you confidence that the certificate belongsto the correct person. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><span style=" font-size:small;"> </span><a name="FAQ-CONNECT"></a><span style=" font-size:small;">W</span><span style=" font-size:small;">hy won't it Connect?</span><span style=" font-size:small;"> </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A connection can fail for a number of reasons:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) Failed Authentication. Have both peers signed each otherscertificates? </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Firewalls. If both peers are behind firewalls then they cannotconnect directly. RetroShare has a built in proxy system to circumventfirewalls - However this can only function if both peers can connect to a common third party that is not behind a firewall. Thisis the most likely reason for initial connections to fail. The only solution to find a common friend that isn't firewalled (know anyone with Broadband?)</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(3) IP Addresses are wrong. You can manually examine and change these using the Certificate configuration.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +</body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="ABOUT"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">About RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShare is a private peer to peer communication platform created by Dr. Bob.This program enables you to securely share files and chat with your friends (and no-one else!).</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, and the latest release go to http://www.lunamutt.com.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="START"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Quick Start Guide to RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If this is your first time using Retroshare, it is recommended that you readthis guide for instructions on how to get started. The first step is:<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Connecting to Your Friends</span></a>. Once you have managed this you can <a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">Download Files</span></a> and<a href="#START-SHARE"><span style=" text-decoration: underline; color:#0000ff;">Share with Others</span></a></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Some of the key concepts related to ensuring your sharing remains private aredescribed in the <a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">Frequently Asked Questions</span></a>. Some Key security questions are:<a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">What is a Web of Trust?</span></a>, <a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">Should I Sign this Certificate?</span></a>, and finally<a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">What does "Trust" Mean?</span></a>.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is also worthwhile reading the <a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">GUI Overview</span></a>which describes the featureson available through the User Interface.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Connecting to your Friends </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">There are four steps to connecting to a Friend:</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Get Friend's Certificate</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Load Certificate</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Sign Certificate</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect to Friend.</li></ul><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The instructions might initially appear long and daunting, however thesesteps are required to ensure that your sharing is private and secure.These steps are only required a couple of times, to add new friends, and become quite straight forward after the first time.</p><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (1) EXCHANGE CERTIFICATES </span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Before you can connect, you need send your certificate to your friend, and get your friends certificate. Follow these steps to get your certificate:</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on Your Certificate to Select it.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on the "Export Friend" Button to bring up a file save dialog.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select directory to save the certificate to.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Enter desired filename. (with a file type of .pqi), and Click OK.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Email this File to your Friend. (It is recommended you put thecertificate in a zip file before sending, as some email programsdon't transmit the file correctly).</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Ask your friend to do the same.</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Once you have received your friend's certificate, removed itfrom the zip file and saved it to disk, you can proceed to step (2).</li></ul><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Note: This exchange of certificates is only necessary to get you started.Once you are connected to some friends the exchange of certificates becomeautomated by the autoDiscovery system. See<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">GUI: Connecting</span></a> for more information.------------------------------------------------------------------------<br /><br /><br /></p><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (2) LOAD YOUR FRIEND'S CERTIFICATE </span></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Import Friend"</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select your friends certificate file, then click "Okay". Their certificate should appear in the top window of the "Connect" Tab.</li></ul><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">------------------------------------------------------------------------<br /><br /><br /></p><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (3) SIGN CERTIFICATE </span></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select their Certificate by clicking on their name.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Configure Friend" Button. This will bring up a configuration window. which allows you to look at the detailsof the certificate.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click the "Sign Certificate" button near the bottom of the "Certificate Configuration" Window.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Now close the window by clicking on the "Done" button.</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Your Friends certificate should now say "Trusted (S)", indicating it is ready for connections.</li></ul><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can only share with "Trusted" Peers. You must sign your Friend'scertificate to prove that you know the certificate belongs to your Friend. Do not sign any/all certificates - only the people youtrust. For more information see: <br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br />------------------------------------------------------------------------<br /><br /> <br /></p><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (4) AUTOCONNECT TO PEER </span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Finally You need to activate the connection:</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click in the Box, next to your friends Name.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> A Tick should appear in the box, a connection will be started.</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> The "Offline" will change to "Online" when you have successfullyconnected.</li></ul><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Remember: Your initial connection attempts will fail, until your friend has signed your certificate and ticked the Auto-Connect Box.This ensures that both peers trust each other, and stops random peopleaccessing your files.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>. <br />------------------------------------------------------------------------<br /><br /><br /></p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-DOWNLOAD"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Downloading Files </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have connected to friends, you can download their shared files.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can search for the files you want using either:</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) File Listing Tab: This gives you a directory view of the files being shared by your peers. Double clickon the directory name (not the arrow) to diplay its subdirectories and files.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 1: This can take up to 5 seconds to fetch the information for your peer.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 2: If the directory is empty, or the person is offline, then the request will silently fail.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Search Tab: Retroshare also allows you to search your peers computers for filenames. Enter yourterm(s) in the search box at the top of the TAB and click the "Search" button. This willsearch all of the peers that you are currently connected to.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 3: If any matching files are found they will be displayed within 5 - 10 seconds.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have found the files you want, Select the file(s), and click "Download" to begin the download process.If you click over the "File Transfer" TAB, the status of the files will appear.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 4: The files can take up to 10 seconds to appear in the transfer window.</p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-SHARING"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Sharing Files </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can specify which files you want to share in the "Config" Tab.In the "Share Directories" section, click the "Add Directory" Button, and select the directory you want to share.The files and subdirectories will become available for you peers.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can remove a directory from the Shared Directories List by clicking onthe directory name in the list, and then clicking "Remove Directory".</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="GUI"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Gui Overview (Tab Description) </span><span style=" font-size:medium;"> </span></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The GUI is divided up into several sections which can be accessed by clicking on the Tabs along the top of the main window. </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect: Manage Connections and Friends.(<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">getting started</span></a> and<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Listing: A directory view of available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Search: Search for available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Messages: For Sending/Recving Message. (Coming Soon)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Channels: A broadcast/subscription system. (Coming Soon)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Transfer: Listing of Current and completed Transfers.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Config: Specify of share diectories and IP Addresses.(<a href="#GUI-CONFIG"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> About: Help and other Information.</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Chat: Accessed by the clicking on the "Chat" button.</li></ul><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Connect Tab </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Connect TAB consists of two windows. The upper windowshows a list of your friends. This window indicates each friendscurrent trust level, as well as their connection state.The "Trust_Lvl" Column indicates if the certificate has beenAuthenticated using the web of trust. You can only connect to "Trusted" certificates. Tick the "Auto_Connect" box to connect to your trusted friends.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The lower window provides a list of the friends of your friends.This window shows the neighbour's name and how long ago they attempted to connect to you. This window is automatically populatedby the autoDiscovery system, and should be used to expand yourretroShare network. A word of warning: Do not automatically trust (or sign) anyonethat appears in this window. First verify by some other means (email/phone)that certificate belongs to the person you think it does.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use the "Neighbour List" window to expand your friend list. Select the desired entry in the lower window by clicking on it, then click the "Add to Friends" Button to move it to the upper window.Likewise the "Remove from Friends" button moved a person from the upper window to the lower window.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The "Configure Friend" Button opens a Certificate Configuration window.This window can be used to examine the certificate details, sign the certificate or manually change the peer's IP Address.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">See Also:<br /><a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Getting Started: Connecting to your friends</span></a>.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>.<br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br /></p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONFIG"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Config Tab </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Configuration Tab allows you to select the share directories, as well as the directory that downloaded files are saved to.<br />See <a href="#STARTUP-SHARING"><span style=" text-decoration: underline; color:#0000ff;">Sharing you Files</span></a> for details. </p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Config Tab also allows you to control the IP Address and Portused by RetroShare. Under most cirumstances you do not need to changethese setting. If you are behind a firewall and can setup a forwarded port, the selected IP Address and Port should be specified here.</p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="FAQ"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Frequently Asked Questions </span><span style=" font-size:medium;"> </span></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">How does the security/privacy work? </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShares uses a Web of Trust Authentication system to ensurethat your "friends" are your friends, and uses SSL to encryptthe communcications between peers. </p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What is a Web of Trust? </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Web of Trust relies on a collection of peers to identify eachother. Look it up on the Web!</p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-TRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What does "Trust" Mean in RetroShare?</span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Anyone can generate a certificate, with any name on it. So howdo you know that the certificate that claims to be from "Joe Bloggs"is really from your mate Joe. This is the "AuthenticationProblem". RetroShare uses a Web of Trust to Authenticate your peers.</p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-SIGN"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Should I Sign this Certificate? </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should only sign a certificate if you are completely surethat it comes from the "right" person. If you sign a certificateyou are "Authenticating" the person to yourself and others.If you sign certificates that you haven't checked, then you aredestroying your own privacy and security.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">How do you verify a certificate? Use an alternative method ofcommunication to send the certificate: E.g. email or USB stick. This will improve you confidence that the certificate belongsto the correct person. </p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><span style=" font-size:small;"> </span><a name="FAQ-CONNECT"></a><span style=" font-size:small;">W</span><span style=" font-size:small;">hy won't it Connect?</span><span style=" font-size:small;"> </span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A connection can fail for a number of reasons:</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) Failed Authentication. Have both peers signed each otherscertificates? </p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Firewalls. If both peers are behind firewalls then they cannotconnect directly. RetroShare has a built in proxy system to circumventfirewalls - However this can only function if both peers can connect to a common third party that is not behind a firewall. Thisis the most likely reason for initial connections to fail. The only solution to find a common friend that isn't firewalled (know anyone with Broadband?)</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(3) IP Addresses are wrong. You can manually examine and change these using the Certificate configuration.</p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table></body></html> + + + + MainWindow + + + Preferences + Ï€Ïοτίμηση + + + + Network + δικτυωτό + + + + Friends + φιλική συζήτηση συν φίλος + + + + Transfers + έμβασμα + + + + Messages + μήνυμα + + + + Channels + κανάλι + + + + Options + δικαίωμα εκλογής + + + + Users: 0 Files: 0 + Users: 0 Files: 0 + + + + Down: 0.0 Up: 0.0 + Down: 0.0 Up: 0.0 + + + + Connections: 0/45 + Connections: 0/45 + + + + System tray is unavailable + System tray is unavailable + + + + System tray unavailable + System tray unavailable + + + + RetroShare System tray + Retroshare System tray + + + + Application will continue running. Quit using context menu in the system tray + Application will continue running. Quit using context menu in the system tray + + + + Hide + Hide + + + + Show + Show + + + + RetroShare + Retroshare + + + + Home + Home + + + + General + στÏατηγός + + + + Invite Friend + Ï€Ïοσκαλώ φίλος + + + + Add Friend + Ï€Ïοσθέτω φίλος + + + + Add Share + Ï€Ïοσθέτω μεÏίδα + + + + Advanced + Ï€ÏοχωÏημένος + + + + QTextBrowser { + background-color: rgb(192,192,192); + +} + QTextBrowser { background-color: rgb(192,192,192);} + + + + QPushButton +{ + border-image: url(:/images/console-small-up.png) +} + +QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + +} + +QPushButton:pressed { + border-image: url(:/images/console-small-down.png) +} + + QPushButton{ border-image: url(:/images/console-small-up.png) }QPushButton:hover { border-image: url(:/images/console-small-hover.png) }QPushButton:pressed { border-image: url(:/images/console-small-down.png) } + + + + Exit + έξοδος + + + + Search + εÏευνώ + + + + Files + λίμα + + + + Chat + ομάδα φιλική συζήτηση + + + + Add Shared Directory + Ï€Ïοσθέτω μεÏίδα διευθηντήÏιο + + + + About/Help + + + + + Messenger + + + + + Show/Hide + + + + + &Quit + + + + + Bandwidth Graph + + + + + Open Messenger + + + + + RetroShare %1 + + + + + Add a Friend + + + + + Invite a Friend + + + + + Add a Share + + + + + Quit + + + + + Minimize + + + + + Maximize + + + + + Hide Console + + + + + Show Console + + + + + Hide ToolBox + + + + + :images/hide_toolbox_frame.png + + + + + Show ToolBox + + + + + :images/show_toolbox_frame.png + + + + + QTextBrowser { + background-color: rgb(192,192,192); + + } + + + + + QPushButton + { + border-image: url(:/images/console-small-up.png) + } + + QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + + } + + QPushButton:pressed { + border-image: url(:/images/console-small-down.png) + } + + + + + + Apps + + + + + MessageToaster + + + message + μήνυμα + + + + MessagesDialog + + + New Message + καινοÏÏγιος μήνυμα + + + + Reply to Message + απαντώ εις μήνυμα + + + + Remove Message + μετακινώ μήνυμα + + + + Date + χÏονολογώ + + + + From + από + + + + Title + τίτλος εφημεÏίδας + + + + Msg + μήνυμα + + + + Count + κεφάλαιο κατηγοÏίας + + + + Size + μέγεθος + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Recommended Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">συνιστώ λίμα</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">remove selected message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">remove selected message</p></body></html> + + + + QPushButton +{ +border-image: url(:/images/deletemail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/deletemail-hover.png); +} + QPushButton{border-image: url(:/images/deletemail24.png);}QPushButton:pressed{border-image: url(:/images/deletemail-hover.png);} + + + + Inbox + Email-Inbox + + + + Outbox + Email-Outbox + + + + Draft + νομοσχέδιο + + + + Sent + Email-Sent + + + + Timestamp + Timestamp + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">reply to selected message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">reply to selected message</p></body></html> + + + + +QPushButton +{ +border-image: url(:/images/replymail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/replymail-hover.png); +} + + QPushButton{border-image: url(:/images/replymail24.png);}QPushButton:pressed{border-image: url(:/images/replymail-hover.png);} + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">New Message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">καινοÏÏγιος Email μήνυμα</p></body></html> + + + + QPushButton +{ +border-image: url(:/images/folder-draft24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/folder-draft24-hover.png); +} + + QPushButton{border-image: url(:/images/folder-draft24.png);}QPushButton:pressed {border-image: url(:/images/folder-draft24-hover.png);} + + + + You get Message testing + You get Message testing + + + + Download All + Download All + + + + QPushButton +{ +border-image: url(:/images/deletemail24.png); +} + +QPushButton:hover +{ +border-image: url(:/images/deletemail-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/deletemail-pressed.png); +} + + + + + +QPushButton +{ +border-image: url(:/images/replymail24.png); +} + +QPushButton:hover +{ +border-image: url(:/images/replymail24-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/replymail-pressed.png); +} + + + + + + QPushButton +{ +border-image: url(:/images/folder-draft24.png); +} +QPushButton:hover +{ +border-image: url(:/images/folder-draft24-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/folder-draft24-pressed.png); +} + + + + + + MessengerWindow + + + QWidget#MessengerWindow { +background-color: #ECF3F6; background-image:url(:/images/backgroundimage.png); +background-position: top right; +background-repeat: no-repeat +} + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click to change your avatar</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Change your Status and your display</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">picture here.</p></body></html> + + + + + Online + + + + + Busy + + + + + Be right Back + + + + + Away + + + + + In a Call + + + + + Out of lunch + + + + + Apear Offline + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Share a personal message with your contacts</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Add a Friend</p></body></html> + + + + + Chat + + + + + Connect To Friend + + + + + NetworkDialog + + + Peer Details / Authenticate + Peer Details / Authenticate + + + + Load Certificate + γεμίζω πτυχίο + + + + Select a pem/pqi File + Select a pem/pqi File + + + + File Not Found + File Not Found + + + + %1 does not exist. Would you like to create it? + %1 does not exist. Would you like to create it? + + + + Failed to Create File + Failed to Create File + + + + Unable to create %1 [%2] + Unable to create %1 [%2] + + + + Select Certificate + Select Certificate + + + + Certificates (*.pqi *.pem) + Certificates (*.pqi *.pem) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + + + + # + + + + + Accept + Accept + + + + Trust + εμπιστοσÏνη + + + + Last Contact + Last Contact + + + + Name + Name + + + + Peer Address + Peer Address + + + + Organisation + Organisation + + + + Location + Location + + + + Country + Country + + + + Cert Id + Cert Id + + + + Auth Code + αυθεντικότητα κÏυπτογÏάφημα: + + + + NetworkPage + + + Rate Options + Rate Options + + + + Max Total Data Rate (KB/S): + Your maximum upload speed (KB/S): + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Rate per Person (KB/S):</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Rate per Person (KB/S):</p></body></html> + + + + PeersDialog + + + Chat + φιλική συζήτηση + + + + Configure Friend + Configure φίλος + + + + Export Friend + Export φίλος + + + + Remove Friend + Remove φίλος + + + + Save Certificate + Save Certificate + + + + Certificates (*.pqi) + Certificates (*.pqi) + + + + Status + Status + + + + Person + Person + + + + Auto Connect + Auto Connect + + + + Trust Level + Trust Level + + + + Peer Address + Peer Address + + + + Last Contact + Last Contact + + + + Organisation + Organisation + + + + Location + Location + + + + Country + Country + + + + Person Id + Person ID + + + + Auth Code + αυθεντικότητα κÏυπτογÏάφημα + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Friends</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Friends</span></p></body></html> + + + + Connect To Friend + Connect To φίλος + + + + # + + + + + PopupChatDialog + + + RetroShare Friend Chat + Retroshare φίλος φιλική συζήτηση + + + + RetroShare User Chat + + + + + PreferencesDialog + + + Language + Language + + + + Style + Style + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + + + + Style Sheet + Style Sheet + + + + Default + Default + + + + Pagefold + Pagefold + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose RetroShare's interface style</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose RetroShare's interface style</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose the language used in RetroShare</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose the language used in RetroShare</p></body></html> + + + + blue + blue + + + + silver + silver + + + + ed2k + ed2k + + + + over + over + + + + black + black + + + + arachnophobia + arachnophobia + + + + Skin2 + Skin2 + + + + Login + Login + + + + Remove Auto Login + Remove Auto Login + + + + PreferencesWindow + + + Directories + Directories + + + + Error Saving Configuration + Error Saving Configuration + + + + About + About + + + + General + About + + + + Server + Peer Settings + + + + Options + Options + + + + Cancel + Cancel + + + + OK + OK + + + + QObject + + + Name + Name + + + + Path + + + + + Extension + + + + + Date + + + + + Size + + + + + Popularity + + + + + contains + + + + + contains all + + + + + is + + + + + less than + + + + + less than or equal + + + + + greater than or equal + + + + + greater than + + + + + is in range + + + + + and + + + + + and / or + + + + + or + + + + + equals + + + + + Rshare + + + Invalid language code specified: + Invalid language code specified: + + + + Invalid GUI style specified: + Invalid GUI style specified: + + + + SearchDialog + + + File Name + File Name + + + + Sources + Sources + + + + Search Pattern + Search Pattern + + + + Results + Results + + + + File Size + File Size + + + + Download + Download + + + + Broadcast on Channel + Broadcast on Channel + + + + Recommend to Friends + Recommend to Friends + + + + Remove + Remove + + + + Remove All + Remove All + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Keywords</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Keywords</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Format</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Format</p></body></html> + + + + Any + Any + + + + Audio + Audio + + + + Video + Video + + + + Images + Images + + + + Programs + Programs + + + + Archives + Archives + + + + Documents + Documents + + + + search + εÏευνώ + + + + download + download + + + + Toggle advanced searching on and off. + + + + + <h3>Simple Search:</h3> + + + + + Keywords + + + + + Perform simple search + + + + + Show Advanced Search Tool + + + + + Filename + + + + + Hash + + + + + KeyWords + + + + + Search Id + + + + + <h3>Advanced Search:</h3> + + + + + ServerDialog + + + Transfer Rates + Transfer Rates + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Total Rate (kb/s) </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Your Upload Speed (kb/s) </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Per Person </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Per Person </p></body></html> + + + + Server Settings + Peer Settings + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + + + + Port: + Port: + + + + behind zee Firewall + Behind a Firewall + + + + Forwarded External Port + Forwarded External Port (Router) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + + + + Check Settings + Check Settings + + + + Firewall/Router Configuration + + + + + Manual router setup. + + + + + Use uPnP to configure router + + + + + Network Address Configuration (takes effect after restart) + + + + + Use DHT to locate friends + + + + + Manual IP Addresses + + + + + Server Status And Network Settings + + + + + Firewalled + + + + + Forwarded Port + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">DHT Status</p></body></html> + + + + + uPnP Status + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Local Address:</p></body></html> + + + + + ServerPage + + + Change + Restart Server + Change + Restart + + + + Server Settings + Peer Settings + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Adress:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + + + + Port: + Port: + + + + Misc + Misc + + + + behinde Firewall + Behind a Firewall + + + + Forwarded External Port + Forwarded External Port (Router) + + + + Settings + + + Settings + Settings + + + + Cancel + Cancel + + + + Apply + Apply + + + + OK + OK + + + + General + General + + + + Network + Network + + + + Server + Peer Settings + + + + Directories + Directories + + + + SharedFilesDialog + + + Download + Download + + + + Recommend + Recommend + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Files</span></p></body></html> + + + + Add to Recommend List + + + + + Recommend To + + + + + Message Friend + + + + + StartDialog + + + Select Trusted Friend + εκλεκτός έμπιστος φίλος + + + + Certificates (*.pqi *.pem) + Certificates (*.pqi *.pem) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:13pt; font-weight:600; color:#8b0000;">Welcome to RetroShare</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:13pt; font-weight:600; color:#8b0000;">καλωσόÏισμα εις Retroshare</span></p></body></html> + + + + Please Login .... + Please Login .... + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Pasword</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Pasword</span></p></body></html> + + + + Load Existing User + Load Existing User + + + + Or create a New User + Or create a New User + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Organisation:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Organisation:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Location:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Location:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Password (Again)</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Password (Again)</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">New Password</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">New Password</span></p></body></html> + + + + Load Trusted Certificate (Optional) + Load Trusted Certificate (Optional) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + + + + Select File + Select File + + + + Generate New Certificate + Generate New Certificate + + + + RetroShare setup + Retroshare setup + + + + Automatically Login in Future + Automatically Login in Future + + + + RetroShare + + + + + QWidget { + background-color: #ECF3F6; +} + + + + + Auto-login + + + + + Name: + + + + + Log In + + + + + Password: + + + + + Create a Account + + + + + QToolButton{ +border-image: url(:/images/avatar_background.png); + +} + + + + + + StatisticDialog + + + Statistics + Statistics + + + + Download + Download + + + + Session: + Session: + + + + Downloaded: + Downloaded: + + + + Average Downloadspeed: + Average Downloadspeed: + + + + Count of Downloads: + Count of Downloads: + + + + Overall + Overall + + + + Upload + Upload + + + + Session + Session + + + + Uploaded: + Uploaded: + + + + Average Uploadspeed: + Average Uploadspeed: + + + + Count of Uploads: + Count of Uploads: + + + + Uploaded + Uploaded + + + + Connections: + Connections: + + + + Peers: + Peers: + + + + Misc + Misc + + + + Uptime: + Uptime: + + + + Overall: + Overall: + + + + Uptime + Uptime + + + + Records + Records + + + + Uploadspeed: + Uploadspeed: + + + + Downloadspeed: + Downloadspeed: + + + + Show Settings + Show Settings + + + + Reset + Reset + + + + Receive Rate + Receive Rate + + + + Send Rate + Send Rate + + + + Always On Top + Always On Top + + + + 100 + 100 + + + + % Opaque + % Opaque + + + + Changes the transparency of the Bandwidth Graph + Changes the transparency of the Bandwidth Graph + + + + Save + Save + + + + Cancel + Cancel + + + + Hide Settings + Hide Settings + + + + TransfersDialog + + + Cancel + Cancel + + + + Clear Completed + Clear Completed + + + + File Name + File Name + + + + Sources + Sources + + + + Status + Status + + + + File Size + File Size + + + + Speed + Speed + + + + Progress + Progress + + + + Completed + Completed + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Downloads:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Downloads:</span></p></body></html> + + + + Peer Name + Peer Name + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Uploads:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Uploads:</span></p></body></html> + + + + Name + i.e: file name + Name + + + + Size + i.e: file size + + + + + Progress + i.e: % downloaded + Progress + + + + Speed + i.e: Download speed + Speed + + + + Sources + i.e: Sources + Sources + + + + Remaining + i.e: Estimated Time of Arrival / Time left + + + + + Core-ID + + + + + User Name + i.e: user name + + + + + Progress + i.e: % uploaded + Progress + + + + Speed + i.e: upload speed + Speed + + + + Transferred + + + + + ULListDelegate + + + B + + + + + KB + + + + + MB + + + + + GB + + + + + VMessageBox + + + OK + OK + + + + Cancel + Cancel + + + + Yes + Yes + + + + No + No + + + + Help + Help + + + + Retry + Retry + + + + Show Log + Show Log + + + + Show Settings + Show Settings + + + + moreinfo + + + Details + Details + + + + OK + OK + + + + Name + Name + + + + Value + Value + + + diff --git a/retroshare-gui/src/lang/retroshare_it.qm b/retroshare-gui/src/lang/retroshare_it.qm new file mode 100644 index 000000000..4c790ffc1 Binary files /dev/null and b/retroshare-gui/src/lang/retroshare_it.qm differ diff --git a/retroshare-gui/src/lang/retroshare_it.ts b/retroshare-gui/src/lang/retroshare_it.ts new file mode 100644 index 000000000..51082a08f --- /dev/null +++ b/retroshare-gui/src/lang/retroshare_it.ts @@ -0,0 +1,3974 @@ + + + + + + + Arial + Arial + + + + AddFriendDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;"> To add a new Friend, cut and paste their email </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">invitation into the box below, and click done.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Per aggiungere un nuovi amico, taglio e colla il loro invito del email</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">nella scatola qui sotto e scatto fatto.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;"></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + Cancel + Annullamento + + + + Done + Fatto + + + + Load From File + Carico dalla lima + + + + RetroShare + Retroshare + + + + Certificate Load Failed + Il carico del certificato è venuto a mancare + + + + Add a Friend + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"><span style=" font-size:16pt;">Add a new Friend</span><br /><br /><span style=" font-size:10pt;">To add a new Friend, cut and paste their email </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">invitation into the box below, and click done.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + + + + + AddFriendWizard + + + < Back + + + + + Next > + + + + + Cancel + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">This Wizard helps to Connect to your Friends</span></p></body></html> + + + + + I have a .pqi/.pem file received from a Friend + + + + + I have Key received from a Friend + + + + + I want to invite a friend to my RetroShare network + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Cut and paste the text below into an email.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;"> and send it to all your friends!</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">When you press next RetroShare will attempt to launch a Email client.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Invite your Friends to join with RetroShare</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Enter the Key code you got from your friend:</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">When you press next RetroShare will attempt to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">connect using the key.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Select a pqi/pem file:</span></p></body></html> + + + + + Browse + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">When you press next RetroShare will attempt to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">connect using the .pqi/.pem file.</p></body></html> + + + + + Add Friend to my netowork Wizard + + + + + AdvancedSearchDialog + + + RetrosShare: Advanced Search + + + + + Add a further search criterion. + + + + + Add a selection criterion + + + + + Reset + + + + + Cancels the search. + + + + + Cancel + + + + + Perform the advanced search. + + + + + Search + + + + + Search Criteria + + + + + Reset the search criteria. + + + + + ApplicationWindow + + + RetroShare %1 + + + + + Example Application + + + + + Application Users: 0 Files: 0 + + + + + Down: 0.0 Up: 0.0 + + + + + Connections: 0/45 + + + + + Hide + + + + + Show + + + + + RetroShare + + + + + Home + + + + + General + Generalità + + + + Advanced + + + + + QTextBrowser { + background-color: rgb(192,192,192); + + } + + + + + QPushButton + { + border-image: url(:/images/console-small-up.png) + } + + QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + + } + + QPushButton:pressed { + border-image: url(:/images/console-small-down.png) + } + + + + + + AuthorizationDialog + + + Authenticate + Autenticare + + + + Authenticate Friend By Entering Their Code + Autenticare l'amico impostando il codice + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + + + + OK + OK + + + + Cancel + Annullamento + + + + BandwidthGraph + + + RetroShare Bandwidth Usage + + + + + Show Settings + + + + + Reset + + + + + Receive Rate + + + + + Send Rate + + + + + Always on Top + + + + + Style + + + + + Changes the transparency of the Bandwidth Graph + + + + + 100 + + + + + % Opaque + + + + + Save + + + + + Cancel + + + + + Since: + + + + + Hide Settings + + + + + CallToaster + + + Message + + + + + ChanCreateDialog + + + Create a new Broadcast Channel + Generare una nuova Manica di radiodiffusione + + + + Create A New Broadcast Channel + Generare una nuova Manica di radiodiffusione + + + + Channel Name: + Nome della Manica: + + + + Type: + Tipo: + + + + Public Channel (Signed) + Manica pubblica (firmata) + + + + Private Channel (Encrypted) + Manica riservata (cifrata) + + + + Cancel Channel + Annullare la Manica + + + + Create Channel + Generare la Manica + + + + ChanMsgDialog + + + Compose + Comporre + + + + Recommended Files + Lime suggerite + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-weight:400;"><span style=" font-weight:600;">Subject:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-weight:400;"><span style=" font-weight:600;">Titolo:</span></p></body></html> + + + + Send To: + Trasmettere a: + + + + Send + Trasmettere + + + + Delete Channel + Manica di cancellazione + + + + Create Channel MSG + Generare il messaggio della Manica + + + + 1 + + + + + Reply + + + + + ChannelsDialog + + + New Message + Nuovo messaggio + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Messages</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Messaggi</span></p></body></html> + + + + Date + Data + + + + Rank + Rank + + + + From + Da + + + + Title + Titolo + + + + Msg + Messaggio + + + + Count + Conteggio + + + + Size + Formato + + + + Type + Tipo + + + + Rs[Cert/Chan]IdSize + Rs[Cert/Chan]IdSize + + + + RsMsgId + RsMsgId + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Message Text</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Testo del messaggio</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Recommended Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Lime suggerite</span></p></body></html> + + + + New Channel + Nuova Manica + + + + Subscribe To Channel + Abbonar alla Manica + + + + Unsubscribe To Channel + Unsubscribe alla Manica + + + + Delete Your Channel + Cancellare la vostra Manica + + + + Download + Trasferimento dal sistema centrale verso i satelliti + + + + Download All + Trasferire tutti dal sistema centrale verso i satelliti + + + + ChatDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:9pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:400;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:9pt; font-weight:600; font-style:normal; text-decoration:none;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:400;"></p></body></html> + + + + Chat History: + Storia di chiacchierata: + + + + Chat With: + Chiacchierata con: + + + + Chat + Chiacchierata + + + + Users: + + + + + ChatToaster + + + message + messaggio + + + + You Get a New Message + Ottenete un nuovo messaggio + + + + Message + + + + + ConfCertDialog + + + Cancel + Annullamento + + + + Done + Fatto + + + + Apply + Applicar + + + + Peer Settings + Regolazioni del pari + + + + Port: + Orificio: + + + + behind zee Firewall + Dietro una parete refrattaria + + + + Forwarded External Port + Orificio esterno spedito (Router) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Indirizzo esterno:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Esterno di Nome</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Adress locale:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Max Transfer Rate (kb/s) </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">La vostra velocità massima di upload (KB/S) </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Org / Loc:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Organizzazione/Posizione:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Nome:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Country/State:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Il paese/dichiara:</p></body></html> + + + + Trust Settings + Regolazioni di fiducia + + + + Trust Level + Livello di fiducia + + + + Trust Their Signature + Fidar della firma + + + + Sign The Certificate + Firmare il certificato + + + + OK + + + + + Peer Adress + + + + + Peer Info + + + + + ConfirmQuitDialog + + + Exit RetroShare + + + + + You are about to exit the RetroShare application and therefore stop all transfers. <br><br>Are you sure you want to stop and exit RetroShare? + + + + + Do not show this message again. + + + + + ConnectDialog + + + Peer Details + Particolari del pari + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Paese:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Org:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Organizzazione:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Nome:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Trust:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Fiducia:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Loc:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Posizione:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Certificate</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">signers:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Certificato</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">signers:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">CODICE di AUTenticazione </span></p></body></html> + + + + Make Friend + Fare l'amico + + + + Close + Fine + + + + ConnectionsDialog + + + Load Certificate + Certificato del carico + + + + Select a pem/pqi File + Selezionare una lima PEM/PQI + + + + File Not Found + Lima non trovata + + + + %1 does not exist. Would you like to create it? + %1 non esistono. gradite generarli? + + + + Failed to Create File + Non è riuscito a generare la lima. + + + + Unable to create %1 [%2] + Incapace generare %1 [%2] + + + + Select Certificate + Selezionare il certificato + + + + Certificates (*.pqi *.pem) + Certificato (*.pqi *.pem) + + + + Accept + Accettare + + + + Trust + Fiducia + + + + Last Contact + Ultimo contatto + + + + Name + Nome + + + + Organisation + Organizzazione + + + + Location + Posizione + + + + Country + Paese + + + + Peer Address + Indirizzo del pari + + + + Cert Id + ID di cert + + + + Auth Code + Codice di aut + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Rete:</span></p></body></html> + + + + Peer Details / Authenticate + I particolari del Peer/autenticano + + + + CryptographyDialog + + + RSA Key Size + RSA Key Size + + + + Rijndael Block size + Rijndael Block size + + + + 128 Bits + 128 Bits + + + + 192 Bits + 192 Bits + + + + 256 Bits + 256 Bits + + + + Rijndael Key Size + Rijndael Key Size + + + + Rijndael Mode + Rijndael Mode + + + + CBC + CBC + + + + ECB + ECB + + + + CFB + CFB + + + + Rijndael Padding + Rijndael Padding + + + + PKCS7 + PKCS7 + + + + Zeros + Zeros + + + + ANSIX923 + ANSIX923 + + + + ISO10126 + ISO10126 + + + + Rijndael Feedback Size + Rijndael Feedback Size + + + + Key Size: + Formato chiave: + + + + Block Size: + Formato di blocco: + + + + Feedback Size: + Formato di risposte: + + + + Mode: + Modo: + + + + Padding: + Padding: + + + + DLListDelegate + + + B + + + + + KB + + + + + MB + + + + + GB + + + + + DirectoriesDialog + + + Shared Directories + Indici comuni + + + + Other Directories + Altri indici + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Incoming Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Lime ricevute</span></p></body></html> + + + + Add Shared Directory + Aggiungere l'indice comune + + + + DirectoriesPage + + + Shared Directories + Indici comuni + + + + Incoming files + Lime ricevute + + + + ExampleDialog + + + Vote Up + + + + + Vote Down + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Friends</span></p></body></html> + + + + + # + + + + + Status + + + + + Person + + + + + Auto Connect + + + + + Trust Level + + + + + Peer Address + Indirizzo del pari + + + + Last Contact + Ultimo contatto + + + + Organisation + Organizzazione + + + + Location + Posizione + + + + Country + Paese + + + + Person Id + + + + + Auth Code + Codice di aut + + + + ExprParamElement + + + to + + + + + ignore case + + + + + dd.MM.yyyy + + + + + KB + + + + + MB + + + + + GB + + + + + ExpressionWidget + + + Expression Widget + + + + + Delete this expression + + + + + FileHashDialog + + + Download + Download Trasferimento + + + + GSettingsWin + + + General + Generalità + + + + Network + Rete + + + + Directories + Indici + + + + Server + Peer Regolazioni + + + + %1 + %1 + + + + GenCertDialog + + + RetroShare setup + Messa a punto di Retroshare + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16pt;">Generate a new profile</span><br /><br />Please fill in the information which will<br />allow your RetroShare to connect to</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Friends.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Organisation:</p></body></html> + + + + + Password (Again) + + + + + Location: + + + + + Load Trusted Certificate (Optional) + Il carico si è fidato del certificato (facoltativo) + + + + Password + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Amico</span></p></body></html> + + + + Select File + Selezionare la lima + + + + Country: + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + + + + + Generate New Certificate + Generare il nuovo certificato + + + + Select Trusted Friend + Selezionare l'amico di fiducia + + + + Certificates (*.pqi *.pem) + Certificati (*.pqi *.pem) + + + + GeneralPage + + + Keys manager + Chiude a chiave il responsabile + + + + Style + Stile + + + + Choose RetroShare's interface style + Scegliere lo stile dell'interfaccia del Retroshare + + + + Language + Lingua + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">I cambiamenti alla lingua entreranno in vigore soltanto dopo il nuovo inizio del Retroshare!</p></body></html> + + + + Choose the language used in RetroShare + Scegliere la lingua usata in Retroshare + + + + GraphFrame + + + Recv: + Recv: + + + + %1 KB/s + %1 KB/s + + + + Sent: + Sent: + + + + %1 KB + %1 KB + + + + %1 MB + %1 MB + + + + %1 GB + %1 GB + + + + HelpDialog + + + About + + + + + Authors + + + + + Thanks to + + + + + Translation + + + + + License Agreement + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">About/Help</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:xx-large; font-weight:600; color:#0000ff;">About RetroShare.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-weight:600;">Retroshare is a private and secure decentralised commmunication platform.<br />You can use it chat, send messages and share files with your friends.</span><br /><br />This is just a placeholder page for the moment. You can<br />improve retroshare's in-built help (this text) by<br />updating the retroshare wiki: <a href="http://retroshare.wiki.sourceforge.net/help_tab"><span style=" text-decoration: underline; color:#0000ff;">This Page in the retroshare Wiki</span></a><br /><br />The About/Help Tab is regularly updated from the Wiki page.<br /><br />External Links to more information:<br /></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.sourceforge.net"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Webpage</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.wiki.sourceforge.net/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Wiki</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://sourceforge.net/projects/retroshare/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Project Page</span></a></li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.lunamutt.com"><span style=" text-decoration: underline; color:#0000ff;">Lunamutt Homepage.</span></a></li></ul></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-size:19pt; font-weight:600; color:#0000ff;">The RetroShare Team:</span><br /> <br /><span style=" font-size:9pt; color:#0000ff;">defnax</span>: Lead GUI developer <br /><span style=" font-size:9pt; color:#0000ff;">drbob7</span>: Lead Core developer. <br /> <br /><span style=" font-size:9pt; color:#0000ff;">bmeck</span> : Our new web-developer. Joined retroshare a couple <br />of weeks ago, and already starting on an exciting new <br />design for the web-page. <br /> <br /><span style=" font-size:9pt; color:#0000ff;">noragen</span> : Developer from the SIM-IM project. Working on a retroshare plugin to SIM-IM. <br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">kernelpanix</span> : Gui and skin developer</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">libris</span><span style=" font-size:9pt;">:</span> core developer</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-size:9pt; color:#0000ff;">kashif: </span><span style=" color:#000000;">core developer</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt; color:#000000;"><span style=" font-size:8pt;"><br /></span><span style=" color:#0000ff;">agent725</span><span style=" font-size:8pt;">: Manages the 'local' Retroshare release, <br />and beta-testing retroshare on a large scale. <br /> <br /></span><span style=" color:#0000ff;">the_mgt</span><span style=" font-size:8pt;">: Maintains the Gentoo and generic linux <br />installation/compilation scripts. </span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">notdefine:</span> Maintains the .rpm, .deb installation/compilation scripts.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">zhouk</span>: developer</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Translators:</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Serbian</span>: Kunalagon Umuhanik &lt;kunalagon@gmail.com&gt;</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Polish: </span>Jarek</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">French</span>:Temet</p></body></html> + + + + + InviteDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">To </span><span style=" font-size:10pt; font-weight:600;">Invite your friends to join you with Retroshare: </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">Cut and paste the text below into an email.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">and send it to all your friends!</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Per </span><span style=" font-size:10pt; font-weight:600;">invitare i vostri amici ad unirli con Retroshare: </span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">Taglio e colla il testo qui sotto in un email.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">E trasmetterlo a tutti gli vostri amici!</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + Done + Fatto + + + + Cancel + Annullamento + + + + Launch Email + Email convenzionale del lancio + + + + Invite a Friend + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"><span style=" font-size:16pt;">Invite a Friend</span><br /><br /><span style=" font-size:10pt;">To Invite your friends to join you with Retroshare: </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">Cut and paste the text below into an email.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">and send it to all your friends!</p></body></html> + + + + + LogDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> + +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="ABOUT"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">About RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShare is a private peer to peer communication platform created by Dr. Bob.This program enables you to securely share files and chat with your friends (and no-one else!).</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, and the latest release go to http://www.lunamutt.com.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="START"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Quick Start Guide to RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If this is your first time using Retroshare, it is recommended that you readthis guide for instructions on how to get started. The first step is:<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Connecting to Your Friends</span></a>. Once you have managed this you can <a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">Download Files</span></a> and<a href="#START-SHARE"><span style=" text-decoration: underline; color:#0000ff;">Share with Others</span></a></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Some of the key concepts related to ensuring your sharing remains private aredescribed in the <a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">Frequently Asked Questions</span></a>. Some Key security questions are:<a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">What is a Web of Trust?</span></a>, <a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">Should I Sign this Certificate?</span></a>, and finally<a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">What does "Trust" Mean?</span></a>.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is also worthwhile reading the <a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">GUI Overview</span></a>which describes the featureson available through the User Interface.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Connecting to your Friends </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">There are four steps to connecting to a Friend:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Get Friend's Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Load Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Sign Certificate</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect to Friend.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The instructions might initially appear long and daunting, however thesesteps are required to ensure that your sharing is private and secure.These steps are only required a couple of times, to add new friends, and become quite straight forward after the first time.</p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (1) EXCHANGE CERTIFICATES </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Before you can connect, you need send your certificate to your friend, and get your friends certificate. Follow these steps to get your certificate:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on Your Certificate to Select it.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on the "Export Friend" Button to bring up a file save dialog.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select directory to save the certificate to.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Enter desired filename. (with a file type of .pqi), and Click OK.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Email this File to your Friend. (It is recommended you put thecertificate in a zip file before sending, as some email programsdon't transmit the file correctly).</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Ask your friend to do the same.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Once you have received your friend's certificate, removed itfrom the zip file and saved it to disk, you can proceed to step (2).</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Note: This exchange of certificates is only necessary to get you started.Once you are connected to some friends the exchange of certificates becomeautomated by the autoDiscovery system. See<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">GUI: Connecting</span></a> for more information.------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (2) LOAD YOUR FRIEND'S CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Import Friend"</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select your friends certificate file, then click "Okay". Their certificate should appear in the top window of the "Connect" Tab.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (3) SIGN CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select their Certificate by clicking on their name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Configure Friend" Button. This will bring up a configuration window. which allows you to look at the detailsof the certificate.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click the "Sign Certificate" button near the bottom of the "Certificate Configuration" Window.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Now close the window by clicking on the "Done" button.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Your Friends certificate should now say "Trusted (S)", indicating it is ready for connections.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can only share with "Trusted" Peers. You must sign your Friend'scertificate to prove that you know the certificate belongs to your Friend. Do not sign any/all certificates - only the people youtrust. For more information see: <br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br />------------------------------------------------------------------------<br /><br /> <br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (4) AUTOCONNECT TO PEER </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Finally You need to activate the connection:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click in the Box, next to your friends Name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> A Tick should appear in the box, a connection will be started.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> The "Offline" will change to "Online" when you have successfullyconnected.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Remember: Your initial connection attempts will fail, until your friend has signed your certificate and ticked the Auto-Connect Box.This ensures that both peers trust each other, and stops random peopleaccessing your files.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>. <br />------------------------------------------------------------------------<br /><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-DOWNLOAD"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Downloading Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have connected to friends, you can download their shared files.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can search for the files you want using either:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) File Listing Tab: This gives you a directory view of the files being shared by your peers. Double clickon the directory name (not the arrow) to diplay its subdirectories and files.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 1: This can take up to 5 seconds to fetch the information for your peer.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 2: If the directory is empty, or the person is offline, then the request will silently fail.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Search Tab: Retroshare also allows you to search your peers computers for filenames. Enter yourterm(s) in the search box at the top of the TAB and click the "Search" button. This willsearch all of the peers that you are currently connected to.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 3: If any matching files are found they will be displayed within 5 - 10 seconds.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have found the files you want, Select the file(s), and click "Download" to begin the download process.If you click over the "File Transfer" TAB, the status of the files will appear.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 4: The files can take up to 10 seconds to appear in the transfer window.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-SHARING"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Sharing Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can specify which files you want to share in the "Config" Tab.In the "Share Directories" section, click the "Add Directory" Button, and select the directory you want to share.The files and subdirectories will become available for you peers.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can remove a directory from the Shared Directories List by clicking onthe directory name in the list, and then clicking "Remove Directory".</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="GUI"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Gui Overview (Tab Description) </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The GUI is divided up into several sections which can be accessed by clicking on the Tabs along the top of the main window. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect: Manage Connections and Friends.(<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">getting started</span></a> and<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Listing: A directory view of available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Search: Search for available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Messages: For Sending/Recving Message. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Channels: A broadcast/subscription system. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Transfer: Listing of Current and completed Transfers.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Config: Specify of share diectories and IP Addresses.(<a href="#GUI-CONFIG"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> About: Help and other Information.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Chat: Accessed by the clicking on the "Chat" button.</li></ul> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Connect Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Connect TAB consists of two windows. The upper windowshows a list of your friends. This window indicates each friendscurrent trust level, as well as their connection state.The "Trust_Lvl" Column indicates if the certificate has beenAuthenticated using the web of trust. You can only connect to "Trusted" certificates. Tick the "Auto_Connect" box to connect to your trusted friends.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The lower window provides a list of the friends of your friends.This window shows the neighbour's name and how long ago they attempted to connect to you. This window is automatically populatedby the autoDiscovery system, and should be used to expand yourretroShare network. A word of warning: Do not automatically trust (or sign) anyonethat appears in this window. First verify by some other means (email/phone)that certificate belongs to the person you think it does.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use the "Neighbour List" window to expand your friend list. Select the desired entry in the lower window by clicking on it, then click the "Add to Friends" Button to move it to the upper window.Likewise the "Remove from Friends" button moved a person from the upper window to the lower window.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The "Configure Friend" Button opens a Certificate Configuration window.This window can be used to examine the certificate details, sign the certificate or manually change the peer's IP Address.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">See Also:<br /><a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Getting Started: Connecting to your friends</span></a>.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>.<br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONFIG"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Config Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Configuration Tab allows you to select the share directories, as well as the directory that downloaded files are saved to.<br />See <a href="#STARTUP-SHARING"><span style=" text-decoration: underline; color:#0000ff;">Sharing you Files</span></a> for details. </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Config Tab also allows you to control the IP Address and Portused by RetroShare. Under most cirumstances you do not need to changethese setting. If you are behind a firewall and can setup a forwarded port, the selected IP Address and Port should be specified here.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="FAQ"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Frequently Asked Questions </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">How does the security/privacy work? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShares uses a Web of Trust Authentication system to ensurethat your "friends" are your friends, and uses SSL to encryptthe communcications between peers. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What is a Web of Trust? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Web of Trust relies on a collection of peers to identify eachother. Look it up on the Web!</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-TRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What does "Trust" Mean in RetroShare?</span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Anyone can generate a certificate, with any name on it. So howdo you know that the certificate that claims to be from "Joe Bloggs"is really from your mate Joe. This is the "AuthenticationProblem". RetroShare uses a Web of Trust to Authenticate your peers.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-SIGN"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Should I Sign this Certificate? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should only sign a certificate if you are completely surethat it comes from the "right" person. If you sign a certificateyou are "Authenticating" the person to yourself and others.If you sign certificates that you haven't checked, then you aredestroying your own privacy and security.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">How do you verify a certificate? Use an alternative method ofcommunication to send the certificate: E.g. email or USB stick. This will improve you confidence that the certificate belongsto the correct person. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><span style=" font-size:small;"> </span><a name="FAQ-CONNECT"></a><span style=" font-size:small;">W</span><span style=" font-size:small;">hy won't it Connect?</span><span style=" font-size:small;"> </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A connection can fail for a number of reasons:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) Failed Authentication. Have both peers signed each otherscertificates? </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Firewalls. If both peers are behind firewalls then they cannotconnect directly. RetroShare has a built in proxy system to circumventfirewalls - However this can only function if both peers can connect to a common third party that is not behind a firewall. Thisis the most likely reason for initial connections to fail. The only solution to find a common friend that isn't firewalled (know anyone with Broadband?)</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(3) IP Addresses are wrong. You can manually examine and change these using the Certificate configuration.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +</body></html> + + + + + MainWindow + + + Preferences + Preferenze + + + + Network + Regolazioni della rete + + + + Friends + Messaggio un amico + + + + Transfers + Trasferimenti + + + + Messages + Email + + + + Channels + Scanalature + + + + Options + Opzioni + + + + Users: 0 Files: 0 + Utenti: 0 Lime: 0 + + + + Down: 0.0 Up: 0.0 + Down: 0.0 Up: 0.0 + + + + Connections: 0/45 + Collegamenti: 10/45 + + + + System tray is unavailable + Il vassoio del sistema è non disponibile + + + + System tray unavailable + Il vassoio del sistema è non disponibile + + + + RetroShare System tray + Vassoio del sistema di Retroshare + + + + Application will continue running. Quit using context menu in the system tray + L'applicazione continuerà a funzionare. Menu usando rinunciato di contesto nel vassoio del sistema. + + + + Hide + Pellame + + + + Show + Esposizione + + + + RetroShare + Retroshare + + + + Home + Domestico + + + + General + Generalità + + + + Invite Friend + Invitare l'amico + + + + Add Friend + Aggiungere l'amico + + + + Add Share + Aggiungere la parte + + + + Advanced + Avanzato + + + + QTextBrowser { + background-color: rgb(192,192,192); + +} + QTextBrowser { background-color: rgb(192,192,192);} + + + + QPushButton +{ + border-image: url(:/images/console-small-up.png) +} + +QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + +} + +QPushButton:pressed { + border-image: url(:/images/console-small-down.png) +} + + QPushButton{ border-image: url(:/images/console-small-up.png) }QPushButton:hover { border-image: url(:/images/console-small-hover.png) }QPushButton:pressed { border-image: url(:/images/console-small-down.png) } + + + + Exit + Uscita + + + + Search + Ricerca + + + + Files + Lime + + + + Chat + Chiacchierata del gruppo + + + + Add Shared Directory + Aggiungere l'indice comune + + + + About/Help + + + + + Messenger + + + + + Show/Hide + + + + + &Quit + + + + + Bandwidth Graph + + + + + Open Messenger + + + + + RetroShare %1 + + + + + Add a Friend + + + + + Invite a Friend + + + + + Add a Share + + + + + Quit + + + + + Minimize + + + + + Maximize + + + + + Hide Console + + + + + Show Console + + + + + Hide ToolBox + + + + + :images/hide_toolbox_frame.png + + + + + Show ToolBox + + + + + :images/show_toolbox_frame.png + + + + + QTextBrowser { + background-color: rgb(192,192,192); + + } + + + + + QPushButton + { + border-image: url(:/images/console-small-up.png) + } + + QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + + } + + QPushButton:pressed { + border-image: url(:/images/console-small-down.png) + } + + + + + + Apps + + + + + MessageToaster + + + message + messaggio + + + + MessagesDialog + + + New Message + Nuovo messaggio + + + + Reply to Message + Risposta al messaggio + + + + Remove Message + Rimuovere il messaggio + + + + Date + Data + + + + From + Da + + + + Title + Titolo + + + + Msg + Messaggio + + + + Count + Conteggio + + + + Size + Formato + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Recommended Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Lime suggerite</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">remove selected message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">rimuovere il messaggio selezionato</p></body></html> + + + + QPushButton +{ +border-image: url(:/images/deletemail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/deletemail-hover.png); +} + QPushButton{border-image: url(:/images/deletemail24.png);}QPushButton:pressed{border-image: url(:/images/deletemail-hover.png);} + + + + Inbox + Email-Inbox + + + + Outbox + Email-Outbox + + + + Draft + Brutta copia + + + + Sent + Email-Sent + + + + Timestamp + Timestamp + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">reply to selected message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">risposta al messaggio selezionato</p></body></html> + + + + +QPushButton +{ +border-image: url(:/images/replymail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/replymail-hover.png); +} + + QPushButton{border-image: url(:/images/replymail24.png);}QPushButton:pressed{border-image: url(:/images/replymail-hover.png);} + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">New Message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Nuovo messaggio</p></body></html> + + + + QPushButton +{ +border-image: url(:/images/folder-draft24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/folder-draft24-hover.png); +} + + QPushButton{border-image: url(:/images/folder-draft24.png);}QPushButton:pressed {border-image: url(:/images/folder-draft24-hover.png);} + + + + You get Message testing + Ottenete un messaggio per esaminare + + + + Download All + Download All: Trasferire tutti dal sistema centrale verso i satelliti + + + + QPushButton +{ +border-image: url(:/images/deletemail24.png); +} + +QPushButton:hover +{ +border-image: url(:/images/deletemail-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/deletemail-pressed.png); +} + + + + + +QPushButton +{ +border-image: url(:/images/replymail24.png); +} + +QPushButton:hover +{ +border-image: url(:/images/replymail24-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/replymail-pressed.png); +} + + + + + + QPushButton +{ +border-image: url(:/images/folder-draft24.png); +} +QPushButton:hover +{ +border-image: url(:/images/folder-draft24-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/folder-draft24-pressed.png); +} + + + + + + MessengerWindow + + + QWidget#MessengerWindow { +background-color: #ECF3F6; background-image:url(:/images/backgroundimage.png); +background-position: top right; +background-repeat: no-repeat +} + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click to change your avatar</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Change your Status and your display</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">picture here.</p></body></html> + + + + + Online + + + + + Busy + + + + + Be right Back + + + + + Away + + + + + In a Call + + + + + Out of lunch + + + + + Apear Offline + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Share a personal message with your contacts</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Add a Friend</p></body></html> + + + + + Chat + + + + + Connect To Friend + + + + + NetworkDialog + + + Peer Details / Authenticate + I particolari del Peer/autenticano + + + + Load Certificate + Certificato del carico + + + + Select a pem/pqi File + Selezionare una lima PEM/PQI + + + + File Not Found + Lima non trovata + + + + %1 does not exist. Would you like to create it? + %1 non esistono. gradite generarli? + + + + Failed to Create File + Non è riuscito a generare la lima. + + + + Unable to create %1 [%2] + Incapace generare %1 [%2] + + + + Select Certificate + Selezionare il certificato + + + + Certificates (*.pqi *.pem) + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Rete:</span></p></body></html> + + + + # + + + + + Accept + Accettare + + + + Trust + Fiducia + + + + Last Contact + Ultimo contatto + + + + Name + Nome + + + + Peer Address + Indirizzo del pari + + + + Organisation + Organizzazione + + + + Location + Posizione + + + + Country + Paese + + + + Cert Id + ID di cert + + + + Auth Code + Codice di aut + + + + NetworkPage + + + Rate Options + opzioni di velocità + + + + Max Total Data Rate (KB/S): + La vostra velocità massima di upload (KB/S): + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Rate per Person (KB/S):</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Velocità a persona (KB/S):</p></body></html> + + + + PeersDialog + + + Chat + Chiacchierata + + + + Configure Friend + Configurare l'amico + + + + Export Friend + Amico dell'esportazione + + + + Remove Friend + Rimuovere l'amico + + + + Save Certificate + Risparmi il certificato + + + + Certificates (*.pqi) + Certificati (*.pqi) + + + + Status + Condizione + + + + Person + Persona + + + + Auto Connect + Collegare automaticamente + + + + Trust Level + Livello di fiducia + + + + Peer Address + Indirizzo del pari + + + + Last Contact + Ultimo contatto + + + + Organisation + Organizzazione + + + + Location + Posizione + + + + Country + Paese + + + + Person Id + ID di persona + + + + Auth Code + Codice di Auth + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Friends</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Amici</span></p></body></html> + + + + Connect To Friend + Collegare all'amico + + + + # + + + + + PopupChatDialog + + + RetroShare Friend Chat + Chiacchierata dell'amico di Retroshare + + + + RetroShare User Chat + + + + + PreferencesDialog + + + Language + Lingua + + + + Style + Stile + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">I cambiamenti alla lingua entreranno in vigore soltanto dopo il nuovo inizio del Retroshare!</p></body></html> + + + + Style Sheet + Foglio di stile + + + + Default + Difetto + + + + Pagefold + Pagefold + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose RetroShare's interface style</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose Retroshare's interface style</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose the language used in RetroShare</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Scegliere la lingua usata in Retroshare</p></body></html> + + + + blue + blu + + + + silver + argento + + + + ed2k + emule-ed2k + + + + over + over + + + + black + nero + + + + arachnophobia + arachnophobia + + + + Skin2 + Pelle2 + + + + Login + Inizio attività (Login) + + + + Remove Auto Login + Rimuovere l'inizio attività auto + + + + PreferencesWindow + + + Directories + Indici + + + + Error Saving Configuration + Configurazione di Saving di errore + + + + About + About + + + + General + Generalità + + + + Server + Regolazioni del Peer + + + + Options + Opzioni + + + + Cancel + Annullamento + + + + OK + OK + + + + QObject + + + Name + Nome + + + + Path + + + + + Extension + + + + + Date + + + + + Size + + + + + Popularity + + + + + contains + + + + + contains all + + + + + is + + + + + less than + + + + + less than or equal + + + + + greater than or equal + + + + + greater than + + + + + is in range + + + + + and + + + + + and / or + + + + + or + + + + + equals + + + + + Rshare + + + Invalid language code specified: + Codice non valido di lingua specificato: + + + + Invalid GUI style specified: + Lo stile non valido del GUI ha specificato: + + + + SearchDialog + + + File Name + Nome di lima + + + + Sources + Fonti + + + + Search Pattern + Modello di ricerca + + + + Results + Risultati + + + + File Size + Formato di lima + + + + Download + Download Trasferimento + + + + Broadcast on Channel + Radiodiffusione sulla Manica + + + + Recommend to Friends + Suggerire agli amici + + + + Remove + Rimuovere + + + + Remove All + Rimuovere tutti + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Keywords</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Parole chiavi</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Format</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Disposizione</p></body></html> + + + + Any + C'è ne + + + + Audio + Audio + + + + Video + Video + + + + Images + Immagini + + + + Programs + Programmi + + + + Archives + Archivi + + + + Documents + Documenti + + + + search + ricerca + + + + download + download trasferimento + + + + Toggle advanced searching on and off. + + + + + <h3>Simple Search:</h3> + + + + + Keywords + + + + + Perform simple search + + + + + Show Advanced Search Tool + + + + + Filename + + + + + Hash + + + + + KeyWords + + + + + Search Id + + + + + <h3>Advanced Search:</h3> + + + + + ServerDialog + + + Transfer Rates + Transfer Rates + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Total Rate (kb/s) </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Total Rate (kb/s) </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Per Person </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Per Persona </p></body></html> + + + + Server Settings + Regolazioni del Peer + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Adress locale:</p></body></html> + + + + Port: + Orificio: + + + + behind zee Firewall + Dietro una parete refrattaria (Firewall) + + + + Forwarded External Port + Orificio esterno spedito (Router) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Orificio:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Nome esterno</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Indirizzo esterno:</p></body></html> + + + + Check Settings + Controllare le regolazioni + + + + Firewall/Router Configuration + + + + + Manual router setup. + + + + + Use uPnP to configure router + + + + + Network Address Configuration (takes effect after restart) + + + + + Use DHT to locate friends + + + + + Manual IP Addresses + + + + + Server Status And Network Settings + + + + + Firewalled + + + + + Forwarded Port + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">DHT Status</p></body></html> + + + + + uPnP Status + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Local Address:</p></body></html> + + + + + ServerPage + + + Change + Restart Server + Cambiamento + riavviamento + + + + Server Settings + Regolazioni del Peer + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Indirizzo esterno:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Adress locale:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Orificio:</p></body></html> + + + + Port: + Orificio: + + + + Misc + Misc + + + + behinde Firewall + Dietro una parete refrattaria (Firewall) + + + + Forwarded External Port + Orificio esterno spedito (Router) + + + + Settings + + + Settings + Regolazioni + + + + Cancel + Annullamento + + + + Apply + Applicar + + + + OK + OK + + + + General + Generalità + + + + Network + Rete + + + + Server + Peer + + + + Directories + Indici + + + + SharedFilesDialog + + + Download + Download + + + + Recommend + Suggerire + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Files</span></p></body></html> + + + + Add to Recommend List + + + + + Recommend To + + + + + Message Friend + + + + + StartDialog + + + Select Trusted Friend + Selezionare l'amico di fiducia + + + + Certificates (*.pqi *.pem) + Certificati (*.pqi *.pem) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:13pt; font-weight:600; color:#8b0000;">Welcome to RetroShare</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:13pt; font-weight:600; color:#8b0000;">Benvenuto a Retroshare</span></p></body></html> + + + + Please Login .... + Prego inizio attività (Login)… + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Pasword</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Parola d'accesso (Password)</span></p></body></html> + + + + Load Existing User + Utente attuale del carico + + + + Or create a New User + O generare un nuovo utente + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Organisation:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Organizzazione:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Paese:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Location:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Posizione:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Password (Again)</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Parola d'accesso (ancora)</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">New Password</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Nuova parola d'accesso</span></p></body></html> + + + + Load Trusted Certificate (Optional) + Il carico si è fidato del certificato (facoltativo) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Amico</span></p></body></html> + + + + Select File + Selezionare la lima + + + + Generate New Certificate + Generare il nuovo certificato + + + + RetroShare setup + Messa a punto di Retroshare + + + + Automatically Login in Future + Automaticamente inizio attività in futuro + + + + RetroShare + + + + + QWidget { + background-color: #ECF3F6; +} + + + + + Auto-login + + + + + Name: + + + + + Log In + + + + + Password: + + + + + Create a Account + + + + + QToolButton{ +border-image: url(:/images/avatar_background.png); + +} + + + + + + StatisticDialog + + + Statistics + Statistiche + + + + Download + Download + + + + Session: + Session: + + + + Downloaded: + Downloaded: + + + + Average Downloadspeed: + Average Downloadspeed: + + + + Count of Downloads: + Count of Downloads: + + + + Overall + Overall + + + + Upload + Upload + + + + Session + Session + + + + Uploaded: + Uploaded: + + + + Average Uploadspeed: + Average Uploadspeed: + + + + Count of Uploads: + Count of Uploads: + + + + Uploaded + Uploaded + + + + Connections: + Connections: + + + + Peers: + Peers: + + + + Misc + Misc + + + + Uptime: + Uptime: + + + + Overall: + Overall: + + + + Uptime + Uptime + + + + Records + Records + + + + Uploadspeed: + Uploadspeed: + + + + Downloadspeed: + Downloadspeed: + + + + Show Settings + Show Settings + + + + Reset + Risistemazione + + + + Receive Rate + Receive Rate + + + + Send Rate + Send Rate + + + + Always On Top + Always On Top + + + + 100 + 100 + + + + % Opaque + % Opaque + + + + Changes the transparency of the Bandwidth Graph + Cambia l'acetato del grafico di larghezza di banda + + + + Save + Risparmi + + + + Cancel + Annullamento + + + + Hide Settings + Regolazioni del pellame + + + + TransfersDialog + + + Cancel + Annullamento + + + + Clear Completed + La radura ha completato + + + + File Name + Nome di lima + + + + Sources + Fonti + + + + Status + Condizione + + + + File Size + Formato di lima + + + + Speed + Velocità + + + + Progress + Progresso + + + + Completed + Completato + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Downloads:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Downloads / Trasferimenti dal sistema centrale verso i satelliti:</span></p></body></html> + + + + Peer Name + Nome del Peer + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Uploads:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Uploads / Trasferimenti i satelliti verso dal sistema centrale:</span></p></body></html> + + + + Name + i.e: file name + Nome + + + + Size + i.e: file size + + + + + Progress + i.e: % downloaded + Progresso + + + + Speed + i.e: Download speed + Velocità + + + + Sources + i.e: Sources + Fonti + + + + Remaining + i.e: Estimated Time of Arrival / Time left + + + + + Core-ID + + + + + User Name + i.e: user name + + + + + Progress + i.e: % uploaded + Progresso + + + + Speed + i.e: upload speed + Velocità + + + + Transferred + + + + + ULListDelegate + + + B + + + + + KB + + + + + MB + + + + + GB + + + + + VMessageBox + + + OK + OK + + + + Cancel + Annullamento + + + + Yes + Sì + + + + No + No + + + + Help + Aiuto + + + + Retry + Altra prova + + + + Show Log + Mostrare la storia + + + + Show Settings + Mostrare le regolazioni + + + + moreinfo + + + Details + Particolari + + + + OK + OK + + + + Name + Nome + + + + Value + Valore + + + diff --git a/retroshare-gui/src/lang/retroshare_jp.qm b/retroshare-gui/src/lang/retroshare_jp.qm new file mode 100644 index 000000000..d9e1c4df1 Binary files /dev/null and b/retroshare-gui/src/lang/retroshare_jp.qm differ diff --git a/retroshare-gui/src/lang/retroshare_jp.ts b/retroshare-gui/src/lang/retroshare_jp.ts new file mode 100644 index 000000000..cf3573c60 --- /dev/null +++ b/retroshare-gui/src/lang/retroshare_jp.ts @@ -0,0 +1,3974 @@ + + + + + + + Arial + Arial + + + + AddFriendDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;"> To add a new Friend, cut and paste their email </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">invitation into the box below, and click done.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;"> æ–°ã—ã„å‹äººã€åˆ‡ã‚Šè²¼ã‚Šé›»å­ãƒ¡ãƒ¼ãƒ«ã®æ‹›å¾…ç®±ã«æ¬¡ã«åŠ ãˆã‚‹ãŸã‚。 </span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">ãã—ã¦ã§ãã¦ã„ã‚‹ã‹ã¡ã‚Šã¨è¨€ã†éŸ³ã€‚</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;"></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + Cancel + å–り消㗠+ + + + Done + ã•ã‚Œã‚‹ + + + + Load From File + ファイルã‹ã‚‰ã®è² è· + + + + RetroShare + Retroshare (Retroã®åˆ†ã‘å‰) + + + + Certificate Load Failed + 証明書ã®è² è·ã¯å¤±æ•—ã—㟠+ + + + Add a Friend + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"><span style=" font-size:16pt;">Add a new Friend</span><br /><br /><span style=" font-size:10pt;">To add a new Friend, cut and paste their email </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">invitation into the box below, and click done.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + + + + + AddFriendWizard + + + < Back + + + + + Next > + + + + + Cancel + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">This Wizard helps to Connect to your Friends</span></p></body></html> + + + + + I have a .pqi/.pem file received from a Friend + + + + + I have Key received from a Friend + + + + + I want to invite a friend to my RetroShare network + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Cut and paste the text below into an email.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;"> and send it to all your friends!</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">When you press next RetroShare will attempt to launch a Email client.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Invite your Friends to join with RetroShare</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Enter the Key code you got from your friend:</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">When you press next RetroShare will attempt to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">connect using the key.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Select a pqi/pem file:</span></p></body></html> + + + + + Browse + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">When you press next RetroShare will attempt to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">connect using the .pqi/.pem file.</p></body></html> + + + + + Add Friend to my netowork Wizard + + + + + AdvancedSearchDialog + + + RetrosShare: Advanced Search + + + + + Add a further search criterion. + + + + + Add a selection criterion + + + + + Reset + + + + + Cancels the search. + + + + + Cancel + + + + + Perform the advanced search. + + + + + Search + + + + + Search Criteria + + + + + Reset the search criteria. + + + + + ApplicationWindow + + + RetroShare %1 + + + + + Example Application + + + + + Application Users: 0 Files: 0 + + + + + Down: 0.0 Up: 0.0 + + + + + Connections: 0/45 + + + + + Hide + + + + + Show + + + + + RetroShare + + + + + Home + + + + + General + + + + + Advanced + + + + + QTextBrowser { + background-color: rgb(192,192,192); + + } + + + + + QPushButton + { + border-image: url(:/images/console-small-up.png) + } + + QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + + } + + QPushButton:pressed { + border-image: url(:/images/console-small-down.png) + } + + + + + + AuthorizationDialog + + + Authenticate + èªè¨¼ã—ãªã•ã„ + + + + Authenticate Friend By Entering Their Code + コードを入れるã“ã¨ã«ã‚ˆã£ã¦å‹äººã‚’èªè¨¼ã—ãªã•ã„ + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">証明コード :</span></p></body></html> + + + + OK + ã‚ã‹ã‚Šã¾ã—㟠(OK) + + + + Cancel + å–り消㗠+ + + + BandwidthGraph + + + RetroShare Bandwidth Usage + + + + + Show Settings + + + + + Reset + + + + + Receive Rate + + + + + Send Rate + + + + + Always on Top + + + + + Style + + + + + Changes the transparency of the Bandwidth Graph + + + + + 100 + + + + + % Opaque + + + + + Save + + + + + Cancel + + + + + Since: + + + + + Hide Settings + + + + + CallToaster + + + Message + + + + + ChanCreateDialog + + + Create a new Broadcast Channel + æ–°ã—ã„放é€ãƒãƒ£ãƒãƒ«ã‚’作æˆã—ãªã•ã„ + + + + Create A New Broadcast Channel + æ–°ã—ã„放é€ãƒãƒ£ãƒãƒ«ã‚’作æˆã—ãªã•ã„ + + + + Channel Name: + ãƒãƒ£ãƒãƒ«ã®åå‰: + + + + Type: + タイプ: + + + + Public Channel (Signed) + 公共ãƒãƒ£ãƒãƒ«(ç½²åã™ã‚‹) + + + + Private Channel (Encrypted) + ç§ç”¨ãƒãƒ£ãƒãƒ«(æš—å·åŒ–ã•ã‚Œã‚‹) + + + + Cancel Channel + å–り消ã—ãƒãƒ£ãƒãƒ« + + + + Create Channel + ãƒãƒ£ãƒãƒ«ã‚’作æˆã—ãªã•ã„ + + + + ChanMsgDialog + + + Compose + 構æˆã—ãªã•ã„ + + + + Recommended Files + 推薦ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ« + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-weight:400;"><span style=" font-weight:600;">Subject:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-weight:400;"><span style=" font-weight:600;">見出ã—: </span></p></body></html> + + + + Send To: + ã«é€ã‚Šãªã•ã„: + + + + Send + é€ã‚Šãªã•ã„ + + + + Delete Channel + 削除ãƒãƒ£ãƒãƒ« + + + + Create Channel MSG + ãƒãƒ£ãƒãƒ«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’作æˆã—ãªã•ã„ + + + + 1 + + + + + Reply + + + + + ChannelsDialog + + + New Message + æ–°ã—ã„メッセージ + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Messages</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">メッセージ</span></p></body></html> + + + + Date + 日付 + + + + Rank + ランク + + + + From + ã‹ã‚‰ + + + + Title + タイトル + + + + Msg + メッセージ + + + + Count + 計算 + + + + Size + サイズ + + + + Type + タイプ + + + + Rs[Cert/Chan]IdSize + Rs[Cert/Chan]åŒä¸€è¨¼æ˜Žã®ã‚µã‚¤ã‚º + + + + RsMsgId + メッセージã®åŒä¸€è¨¼æ˜Ž + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Message Text</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">メッセージテキスト</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Recommended Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">推薦ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ« </span></p></body></html> + + + + New Channel + æ–°ã—ã„ãƒãƒ£ãƒãƒ« + + + + Subscribe To Channel + ãƒãƒ£ãƒãƒ«ã‚’予約購読ã—ãªã•ã„ + + + + Unsubscribe To Channel + ãƒãƒ£ãƒãƒ«ã‚’予約講読を解除ã—ãªã•ã„ + + + + Delete Your Channel + ã‚ãªãŸã®ãƒãƒ£ãƒãƒ«ã‚’削除ã—ãªã•ã„ + + + + Download + ダウンロード + + + + Download All + ã™ã¹ã¦ã‚’ダウンロードã—ãªã•ã„ + + + + ChatDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:9pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:400;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:9pt; font-weight:600; font-style:normal; text-decoration:none;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:400;"></p></body></html> + + + + Chat History: + 雑談ã®æ­´å²: + + + + Chat With: + 雑談下記ã®ã‚‚ã®ã®: + + + + Chat + 雑談 + + + + Users: + + + + + ChatToaster + + + message + メッセージ + + + + You Get a New Message + æ–°ã—ã„メッセージを得る + + + + Message + + + + + ConfCertDialog + + + Cancel + å–り消㗠+ + + + Done + ã•ã‚Œã‚‹ + + + + Apply + é©ç”¨ã—ãªã•ã„ + + + + Peer Settings + åŒç­‰è€…ã®è¨­å®š + + + + Port: + 港: + + + + behind zee Firewall + 防ç«å£ã®å¾Œã‚ + + + + Forwarded External Port + 進ã‚られãŸå¤–çš„ãªæ¸¯ + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">港: </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">外的ãªä½æ‰€: </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">外部å </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ç¾ä½æ‰€:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Max Transfer Rate (kb/s) </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ã‚ãªãŸã®æœ€é«˜ã®ã‚¢ãƒƒãƒ—ロードã®é€Ÿåº¦ (kb/s) </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Org / Loc:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">構æˆ/ä½ç½®: </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">åå‰: </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Country/State:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">国ã‹å›½å®¶: </p></body></html> + + + + Trust Settings + ä¿¡é ¼ã®è¨­å®š + + + + Trust Level + 信頼レベル + + + + Trust Their Signature + ç½²åã‚’ä¿¡é ¼ã—ãªã•ã„ + + + + Sign The Certificate + 証明書ã«ç½²åã—ãªã•ã„ + + + + OK + + + + + Peer Adress + + + + + Peer Info + + + + + ConfirmQuitDialog + + + Exit RetroShare + + + + + You are about to exit the RetroShare application and therefore stop all transfers. <br><br>Are you sure you want to stop and exit RetroShare? + + + + + Do not show this message again. + + + + + ConnectDialog + + + Peer Details + åŒç­‰è€…ã®ç´°éƒ¨ + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">国:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Org:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">構æˆ:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">åå‰:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Trust:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ä¿¡é ¼:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Loc:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ä½ç½®:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Certificate</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">signers:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Certificate</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">ç½²å者:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">証明コード:</span></p></body></html> + + + + Make Friend + å‹äººã‚’作りãªã•ã„ + + + + Close + 終ã‚ã‚Š + + + + ConnectionsDialog + + + Load Certificate + è² è·è¨¼æ˜Žæ›¸ + + + + Select a pem/pqi File + ファイルをé¸ã³ãªã•ã„ PEM/PQI + + + + File Not Found + 見ã¤ã‘られãªã„ファイル + + + + %1 does not exist. Would you like to create it? + %1 存在ã—ã¦ã„ãªã„. ãれを作æˆã™ã‚‹ã®ã‚’好むã‹ã€‚ + + + + Failed to Create File + ファイルを作æˆã•ã‚Œãªã„ + + + + Unable to create %1 [%2] + ãªã„作æˆã™ã‚‹ã“㨠%1 [%2] + + + + Select Certificate + 証明書をé¸ã³ãªã•ã„ + + + + Certificates (*.pqi *.pem) + 証明書 (*.pqi *.pem) + + + + Accept + å—容 + + + + Trust + ä¿¡é ¼ + + + + Last Contact + 最後ã®æŽ¥è§¦ + + + + Name + åå‰ + + + + Organisation + æ§‹æˆ + + + + Location + ä½ç½® + + + + Country + 国 + + + + Peer Address + åŒç­‰è€…ã®ä½æ‰€ + + + + Cert Id + 証明ã®åŒä¸€ç•ªå· + + + + Auth Code + èªè¨¼ã‚³ãƒ¼ãƒ‰ + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯:</span></p></body></html> + + + + Peer Details / Authenticate + åŒç­‰è€…ã®ç´°éƒ¨ã¯/èªè¨¼ã™ã‚‹ + + + + CryptographyDialog + + + RSA Key Size + RSA Key Size + + + + Rijndael Block size + Rijndael Block size + + + + 128 Bits + 128 Bits + + + + 192 Bits + 192 Bits + + + + 256 Bits + 256 Bits + + + + Rijndael Key Size + Rijndael Key Size + + + + Rijndael Mode + Rijndael Mode + + + + CBC + CBC + + + + ECB + ECB + + + + CFB + CFB + + + + Rijndael Padding + Rijndael Padding + + + + PKCS7 + PKCS7 + + + + Zeros + Zeros + + + + ANSIX923 + ANSIX923 + + + + ISO10126 + ISO10126 + + + + Rijndael Feedback Size + Rijndael Feedback Size + + + + Key Size: + Key Size: + + + + Block Size: + Block Size: + + + + Feedback Size: + Feedback Size: + + + + Mode: + Mode: + + + + Padding: + Padding: + + + + DLListDelegate + + + B + + + + + KB + + + + + MB + + + + + GB + + + + + DirectoriesDialog + + + Shared Directories + 共用登録簿 + + + + Other Directories + ä»–ã®ç™»éŒ²ç°¿ + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Incoming Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">å…¥ã£ã¦æ¥ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«</span></p></body></html> + + + + Add Shared Directory + 共用登録簿を加ãˆãªã•ã„ + + + + DirectoriesPage + + + Shared Directories + 共用登録簿 + + + + Incoming files + å…¥ã£ã¦æ¥ã‚‹ãƒ•ã‚¡ã‚¤ãƒ« + + + + ExampleDialog + + + Vote Up + + + + + Vote Down + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Friends</span></p></body></html> + + + + + # + + + + + Status + + + + + Person + + + + + Auto Connect + + + + + Trust Level + + + + + Peer Address + åŒç­‰è€…ã®ä½æ‰€ + + + + Last Contact + 最後ã®æŽ¥è§¦ + + + + Organisation + æ§‹æˆ + + + + Location + ä½ç½® + + + + Country + 国 + + + + Person Id + + + + + Auth Code + èªè¨¼ã‚³ãƒ¼ãƒ‰ + + + + ExprParamElement + + + to + + + + + ignore case + + + + + dd.MM.yyyy + + + + + KB + + + + + MB + + + + + GB + + + + + ExpressionWidget + + + Expression Widget + + + + + Delete this expression + + + + + FileHashDialog + + + Download + ダウンロード (Download) + + + + GSettingsWin + + + General + æ¦‚è¦ + + + + Network + ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ + + + + Directories + 登録簿 + + + + Server + åŒç­‰è€…ノード設定 + + + + %1 + %1 + + + + GenCertDialog + + + RetroShare setup + Retroshareã®çµ„ã¿ç«‹ã¦ + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16pt;">Generate a new profile</span><br /><br />Please fill in the information which will<br />allow your RetroShare to connect to</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Friends.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Organisation:</p></body></html> + + + + + Password (Again) + + + + + Location: + + + + + Load Trusted Certificate (Optional) + è² è·ä¿¡è¨—証券(ä»»æ„) + + + + Password + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">å‹äºº</span></p></body></html> + + + + Select File + ファイルをé¸ã³ãªã•ã„ + + + + Country: + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + + + + + Generate New Certificate + æ–°ã—ã„証明書を発生ã•ã›ãªã•ã„ + + + + Select Trusted Friend + ä¿¡é ¼ã•ã‚ŒãŸå‹äººã‚’é¸ã³ãªã•ã„ + + + + Certificates (*.pqi *.pem) + 証明書 (*.pqi *.pem) + + + + GeneralPage + + + Keys manager + キーã®ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ¼ + + + + Style + æ§˜å¼ + + + + Choose RetroShare's interface style + インターフェイス様å¼ã‚’é¸ã³ãªã•ã„ + + + + Language + 言語 (Language) + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">言語ã¸ã®å¤‰æ›´ã¯é©ç”¨ã‚’å†å§‹å‹•ã—ãŸå¾Œã ã‘実施ã•ã‚Œã‚‹!</p></body></html> + + + + Choose the language used in RetroShare + Retroshareã§ä½¿ç”¨ã•ã‚Œã‚‹è¨€èªžã‚’é¸ã³ãªã•ã„ + + + + GraphFrame + + + Recv: + å…¥ã£ã¦æ¥ã‚‹: + + + + %1 KB/s + %1 KB/s + + + + Sent: + é€ã‚‰ã‚Œã‚‹: + + + + %1 KB + %1 KB + + + + %1 MB + %1 MB + + + + %1 GB + %1 GB + + + + HelpDialog + + + About + + + + + Authors + + + + + Thanks to + + + + + Translation + + + + + License Agreement + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">About/Help</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:xx-large; font-weight:600; color:#0000ff;">About RetroShare.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-weight:600;">Retroshare is a private and secure decentralised commmunication platform.<br />You can use it chat, send messages and share files with your friends.</span><br /><br />This is just a placeholder page for the moment. You can<br />improve retroshare's in-built help (this text) by<br />updating the retroshare wiki: <a href="http://retroshare.wiki.sourceforge.net/help_tab"><span style=" text-decoration: underline; color:#0000ff;">This Page in the retroshare Wiki</span></a><br /><br />The About/Help Tab is regularly updated from the Wiki page.<br /><br />External Links to more information:<br /></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.sourceforge.net"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Webpage</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.wiki.sourceforge.net/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Wiki</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://sourceforge.net/projects/retroshare/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Project Page</span></a></li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.lunamutt.com"><span style=" text-decoration: underline; color:#0000ff;">Lunamutt Homepage.</span></a></li></ul></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-size:19pt; font-weight:600; color:#0000ff;">The RetroShare Team:</span><br /> <br /><span style=" font-size:9pt; color:#0000ff;">defnax</span>: Lead GUI developer <br /><span style=" font-size:9pt; color:#0000ff;">drbob7</span>: Lead Core developer. <br /> <br /><span style=" font-size:9pt; color:#0000ff;">bmeck</span> : Our new web-developer. Joined retroshare a couple <br />of weeks ago, and already starting on an exciting new <br />design for the web-page. <br /> <br /><span style=" font-size:9pt; color:#0000ff;">noragen</span> : Developer from the SIM-IM project. Working on a retroshare plugin to SIM-IM. <br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">kernelpanix</span> : Gui and skin developer</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">libris</span><span style=" font-size:9pt;">:</span> core developer</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-size:9pt; color:#0000ff;">kashif: </span><span style=" color:#000000;">core developer</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt; color:#000000;"><span style=" font-size:8pt;"><br /></span><span style=" color:#0000ff;">agent725</span><span style=" font-size:8pt;">: Manages the 'local' Retroshare release, <br />and beta-testing retroshare on a large scale. <br /> <br /></span><span style=" color:#0000ff;">the_mgt</span><span style=" font-size:8pt;">: Maintains the Gentoo and generic linux <br />installation/compilation scripts. </span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">notdefine:</span> Maintains the .rpm, .deb installation/compilation scripts.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">zhouk</span>: developer</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Translators:</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Serbian</span>: Kunalagon Umuhanik &lt;kunalagon@gmail.com&gt;</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Polish: </span>Jarek</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">French</span>:Temet</p></body></html> + + + + + InviteDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">To </span><span style=" font-size:10pt; font-weight:600;">Invite your friends to join you with Retroshare: </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">Cut and paste the text below into an email.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">and send it to all your friends!</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;"> </span><span style=" font-size:10pt; font-weight:600;">ã‚ãªãŸã®å‹äººã‚’Retroshareã¨ã®çµåˆã™ã‚‹ã‚ˆã†ã«èª˜ã„ãªã•ã„: </span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">切り貼り電å­ãƒ¡ãƒ¼ãƒ«ã¸ã®ãƒ†ã‚­ã‚¹ãƒˆæ¬¡ã«ã€‚</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">ãã—ã¦ã™ã¹ã¦ã®ã‚ãªãŸã®å‹äººã«ãれをé€ã‚Šãªã•ã„! </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + Done + ã•ã‚Œã‚‹ + + + + Cancel + å–り消㗠+ + + + Launch Email + 進水ã®æ…£ç¿’çš„ãªé›»å­ãƒ¡ãƒ¼ãƒ« + + + + Invite a Friend + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"><span style=" font-size:16pt;">Invite a Friend</span><br /><br /><span style=" font-size:10pt;">To Invite your friends to join you with Retroshare: </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">Cut and paste the text below into an email.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">and send it to all your friends!</p></body></html> + + + + + LogDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> + +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="ABOUT"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">About RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShare is a private peer to peer communication platform created by Dr. Bob.This program enables you to securely share files and chat with your friends (and no-one else!).</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, and the latest release go to http://www.lunamutt.com.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="START"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Quick Start Guide to RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If this is your first time using Retroshare, it is recommended that you readthis guide for instructions on how to get started. The first step is:<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Connecting to Your Friends</span></a>. Once you have managed this you can <a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">Download Files</span></a> and<a href="#START-SHARE"><span style=" text-decoration: underline; color:#0000ff;">Share with Others</span></a></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Some of the key concepts related to ensuring your sharing remains private aredescribed in the <a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">Frequently Asked Questions</span></a>. Some Key security questions are:<a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">What is a Web of Trust?</span></a>, <a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">Should I Sign this Certificate?</span></a>, and finally<a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">What does "Trust" Mean?</span></a>.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is also worthwhile reading the <a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">GUI Overview</span></a>which describes the featureson available through the User Interface.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Connecting to your Friends </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">There are four steps to connecting to a Friend:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Get Friend's Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Load Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Sign Certificate</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect to Friend.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The instructions might initially appear long and daunting, however thesesteps are required to ensure that your sharing is private and secure.These steps are only required a couple of times, to add new friends, and become quite straight forward after the first time.</p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (1) EXCHANGE CERTIFICATES </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Before you can connect, you need send your certificate to your friend, and get your friends certificate. Follow these steps to get your certificate:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on Your Certificate to Select it.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on the "Export Friend" Button to bring up a file save dialog.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select directory to save the certificate to.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Enter desired filename. (with a file type of .pqi), and Click OK.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Email this File to your Friend. (It is recommended you put thecertificate in a zip file before sending, as some email programsdon't transmit the file correctly).</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Ask your friend to do the same.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Once you have received your friend's certificate, removed itfrom the zip file and saved it to disk, you can proceed to step (2).</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Note: This exchange of certificates is only necessary to get you started.Once you are connected to some friends the exchange of certificates becomeautomated by the autoDiscovery system. See<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">GUI: Connecting</span></a> for more information.------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (2) LOAD YOUR FRIEND'S CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Import Friend"</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select your friends certificate file, then click "Okay". Their certificate should appear in the top window of the "Connect" Tab.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (3) SIGN CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select their Certificate by clicking on their name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Configure Friend" Button. This will bring up a configuration window. which allows you to look at the detailsof the certificate.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click the "Sign Certificate" button near the bottom of the "Certificate Configuration" Window.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Now close the window by clicking on the "Done" button.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Your Friends certificate should now say "Trusted (S)", indicating it is ready for connections.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can only share with "Trusted" Peers. You must sign your Friend'scertificate to prove that you know the certificate belongs to your Friend. Do not sign any/all certificates - only the people youtrust. For more information see: <br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br />------------------------------------------------------------------------<br /><br /> <br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (4) AUTOCONNECT TO PEER </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Finally You need to activate the connection:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click in the Box, next to your friends Name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> A Tick should appear in the box, a connection will be started.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> The "Offline" will change to "Online" when you have successfullyconnected.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Remember: Your initial connection attempts will fail, until your friend has signed your certificate and ticked the Auto-Connect Box.This ensures that both peers trust each other, and stops random peopleaccessing your files.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>. <br />------------------------------------------------------------------------<br /><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-DOWNLOAD"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Downloading Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have connected to friends, you can download their shared files.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can search for the files you want using either:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) File Listing Tab: This gives you a directory view of the files being shared by your peers. Double clickon the directory name (not the arrow) to diplay its subdirectories and files.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 1: This can take up to 5 seconds to fetch the information for your peer.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 2: If the directory is empty, or the person is offline, then the request will silently fail.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Search Tab: Retroshare also allows you to search your peers computers for filenames. Enter yourterm(s) in the search box at the top of the TAB and click the "Search" button. This willsearch all of the peers that you are currently connected to.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 3: If any matching files are found they will be displayed within 5 - 10 seconds.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have found the files you want, Select the file(s), and click "Download" to begin the download process.If you click over the "File Transfer" TAB, the status of the files will appear.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 4: The files can take up to 10 seconds to appear in the transfer window.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-SHARING"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Sharing Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can specify which files you want to share in the "Config" Tab.In the "Share Directories" section, click the "Add Directory" Button, and select the directory you want to share.The files and subdirectories will become available for you peers.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can remove a directory from the Shared Directories List by clicking onthe directory name in the list, and then clicking "Remove Directory".</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="GUI"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Gui Overview (Tab Description) </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The GUI is divided up into several sections which can be accessed by clicking on the Tabs along the top of the main window. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect: Manage Connections and Friends.(<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">getting started</span></a> and<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Listing: A directory view of available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Search: Search for available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Messages: For Sending/Recving Message. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Channels: A broadcast/subscription system. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Transfer: Listing of Current and completed Transfers.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Config: Specify of share diectories and IP Addresses.(<a href="#GUI-CONFIG"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> About: Help and other Information.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Chat: Accessed by the clicking on the "Chat" button.</li></ul> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Connect Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Connect TAB consists of two windows. The upper windowshows a list of your friends. This window indicates each friendscurrent trust level, as well as their connection state.The "Trust_Lvl" Column indicates if the certificate has beenAuthenticated using the web of trust. You can only connect to "Trusted" certificates. Tick the "Auto_Connect" box to connect to your trusted friends.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The lower window provides a list of the friends of your friends.This window shows the neighbour's name and how long ago they attempted to connect to you. This window is automatically populatedby the autoDiscovery system, and should be used to expand yourretroShare network. A word of warning: Do not automatically trust (or sign) anyonethat appears in this window. First verify by some other means (email/phone)that certificate belongs to the person you think it does.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use the "Neighbour List" window to expand your friend list. Select the desired entry in the lower window by clicking on it, then click the "Add to Friends" Button to move it to the upper window.Likewise the "Remove from Friends" button moved a person from the upper window to the lower window.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The "Configure Friend" Button opens a Certificate Configuration window.This window can be used to examine the certificate details, sign the certificate or manually change the peer's IP Address.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">See Also:<br /><a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Getting Started: Connecting to your friends</span></a>.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>.<br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONFIG"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Config Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Configuration Tab allows you to select the share directories, as well as the directory that downloaded files are saved to.<br />See <a href="#STARTUP-SHARING"><span style=" text-decoration: underline; color:#0000ff;">Sharing you Files</span></a> for details. </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Config Tab also allows you to control the IP Address and Portused by RetroShare. Under most cirumstances you do not need to changethese setting. If you are behind a firewall and can setup a forwarded port, the selected IP Address and Port should be specified here.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="FAQ"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Frequently Asked Questions </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">How does the security/privacy work? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShares uses a Web of Trust Authentication system to ensurethat your "friends" are your friends, and uses SSL to encryptthe communcications between peers. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What is a Web of Trust? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Web of Trust relies on a collection of peers to identify eachother. Look it up on the Web!</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-TRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What does "Trust" Mean in RetroShare?</span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Anyone can generate a certificate, with any name on it. So howdo you know that the certificate that claims to be from "Joe Bloggs"is really from your mate Joe. This is the "AuthenticationProblem". RetroShare uses a Web of Trust to Authenticate your peers.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-SIGN"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Should I Sign this Certificate? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should only sign a certificate if you are completely surethat it comes from the "right" person. If you sign a certificateyou are "Authenticating" the person to yourself and others.If you sign certificates that you haven't checked, then you aredestroying your own privacy and security.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">How do you verify a certificate? Use an alternative method ofcommunication to send the certificate: E.g. email or USB stick. This will improve you confidence that the certificate belongsto the correct person. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><span style=" font-size:small;"> </span><a name="FAQ-CONNECT"></a><span style=" font-size:small;">W</span><span style=" font-size:small;">hy won't it Connect?</span><span style=" font-size:small;"> </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A connection can fail for a number of reasons:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) Failed Authentication. Have both peers signed each otherscertificates? </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Firewalls. If both peers are behind firewalls then they cannotconnect directly. RetroShare has a built in proxy system to circumventfirewalls - However this can only function if both peers can connect to a common third party that is not behind a firewall. Thisis the most likely reason for initial connections to fail. The only solution to find a common friend that isn't firewalled (know anyone with Broadband?)</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(3) IP Addresses are wrong. You can manually examine and change these using the Certificate configuration.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +</body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="ABOUT"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">About RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShare is a private peer to peer communication platform created by Dr. Bob.This program enables you to securely share files and chat with your friends (and no-one else!).</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">より多ãã®æƒ…å ±ãŠã‚ˆã³æœ€ã‚‚最近ã®è§£æ”¾ã®ãŸã‚ã«ç§é”ã®ã‚¦ã‚§ãƒ–サイトã«è¡Œããªã•ã„: http://retroshare.sf.net。 For more information, and the latest release go to http://retroshare.sf.net.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="START"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Quick Start Guide to RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If this is your first time using Retroshare, it is recommended that you readthis guide for instructions on how to get started. The first step is:<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Connecting to Your Friends</span></a>. Once you have managed this you can <a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">Download Files</span></a> and<a href="#START-SHARE"><span style=" text-decoration: underline; color:#0000ff;">Share with Others</span></a></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Some of the key concepts related to ensuring your sharing remains private aredescribed in the <a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">Frequently Asked Questions</span></a>. Some Key security questions are:<a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">What is a Web of Trust?</span></a>, <a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">Should I Sign this Certificate?</span></a>, and finally<a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">What does "Trust" Mean?</span></a>.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is also worthwhile reading the <a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">GUI Overview</span></a>which describes the featureson available through the User Interface.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Connecting to your Friends </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">There are four steps to connecting to a Friend:</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Get Friend's Certificate</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Load Certificate</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Sign Certificate</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect to Friend.</li></ul><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The instructions might initially appear long and daunting, however thesesteps are required to ensure that your sharing is private and secure.These steps are only required a couple of times, to add new friends, and become quite straight forward after the first time.</p><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (1) EXCHANGE CERTIFICATES </span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Before you can connect, you need send your certificate to your friend, and get your friends certificate. Follow these steps to get your certificate:</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on Your Certificate to Select it.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on the "Export Friend" Button to bring up a file save dialog.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select directory to save the certificate to.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Enter desired filename. (with a file type of .pqi), and Click OK.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Email this File to your Friend. (It is recommended you put thecertificate in a zip file before sending, as some email programsdon't transmit the file correctly).</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Ask your friend to do the same.</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Once you have received your friend's certificate, removed itfrom the zip file and saved it to disk, you can proceed to step (2).</li></ul><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Note: This exchange of certificates is only necessary to get you started.Once you are connected to some friends the exchange of certificates becomeautomated by the autoDiscovery system. See<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">GUI: Connecting</span></a> for more information.------------------------------------------------------------------------<br /><br /><br /></p><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (2) LOAD YOUR FRIEND'S CERTIFICATE </span></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Import Friend"</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select your friends certificate file, then click "Okay". Their certificate should appear in the top window of the "Connect" Tab.</li></ul><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">------------------------------------------------------------------------<br /><br /><br /></p><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (3) SIGN CERTIFICATE </span></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select their Certificate by clicking on their name.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Configure Friend" Button. This will bring up a configuration window. which allows you to look at the detailsof the certificate.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click the "Sign Certificate" button near the bottom of the "Certificate Configuration" Window.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Now close the window by clicking on the "Done" button.</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Your Friends certificate should now say "Trusted (S)", indicating it is ready for connections.</li></ul><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can only share with "Trusted" Peers. You must sign your Friend'scertificate to prove that you know the certificate belongs to your Friend. Do not sign any/all certificates - only the people youtrust. For more information see: <br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br />------------------------------------------------------------------------<br /><br /> <br /></p><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (4) AUTOCONNECT TO PEER </span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Finally You need to activate the connection:</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click in the Box, next to your friends Name.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> A Tick should appear in the box, a connection will be started.</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> The "Offline" will change to "Online" when you have successfullyconnected.</li></ul><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Remember: Your initial connection attempts will fail, until your friend has signed your certificate and ticked the Auto-Connect Box.This ensures that both peers trust each other, and stops random peopleaccessing your files.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>. <br />------------------------------------------------------------------------<br /><br /><br /></p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-DOWNLOAD"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Downloading Files </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have connected to friends, you can download their shared files.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can search for the files you want using either:</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) File Listing Tab: This gives you a directory view of the files being shared by your peers. Double clickon the directory name (not the arrow) to diplay its subdirectories and files.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 1: This can take up to 5 seconds to fetch the information for your peer.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 2: If the directory is empty, or the person is offline, then the request will silently fail.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Search Tab: Retroshare also allows you to search your peers computers for filenames. Enter yourterm(s) in the search box at the top of the TAB and click the "Search" button. This willsearch all of the peers that you are currently connected to.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 3: If any matching files are found they will be displayed within 5 - 10 seconds.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have found the files you want, Select the file(s), and click "Download" to begin the download process.If you click over the "File Transfer" TAB, the status of the files will appear.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 4: The files can take up to 10 seconds to appear in the transfer window.</p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-SHARING"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Sharing Files </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can specify which files you want to share in the "Config" Tab.In the "Share Directories" section, click the "Add Directory" Button, and select the directory you want to share.The files and subdirectories will become available for you peers.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can remove a directory from the Shared Directories List by clicking onthe directory name in the list, and then clicking "Remove Directory".</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="GUI"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Gui Overview (Tab Description) </span><span style=" font-size:medium;"> </span></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The GUI is divided up into several sections which can be accessed by clicking on the Tabs along the top of the main window. </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect: Manage Connections and Friends.(<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">getting started</span></a> and<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Listing: A directory view of available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Search: Search for available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Messages: For Sending/Recving Message. (Coming Soon)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Channels: A broadcast/subscription system. (Coming Soon)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Transfer: Listing of Current and completed Transfers.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Config: Specify of share diectories and IP Addresses.(<a href="#GUI-CONFIG"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> About: Help and other Information.</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Chat: Accessed by the clicking on the "Chat" button.</li></ul><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Connect Tab </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Connect TAB consists of two windows. The upper windowshows a list of your friends. This window indicates each friendscurrent trust level, as well as their connection state.The "Trust_Lvl" Column indicates if the certificate has beenAuthenticated using the web of trust. You can only connect to "Trusted" certificates. Tick the "Auto_Connect" box to connect to your trusted friends.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The lower window provides a list of the friends of your friends.This window shows the neighbour's name and how long ago they attempted to connect to you. This window is automatically populatedby the autoDiscovery system, and should be used to expand yourretroShare network. A word of warning: Do not automatically trust (or sign) anyonethat appears in this window. First verify by some other means (email/phone)that certificate belongs to the person you think it does.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use the "Neighbour List" window to expand your friend list. Select the desired entry in the lower window by clicking on it, then click the "Add to Friends" Button to move it to the upper window.Likewise the "Remove from Friends" button moved a person from the upper window to the lower window.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The "Configure Friend" Button opens a Certificate Configuration window.This window can be used to examine the certificate details, sign the certificate or manually change the peer's IP Address.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">See Also:<br /><a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Getting Started: Connecting to your friends</span></a>.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>.<br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br /></p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONFIG"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Config Tab </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Configuration Tab allows you to select the share directories, as well as the directory that downloaded files are saved to.<br />See <a href="#STARTUP-SHARING"><span style=" text-decoration: underline; color:#0000ff;">Sharing you Files</span></a> for details. </p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Config Tab also allows you to control the IP Address and Portused by RetroShare. Under most cirumstances you do not need to changethese setting. If you are behind a firewall and can setup a forwarded port, the selected IP Address and Port should be specified here.</p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="FAQ"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Frequently Asked Questions </span><span style=" font-size:medium;"> </span></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">How does the security/privacy work? </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShares uses a Web of Trust Authentication system to ensurethat your "friends" are your friends, and uses SSL to encryptthe communcications between peers. </p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What is a Web of Trust? </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Web of Trust relies on a collection of peers to identify eachother. Look it up on the Web!</p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-TRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What does "Trust" Mean in RetroShare?</span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Anyone can generate a certificate, with any name on it. So howdo you know that the certificate that claims to be from "Joe Bloggs"is really from your mate Joe. This is the "AuthenticationProblem". RetroShare uses a Web of Trust to Authenticate your peers.</p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-SIGN"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Should I Sign this Certificate? </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should only sign a certificate if you are completely surethat it comes from the "right" person. If you sign a certificateyou are "Authenticating" the person to yourself and others.If you sign certificates that you haven't checked, then you aredestroying your own privacy and security.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">How do you verify a certificate? Use an alternative method ofcommunication to send the certificate: E.g. email or USB stick. This will improve you confidence that the certificate belongsto the correct person. </p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><span style=" font-size:small;"> </span><a name="FAQ-CONNECT"></a><span style=" font-size:small;">W</span><span style=" font-size:small;">hy won't it Connect?</span><span style=" font-size:small;"> </span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A connection can fail for a number of reasons:</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) Failed Authentication. Have both peers signed each otherscertificates? </p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Firewalls. If both peers are behind firewalls then they cannotconnect directly. RetroShare has a built in proxy system to circumventfirewalls - However this can only function if both peers can connect to a common third party that is not behind a firewall. Thisis the most likely reason for initial connections to fail. The only solution to find a common friend that isn't firewalled (know anyone with Broadband?)</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(3) IP Addresses are wrong. You can manually examine and change these using the Certificate configuration.</p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table></body></html> + + + + MainWindow + + + Preferences + 好㿠+ + + + Network + ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®çµ„ã¿ç«‹ã¦ + + + + Friends + メッセージå‹äºº + + + + Transfers + ファイル・トランスファー + + + + Messages + é›»å­ãƒ¡ãƒ¼ãƒ« + + + + Channels + ãƒãƒ£ãƒãƒ« + + + + Options + é¸æŠž + + + + Users: 0 Files: 0 + ユーザー : 10 ファイル : 10 + + + + Down: 0.0 Up: 0.0 + ダウンロード/ 0.0 /アップロード : 0.0 + + + + Connections: 0/45 + 関係: 0/45 + + + + System tray is unavailable + システム皿ã¯åˆ©ç”¨ã§ããªã„ + + + + System tray unavailable + システム皿ã¯åˆ©ç”¨ã§ããªã„ + + + + RetroShare System tray + Retroshareシステム皿 + + + + Application will continue running. Quit using context menu in the system tray + é©ç”¨ã¯å‹•ã続ã‘る。システム皿ã®æ–‡è„ˆãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‚’使用ã—ã¦ã‚„ã‚られる。 + + + + Hide + çš® + + + + Show + ショー + + + + RetroShare + Retroshare (ã®åˆ†ã‘å‰) + + + + Home + 家 + + + + General + æ¦‚è¦ + + + + Invite Friend + å‹äººã‚’誘ã„ãªã•ã„ + + + + Add Friend + å‹äººã‚’加ãˆãªã•ã„ + + + + Add Share + 分ã‘å‰ã‚’加ãˆãªã•ã„ + + + + Advanced + 高度 + + + + QTextBrowser { + background-color: rgb(192,192,192); + +} + QTextBrowser { background-color: rgb(192,192,192);} + + + + QPushButton +{ + border-image: url(:/images/console-small-up.png) +} + +QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + +} + +QPushButton:pressed { + border-image: url(:/images/console-small-down.png) +} + + QPushButton{ border-image: url(:/images/console-small-up.png) }QPushButton:hover { border-image: url(:/images/console-small-hover.png) }QPushButton:pressed { border-image: url(:/images/console-small-down.png) } + + + + Exit + å‡ºå£ + + + + Search + 調査 + + + + Files + ファイル + + + + Chat + グループã®é›‘談 + + + + Add Shared Directory + 共用登録簿を加ãˆãªã•ã„ + + + + About/Help + + + + + Messenger + + + + + Show/Hide + + + + + &Quit + + + + + Bandwidth Graph + + + + + Open Messenger + + + + + RetroShare %1 + + + + + Add a Friend + + + + + Invite a Friend + + + + + Add a Share + + + + + Quit + + + + + Minimize + + + + + Maximize + + + + + Hide Console + + + + + Show Console + + + + + Hide ToolBox + + + + + :images/hide_toolbox_frame.png + + + + + Show ToolBox + + + + + :images/show_toolbox_frame.png + + + + + QTextBrowser { + background-color: rgb(192,192,192); + + } + + + + + QPushButton + { + border-image: url(:/images/console-small-up.png) + } + + QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + + } + + QPushButton:pressed { + border-image: url(:/images/console-small-down.png) + } + + + + + + Apps + + + + + MessageToaster + + + message + メッセージ + + + + MessagesDialog + + + New Message + æ–°ã—ã„メッセージ + + + + Reply to Message + メッセージã¸ã®å¿œç­” + + + + Remove Message + メッセージをå–除ããªã•ã„ + + + + Date + 日付 + + + + From + ã‹ã‚‰ + + + + Title + タイトル + + + + Msg + メッセージ + + + + Count + 計算 + + + + Size + サイズ + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Recommended Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">推薦ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ« </span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">remove selected message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">指定メッセージをå–除ããªã•ã„ </p></body></html> + + + + QPushButton +{ +border-image: url(:/images/deletemail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/deletemail-hover.png); +} + QPushButton{border-image: url(:/images/deletemail24.png);}QPushButton:pressed{border-image: url(:/images/deletemail-hover.png);} + + + + Inbox + å…¥ã£ã¦æ¥ã‚‹é›»å­ãƒ¡ãƒ¼ãƒ« + + + + Outbox + 出ã¦è¡Œãã®ãŸã‚ã®é›»å­ãƒ¡ãƒ¼ãƒ« + + + + Draft + è‰æ¡ˆ + + + + Sent + é€ã‚‰ã‚ŒãŸé›»å­ãƒ¡ãƒ¼ãƒ« + + + + Timestamp + タイムスタンプ + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">reply to selected message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">指定メッセージã¸ã®å¿œç­” </p></body></html> + + + + +QPushButton +{ +border-image: url(:/images/replymail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/replymail-hover.png); +} + + QPushButton{border-image: url(:/images/replymail24.png);}QPushButton:pressed{border-image: url(:/images/replymail-hover.png);} + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">New Message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">æ–°ã—ã„メッセージ</p></body></html> + + + + QPushButton +{ +border-image: url(:/images/folder-draft24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/folder-draft24-hover.png); +} + + QPushButton{border-image: url(:/images/folder-draft24.png);}QPushButton:pressed {border-image: url(:/images/folder-draft24-hover.png);} + + + + You get Message testing + テストã®ãŸã‚ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å¾—ã‚‹ + + + + Download All + ã™ã¹ã¦ã‚’ダウンロードã—ãªã•ã„ + + + + QPushButton +{ +border-image: url(:/images/deletemail24.png); +} + +QPushButton:hover +{ +border-image: url(:/images/deletemail-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/deletemail-pressed.png); +} + + + + + +QPushButton +{ +border-image: url(:/images/replymail24.png); +} + +QPushButton:hover +{ +border-image: url(:/images/replymail24-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/replymail-pressed.png); +} + + + + + + QPushButton +{ +border-image: url(:/images/folder-draft24.png); +} +QPushButton:hover +{ +border-image: url(:/images/folder-draft24-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/folder-draft24-pressed.png); +} + + + + + + MessengerWindow + + + QWidget#MessengerWindow { +background-color: #ECF3F6; background-image:url(:/images/backgroundimage.png); +background-position: top right; +background-repeat: no-repeat +} + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click to change your avatar</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Change your Status and your display</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">picture here.</p></body></html> + + + + + Online + + + + + Busy + + + + + Be right Back + + + + + Away + + + + + In a Call + + + + + Out of lunch + + + + + Apear Offline + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Share a personal message with your contacts</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Add a Friend</p></body></html> + + + + + Chat + + + + + Connect To Friend + + + + + NetworkDialog + + + Peer Details / Authenticate + åŒç­‰è€…ã®ç´°éƒ¨ã¯/èªè¨¼ã™ã‚‹ + + + + Load Certificate + è² è·è¨¼æ˜Žæ›¸ + + + + Select a pem/pqi File + ファイルをé¸ã³ãªã•ã„ PEM/PQI + + + + File Not Found + 見ã¤ã‘られãªã„ファイル + + + + %1 does not exist. Would you like to create it? + %1 存在ã—ã¦ã„ãªã„. ãれを作æˆã™ã‚‹ã®ã‚’好むã‹ã€‚ + + + + Failed to Create File + ファイルを作æˆã•ã‚Œãªã„ + + + + Unable to create %1 [%2] + ãªã„作æˆã™ã‚‹ã“㨠%1 [%2] + + + + Select Certificate + 証明書をé¸ã³ãªã•ã„ + + + + Certificates (*.pqi *.pem) + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯:</span></p></body></html> + + + + # + + + + + Accept + å—容 + + + + Trust + ä¿¡é ¼ + + + + Last Contact + 最後ã®æŽ¥è§¦ + + + + Name + åå‰ + + + + Peer Address + åŒç­‰è€…ã®ä½æ‰€ + + + + Organisation + æ§‹æˆ + + + + Location + ä½ç½® + + + + Country + 国 + + + + Cert Id + 証明ã®åŒä¸€ç•ªå· + + + + Auth Code + èªè¨¼ã‚³ãƒ¼ãƒ‰ + + + + NetworkPage + + + Rate Options + 速度ã®é¸æŠž + + + + Max Total Data Rate (KB/S): + ã‚ãªãŸã®æœ€é«˜ã®ã‚¢ãƒƒãƒ—ロードã®é€Ÿåº¦ (KB/S): + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Rate per Person (KB/S):</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">一人ã«ã¤ã速度 (KB/S):</p></body></html> + + + + PeersDialog + + + Chat + 雑談 + + + + Configure Friend + å‹äººã‚’å½¢æˆã—ãªã•ã„ + + + + Export Friend + 輸出å‹äºº + + + + Remove Friend + å‹äººã‚’å–除ããªã•ã„ + + + + Save Certificate + 証明書を救ã„ãªã•ã„ + + + + Certificates (*.pqi) + 証明書(*.pqi) + + + + Status + 状態 + + + + Person + 人 + + + + Auto Connect + 自動的ã«æŽ¥ç¶šã—ãªã•ã„ + + + + Trust Level + 信頼レベル + + + + Peer Address + åŒç­‰è€…ã®ä½æ‰€ + + + + Last Contact + 最後ã®æŽ¥è§¦ + + + + Organisation + æ§‹æˆ + + + + Location + ä½ç½® + + + + Country + 国 + + + + Person Id + 人ã®åŒä¸€ç•ªå· + + + + Auth Code + 証明コード + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Friends</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">å‹äºº</span></p></body></html> + + + + Connect To Friend + å‹äººã«æŽ¥ç¶šã—ãªã•ã„ + + + + # + + + + + PopupChatDialog + + + RetroShare Friend Chat + Retroshareã®å‹äººã®é›‘談 + + + + RetroShare User Chat + + + + + PreferencesDialog + + + Language + 言語 (Language) + + + + Style + æ§˜å¼ + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">言語ã¸ã®å¤‰æ›´ã¯å†å§‹å‹•ã®å¾Œã ã‘ã§å®Ÿæ–½ã•ã‚Œã‚‹!</p></body></html> + + + + Style Sheet + スタイルシート + + + + Default + デフォルト + + + + Pagefold + Pagefold + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose RetroShare's interface style</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">インターフェイス様å¼ã‚’é¸ã³ãªã•ã„</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose the language used in RetroShare</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">言語をé¸ã³ãªã•ã„</p></body></html> + + + + blue + é’ã„ + + + + silver + 銀 + + + + ed2k + é›»å­ã‚ã° emule.sf.net ed2k + + + + over + over + + + + black + é»’ + + + + arachnophobia + arachnophobia + + + + Skin2 + çš®2 + + + + Login + ログイン (Login) + + + + Remove Auto Login + 自動ログインをå–除ããªã•ã„ + + + + PreferencesWindow + + + Directories + 登録簿 + + + + Error Saving Configuration + é–“é•ã„ã®ã‚»ãƒ¼ãƒ“ãƒ³ã‚°æ§‹æˆ + + + + About + ã«ã¤ã„㦠+ + + + General + æ¦‚è¦ + + + + Server + åŒç­‰è€…ノード設定 + + + + Options + é¸æŠž + + + + Cancel + å–り消㗠+ + + + OK + ã‚ã‹ã‚Šã¾ã—ãŸ(OK) + + + + QObject + + + Name + åå‰ + + + + Path + + + + + Extension + + + + + Date + + + + + Size + + + + + Popularity + + + + + contains + + + + + contains all + + + + + is + + + + + less than + + + + + less than or equal + + + + + greater than or equal + + + + + greater than + + + + + is in range + + + + + and + + + + + and / or + + + + + or + + + + + equals + + + + + Rshare + + + Invalid language code specified: + 指定ã•ã‚Œã‚‹ç„¡åŠ¹ãªè¨€èªžã‚³ãƒ¼ãƒ‰: + + + + Invalid GUI style specified: + 無効ãªGUI様å¼ã¯æŒ‡å®šã—ãŸ: + + + + SearchDialog + + + File Name + ファイルåå‰ + + + + Sources + æº + + + + Search Pattern + 調査パターン + + + + Results + çµæžœ + + + + File Size + ファイルサイズ + + + + Download + ダウンロード + + + + Broadcast on Channel + ãƒãƒ£ãƒãƒ«ã®æ”¾é€ + + + + Recommend to Friends + å‹äººã«æŽ¨è–¦ã—ãªã•ã„ + + + + Remove + å–除ããªã•ã„ + + + + Remove All + ã™ã¹ã¦ã‚’å–除ããªã•ã„ + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Keywords</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">キーワード</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Format</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">フォーマット</p></body></html> + + + + Any + フォーマット + + + + Audio + å¯è´å‘¨æ³¢éŸ³æ¥½ + + + + Video + ビデオ映画 + + + + Images + イメージ + + + + Programs + プログラム + + + + Archives + アーカイブ + + + + Documents + 文書 + + + + search + 調査 + + + + download + ダウンロード + + + + Toggle advanced searching on and off. + + + + + <h3>Simple Search:</h3> + + + + + Keywords + + + + + Perform simple search + + + + + Show Advanced Search Tool + + + + + Filename + + + + + Hash + + + + + KeyWords + + + + + Search Id + + + + + <h3>Advanced Search:</h3> + + + + + ServerDialog + + + Transfer Rates + 移動ã®é€Ÿåº¦ + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Total Rate (kb/s) </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ã‚ãªãŸã®æœ€é«˜ã®ã‚¢ãƒƒãƒ—ロードã®é€Ÿåº¦ (KB/S) </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Per Person </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">一人ã«ã¤ã </p></body></html> + + + + Server Settings + åŒç­‰è€…ã®è¨­å®š + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ç¾ä½æ‰€: </p></body></html> + + + + Port: + 港: + + + + behind zee Firewall + 防ç«å£ã®å¾Œã‚ + + + + Forwarded External Port + 進ã‚られãŸå¤–çš„ãªæ¸¯(ルーター) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">港: </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">外部å</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">外的ãªä½æ‰€:</p></body></html> + + + + Check Settings + 点検ã®è¨­å®š + + + + Firewall/Router Configuration + + + + + Manual router setup. + + + + + Use uPnP to configure router + + + + + Network Address Configuration (takes effect after restart) + + + + + Use DHT to locate friends + + + + + Manual IP Addresses + + + + + Server Status And Network Settings + + + + + Firewalled + + + + + Forwarded Port + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">DHT Status</p></body></html> + + + + + uPnP Status + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Local Address:</p></body></html> + + + + + ServerPage + + + Change + Restart Server + 変更+å†å§‹å‹• + + + + Server Settings + åŒç­‰è€…ã®è¨­å®š + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">外的ãªä½æ‰€:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ç¾ä½æ‰€: </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + + + + Port: + 港: + + + + Misc + 雑多 + + + + behinde Firewall + 防ç«å£ã®å¾Œã‚ + + + + Forwarded External Port + 進ã‚られãŸå¤–çš„ãªæ¸¯(ルーター) + + + + Settings + + + Settings +  設定 + + + + Cancel + å–り消㗠+ + + + Apply + é©ç”¨ã—ãªã•ã„ + + + + OK + ã‚ã‹ã‚Šã¾ã—㟠(OK) + + + + General + æ¦‚è¦ + + + + Network + ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ + + + + Server + åŒç­‰è€…ã®è¨­å®š + + + + Directories + 登録簿 + + + + SharedFilesDialog + + + Download +  ダウンロード + + + + Recommend + 推薦ã—ãªã•ã„ + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">ファイル</span></p></body></html> + + + + Add to Recommend List + + + + + Recommend To + + + + + Message Friend + + + + + StartDialog + + + Select Trusted Friend + ä¿¡é ¼ã•ã‚ŒãŸå‹äººã‚’é¸ã³ãªã•ã„ + + + + Certificates (*.pqi *.pem) + 証明書 (*.pqi *.pem) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:13pt; font-weight:600; color:#8b0000;">Welcome to RetroShare</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:13pt; font-weight:600; color:#8b0000;">Retroshareã¸ã®æ­“è¿Ž </span></p></body></html> + + + + Please Login .... + ログイン…. (Login) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">åå‰:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Pasword</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">パスワード </span></p></body></html> + + + + Load Existing User + è² è·æ—¢å­˜ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ + + + + Or create a New User + ã¾ãŸã¯æ–°ã—ã„ユーザーを作æˆã—ãªã•ã„ + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Organisation:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">構æˆ:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">国:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Location:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ä½ç½®:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Password (Again)</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">パスワード(å†åº¦)</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">New Password</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">æ–°ã—ã„パスワード </span></p></body></html> + + + + Load Trusted Certificate (Optional) + è² è·ä¿¡è¨—証券(ä»»æ„) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">å‹äºº</span></p></body></html> + + + + Select File + ファイルをé¸ã³ãªã•ã„ + + + + Generate New Certificate + æ–°ã—ã„証明書を発生ã•ã›ãªã•ã„ + + + + RetroShare setup + Retroshareã®çµ„ã¿ç«‹ã¦ + + + + Automatically Login in Future + å°†æ¥è‡ªå‹•çš„ã«ãƒ­ã‚°ã‚¤ãƒ³ + + + + RetroShare + + + + + QWidget { + background-color: #ECF3F6; +} + + + + + Auto-login + + + + + Name: + + + + + Log In + + + + + Password: + + + + + Create a Account + + + + + QToolButton{ +border-image: url(:/images/avatar_background.png); + +} + + + + + + StatisticDialog + + + Statistics + çµ±è¨ˆé‡ + + + + Download + ダウンロード + + + + Session: + Session: + + + + Downloaded: + Downloaded: + + + + Average Downloadspeed: + Average Downloadspeed: + + + + Count of Downloads: + Count of Downloads: + + + + Overall + Overall + + + + Upload + Upload + + + + Session + Session + + + + Uploaded: + Uploaded: + + + + Average Uploadspeed: + Average Uploadspeed: + + + + Count of Uploads: + Count of Uploads: + + + + Uploaded + Uploaded + + + + Connections: + Connections: + + + + Peers: + Peers: + + + + Misc + Misc + + + + Uptime: + Uptime: + + + + Overall: + Overall: + + + + Uptime + Uptime + + + + Records + Records + + + + Uploadspeed: + Uploadspeed: + + + + Downloadspeed: + Downloadspeed: + + + + Show Settings + Show Settings + + + + Reset + Reset + + + + Receive Rate + Receive Rate + + + + Send Rate + Send Rate + + + + Always On Top + Always On Top + + + + 100 + 100 + + + + % Opaque + % Opaque + + + + Changes the transparency of the Bandwidth Graph + 帯域幅グラフã®é€æ˜Žç‰©ã‚’変ãˆã‚‹ + + + + Save + Save + + + + Cancel + å–り消㗠+ + + + Hide Settings + Hide Settings + + + + TransfersDialog + + + Cancel + å–り消㗠+ + + + Clear Completed + ゆã¨ã‚Šã¯å®Œäº†ã—㟠+ + + + File Name + ファイルåå‰ + + + + Sources + æº + + + + Status + 状態 + + + + File Size + ファイルサイズ + + + + Speed + 速度 + + + + Progress + 進歩 + + + + Completed + 完了ã•ã‚Œã‚‹ + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Downloads:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">ダウンロード (Downloads):</span></p></body></html> + + + + Peer Name + åŒç­‰è€…ã®åå‰ + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Uploads:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">アップロード(Uploads):</span></p></body></html> + + + + Name + i.e: file name + åå‰ + + + + Size + i.e: file size + + + + + Progress + i.e: % downloaded + 進歩 + + + + Speed + i.e: Download speed + 速度 + + + + Sources + i.e: Sources + æº + + + + Remaining + i.e: Estimated Time of Arrival / Time left + + + + + Core-ID + + + + + User Name + i.e: user name + + + + + Progress + i.e: % uploaded + 進歩 + + + + Speed + i.e: upload speed + 速度 + + + + Transferred + + + + + ULListDelegate + + + B + + + + + KB + + + + + MB + + + + + GB + + + + + VMessageBox + + + OK + ã‚ã‹ã‚Šã¾ã—㟠(OK) + + + + Cancel + å–り消㗠+ + + + Yes + ã¯ã„ + + + + No + ã„ã„㈠+ + + + Help + 助㑠+ + + + Retry + å†è©¦è¡Œ + + + + Show Log + ショーã®æ­´å² + + + + Show Settings + ショーã®è¨­å®š + + + + moreinfo + + + Details + 細部 + + + + OK + ã‚ã‹ã‚Šã¾ã—㟠(OK) + + + + Name + åå‰ + + + + Value + 価値 + + + diff --git a/retroshare-gui/src/lang/retroshare_kr.qm b/retroshare-gui/src/lang/retroshare_kr.qm new file mode 100644 index 000000000..a18b3ec1a Binary files /dev/null and b/retroshare-gui/src/lang/retroshare_kr.qm differ diff --git a/retroshare-gui/src/lang/retroshare_kr.ts b/retroshare-gui/src/lang/retroshare_kr.ts new file mode 100644 index 000000000..f56d466cc --- /dev/null +++ b/retroshare-gui/src/lang/retroshare_kr.ts @@ -0,0 +1,3974 @@ + + + + + + + Arial + Arial + + + + AddFriendDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;"> To add a new Friend, cut and paste their email </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">invitation into the box below, and click done.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">새로운 친구, ìž˜ë¼ ë¶™ì´ê¸° ê·¸ë“¤ì˜ ì „ìž ìš°íŽ¸ 안내장 ìƒìžë¡œ 아래 </span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">ì— ì¶”ê°€í•˜ê¸° 위하여. 그리고 잘 ë˜ëŠ” 누르기. </p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;"></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + Cancel + 취소 + + + + Done + 하는 + + + + Load From File + 파ì¼ì—ì„œ ì§ + + + + RetroShare + Retroshare (ë’¤ì—몫) + + + + Certificate Load Failed + ì¦ëª…ì„œ ì§ì€ 실패했다 + + + + Add a Friend + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"><span style=" font-size:16pt;">Add a new Friend</span><br /><br /><span style=" font-size:10pt;">To add a new Friend, cut and paste their email </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">invitation into the box below, and click done.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + + + + + AddFriendWizard + + + < Back + + + + + Next > + + + + + Cancel + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">This Wizard helps to Connect to your Friends</span></p></body></html> + + + + + I have a .pqi/.pem file received from a Friend + + + + + I have Key received from a Friend + + + + + I want to invite a friend to my RetroShare network + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Cut and paste the text below into an email.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;"> and send it to all your friends!</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">When you press next RetroShare will attempt to launch a Email client.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Invite your Friends to join with RetroShare</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Enter the Key code you got from your friend:</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">When you press next RetroShare will attempt to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">connect using the key.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Select a pqi/pem file:</span></p></body></html> + + + + + Browse + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">When you press next RetroShare will attempt to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">connect using the .pqi/.pem file.</p></body></html> + + + + + Add Friend to my netowork Wizard + + + + + AdvancedSearchDialog + + + RetrosShare: Advanced Search + + + + + Add a further search criterion. + + + + + Add a selection criterion + + + + + Reset + + + + + Cancels the search. + + + + + Cancel + + + + + Perform the advanced search. + + + + + Search + + + + + Search Criteria + + + + + Reset the search criteria. + + + + + ApplicationWindow + + + RetroShare %1 + + + + + Example Application + + + + + Application Users: 0 Files: 0 + + + + + Down: 0.0 Up: 0.0 + + + + + Connections: 0/45 + + + + + Hide + + + + + Show + + + + + RetroShare + + + + + Home + + + + + General + + + + + Advanced + + + + + QTextBrowser { + background-color: rgb(192,192,192); + + } + + + + + QPushButton + { + border-image: url(:/images/console-small-up.png) + } + + QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + + } + + QPushButton:pressed { + border-image: url(:/images/console-small-down.png) + } + + + + + + AuthorizationDialog + + + Authenticate + 확ì¸í•˜ì‹­ì‹œì˜¤ + + + + Authenticate Friend By Entering Their Code + 부호를 입력해서 친구를 확ì¸í•˜ì‹­ì‹œì˜¤ + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">ìž…ì¦ ë¶€í˜¸:</span></p></body></html> + + + + OK + 좋습니다 + + + + Cancel + 취소 + + + + BandwidthGraph + + + RetroShare Bandwidth Usage + + + + + Show Settings + + + + + Reset + + + + + Receive Rate + + + + + Send Rate + + + + + Always on Top + + + + + Style + + + + + Changes the transparency of the Bandwidth Graph + + + + + 100 + + + + + % Opaque + + + + + Save + + + + + Cancel + + + + + Since: + + + + + Hide Settings + + + + + CallToaster + + + Message + + + + + ChanCreateDialog + + + Create a new Broadcast Channel + 새로운 방송 채ë„ì„ ì°½ì¡°í•˜ì‹­ì‹œì˜¤ + + + + Create A New Broadcast Channel + 새로운 방송 채ë„ì„ ì°½ì¡°í•˜ì‹­ì‹œì˜¤ + + + + Channel Name: + ì±„ë„ ì´ë¦„: + + + + Type: + 유형: + + + + Public Channel (Signed) + (서명ë˜ëŠ”) 공중 ì±„ë„ + + + + Private Channel (Encrypted) + (암호로 ê³ ì³ ì“°ëŠ”) ê°œì¸ ì±„ë„ + + + + Cancel Channel + 취소 ì±„ë„ + + + + Create Channel + 채ë„ì„ ì°½ì¡°í•˜ì‹­ì‹œì˜¤ + + + + ChanMsgDialog + + + Compose + 구성하십시오 + + + + Recommended Files + ì¶”ì²œëœ íŒŒì¼ + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-weight:400;"><span style=" font-weight:600;">Subject:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-weight:400;"><span style=" font-weight:600;">제목 표제:</span></p></body></html> + + + + Send To: + ì— ë³´ë‚´ì‹­ì‹œì˜¤: + + + + Send + 보내십시오 + + + + Delete Channel + ê°ì†Œ ì±„ë„ + + + + Create Channel MSG + ì±„ë„ ë©”ì‹œì§€ë¥¼ 창조하십시오 + + + + 1 + + + + + Reply + + + + + ChannelsDialog + + + New Message + 새로운 메시지 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Messages</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">메시지</span></p></body></html> + + + + Date + 날짜 + + + + Rank + 계급 + + + + From + ì—ì„œ + + + + Title + 제목 + + + + Msg + 메시지 + + + + Count + 조사 + + + + Size + í¬ê¸° + + + + Type + 유형 + + + + Rs[Cert/Chan]IdSize + Rs[Cert/Chan]ID í¬ê¸° + + + + RsMsgId + 메시지 신분 ì¦ëª… 번호 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Message Text</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">메시지 í…스트</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Recommended Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">ì¶”ì²œëœ íŒŒì¼</span></p></body></html> + + + + New Channel + 새로운 ì±„ë„ + + + + Subscribe To Channel + 채ë„ì„ êµ¬ë…하십시오 + + + + Unsubscribe To Channel + 채ë„ì„ êµ¬ë… ì·¨ì†Œí•˜ì‹­ì‹œì˜¤ + + + + Delete Your Channel + ë‹¹ì‹ ì˜ ì±„ë„ì„ ì‚­ì œí•˜ì‹­ì‹œì˜¤ + + + + Download + 다운로드 + + + + Download All + 모ë‘를 다운로드하십시오 + + + + ChatDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:9pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:400;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:9pt; font-weight:600; font-style:normal; text-decoration:none;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:400;"></p></body></html> + + + + Chat History: + ìž¡ë‹´ 역사: + + + + Chat With: + ìž¡ë‹´ì„ ê°€ì§„: + + + + Chat + ìž¡ë‹´ + + + + Users: + + + + + ChatToaster + + + message + 메시지 + + + + You Get a New Message + ë‹¹ì‹ ì€ ìƒˆë¡œìš´ 메시지를 받는다 + + + + Message + + + + + ConfCertDialog + + + Cancel + 취소 + + + + Done + 하는 + + + + Apply + ì ìš©í•˜ì‹­ì‹œì˜¤ + + + + Peer Settings + ë™ë£Œ ì¡°ì • + + + + Port: + 항구: + + + + behind zee Firewall + ë°©í˜¸ë²½ì˜ ë’¤ì— + + + + Forwarded External Port + ë°œì†¡ëœ ì™¸ë¶€ 항구 (대패) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">항구:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">외부 주소:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">외부 ì´ë¦„ </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">로컬 주소:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Max Transfer Rate (kb/s) </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ë‹¹ì‹ ì˜ ìµœëŒ€ 올려주기 ì†ë„ (kb/s) </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Org / Loc:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ì¡°ì§/위치 </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ì´ë¦„: </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Country/State:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">êµ­ê°€/êµ­ê°€:</p></body></html> + + + + Trust Settings + ì‹ ë§ ì¡°ì • + + + + Trust Level + ì‹ ë§ ìˆ˜ì¤€ + + + + Trust Their Signature + ê·¸ë“¤ì˜ ì„œëª…ì„ ì‹ ë¢°í•˜ì‹­ì‹œì˜¤ + + + + Sign The Certificate + ì¦ëª…서를 서명하십시오 + + + + OK + + + + + Peer Adress + + + + + Peer Info + + + + + ConfirmQuitDialog + + + Exit RetroShare + + + + + You are about to exit the RetroShare application and therefore stop all transfers. <br><br>Are you sure you want to stop and exit RetroShare? + + + + + Do not show this message again. + + + + + ConnectDialog + + + Peer Details + ë™ë£Œ 세부사항 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">êµ­ê°€:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Org:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ì¡°ì§:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ì´ë¦„:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Trust:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ì‹ ë§:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Loc:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">위치:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Certificate</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">signers:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ì¦ëª…ì„œ</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">서명ìž:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">ìž…ì¦ ë¶€í˜¸:</span></p></body></html> + + + + Make Friend + 친구를 사귀십시오 + + + + Close + 마지막 + + + + ConnectionsDialog + + + Load Certificate + ì§ ì¦ëª…ì„œ + + + + Select a pem/pqi File + 파ì¼ì„ 선정하십시오 PEM/PQI + + + + File Not Found + 찾아내지 않는 íŒŒì¼ + + + + %1 does not exist. Would you like to create it? + %1 존재하지 않는다.ë‹¹ì‹ ì€ ê·¸ê²ƒì„ ì°½ì¡°í•˜ê³  싶ì€ê°€ í•˜ê³ ìž í–ˆëŠ”ê°€? + + + + Failed to Create File + 파ì¼ì„ 창조하지 못하는. + + + + Unable to create %1 [%2] + 창조할 수 없습니다 %1 [%2] + + + + Select Certificate + ì¦ëª…서를 선정하십시오 + + + + Certificates (*.pqi *.pem) + ì¦ëª…ì„œ (*.pqi *.pem) + + + + Accept + ìˆ˜ë½ + + + + Trust + ì‹ ë§ + + + + Last Contact + Last Contact + + + + Name + ì´ë¦„ + + + + Organisation + ì¡°ì§ + + + + Location + 위치 + + + + Country + êµ­ê°€ + + + + Peer Address + ë™ë£Œ 주소 + + + + Cert Id + ì¦ëª…ì„œ ID + + + + Auth Code + ìž…ì¦ ë¶€í˜¸ + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">네트워í¬:</span></p></body></html> + + + + Peer Details / Authenticate + ë™ë£Œ 세부사항ì€/확ì¸í•œë‹¤ + + + + CryptographyDialog + + + RSA Key Size + RSA 중요한 í¬ê¸° + + + + Rijndael Block size + Rijndael ë¸”ë¡ í¬ê¸° + + + + 128 Bits + 128 조금 + + + + 192 Bits + 192 조금 + + + + 256 Bits + 256 조금 + + + + Rijndael Key Size + Rijndael 중요한 í¬ê¸° + + + + Rijndael Mode + Rijndael 형태 + + + + CBC + CBC + + + + ECB + ECB + + + + CFB + CFB + + + + Rijndael Padding + Rijndael Padding + + + + PKCS7 + Rijndael Padding + + + + Zeros + Zeros + + + + ANSIX923 + ANSIX923 + + + + ISO10126 + ISO10126 + + + + Rijndael Feedback Size + Rijndael ì˜ê²¬ í¬ê¸° + + + + Key Size: + 중요한 í¬ê¸°: + + + + Block Size: + ë¸”ë¡ í¬ê¸°: + + + + Feedback Size: + ì˜ê²¬ í¬ê¸°: + + + + Mode: + 형태: + + + + Padding: + Padding: + + + + DLListDelegate + + + B + + + + + KB + + + + + MB + + + + + GB + + + + + DirectoriesDialog + + + Shared Directories + 공유 디렉토리 + + + + Other Directories + 다른 전화번호부 + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Incoming Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">들어오는 파ì¼</span></p></body></html> + + + + Add Shared Directory + 공유 디렉토리를 추가하십시오 + + + + DirectoriesPage + + + Shared Directories + 공유 디렉토리 + + + + Incoming files + 공유디렉토리 + + + + ExampleDialog + + + Vote Up + + + + + Vote Down + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Friends</span></p></body></html> + + + + + # + + + + + Status + + + + + Person + + + + + Auto Connect + + + + + Trust Level + + + + + Peer Address + ë™ë£Œ 주소 + + + + Last Contact + Last Contact + + + + Organisation + ì¡°ì§ + + + + Location + 위치 + + + + Country + êµ­ê°€ + + + + Person Id + + + + + Auth Code + ìž…ì¦ ë¶€í˜¸ + + + + ExprParamElement + + + to + + + + + ignore case + + + + + dd.MM.yyyy + + + + + KB + + + + + MB + + + + + GB + + + + + ExpressionWidget + + + Expression Widget + + + + + Delete this expression + + + + + FileHashDialog + + + Download + 다운로드 + + + + GSettingsWin + + + General + ì¼ë°˜ + + + + Network + ë„¤íŠ¸ì›Œí¬ + + + + Directories + 전화번호부 + + + + Server + ë™ë£Œ ì¡°ì • + + + + %1 + %1 + + + + GenCertDialog + + + RetroShare setup + Retroshare (ë’¤ì—몫) ì²´ì œ + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16pt;">Generate a new profile</span><br /><br />Please fill in the information which will<br />allow your RetroShare to connect to</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Friends.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Organisation:</p></body></html> + + + + + Password (Again) + + + + + Location: + + + + + Load Trusted Certificate (Optional) + (ì„ íƒ) ì§ íŠ¸ëŸ¬ìŠ¤íŠ¸ ì¸ì¦ì„œ + + + + Password + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">친구</span></p></body></html> + + + + Select File + 파ì¼ì„ 선정하십시오 + + + + Country: + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + + + + + Generate New Certificate + 새로운 ì¦ëª…서를 ìƒì„±í•˜ì‹­ì‹œì˜¤ + + + + Select Trusted Friend + 신뢰한 친구를 선정하십시오 + + + + Certificates (*.pqi *.pem) + ì¦ëª…ì„œ (*.pqi *.pem) + + + + GeneralPage + + + Keys manager + 열쇠 매니저 + + + + Style + ìž‘í’ + + + + Choose RetroShare's interface style + 공용ì˜ì—­ ìž‘í’ì„ ì„ íƒí•˜ì‹­ì‹œì˜¤ + + + + Language + 언어 (Language) + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ì–¸ì–´ì— ë³€í™”ëŠ” ì‹ ì²­ì„ ìž¬ì¶œë°œí•œ 후ì—서만 íš¨ë ¥ì„ ë‚˜íƒ€ë‚¼ 것ì´ë‹¤!</p></body></html> + + + + Choose the language used in RetroShare + ì´ ì¦‰ì‹œ 메신저ì—ì„œ ì‚¬ìš©ëœ ì–¸ì–´ë¥¼ ì„ íƒí•˜ì‹­ì‹œì˜¤ + + + + GraphFrame + + + Recv: + Recv: + + + + %1 KB/s + %1 KB/s + + + + Sent: + Sent: + + + + %1 KB + %1 KB + + + + %1 MB + %1 MB + + + + %1 GB + %1 GB + + + + HelpDialog + + + About + + + + + Authors + + + + + Thanks to + + + + + Translation + + + + + License Agreement + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">About/Help</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:xx-large; font-weight:600; color:#0000ff;">About RetroShare.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-weight:600;">Retroshare is a private and secure decentralised commmunication platform.<br />You can use it chat, send messages and share files with your friends.</span><br /><br />This is just a placeholder page for the moment. You can<br />improve retroshare's in-built help (this text) by<br />updating the retroshare wiki: <a href="http://retroshare.wiki.sourceforge.net/help_tab"><span style=" text-decoration: underline; color:#0000ff;">This Page in the retroshare Wiki</span></a><br /><br />The About/Help Tab is regularly updated from the Wiki page.<br /><br />External Links to more information:<br /></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.sourceforge.net"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Webpage</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.wiki.sourceforge.net/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Wiki</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://sourceforge.net/projects/retroshare/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Project Page</span></a></li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.lunamutt.com"><span style=" text-decoration: underline; color:#0000ff;">Lunamutt Homepage.</span></a></li></ul></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-size:19pt; font-weight:600; color:#0000ff;">The RetroShare Team:</span><br /> <br /><span style=" font-size:9pt; color:#0000ff;">defnax</span>: Lead GUI developer <br /><span style=" font-size:9pt; color:#0000ff;">drbob7</span>: Lead Core developer. <br /> <br /><span style=" font-size:9pt; color:#0000ff;">bmeck</span> : Our new web-developer. Joined retroshare a couple <br />of weeks ago, and already starting on an exciting new <br />design for the web-page. <br /> <br /><span style=" font-size:9pt; color:#0000ff;">noragen</span> : Developer from the SIM-IM project. Working on a retroshare plugin to SIM-IM. <br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">kernelpanix</span> : Gui and skin developer</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">libris</span><span style=" font-size:9pt;">:</span> core developer</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-size:9pt; color:#0000ff;">kashif: </span><span style=" color:#000000;">core developer</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt; color:#000000;"><span style=" font-size:8pt;"><br /></span><span style=" color:#0000ff;">agent725</span><span style=" font-size:8pt;">: Manages the 'local' Retroshare release, <br />and beta-testing retroshare on a large scale. <br /> <br /></span><span style=" color:#0000ff;">the_mgt</span><span style=" font-size:8pt;">: Maintains the Gentoo and generic linux <br />installation/compilation scripts. </span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">notdefine:</span> Maintains the .rpm, .deb installation/compilation scripts.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">zhouk</span>: developer</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Translators:</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Serbian</span>: Kunalagon Umuhanik &lt;kunalagon@gmail.com&gt;</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Polish: </span>Jarek</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">French</span>:Temet</p></body></html> + + + + + InviteDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">To </span><span style=" font-size:10pt; font-weight:600;">Invite your friends to join you with Retroshare: </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">Cut and paste the text below into an email.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">and send it to all your friends!</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">.</span><span style=" font-size:10pt; font-weight:600;">ë‹¹ì‹ ì˜ ì¹œêµ¬ë¥¼ ì´ ë©”ì‹ ì €ì™€ ë‹¹ì‹ ì„ ê²°í•©í•˜ë„ë¡ ì´ˆëŒ€í•˜ê¸° 위하여: </span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">ìž˜ë¼ ë¶™ì´ê¸° ì „ìž ìš°íŽ¸ìœ¼ë¡œ ì›ë³¸ 아래ì—.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">그리고 모든 ë‹¹ì‹ ì˜ ì¹œêµ¬ì—게 ê·¸ê²ƒì„ ë³´ë‚´ì‹­ì‹œì˜¤!</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + Done + 하는 + + + + Cancel + 취소 + + + + Launch Email + 발사 í‰ë²”í•œ ì „ìž ìš°íŽ¸ + + + + Invite a Friend + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"><span style=" font-size:16pt;">Invite a Friend</span><br /><br /><span style=" font-size:10pt;">To Invite your friends to join you with Retroshare: </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">Cut and paste the text below into an email.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">and send it to all your friends!</p></body></html> + + + + + LogDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> + +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="ABOUT"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">About RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShare is a private peer to peer communication platform created by Dr. Bob.This program enables you to securely share files and chat with your friends (and no-one else!).</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, and the latest release go to http://www.lunamutt.com.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="START"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Quick Start Guide to RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If this is your first time using Retroshare, it is recommended that you readthis guide for instructions on how to get started. The first step is:<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Connecting to Your Friends</span></a>. Once you have managed this you can <a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">Download Files</span></a> and<a href="#START-SHARE"><span style=" text-decoration: underline; color:#0000ff;">Share with Others</span></a></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Some of the key concepts related to ensuring your sharing remains private aredescribed in the <a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">Frequently Asked Questions</span></a>. Some Key security questions are:<a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">What is a Web of Trust?</span></a>, <a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">Should I Sign this Certificate?</span></a>, and finally<a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">What does "Trust" Mean?</span></a>.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is also worthwhile reading the <a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">GUI Overview</span></a>which describes the featureson available through the User Interface.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Connecting to your Friends </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">There are four steps to connecting to a Friend:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Get Friend's Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Load Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Sign Certificate</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect to Friend.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The instructions might initially appear long and daunting, however thesesteps are required to ensure that your sharing is private and secure.These steps are only required a couple of times, to add new friends, and become quite straight forward after the first time.</p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (1) EXCHANGE CERTIFICATES </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Before you can connect, you need send your certificate to your friend, and get your friends certificate. Follow these steps to get your certificate:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on Your Certificate to Select it.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on the "Export Friend" Button to bring up a file save dialog.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select directory to save the certificate to.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Enter desired filename. (with a file type of .pqi), and Click OK.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Email this File to your Friend. (It is recommended you put thecertificate in a zip file before sending, as some email programsdon't transmit the file correctly).</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Ask your friend to do the same.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Once you have received your friend's certificate, removed itfrom the zip file and saved it to disk, you can proceed to step (2).</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Note: This exchange of certificates is only necessary to get you started.Once you are connected to some friends the exchange of certificates becomeautomated by the autoDiscovery system. See<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">GUI: Connecting</span></a> for more information.------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (2) LOAD YOUR FRIEND'S CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Import Friend"</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select your friends certificate file, then click "Okay". Their certificate should appear in the top window of the "Connect" Tab.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (3) SIGN CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select their Certificate by clicking on their name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Configure Friend" Button. This will bring up a configuration window. which allows you to look at the detailsof the certificate.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click the "Sign Certificate" button near the bottom of the "Certificate Configuration" Window.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Now close the window by clicking on the "Done" button.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Your Friends certificate should now say "Trusted (S)", indicating it is ready for connections.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can only share with "Trusted" Peers. You must sign your Friend'scertificate to prove that you know the certificate belongs to your Friend. Do not sign any/all certificates - only the people youtrust. For more information see: <br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br />------------------------------------------------------------------------<br /><br /> <br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (4) AUTOCONNECT TO PEER </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Finally You need to activate the connection:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click in the Box, next to your friends Name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> A Tick should appear in the box, a connection will be started.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> The "Offline" will change to "Online" when you have successfullyconnected.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Remember: Your initial connection attempts will fail, until your friend has signed your certificate and ticked the Auto-Connect Box.This ensures that both peers trust each other, and stops random peopleaccessing your files.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>. <br />------------------------------------------------------------------------<br /><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-DOWNLOAD"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Downloading Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have connected to friends, you can download their shared files.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can search for the files you want using either:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) File Listing Tab: This gives you a directory view of the files being shared by your peers. Double clickon the directory name (not the arrow) to diplay its subdirectories and files.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 1: This can take up to 5 seconds to fetch the information for your peer.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 2: If the directory is empty, or the person is offline, then the request will silently fail.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Search Tab: Retroshare also allows you to search your peers computers for filenames. Enter yourterm(s) in the search box at the top of the TAB and click the "Search" button. This willsearch all of the peers that you are currently connected to.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 3: If any matching files are found they will be displayed within 5 - 10 seconds.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have found the files you want, Select the file(s), and click "Download" to begin the download process.If you click over the "File Transfer" TAB, the status of the files will appear.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 4: The files can take up to 10 seconds to appear in the transfer window.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-SHARING"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Sharing Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can specify which files you want to share in the "Config" Tab.In the "Share Directories" section, click the "Add Directory" Button, and select the directory you want to share.The files and subdirectories will become available for you peers.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can remove a directory from the Shared Directories List by clicking onthe directory name in the list, and then clicking "Remove Directory".</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="GUI"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Gui Overview (Tab Description) </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The GUI is divided up into several sections which can be accessed by clicking on the Tabs along the top of the main window. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect: Manage Connections and Friends.(<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">getting started</span></a> and<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Listing: A directory view of available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Search: Search for available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Messages: For Sending/Recving Message. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Channels: A broadcast/subscription system. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Transfer: Listing of Current and completed Transfers.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Config: Specify of share diectories and IP Addresses.(<a href="#GUI-CONFIG"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> About: Help and other Information.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Chat: Accessed by the clicking on the "Chat" button.</li></ul> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Connect Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Connect TAB consists of two windows. The upper windowshows a list of your friends. This window indicates each friendscurrent trust level, as well as their connection state.The "Trust_Lvl" Column indicates if the certificate has beenAuthenticated using the web of trust. You can only connect to "Trusted" certificates. Tick the "Auto_Connect" box to connect to your trusted friends.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The lower window provides a list of the friends of your friends.This window shows the neighbour's name and how long ago they attempted to connect to you. This window is automatically populatedby the autoDiscovery system, and should be used to expand yourretroShare network. A word of warning: Do not automatically trust (or sign) anyonethat appears in this window. First verify by some other means (email/phone)that certificate belongs to the person you think it does.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use the "Neighbour List" window to expand your friend list. Select the desired entry in the lower window by clicking on it, then click the "Add to Friends" Button to move it to the upper window.Likewise the "Remove from Friends" button moved a person from the upper window to the lower window.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The "Configure Friend" Button opens a Certificate Configuration window.This window can be used to examine the certificate details, sign the certificate or manually change the peer's IP Address.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">See Also:<br /><a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Getting Started: Connecting to your friends</span></a>.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>.<br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONFIG"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Config Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Configuration Tab allows you to select the share directories, as well as the directory that downloaded files are saved to.<br />See <a href="#STARTUP-SHARING"><span style=" text-decoration: underline; color:#0000ff;">Sharing you Files</span></a> for details. </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Config Tab also allows you to control the IP Address and Portused by RetroShare. Under most cirumstances you do not need to changethese setting. If you are behind a firewall and can setup a forwarded port, the selected IP Address and Port should be specified here.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="FAQ"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Frequently Asked Questions </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">How does the security/privacy work? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShares uses a Web of Trust Authentication system to ensurethat your "friends" are your friends, and uses SSL to encryptthe communcications between peers. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What is a Web of Trust? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Web of Trust relies on a collection of peers to identify eachother. Look it up on the Web!</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-TRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What does "Trust" Mean in RetroShare?</span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Anyone can generate a certificate, with any name on it. So howdo you know that the certificate that claims to be from "Joe Bloggs"is really from your mate Joe. This is the "AuthenticationProblem". RetroShare uses a Web of Trust to Authenticate your peers.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-SIGN"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Should I Sign this Certificate? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should only sign a certificate if you are completely surethat it comes from the "right" person. If you sign a certificateyou are "Authenticating" the person to yourself and others.If you sign certificates that you haven't checked, then you aredestroying your own privacy and security.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">How do you verify a certificate? Use an alternative method ofcommunication to send the certificate: E.g. email or USB stick. This will improve you confidence that the certificate belongsto the correct person. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><span style=" font-size:small;"> </span><a name="FAQ-CONNECT"></a><span style=" font-size:small;">W</span><span style=" font-size:small;">hy won't it Connect?</span><span style=" font-size:small;"> </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A connection can fail for a number of reasons:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) Failed Authentication. Have both peers signed each otherscertificates? </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Firewalls. If both peers are behind firewalls then they cannotconnect directly. RetroShare has a built in proxy system to circumventfirewalls - However this can only function if both peers can connect to a common third party that is not behind a firewall. Thisis the most likely reason for initial connections to fail. The only solution to find a common friend that isn't firewalled (know anyone with Broadband?)</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(3) IP Addresses are wrong. You can manually examine and change these using the Certificate configuration.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +</body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="ABOUT"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">About RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ë” ì„¸ë¶€ì‚¬í•­ì„ ìœ„í•´ 웹사ì´íŠ¸ë¥¼ 보십시오: http://Retroshare.sf.net is a private peer to peer communication platform created by Dr. Bob.This program enables you to securely share files and chat with your friends (and no-one else!).</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, and the latest release go to http://www.lunamutt.com.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="START"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Quick Start Guide to RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If this is your first time using Retroshare, it is recommended that you readthis guide for instructions on how to get started. The first step is:<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Connecting to Your Friends</span></a>. Once you have managed this you can <a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">Download Files</span></a> and<a href="#START-SHARE"><span style=" text-decoration: underline; color:#0000ff;">Share with Others</span></a></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Some of the key concepts related to ensuring your sharing remains private aredescribed in the <a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">Frequently Asked Questions</span></a>. Some Key security questions are:<a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">What is a Web of Trust?</span></a>, <a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">Should I Sign this Certificate?</span></a>, and finally<a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">What does "Trust" Mean?</span></a>.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is also worthwhile reading the <a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">GUI Overview</span></a>which describes the featureson available through the User Interface.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Connecting to your Friends </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">There are four steps to connecting to a Friend:</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Get Friend's Certificate</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Load Certificate</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Sign Certificate</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect to Friend.</li></ul><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The instructions might initially appear long and daunting, however thesesteps are required to ensure that your sharing is private and secure.These steps are only required a couple of times, to add new friends, and become quite straight forward after the first time.</p><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (1) EXCHANGE CERTIFICATES </span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Before you can connect, you need send your certificate to your friend, and get your friends certificate. Follow these steps to get your certificate:</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on Your Certificate to Select it.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on the "Export Friend" Button to bring up a file save dialog.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select directory to save the certificate to.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Enter desired filename. (with a file type of .pqi), and Click OK.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Email this File to your Friend. (It is recommended you put thecertificate in a zip file before sending, as some email programsdon't transmit the file correctly).</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Ask your friend to do the same.</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Once you have received your friend's certificate, removed itfrom the zip file and saved it to disk, you can proceed to step (2).</li></ul><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Note: This exchange of certificates is only necessary to get you started.Once you are connected to some friends the exchange of certificates becomeautomated by the autoDiscovery system. See<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">GUI: Connecting</span></a> for more information.------------------------------------------------------------------------<br /><br /><br /></p><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (2) LOAD YOUR FRIEND'S CERTIFICATE </span></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Import Friend"</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select your friends certificate file, then click "Okay". Their certificate should appear in the top window of the "Connect" Tab.</li></ul><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">------------------------------------------------------------------------<br /><br /><br /></p><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (3) SIGN CERTIFICATE </span></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select their Certificate by clicking on their name.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Configure Friend" Button. This will bring up a configuration window. which allows you to look at the detailsof the certificate.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click the "Sign Certificate" button near the bottom of the "Certificate Configuration" Window.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Now close the window by clicking on the "Done" button.</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Your Friends certificate should now say "Trusted (S)", indicating it is ready for connections.</li></ul><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can only share with "Trusted" Peers. You must sign your Friend'scertificate to prove that you know the certificate belongs to your Friend. Do not sign any/all certificates - only the people youtrust. For more information see: <br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br />------------------------------------------------------------------------<br /><br /> <br /></p><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (4) AUTOCONNECT TO PEER </span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Finally You need to activate the connection:</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click in the Box, next to your friends Name.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> A Tick should appear in the box, a connection will be started.</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> The "Offline" will change to "Online" when you have successfullyconnected.</li></ul><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Remember: Your initial connection attempts will fail, until your friend has signed your certificate and ticked the Auto-Connect Box.This ensures that both peers trust each other, and stops random peopleaccessing your files.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>. <br />------------------------------------------------------------------------<br /><br /><br /></p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-DOWNLOAD"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Downloading Files </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have connected to friends, you can download their shared files.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can search for the files you want using either:</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) File Listing Tab: This gives you a directory view of the files being shared by your peers. Double clickon the directory name (not the arrow) to diplay its subdirectories and files.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 1: This can take up to 5 seconds to fetch the information for your peer.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 2: If the directory is empty, or the person is offline, then the request will silently fail.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Search Tab: Retroshare also allows you to search your peers computers for filenames. Enter yourterm(s) in the search box at the top of the TAB and click the "Search" button. This willsearch all of the peers that you are currently connected to.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 3: If any matching files are found they will be displayed within 5 - 10 seconds.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have found the files you want, Select the file(s), and click "Download" to begin the download process.If you click over the "File Transfer" TAB, the status of the files will appear.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 4: The files can take up to 10 seconds to appear in the transfer window.</p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-SHARING"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Sharing Files </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can specify which files you want to share in the "Config" Tab.In the "Share Directories" section, click the "Add Directory" Button, and select the directory you want to share.The files and subdirectories will become available for you peers.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can remove a directory from the Shared Directories List by clicking onthe directory name in the list, and then clicking "Remove Directory".</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="GUI"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Gui Overview (Tab Description) </span><span style=" font-size:medium;"> </span></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The GUI is divided up into several sections which can be accessed by clicking on the Tabs along the top of the main window. </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect: Manage Connections and Friends.(<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">getting started</span></a> and<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Listing: A directory view of available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Search: Search for available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Messages: For Sending/Recving Message. (Coming Soon)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Channels: A broadcast/subscription system. (Coming Soon)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Transfer: Listing of Current and completed Transfers.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Config: Specify of share diectories and IP Addresses.(<a href="#GUI-CONFIG"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> About: Help and other Information.</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Chat: Accessed by the clicking on the "Chat" button.</li></ul><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Connect Tab </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Connect TAB consists of two windows. The upper windowshows a list of your friends. This window indicates each friendscurrent trust level, as well as their connection state.The "Trust_Lvl" Column indicates if the certificate has beenAuthenticated using the web of trust. You can only connect to "Trusted" certificates. Tick the "Auto_Connect" box to connect to your trusted friends.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The lower window provides a list of the friends of your friends.This window shows the neighbour's name and how long ago they attempted to connect to you. This window is automatically populatedby the autoDiscovery system, and should be used to expand yourretroShare network. A word of warning: Do not automatically trust (or sign) anyonethat appears in this window. First verify by some other means (email/phone)that certificate belongs to the person you think it does.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use the "Neighbour List" window to expand your friend list. Select the desired entry in the lower window by clicking on it, then click the "Add to Friends" Button to move it to the upper window.Likewise the "Remove from Friends" button moved a person from the upper window to the lower window.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The "Configure Friend" Button opens a Certificate Configuration window.This window can be used to examine the certificate details, sign the certificate or manually change the peer's IP Address.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">See Also:<br /><a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Getting Started: Connecting to your friends</span></a>.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>.<br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br /></p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONFIG"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Config Tab </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Configuration Tab allows you to select the share directories, as well as the directory that downloaded files are saved to.<br />See <a href="#STARTUP-SHARING"><span style=" text-decoration: underline; color:#0000ff;">Sharing you Files</span></a> for details. </p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Config Tab also allows you to control the IP Address and Portused by RetroShare. Under most cirumstances you do not need to changethese setting. If you are behind a firewall and can setup a forwarded port, the selected IP Address and Port should be specified here.</p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="FAQ"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Frequently Asked Questions </span><span style=" font-size:medium;"> </span></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">How does the security/privacy work? </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShares uses a Web of Trust Authentication system to ensurethat your "friends" are your friends, and uses SSL to encryptthe communcications between peers. </p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What is a Web of Trust? </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Web of Trust relies on a collection of peers to identify eachother. Look it up on the Web!</p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-TRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What does "Trust" Mean in RetroShare?</span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Anyone can generate a certificate, with any name on it. So howdo you know that the certificate that claims to be from "Joe Bloggs"is really from your mate Joe. This is the "AuthenticationProblem". RetroShare uses a Web of Trust to Authenticate your peers.</p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-SIGN"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Should I Sign this Certificate? </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should only sign a certificate if you are completely surethat it comes from the "right" person. If you sign a certificateyou are "Authenticating" the person to yourself and others.If you sign certificates that you haven't checked, then you aredestroying your own privacy and security.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">How do you verify a certificate? Use an alternative method ofcommunication to send the certificate: E.g. email or USB stick. This will improve you confidence that the certificate belongsto the correct person. </p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><span style=" font-size:small;"> </span><a name="FAQ-CONNECT"></a><span style=" font-size:small;">W</span><span style=" font-size:small;">hy won't it Connect?</span><span style=" font-size:small;"> </span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A connection can fail for a number of reasons:</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) Failed Authentication. Have both peers signed each otherscertificates? </p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Firewalls. If both peers are behind firewalls then they cannotconnect directly. RetroShare has a built in proxy system to circumventfirewalls - However this can only function if both peers can connect to a common third party that is not behind a firewall. Thisis the most likely reason for initial connections to fail. The only solution to find a common friend that isn't firewalled (know anyone with Broadband?)</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(3) IP Addresses are wrong. You can manually examine and change these using the Certificate configuration.</p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table></body></html> + + + + MainWindow + + + Preferences + 특혜 + + + + Network + ë„¤íŠ¸ì›Œí¬ + + + + Friends + 메시지 ë‹¹ì‹ ì˜ ì¹œêµ¬ + + + + Transfers + 파ì¼-전송 + + + + Messages + ì „ìž ìš°íŽ¸ 메시지 + + + + Channels + 수로 + + + + Options + ì„ íƒê¶Œ + + + + Users: 0 Files: 0 + 사용ìž: 0 신청한다: 0 + + + + Down: 0.0 Up: 0.0 + 아래로: 0.0 ë†’ì€ ìª½ìœ¼ë¡œ: 0.0 + + + + Connections: 0/45 + ì—°ê²°: 0/45 + + + + System tray is unavailable + 체계 ìŸë°˜ì€ ì´ìš©í•  수 없다 + + + + System tray unavailable + 체계 ìŸë°˜ì€ ì´ìš©í•  수 없다 + + + + RetroShare System tray + Retroshare 체계 ìŸë°˜ + + + + Application will continue running. Quit using context menu in the system tray + ì‹ ì²­ì€ ë‹¬ë¦¬ëŠ” 계ì†ë˜.체계 ìŸë°˜ì— 있는 문맥 메뉴를 사용하는 종료하는. + + + + Hide + ì€ì‹ ì²˜ + + + + Show + 쇼 + + + + RetroShare + Retroshare (ë’¤ì—몫) + + + + Home + 가정 + + + + General + ì¼ë°˜ + + + + Invite Friend + 친구를 초대하십시오 + + + + Add Friend + 친구를 추가하십시오 + + + + Add Share + ëª«ì„ ì¶”ê°€í•˜ì‹­ì‹œì˜¤ + + + + Advanced + ì§„ë³´ëœ + + + + QTextBrowser { + background-color: rgb(192,192,192); + +} + QTextBrowser { background-color: rgb(192,192,192);} + + + + QPushButton +{ + border-image: url(:/images/console-small-up.png) +} + +QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + +} + +QPushButton:pressed { + border-image: url(:/images/console-small-down.png) +} + + QPushButton{ border-image: url(:/images/console-small-up.png) }QPushButton:hover { border-image: url(:/images/console-small-hover.png) }QPushButton:pressed { border-image: url(:/images/console-small-down.png) } + + + + Exit + 출구 + + + + Search + 수색 + + + + Files + íŒŒì¼ + + + + Chat + 그룹 ìž¡ë‹´ + + + + Add Shared Directory + 공유 디렉토리를 추가하십시오 + + + + About/Help + + + + + Messenger + + + + + Show/Hide + + + + + &Quit + + + + + Bandwidth Graph + + + + + Open Messenger + + + + + RetroShare %1 + + + + + Add a Friend + + + + + Invite a Friend + + + + + Add a Share + + + + + Quit + + + + + Minimize + + + + + Maximize + + + + + Hide Console + + + + + Show Console + + + + + Hide ToolBox + + + + + :images/hide_toolbox_frame.png + + + + + Show ToolBox + + + + + :images/show_toolbox_frame.png + + + + + QTextBrowser { + background-color: rgb(192,192,192); + + } + + + + + QPushButton + { + border-image: url(:/images/console-small-up.png) + } + + QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + + } + + QPushButton:pressed { + border-image: url(:/images/console-small-down.png) + } + + + + + + Apps + + + + + MessageToaster + + + message + 메시지 + + + + MessagesDialog + + + New Message + 새로운 메시지 + + + + Reply to Message + ë©”ì‹œì§€ì— ëŒ€ë‹µ + + + + Remove Message + 메시지를 제거하십시오 + + + + Date + 날짜 + + + + From + ì—ì„œ + + + + Title + 제목 + + + + Msg + 메시지 + + + + Count + 조사 + + + + Size + í¬ê¸° + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Recommended Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">ì¶”ì²œëœ íŒŒì¼</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">remove selected message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ì„ ì •í•œ 메시지를 제거하십시오 </p></body></html> + + + + QPushButton +{ +border-image: url(:/images/deletemail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/deletemail-hover.png); +} + QPushButton{border-image: url(:/images/deletemail24.png);}QPushButton:pressed{border-image: url(:/images/deletemail-hover.png);} + + + + Inbox + 들어오는 ì „ìž ìš°íŽ¸ + + + + Outbox + 나가는 ì „ìž ìš°íŽ¸ + + + + Draft + 초안 + + + + Sent + 보내진 ì „ìž ìš°íŽ¸ + + + + Timestamp + 타임 스탬프 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">reply to selected message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ì„ ì •ëœ ë©”ì‹œì§€ì— ëŒ€ë‹µ</p></body></html> + + + + +QPushButton +{ +border-image: url(:/images/replymail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/replymail-hover.png); +} + + QPushButton{border-image: url(:/images/replymail24.png);}QPushButton:pressed{border-image: url(:/images/replymail-hover.png);} + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">New Message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">새로운 메시지</p></body></html> + + + + QPushButton +{ +border-image: url(:/images/folder-draft24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/folder-draft24-hover.png); +} + + QPushButton{border-image: url(:/images/folder-draft24.png);}QPushButton:pressed {border-image: url(:/images/folder-draft24-hover.png);} + + + + You get Message testing + ë‹¹ì‹ ì€ ì‹œí—˜ì„ ìœ„í•œ 메시지를 받는다 + + + + Download All + 모ë‘를 다운로드하십시오 + + + + QPushButton +{ +border-image: url(:/images/deletemail24.png); +} + +QPushButton:hover +{ +border-image: url(:/images/deletemail-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/deletemail-pressed.png); +} + + + + + +QPushButton +{ +border-image: url(:/images/replymail24.png); +} + +QPushButton:hover +{ +border-image: url(:/images/replymail24-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/replymail-pressed.png); +} + + + + + + QPushButton +{ +border-image: url(:/images/folder-draft24.png); +} +QPushButton:hover +{ +border-image: url(:/images/folder-draft24-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/folder-draft24-pressed.png); +} + + + + + + MessengerWindow + + + QWidget#MessengerWindow { +background-color: #ECF3F6; background-image:url(:/images/backgroundimage.png); +background-position: top right; +background-repeat: no-repeat +} + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click to change your avatar</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Change your Status and your display</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">picture here.</p></body></html> + + + + + Online + + + + + Busy + + + + + Be right Back + + + + + Away + + + + + In a Call + + + + + Out of lunch + + + + + Apear Offline + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Share a personal message with your contacts</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Add a Friend</p></body></html> + + + + + Chat + + + + + Connect To Friend + + + + + NetworkDialog + + + Peer Details / Authenticate + ë™ë£Œ 세부사항ì€/확ì¸í•œë‹¤ + + + + Load Certificate + ì§ ì¦ëª…ì„œ + + + + Select a pem/pqi File + 파ì¼ì„ 선정하십시오 PEM/PQI + + + + File Not Found + 찾아내지 않는 íŒŒì¼ + + + + %1 does not exist. Would you like to create it? + %1 존재하지 않는다.ë‹¹ì‹ ì€ ê·¸ê²ƒì„ ì°½ì¡°í•˜ê³  싶ì€ê°€ í•˜ê³ ìž í–ˆëŠ”ê°€? + + + + Failed to Create File + 파ì¼ì„ 창조하지 못하는. + + + + Unable to create %1 [%2] + 창조할 수 없습니다 %1 [%2] + + + + Select Certificate + ì¦ëª…서를 선정하십시오 + + + + Certificates (*.pqi *.pem) + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">네트워í¬:</span></p></body></html> + + + + # + + + + + Accept + ìˆ˜ë½ + + + + Trust + ì‹ ë§ + + + + Last Contact + Last Contact + + + + Name + ì´ë¦„ + + + + Peer Address + ë™ë£Œ 주소 + + + + Organisation + ì¡°ì§ + + + + Location + 위치 + + + + Country + êµ­ê°€ + + + + Cert Id + ì¦ëª…ì„œ ID + + + + Auth Code + ìž…ì¦ ë¶€í˜¸ + + + + NetworkPage + + + Rate Options + ì†ë„ ì„ íƒê¶Œ + + + + Max Total Data Rate (KB/S): + ë‹¹ì‹ ì˜ ìµœëŒ€ 올려주기 ì†ë„ (KB/S): + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Rate per Person (KB/S):</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">사람마다 ì†ë„ (KB/S):</p></body></html> + + + + PeersDialog + + + Chat + ìž¡ë‹´ + + + + Configure Friend + 친구를 형성하십시오 + + + + Export Friend + 수출 친구 + + + + Remove Friend + 친구를 제거하십시오 + + + + Save Certificate + ì¦ëª…서를 저장하십시오 + + + + Certificates (*.pqi) + ì¦ëª…ì„œ (*.pqi) + + + + Status + ìƒíƒœ + + + + Person + 사람 + + + + Auto Connect + ìžë™ìœ¼ë¡œ 연결하십시오 + + + + Trust Level + ì‹ ë§ ìˆ˜ì¤€ + + + + Peer Address + ë™ë£Œ 주소 + + + + Last Contact + 마지막 ì ‘ì´‰ + + + + Organisation + ì¡°ì§ + + + + Location + 위치 + + + + Country + êµ­ê°€ + + + + Person Id + 사람 ID + + + + Auth Code + ìž…ì¦ ë¶€í˜¸ + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Friends</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">친구 </span></p></body></html> + + + + Connect To Friend + ì¹œêµ¬ì— ì—°ê²°í•˜ì‹­ì‹œì˜¤ + + + + # + + + + + PopupChatDialog + + + RetroShare Friend Chat + Retroshare (ë’¤ì—몫) 친구 ìž¡ë‹´ + + + + RetroShare User Chat + + + + + PreferencesDialog + + + Language + 언어 + + + + Style + ìž‘í’ + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ì–¸ì–´ì— ë³€í™”ëŠ” RetroShare를 재출발한 후ì—서만 íš¨ë ¥ì„ ë‚˜íƒ€ë‚¼ 것ì´ë‹¤!</p></body></html> + + + + Style Sheet + 문서 ì–‘ì‹ + + + + Default + ë¬¸ì„œì–‘ì‹ + + + + Pagefold + Pagefold + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose RetroShare's interface style</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ì´ ì‹ ì²­ì˜ ê³µìš©ì˜ì—­ ìž‘í’ì„ ì„ íƒí•˜ì‹­ì‹œì˜¤</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose the language used in RetroShare</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ì´ ì‹ ì²­ì—ì„œ ì‚¬ìš©ëœ ì–¸ì–´ë¥¼ ì„ íƒí•˜ì‹­ì‹œì˜¤</p></body></html> + + + + blue + 파란 + + + + silver + ì€ + + + + ed2k + ì „ìž ë‚˜ê·€ emule-ed2k / emule.sf.net + + + + over + 넘어서 + + + + black + 검정 + + + + arachnophobia + arachnophobia + + + + Skin2 + 피부2 + + + + Login + ë¡œê·¸ì¸ (Login) + + + + Remove Auto Login + 로그ì¸ì„ ìžë™ìœ¼ë¡œ 제거하십시오 + + + + PreferencesWindow + + + Directories + 전화번호부 + + + + Error Saving Configuration + 과실 저축 윤곽 + + + + About + ì— ê´€í•˜ì—¬ + + + + General + ì¼ë°˜ + + + + Server + ë™ë£Œ ì¡°ì • + + + + Options + ì„ íƒê¶Œ + + + + Cancel + 취소 + + + + OK + 좋습니다 + + + + QObject + + + Name + ì´ë¦„ + + + + Path + + + + + Extension + + + + + Date + + + + + Size + + + + + Popularity + + + + + contains + + + + + contains all + + + + + is + + + + + less than + + + + + less than or equal + + + + + greater than or equal + + + + + greater than + + + + + is in range + + + + + and + + + + + and / or + + + + + or + + + + + equals + + + + + Rshare + + + Invalid language code specified: + 지정ë˜ëŠ” 부당한 언어 부호: + + + + Invalid GUI style specified: + 지정ë˜ëŠ” 부당한 ë„í‘œ ì‚¬ìš©ìž ì¸í„°íŽ˜ì´ìŠ¤ ìž‘í’: + + + + SearchDialog + + + File Name + íŒŒì¼ ì´ë¦„ + + + + Sources + ê·¼ì› + + + + Search Pattern + 수색 본 + + + + Results + ê²°ê³¼ + + + + File Size + íŒŒì¼ ì‚¬ì´ì¦ˆ + + + + Download + 다운로드 + + + + Broadcast on Channel + 채ë„ì— ë°©ì†¡ + + + + Recommend to Friends + 친구ì—게 추천하십시오 + + + + Remove + 제거하십시오 + + + + Remove All + 모ë‘를 제거하십시오 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Keywords</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">키워드 </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Format</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">체재 </p></body></html> + + + + Any + 무엇ì´ë“  + + + + Audio + 오디오 + + + + Video + ì˜ìƒ + + + + Images + ì‹¬ìƒ + + + + Programs + 프로그램 + + + + Archives + ê¸°ë¡ ë³´ê´€ì†Œ + + + + Documents + 문서 + + + + search + 수색 + + + + download + 다운로드 + + + + Toggle advanced searching on and off. + + + + + <h3>Simple Search:</h3> + + + + + Keywords + + + + + Perform simple search + + + + + Show Advanced Search Tool + + + + + Filename + + + + + Hash + + + + + KeyWords + + + + + Search Id + + + + + <h3>Advanced Search:</h3> + + + + + ServerDialog + + + Transfer Rates + ì´ë™ ì†ë„ + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Total Rate (kb/s) </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ë‹¹ì‹ ì˜ ìµœëŒ€ 올려주기 ì†ë„ (kb/s) </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Per Person </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">사람마다 </p></body></html> + + + + Server Settings + ë™ë£Œ ì¡°ì • + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">로컬 주소: </p></body></html> + + + + Port: + 항구: + + + + behind zee Firewall + ë°©í˜¸ë²½ì˜ ë’¤ì— + + + + Forwarded External Port + ë°œì†¡ëœ ì™¸ë¶€ 항구 (대패) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">항구:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">외부 ì´ë¦„ </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">외부 주소: </p></body></html> + + + + Check Settings + ì²´í¬ ì¡°ì • + + + + Firewall/Router Configuration + + + + + Manual router setup. + + + + + Use uPnP to configure router + + + + + Network Address Configuration (takes effect after restart) + + + + + Use DHT to locate friends + + + + + Manual IP Addresses + + + + + Server Status And Network Settings + + + + + Firewalled + + + + + Forwarded Port + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">DHT Status</p></body></html> + + + + + uPnP Status + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Local Address:</p></body></html> + + + + + ServerPage + + + Change + Restart Server + 변화 + 재착수 + + + + Server Settings + ë™ë£Œ ì¡°ì • + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">외부 주소:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">로컬 주소:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + + + + Port: + 항구: + + + + Misc + 잡다한 + + + + behinde Firewall + ë°©í˜¸ë²½ì˜ ë’¤ì— + + + + Forwarded External Port + ë°œì†¡ëœ ì™¸ë¶€ 항구 (대패) + + + + Settings + + + Settings + ì¡°ì • + + + + Cancel + 취소 + + + + Apply + ì ìš©í•˜ì‹­ì‹œì˜¤ + + + + OK + 좋습니다 + + + + General + ì¼ë°˜ + + + + Network + ë„¤íŠ¸ì›Œí¬ + + + + Server + ë™ë£Œ ì¡°ì • + + + + Directories + 전화번호부 + + + + SharedFilesDialog + + + Download + 다운로드 + + + + Recommend + 추천하십시오 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">íŒŒì¼ </span></p></body></html> + + + + Add to Recommend List + + + + + Recommend To + + + + + Message Friend + + + + + StartDialog + + + Select Trusted Friend + 신뢰한 친구를 선정하십시오 + + + + Certificates (*.pqi *.pem) + ì¦ëª…ì„œ (*.pqi *.pem) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:13pt; font-weight:600; color:#8b0000;">Welcome to RetroShare</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:13pt; font-weight:600; color:#8b0000;"> ë’¤ì—몫 Retroshareì— í™˜ì˜ </span></p></body></html> + + + + Please Login .... + ë¡œê·¸ì¸ (Login)…. + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ì´ë¦„:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Pasword</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">암호 (Password)</span></p></body></html> + + + + Load Existing User + ì§ ê¸°ì¡´í•˜ëŠ” ì‚¬ìš©ìž + + + + Or create a New User + ë˜ëŠ” 새로운 사용ìžë¥¼ 창조하십시오 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Organisation:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ì¡°ì§:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">êµ­ê°€:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Location:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">위치:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Password (Again)</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">암호 (다시)</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">New Password</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">새 암호</span></p></body></html> + + + + Load Trusted Certificate (Optional) + (ì„ íƒ) ì§ íŠ¸ëŸ¬ìŠ¤íŠ¸ ì¸ì¦ì„œ + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">친구</span></p></body></html> + + + + Select File + 파ì¼ì„ 선정하십시오 + + + + Generate New Certificate + 새로운 ì¦ëª…서를 ìƒì„±í•˜ì‹­ì‹œì˜¤ + + + + RetroShare setup + Retroshare (ë’¤ì—몫) ì²´ì œ + + + + Automatically Login in Future + ë¯¸ëž˜ì— ìžˆëŠ” ìžë™ìœ¼ë¡œ ë¡œê·¸ì¸ + + + + RetroShare + + + + + QWidget { + background-color: #ECF3F6; +} + + + + + Auto-login + + + + + Name: + + + + + Log In + + + + + Password: + + + + + Create a Account + + + + + QToolButton{ +border-image: url(:/images/avatar_background.png); + +} + + + + + + StatisticDialog + + + Statistics + 통계 + + + + Download + 다운로드 + + + + Session: + 회ì˜: + + + + Downloaded: + 다운로드하는: + + + + Average Downloadspeed: + í‰ê·  다운로드 ì†ë„: + + + + Count of Downloads: + ë‹¤ìš´ë¡œë“œì˜ ì¡°ì‚¬: + + + + Overall + ì „ë°˜ì ì¸ + + + + Upload + 올려주기 + + + + Session + Session: + + + + Uploaded: + 올려주기하는: + + + + Average Uploadspeed: + í‰ê·  올려주기 ì†ë„: + + + + Count of Uploads: + ì˜¬ë ¤ì£¼ê¸°ì˜ ì¡°ì‚¬: + + + + Uploaded + 올려주기하는 + + + + Connections: + Connections: + + + + Peers: + Peers: + + + + Misc + 잡다한 + + + + Uptime: + ê°€ë™ ì‹œê°„: + + + + Overall: + ì „ë°˜ì ì¸: + + + + Uptime + ê°€ë™ ì‹œê°„ + + + + Records + ê¸°ë¡ + + + + Uploadspeed: + 올려주기 ì†ë„: + + + + Downloadspeed: + 다운로드 ì†ë„: + + + + Show Settings + 쇼 ì¡°ì • + + + + Reset + 리셋 + + + + Receive Rate + ë¹„ìœ¨ì„ ë°›ìœ¼ì‹­ì‹œì˜¤ + + + + Send Rate + ë¹„ìœ¨ì„ ë³´ë‚´ì‹­ì‹œì˜¤ + + + + Always On Top + Always On Top + + + + 100 + 100 + + + + % Opaque + % Opaque + + + + Changes the transparency of the Bandwidth Graph + ëŒ€ì—­í­ ë„í‘œì˜ íˆ¬ëª…ë„를 바꾼다 + + + + Save + 저장하십시오 + + + + Cancel + 취소 + + + + Hide Settings + ì€ì‹ ì²˜ ì¡°ì • + + + + TransfersDialog + + + Cancel + 취소 + + + + Clear Completed + ê³µê°„ì€ ì™„ë£Œí–ˆë‹¤ + + + + File Name + íŒŒì¼ ì´ë¦„ + + + + Sources + ê·¼ì› + + + + Status + ìƒíƒœ + + + + File Size + íŒŒì¼ ì‚¬ì´ì¦ˆ + + + + Speed + ì†ë„ + + + + Progress + ì§„ë„ + + + + Completed + 완료하는 + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Downloads:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">다운로드 (Downloads):</span></p></body></html> + + + + Peer Name + ë™ë£Œ ì´ë¦„ + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Uploads:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">올려주기 (Uploads):</span></p></body></html> + + + + Name + i.e: file name + ì´ë¦„ + + + + Size + i.e: file size + + + + + Progress + i.e: % downloaded + ì§„ë„ + + + + Speed + i.e: Download speed + ì†ë„ + + + + Sources + i.e: Sources + ê·¼ì› + + + + Remaining + i.e: Estimated Time of Arrival / Time left + + + + + Core-ID + + + + + User Name + i.e: user name + + + + + Progress + i.e: % uploaded + ì§„ë„ + + + + Speed + i.e: upload speed + ì†ë„ + + + + Transferred + + + + + ULListDelegate + + + B + + + + + KB + + + + + MB + + + + + GB + + + + + VMessageBox + + + OK + 좋습니다 + + + + Cancel + 취소 + + + + Yes + 그렇습니다 + + + + No + 아니다 + + + + Help + ë„움 + + + + Retry + ìž¬ì‹œë„ + + + + Show Log + 쇼 역사 + + + + Show Settings + 쇼 ì¡°ì • + + + + moreinfo + + + Details + 세부사항 + + + + OK + 좋습니다 + + + + Name + ì´ë¦„ + + + + Value + 가치 + + + diff --git a/retroshare-gui/src/lang/retroshare_pl.qm b/retroshare-gui/src/lang/retroshare_pl.qm new file mode 100644 index 000000000..ecaa782d7 Binary files /dev/null and b/retroshare-gui/src/lang/retroshare_pl.qm differ diff --git a/retroshare-gui/src/lang/retroshare_pl.ts b/retroshare-gui/src/lang/retroshare_pl.ts new file mode 100644 index 000000000..2cf68f93a --- /dev/null +++ b/retroshare-gui/src/lang/retroshare_pl.ts @@ -0,0 +1,4364 @@ + + + + + + + Arial + Arial + + + + AddFriendDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;"> To add a new Friend, cut and paste their email </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">invitation into the box below, and click done.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;"> Aby dodać nowego znajomego, wytnij i wklej ten email </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">invitation into the box below, i kliknij gotowe.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;"></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + Cancel + Anuluj + + + + Done + Wykonano + + + + Load From File + Wczytaj z pliku + + + + RetroShare + RetroShare + + + + Certificate Load Failed + BÅ‚Ä…d wczytania certyfikatu + + + + Add a Friend + Dodaj znajomego + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"><span style=" font-size:16pt;">Add a new Friend</span><br /><br /><span style=" font-size:10pt;">To add a new Friend, cut and paste their email </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">invitation into the box below, and click done.</p></body></html> + + + + + AddFriendWizard + + + Add Friend to my netowork Wizard + Dodaj znajomego do kreatora sieci + + + + < Back + <Do tyÅ‚u + + + + Next > + NastÄ™pny> + + + + Cancel + Anuluj + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">This Wizard helps to Connect to your Friends</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Ten kreator pomoże ci w poÅ‚Ä…czeniu siÄ™ z twoimi znajomymi</span></p></body></html> + + + + I have a .pqi/.pem file received from a Friend + Mam plik .pqi/.pem przyjÄ™ty od znajomego + + + + I have Key received from a Friend + Mam klucz przyjÄ™ty od znajomego + + + + I want to invite a friend to my RetroShare network + ChcÄ™ zaprosić znajomego do mojej sieci RetroShare + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Cut and paste the text below into an email.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;"> and send it to all your friends!</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">When you press next RetroShare will attempt to launch a Email client.</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Cut and paste the text below into an email.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;"> i wysÅ‚ać to do wszystkich twoich znajomych!</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">Gdy naciÅ›niesz dalej RetroShare bÄ™dzie próbowaÅ‚ wÅ‚Ä…czyć klienta Email.</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Invite your Friends to join with RetroShare</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">PoproÅ› znajomych aby doÅ‚Ä…czyli do RetroShare</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Enter the Key code you got from your friend:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Wpisz kod klucza który masz od znajomego:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">When you press next RetroShare will attempt to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">connect using the key.</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Gdy naciÅ›niesz dalej RetroShare bÄ™dzie próbować do</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">poÅ‚Ä…cz używajÄ…c klucza.</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Select a pqi/pem file:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Wybierz plik pqi/pem:</span></p></body></html> + + + + Browse + PrzeglÄ…daj + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">When you press next RetroShare will attempt to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">connect using the .pqi/.pem file.</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Gdy naciÅ›niesz dalej RetroShare bÄ™dzie próbować do</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">poÅ‚Ä…cz używajÄ…c pliku .pqi/.pem.</p></body></html> + + + + AdvancedSearchDialog + + + RetrosShare: Advanced Search + + + + + Add a further search criterion. + + + + + Add a selection criterion + + + + + Reset the search criteria. + + + + + Reset + + + + + Cancels the search. + + + + + Cancel + Anuluj + + + + Perform the advanced search. + + + + + Search + Szukaj + + + + Search Criteria + + + + + ApplicationWindow + + + RetroShare %1 + + + + + Example Application + + + + + Application Users: 0 Files: 0 + + + + + Down: 0.0 Up: 0.0 + Pob.: 0.0 Wys.: 0.0 + + + + Connections: 0/45 + PoÅ‚Ä…czeÅ„: 0/45 + + + + Hide + Ukryj + + + + Show + Pokaż + + + + RetroShare + + + + + Home + Home + + + + General + Główne + + + + Advanced + Zaawansowane + + + + QTextBrowser { + background-color: rgb(192,192,192); + + } + + + + + QPushButton + { + border-image: url(:/images/console-small-up.png) + } + + QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + + } + + QPushButton:pressed { + border-image: url(:/images/console-small-down.png) + } + + + + + + AuthorizationDialog + + + Authenticate + Autentykacja + + + + Authenticate Friend By Entering Their Code + Autentykacja znajomego przez wpisanie jego kodu + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;"> KOD AUTH:</span></p></body></html + + + + OK + OK + + + + Cancel + Anuluj + + + + BandwidthGraph + + + RetroShare Bandwidth Usage + Przepustowość Å‚Ä…cza używana przez RetroShare + + + + Show Settings + Pokaż ustawienia + + + + Reset + Reset + + + + Receive Rate + Pokaż Å›ciÄ…ganie + + + + Send Rate + Pokaż wysyÅ‚anie + + + + Always on Top + Zawsze na wierzchu + + + + Style + Styl + + + + Changes the transparency of the Bandwidth Graph + ZmieÅ„ przezroczystość wykresu przepustowoÅ›ci Å‚Ä…cza + + + + 100 + 100 + + + + % Opaque + % nieprzezroczysty + + + + Save + Zapisz + + + + Cancel + Anuluj + + + + Since: + Od czasu kiedy: + + + + Hide Settings + Ukryj ustawienia + + + + CallToaster + + + Message + Wiadomość + + + + ChanCreateDialog + + + Create a new Broadcast Channel + Stwórz nowy kanaÅ‚ transmisji + + + + Create A New Broadcast Channel + Stwórz nowy kanaÅ‚ transmisji + + + + Channel Name: + Nazwa kanaÅ‚u: + + + + Type: + Typ: + + + + Public Channel (Signed) + KanaÅ‚ publiczny (Podpisany) + + + + Private Channel (Encrypted) + Prywatny kanaÅ‚ (Zaszyfrowany) + + + + Cancel Channel + Anuluj kanaÅ‚ + + + + Create Channel + Stwórz kanaÅ‚ + + + + ChanMsgDialog + + + Compose + SkÅ‚adać + + + + Recommended Files + Rekomendowany Plik + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-weight:400;"><span style=" font-weight:600;">Subject:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-weight:400;"><span style=" font-weight:600;">Obiekt:</span></p></body></html> + + + + Send To: + WyÅ›lij do: + + + + Send + WyÅ›lij + + + + Delete Channel + Skasuj kanaÅ‚ + + + + Create Channel MSG + Stwórz kanaÅ‚ MSG + + + + 1 + 1 + + + + Reply + + + + + ChannelsDialog + + + New Message + Nowa Wiadomość + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Messages</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">WiadomoÅ›ci</span></p></body></html> + + + + Date + Data + + + + Rank + RzÄ…d + + + + From + Od + + + + Title + TytuÅ‚ + + + + Msg + Wiadomość + + + + Count + Numer + + + + Size + Rozmiar + + + + Type + Typ + + + + Rs[Cert/Chan]IdSize + Rs[Cert/Chan]IdSize + + + + RsMsgId + RsMsgId + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Message Text</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Tekst wiadomoÅ›ci</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Recommended Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Rekomendowane pliki</span></p></body></html> + + + + New Channel + Nowy KanaÅ‚ + + + + Subscribe To Channel + Subskrybuj kanaÅ‚ + + + + Unsubscribe To Channel + Nie subskrybuj kanaÅ‚u + + + + Delete Your Channel + UsuÅ„ Twój KanaÅ‚ + + + + Download + Pobieranie + + + + Download All + Pobierz wszystko + + + + ChatDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:9pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:400;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:9pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:400;"></p></body></html> + + + + Chat History: + Historia chatu: + + + + Chat With: + Chat-uj z: + + + + Chat + Chat + + + + Users: + + + + + ChatToaster + + + message + Wiadomość + + + + You Get a New Message + Nowy Wiadomość przybycie + + + + Message + Wiadomość + + + + ConfCertDialog + + + Cancel + Anuluj + + + + Done + uczynione + + + + Apply + Aplikować + + + + Peer Settings + Peer ustawienie + + + + Port: + Port: + + + + behind zee Firewall + za firewallem + + + + Forwarded External Port + NastÄ™pny zewnÄ™trzny Port + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ZewnÄ™trzny Addres:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ZewnÄ™trzna Nazwa</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokalny adres:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Max Transfer Rate (kb/s) </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Twoja maksymalna prÄ™dkość wysyÅ‚ania (kb/s) </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Org / Loc:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Org / Lok:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Nazwa:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Country/State:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Kraj/Stan:</p></body></html> + + + + Trust Settings + Zaufane ustawienia + + + + Trust Level + Zaufany poziom + + + + Trust Their Signature + Zaufaj tej sygnaturze + + + + Sign The Certificate + Znak certyfikatu + + + + OK + Ok + + + + Peer Adress + Adres Peera + + + + Peer Info + Info Peera + + + + ConfirmQuitDialog + + + Exit RetroShare + + + + + You are about to exit the RetroShare application and therefore stop all transfers. <br><br>Are you sure you want to stop and exit RetroShare? + + + + + Do not show this message again. + + + + + ConnectDialog + + + Peer Details + Detale Peera + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Kraj:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Org:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Org:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Nazwa:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Trust:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Zaufana:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Loc:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Lok:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Certificate</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">signers:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Certyfikat</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">znacznik:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Kod Aut.:</span></p></body></html> + + + + Make Friend + Twórz znajomego + + + + Close + Zamknij + + + + ConnectionsDialog + + + Load Certificate + Wczytaj certyfikat + + + + Select a pem/pqi File + Wybierz plik pem/pqi + + + + File Not Found + Nie znaleziono pliku + + + + %1 does not exist. Would you like to create it? + %1 nie istnieje. Czy chciaÅ‚byÅ› go utworzyć? + + + + Failed to Create File + BÅ‚Ä…d tworzenia pliku + + + + Unable to create %1 [%2] + Nie można stworzyć %1 [%2] + + + + Select Certificate + Wybierz certyfikat + + + + Certificates (*.pqi *.pem) + Certyfikaty (*.pqi *.pem) + + + + Accept + Akceptuj + + + + Trust + Zaufaj + + + + Last Contact + Ostatni kontakt + + + + Name + Nazwa + + + + Organisation + Organizacja + + + + Location + Lokalizacja + + + + Country + Kraj + + + + Peer Address + Adres Peera + + + + Cert Id + Cert Id + + + + Auth Code + Kod autentykacji + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Sieć:</span></p></body></html> + + + + Peer Details / Authenticate + Detale Peera / Uwierzytelnij + + + + # + # + + + + CryptographyDialog + + + RSA Key Size + Rozmiar klucza RSA + + + + Rijndael Block size + Rozmiar bloku Rijndael + + + + 128 Bits + 128 Bits + + + + 192 Bits + 192 Bits + + + + 256 Bits + 256 Bits + + + + Rijndael Key Size + Rozmiar klucza Rijndael + + + + Rijndael Mode + Tryb Rijndael + + + + CBC + CBC + + + + ECB + ECB + + + + CFB + CFB + + + + Rijndael Padding + WypeÅ‚nianie Rijndael + + + + PKCS7 + PKCS7 + + + + Zeros + Zera + + + + ANSIX923 + ANSIX923 + + + + ISO10126 + ISO10126 + + + + Rijndael Feedback Size + Rozmiar odpowiedzi Rijndael + + + + Key Size: + Rozmiar klucza: + + + + Block Size: + Rozmiar bloku: + + + + Feedback Size: + Rozmiar odpowiedzi: + + + + Mode: + Tryb: + + + + Padding: + WypeÅ‚nienie: + + + + DLListDelegate + + + B + + + + + KB + + + + + MB + + + + + GB + + + + + DirectoriesDialog + + + Shared Directories + Współdzielone katalogi + + + + Other Directories + Inne katalogi + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Incoming Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">PrzychodzÄ…ce pliki</span></p></body></html> + + + + Add Shared Directory + Dodaj współdzielone katalogi + + + + DirectoriesPage + + + Shared Directories + Współdzielone katalogi + + + + Incoming files + PrzychodzÄ…ce pliki + + + + ExampleDialog + + + Vote Up + + + + + Vote Down + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Friends</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Znajomi</span></p></body></html> + + + + # + # + + + + Status + Status + + + + Person + Osoba + + + + Auto Connect + AutopoÅ‚Ä…czenie + + + + Trust Level + Zaufany poziom + + + + Peer Address + Adres Peera + + + + Last Contact + Ostatni kontakt + + + + Organisation + Organizacja + + + + Location + Lokalizacja + + + + Country + Kraj + + + + Person Id + ID osoby + + + + Auth Code + Kod autentykacji + + + + ExprParamElement + + + to + + + + + ignore case + + + + + dd.MM.yyyy + + + + + KB + + + + + MB + + + + + GB + + + + + ExpressionWidget + + + Expression Widget + + + + + Delete this expression + + + + + FileHashDialog + + + Download + Pobieranie + + + + GSettingsWin + + + General + Główne + + + + Network + Sieć + + + + Directories + Katalogi + + + + Server + Serwer + + + + %1 + %1 + + + + GenCertDialog + + + RetroShare setup + Konfiguracja RetroShare + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16pt;">Generate a new profile</span><br /><br />Please fill in the information which will<br />allow your RetroShare to connect to</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Friends.</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16pt;">Generuj nowy profil</span><br /><br />Please fill in the information which will<br />allow your RetroShare to connect to</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Znajomi.</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Organisation:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Organizacja:</p></body></html> + + + + Password (Again) + HasÅ‚o (Ponownie) + + + + Location: + Lokalizacja: + + + + Load Trusted Certificate (Optional) + Wczytaj zaufany certyfikat (Opcjonalnie) + + + + Password + HasÅ‚o + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Znajomy</span></p></body></html> + + + + Select File + Wybierz plik + + + + Country: + Kraj: + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Nazwa:</p></body></html> + + + + Generate New Certificate + Wygeneruj nowy certyfikat + + + + Select Trusted Friend + Wybierz zaufanego znajomego + + + + Certificates (*.pqi *.pem) + Certyfikaty (*.pqi *.pem) + + + + GeneralPage + + + Keys manager + Menadżer kluczy + + + + Style + Styl + + + + Choose RetroShare's interface style + Wybierz styl interfejsu RetroShare's + + + + Language + JÄ™zyk + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zmiana jÄ™zyka przyniesie efekt po ponownym uruchomieniu RetroShare!</p></body></html> + + + + Choose the language used in RetroShare + Wybierz jÄ™zyk używany w RetroShare + + + + GraphFrame + + + Recv: + Recv: + + + + %1 KB/s + %1 KB/s + + + + Sent: + WysÅ‚any: + + + + %1 KB + %1 KB + + + + %1 MB + %1 MB + + + + %1 GB + %1 GB + + + + HelpDialog + + + About + O + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:large; font-weight:600; text-decoration: underline; color:#0000ff;"><span style=" font-size:xx-large; text-decoration:none;">About RetroShare.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />Retroshare is a private and secure decentralised commmunication platform.<br />You can use it chat, send messages and share files with your friends.<br /><br />This is just a placeholder page for the moment. You can<br />improve retroshare's in-built help (this text) by<br />updating the retroshare wiki: <a href="http://retroshare.wiki.sourceforge.net/help_tab"><span style=" text-decoration: underline; color:#0000ff;">This Page in the retroshare Wiki</span></a><br /><br />The About/Help Tab is regularly updated from the Wiki page.<br /><br />External Links to more information:<br /></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.sourceforge.net"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Webpage</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.wiki.sourceforge.net/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Wiki</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://sourceforge.net/projects/retroshare/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Project Page</span></a></li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.lunamutt.com"><span style=" text-decoration: underline; color:#0000ff;">Lunamutt Homepage.</span></a></li></ul></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:large; font-weight:600; text-decoration: underline; color:#0000ff;"><span style=" font-size:xx-large; text-decoration:none;">O RetroShare.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />Retroshare to prywatna i bezpieczna zdecenralizowana platforma komunikacji.<br />Możesz używać chatu, wysyÅ‚ać wiadomoÅ›ci i dzielić siÄ™ plikami ze swoimi znajomymi.<br /><br />To po prostu zarezerwowane miejsce strony. Możesz<br />ulepszyć wbudowanÄ… pomoc retroshare (ten tekst) przez<br />aktualizowanie retroshare wiki: <a href="http://retroshare.wiki.sourceforge.net/help_tab"><span style=" text-decoration: underline; color:#0000ff;">Ta strona to retroshare Wiki</span></a><br /><br />ZakÅ‚adki O/Pomoc sÄ… regularnie aktualizowane ze strony Wiki.<br /><br />ZewnÄ™trzne linki po wiÄ™cej informacji:<br /></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.sourceforge.net"><span style=" text-decoration: underline; color:#0000ff;">Strona domowa Retroshare</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.wiki.sourceforge.net/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Wiki</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://sourceforge.net/projects/retroshare/"><span style=" text-decoration: underline; color:#0000ff;">Strona projektu Retroshare </span></a></li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.lunamutt.com"><span style=" text-decoration: underline; color:#0000ff;">Strona domowa Lunamutt. </span></a></li></ul></body></html> + + + + Authors + Autorzy + + + + Thanks to + PodziÄ™kowania dla + + + + Translation + TÅ‚umaczenie + + + + License Agreement + Umowa licencyjna + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">About/Help</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">O/Pomoc</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:xx-large; font-weight:600; color:#0000ff;">About RetroShare.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-weight:600;">Retroshare is a private and secure decentralised commmunication platform.<br />You can use it chat, send messages and share files with your friends.</span><br /><br />This is just a placeholder page for the moment. You can<br />improve retroshare's in-built help (this text) by<br />updating the retroshare wiki: <a href="http://retroshare.wiki.sourceforge.net/help_tab"><span style=" text-decoration: underline; color:#0000ff;">This Page in the retroshare Wiki</span></a><br /><br />The About/Help Tab is regularly updated from the Wiki page.<br /><br />External Links to more information:<br /></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.sourceforge.net"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Webpage</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.wiki.sourceforge.net/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Wiki</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://sourceforge.net/projects/retroshare/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Project Page</span></a></li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.lunamutt.com"><span style=" text-decoration: underline; color:#0000ff;">Lunamutt Homepage.</span></a></li></ul></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-size:19pt; font-weight:600; color:#0000ff;">The RetroShare Team:</span><br /> <br /><span style=" font-size:9pt; color:#0000ff;">defnax</span>: Lead GUI developer <br /><span style=" font-size:9pt; color:#0000ff;">drbob7</span>: Lead Core developer. <br /> <br /><span style=" font-size:9pt; color:#0000ff;">bmeck</span> : Our new web-developer. Joined retroshare a couple <br />of weeks ago, and already starting on an exciting new <br />design for the web-page. <br /> <br /><span style=" font-size:9pt; color:#0000ff;">noragen</span> : Developer from the SIM-IM project. Working on a retroshare plugin to SIM-IM. <br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">kernelpanix</span> : Gui and skin developer</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">libris</span><span style=" font-size:9pt;">:</span> core developer</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-size:9pt; color:#0000ff;">kashif: </span><span style=" color:#000000;">core developer</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt; color:#000000;"><span style=" font-size:8pt;"><br /></span><span style=" color:#0000ff;">agent725</span><span style=" font-size:8pt;">: Manages the 'local' Retroshare release, <br />and beta-testing retroshare on a large scale. <br /> <br /></span><span style=" color:#0000ff;">the_mgt</span><span style=" font-size:8pt;">: Maintains the Gentoo and generic linux <br />installation/compilation scripts. </span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">notdefine:</span> Maintains the .rpm, .deb installation/compilation scripts.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">zhouk</span>: developer</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Translators:</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Serbian</span>: Kunalagon Umuhanik &lt;kunalagon@gmail.com&gt;</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Polish: </span>Jarek</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">French</span>:Temet</p></body></html> + + + + + InviteDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">To </span><span style=" font-size:10pt; font-weight:600;">Invite your friends to join you with Retroshare: </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">Cut and paste the text below into an email.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">and send it to all your friends!</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">To </span><span style=" font-size:10pt; font-weight:600;">PoproÅ› znajomego aby doÅ‚Ä…czyÅ‚ z tobÄ… do Retroshare: </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">Wytnij i wklej tekst poniżej do email.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">i wyÅ›lij do wszystkich znajomych!</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + Done + Wykonano + + + + Cancel + Anuluj + + + + Launch Email + Uruchom klienta Email + + + + Invite a Friend + ZaproÅ› znajomego + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"><span style=" font-size:16pt;">Invite a Friend</span><br /><br /><span style=" font-size:10pt;">To Invite your friends to join you with Retroshare: </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">Cut and paste the text below into an email.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">and send it to all your friends!</p></body></html> + + + + + LogDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> + +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="ABOUT"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">About RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShare is a private peer to peer communication platform created by Dr. Bob.This program enables you to securely share files and chat with your friends (and no-one else!).</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, and the latest release go to http://www.lunamutt.com.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="START"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Quick Start Guide to RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If this is your first time using Retroshare, it is recommended that you readthis guide for instructions on how to get started. The first step is:<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Connecting to Your Friends</span></a>. Once you have managed this you can <a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">Download Files</span></a> and<a href="#START-SHARE"><span style=" text-decoration: underline; color:#0000ff;">Share with Others</span></a></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Some of the key concepts related to ensuring your sharing remains private aredescribed in the <a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">Frequently Asked Questions</span></a>. Some Key security questions are:<a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">What is a Web of Trust?</span></a>, <a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">Should I Sign this Certificate?</span></a>, and finally<a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">What does "Trust" Mean?</span></a>.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is also worthwhile reading the <a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">GUI Overview</span></a>which describes the featureson available through the User Interface.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Connecting to your Friends </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">There are four steps to connecting to a Friend:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Get Friend's Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Load Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Sign Certificate</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect to Friend.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The instructions might initially appear long and daunting, however thesesteps are required to ensure that your sharing is private and secure.These steps are only required a couple of times, to add new friends, and become quite straight forward after the first time.</p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (1) EXCHANGE CERTIFICATES </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Before you can connect, you need send your certificate to your friend, and get your friends certificate. Follow these steps to get your certificate:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on Your Certificate to Select it.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on the "Export Friend" Button to bring up a file save dialog.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select directory to save the certificate to.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Enter desired filename. (with a file type of .pqi), and Click OK.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Email this File to your Friend. (It is recommended you put thecertificate in a zip file before sending, as some email programsdon't transmit the file correctly).</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Ask your friend to do the same.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Once you have received your friend's certificate, removed itfrom the zip file and saved it to disk, you can proceed to step (2).</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Note: This exchange of certificates is only necessary to get you started.Once you are connected to some friends the exchange of certificates becomeautomated by the autoDiscovery system. See<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">GUI: Connecting</span></a> for more information.------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (2) LOAD YOUR FRIEND'S CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Import Friend"</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select your friends certificate file, then click "Okay". Their certificate should appear in the top window of the "Connect" Tab.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (3) SIGN CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select their Certificate by clicking on their name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Configure Friend" Button. This will bring up a configuration window. which allows you to look at the detailsof the certificate.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click the "Sign Certificate" button near the bottom of the "Certificate Configuration" Window.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Now close the window by clicking on the "Done" button.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Your Friends certificate should now say "Trusted (S)", indicating it is ready for connections.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can only share with "Trusted" Peers. You must sign your Friend'scertificate to prove that you know the certificate belongs to your Friend. Do not sign any/all certificates - only the people youtrust. For more information see: <br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br />------------------------------------------------------------------------<br /><br /> <br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (4) AUTOCONNECT TO PEER </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Finally You need to activate the connection:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click in the Box, next to your friends Name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> A Tick should appear in the box, a connection will be started.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> The "Offline" will change to "Online" when you have successfullyconnected.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Remember: Your initial connection attempts will fail, until your friend has signed your certificate and ticked the Auto-Connect Box.This ensures that both peers trust each other, and stops random peopleaccessing your files.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>. <br />------------------------------------------------------------------------<br /><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-DOWNLOAD"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Downloading Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have connected to friends, you can download their shared files.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can search for the files you want using either:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) File Listing Tab: This gives you a directory view of the files being shared by your peers. Double clickon the directory name (not the arrow) to diplay its subdirectories and files.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 1: This can take up to 5 seconds to fetch the information for your peer.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 2: If the directory is empty, or the person is offline, then the request will silently fail.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Search Tab: Retroshare also allows you to search your peers computers for filenames. Enter yourterm(s) in the search box at the top of the TAB and click the "Search" button. This willsearch all of the peers that you are currently connected to.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 3: If any matching files are found they will be displayed within 5 - 10 seconds.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have found the files you want, Select the file(s), and click "Download" to begin the download process.If you click over the "File Transfer" TAB, the status of the files will appear.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 4: The files can take up to 10 seconds to appear in the transfer window.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-SHARING"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Sharing Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can specify which files you want to share in the "Config" Tab.In the "Share Directories" section, click the "Add Directory" Button, and select the directory you want to share.The files and subdirectories will become available for you peers.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can remove a directory from the Shared Directories List by clicking onthe directory name in the list, and then clicking "Remove Directory".</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="GUI"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Gui Overview (Tab Description) </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The GUI is divided up into several sections which can be accessed by clicking on the Tabs along the top of the main window. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect: Manage Connections and Friends.(<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">getting started</span></a> and<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Listing: A directory view of available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Search: Search for available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Messages: For Sending/Recving Message. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Channels: A broadcast/subscription system. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Transfer: Listing of Current and completed Transfers.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Config: Specify of share diectories and IP Addresses.(<a href="#GUI-CONFIG"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> About: Help and other Information.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Chat: Accessed by the clicking on the "Chat" button.</li></ul> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Connect Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Connect TAB consists of two windows. The upper windowshows a list of your friends. This window indicates each friendscurrent trust level, as well as their connection state.The "Trust_Lvl" Column indicates if the certificate has beenAuthenticated using the web of trust. You can only connect to "Trusted" certificates. Tick the "Auto_Connect" box to connect to your trusted friends.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The lower window provides a list of the friends of your friends.This window shows the neighbour's name and how long ago they attempted to connect to you. This window is automatically populatedby the autoDiscovery system, and should be used to expand yourretroShare network. A word of warning: Do not automatically trust (or sign) anyonethat appears in this window. First verify by some other means (email/phone)that certificate belongs to the person you think it does.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use the "Neighbour List" window to expand your friend list. Select the desired entry in the lower window by clicking on it, then click the "Add to Friends" Button to move it to the upper window.Likewise the "Remove from Friends" button moved a person from the upper window to the lower window.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The "Configure Friend" Button opens a Certificate Configuration window.This window can be used to examine the certificate details, sign the certificate or manually change the peer's IP Address.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">See Also:<br /><a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Getting Started: Connecting to your friends</span></a>.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>.<br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONFIG"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Config Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Configuration Tab allows you to select the share directories, as well as the directory that downloaded files are saved to.<br />See <a href="#STARTUP-SHARING"><span style=" text-decoration: underline; color:#0000ff;">Sharing you Files</span></a> for details. </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Config Tab also allows you to control the IP Address and Portused by RetroShare. Under most cirumstances you do not need to changethese setting. If you are behind a firewall and can setup a forwarded port, the selected IP Address and Port should be specified here.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="FAQ"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Frequently Asked Questions </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">How does the security/privacy work? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShares uses a Web of Trust Authentication system to ensurethat your "friends" are your friends, and uses SSL to encryptthe communcications between peers. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What is a Web of Trust? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Web of Trust relies on a collection of peers to identify eachother. Look it up on the Web!</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-TRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What does "Trust" Mean in RetroShare?</span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Anyone can generate a certificate, with any name on it. So howdo you know that the certificate that claims to be from "Joe Bloggs"is really from your mate Joe. This is the "AuthenticationProblem". RetroShare uses a Web of Trust to Authenticate your peers.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-SIGN"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Should I Sign this Certificate? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should only sign a certificate if you are completely surethat it comes from the "right" person. If you sign a certificateyou are "Authenticating" the person to yourself and others.If you sign certificates that you haven't checked, then you aredestroying your own privacy and security.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">How do you verify a certificate? Use an alternative method ofcommunication to send the certificate: E.g. email or USB stick. This will improve you confidence that the certificate belongsto the correct person. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><span style=" font-size:small;"> </span><a name="FAQ-CONNECT"></a><span style=" font-size:small;">W</span><span style=" font-size:small;">hy won't it Connect?</span><span style=" font-size:small;"> </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A connection can fail for a number of reasons:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) Failed Authentication. Have both peers signed each otherscertificates? </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Firewalls. If both peers are behind firewalls then they cannotconnect directly. RetroShare has a built in proxy system to circumventfirewalls - However this can only function if both peers can connect to a common third party that is not behind a firewall. Thisis the most likely reason for initial connections to fail. The only solution to find a common friend that isn't firewalled (know anyone with Broadband?)</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(3) IP Addresses are wrong. You can manually examine and change these using the Certificate configuration.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +</body></html> + + + + + MainWindow + + + Preferences + Preferences + + + + Network + Sieć + + + + Friends + Znajomi + + + + Transfers + Transfery + + + + Messages + WiadomoÅ›ci + + + + Channels + KanaÅ‚y + + + + Options + Opcje + + + + Users: 0 Files: 0 + Użytkowników: 0 Plików: 0 + + + + Down: 0.0 Up: 0.0 + Pob.: 0.0 Wys.: 0.0 + + + + Connections: 0/45 + PoÅ‚Ä…czeÅ„: 0/45 + + + + System tray is unavailable + System tray is unavailable + + + + System tray unavailable + System tray unavailable + + + + RetroShare System tray + Ikona Retroshare w trayu + + + + Application will continue running. Quit using context menu in the system tray + Program jest nadal wÅ‚Ä…czony. Zamknij go używajÄ…c menu kontekstowego ikony w trayu + + + + Hide + Ukryj + + + + Show + Pokaż + + + + RetroShare + Retroshare + + + + Home + Home + + + + General + Główne + + + + Invite Friend + ZaproÅ› znajomego + + + + Add Friend + Dodaj znajomego + + + + Add Share + Dodaj udostÄ™pniany + + + + Advanced + Zaawansowane + + + + QTextBrowser { + background-color: rgb(192,192,192); + +} + QTextBrowser { + background-color: rgb(192,192,192); + +} + + + + QPushButton +{ + border-image: url(:/images/console-small-up.png) +} + +QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + +} + +QPushButton:pressed { + border-image: url(:/images/console-small-down.png) +} + + QPushButton +} + border-image: url(:/images/console-small-up.png) +} + +QPushButton:hover { + border-image: url(:/images/console-small-hover.png) +} +QPushButton:pressed { + border-image: url(:/images/console-small-down.png) +} + + + + + Exit + Wyjdź + + + + Search + Szukaj + + + + Files + Pliki + + + + Chat + Chat + + + + Add Shared Directory + Dodaj udostÄ™pniane katalogi + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Select StyleSheet</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Wybierz listÄ™ stylów</p></body></html> + + + + Default + DomyÅ›lne + + + + blue + niebieski + + + + silver + srebrny + + + + ed2k + ed2k + + + + over + nad + + + + black + czarny + + + + arachnophobia + arachnophobia + + + + Skin2 + Skin2 + + + + Pagefold + Pagefold + + + + About/Help + O/Pomoc + + + + Messenger + Messenger + + + + Show/Hide + Pokaż/Ukryj + + + + &Quit + &Zamknij + + + + Bandwidth Graph + Wykres przepustowoÅ›ci Å‚Ä…cza + + + + Open Messenger + Otwórz Messenger + + + + RetroShare %1 + + + + + Add a Friend + Dodaj znajomego + + + + Invite a Friend + ZaproÅ› znajomego + + + + Add a Share + + + + + Quit + + + + + Apps + + + + + Minimize + + + + + Maximize + + + + + Hide Console + + + + + Show Console + + + + + Hide ToolBox + + + + + :images/hide_toolbox_frame.png + + + + + Show ToolBox + + + + + :images/show_toolbox_frame.png + + + + + QTextBrowser { + background-color: rgb(192,192,192); + + } + + + + + QPushButton + { + border-image: url(:/images/console-small-up.png) + } + + QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + + } + + QPushButton:pressed { + border-image: url(:/images/console-small-down.png) + } + + + + + + MessageToaster + + + message + Wiadomość + + + + MessagesDialog + + + New Message + Nowa Wiadomość + + + + Reply to Message + Odpowiedz na wiadomość + + + + Remove Message + UsuÅ„ wiadomość + + + + Date + Data + + + + From + Z + + + + Title + TytuÅ‚ + + + + Msg + Wiadomość + + + + Count + Numer + + + + Size + Rozmiar + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Recommended Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Rekomendowane pliki</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">remove selected message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">usuÅ„ wybrane wiadomoÅ›ci</p></body></html> + + + + QPushButton +{ +border-image: url(:/images/deletemail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/deletemail-hover.png); +} + QPushButton +{ +border-image: url(:/images/deletemail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/deletemail-hover.png); +} + + + + Inbox + Pobrane email + + + + Outbox + Outbox email + + + + Draft + ZaÅ‚Ä…cznik + + + + Sent + WysÅ‚ane email + + + + Timestamp + Datownik + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">reply to selected message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">odpowiedz na wybranÄ… wiadomość</p></body></html> + + + + +QPushButton +{ +border-image: url(:/images/replymail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/replymail-hover.png); +} + + +QPushButton +{ +border-image: url(:/images/replymail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/replymail-hover.png); +} + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">New Message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Nowa wiadomość</p></body></html> + + + + QPushButton +{ +border-image: url(:/images/folder-draft24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/folder-draft24-hover.png); +} + + QPushButton +{ +border-image: url(:/images/folder-draft24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/folder-draft24-hover.png); +} + + + + You get Message testing + Otrzymujesz test wiadomoÅ›ci + + + + Download All + Pobierz wszystko + + + + QPushButton +{ +border-image: url(:/images/deletemail24.png); +} + +QPushButton:hover +{ +border-image: url(:/images/deletemail-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/deletemail-pressed.png); +} + + + + + +QPushButton +{ +border-image: url(:/images/replymail24.png); +} + +QPushButton:hover +{ +border-image: url(:/images/replymail24-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/replymail-pressed.png); +} + + + + + + QPushButton +{ +border-image: url(:/images/folder-draft24.png); +} +QPushButton:hover +{ +border-image: url(:/images/folder-draft24-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/folder-draft24-pressed.png); +} + + + + + + MessengerWindow + + + QWidget#MessengerWindow { +background-color: #ECF3F6; background-image:url(:/images/backgroundimage.png); +background-position: top right; +background-repeat: no-repeat +} + QWidget#MessengerWindow { +background-color: #ECF3F6; background-image:url(:/images/backgroundimage.png); +background-position: top right; +background-repeat: no-repeat +} + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click to change your avatar</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Kliknij aby zmienić swój avatar</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Change your Status and your display</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">picture here.</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ZmieÅ„ swój status i swoje wyÅ›wietlanie</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">obrazek tutaj.</p></body></html> + + + + Online + DostÄ™pny + + + + Busy + ZajÄ™ty + + + + Be right Back + Zaraz wracam + + + + Away + Nieobecny + + + + In a Call + + + + + Out of lunch + + + + + Apear Offline + NiedostÄ™pny + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Share a personal message with your contacts</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Podziel aiÄ™ prywatnÄ… wiadomoÅ›ciÄ… z twoimi kontaktami</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Add a Friend</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Dodaj znajomego</p></body></html> + + + + Chat + Chat + + + + Connect To Friend + PoÅ‚Ä…cz z znajomym + + + + NetworkDialog + + + Peer Details / Authenticate + Detale Peera / Uwierzytelnij + + + + Load Certificate + Wczytaj certyfikat + + + + Select a pem/pqi File + Wybierz plik pem/pqi + + + + File Not Found + Nie znaleziono pliku + + + + %1 does not exist. Would you like to create it? + %1 nie istnieje. Czy chciaÅ‚byÅ› go utworzyć? + + + + Failed to Create File + BÅ‚Ä…d tworzenia pliku + + + + Unable to create %1 [%2] + Nie można stworzyć %1 [%2] + + + + Select Certificate + Wybierz certyfikat + + + + Certificates (*.pqi *.pem) + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Sieć:</span></p></body></html> + + + + # + # + + + + Accept + Akceptuj + + + + Trust + Zaufaj + + + + Last Contact + Ostatni kontakt + + + + Name + Nazwa + + + + Peer Address + Adres Peera + + + + Organisation + Organizacja + + + + Location + Lokalizacja + + + + Country + Kraj + + + + Cert Id + Cert Id + + + + Auth Code + Kod autentykacji + + + + NetworkPage + + + Rate Options + Opcje przesyÅ‚ania + + + + Max Total Data Rate (KB/S): + Maksymalna prÄ™dkość wysyÅ‚ania (KB/S): + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Rate per Person (KB/S):</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PrzesyÅ‚anie na osobÄ™ (KB/S):</p></body></html> + + + + PeersDialog + + + Chat + Chat + + + + Configure Friend + Konfiguruj znajomego + + + + Export Friend + Eksportuj znajomego + + + + Remove Friend + UsuÅ„ znajomego + + + + Save Certificate + Zapisz certyfikat + + + + Certificates (*.pqi) + Certyfikaty (*.pqi) + + + + Status + Status + + + + Person + Osoba + + + + Auto Connect + AutopoÅ‚Ä…czenie + + + + Trust Level + Zaufany poziom + + + + Peer Address + Adres Peera + + + + Last Contact + Ostatni kontakt + + + + Organisation + Organizacja + + + + Location + Lokalizacja + + + + Country + Kraj + + + + Person Id + ID osoby + + + + Auth Code + Kod autentykacji + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Friends</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Znajomi</span></p></body></html> + + + + Connect To Friend + PoÅ‚Ä…cz z znajomym + + + + # + # + + + + PopupChatDialog + + + RetroShare Friend Chat + Retroshare Przyjaciel Plotkować + + + + RetroShare User Chat + Chat użytkowników RetroShare + + + + PreferencesDialog + + + Language + JÄ™zyk + + + + Style + Styl + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zmiana jÄ™zyka przyniesie efekt po ponownym uruchomieniu RetroShare!</p></body></html> + + + + Style Sheet + Lista stylów + + + + Default + DomyÅ›lne + + + + Pagefold + Pagefold + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose RetroShare's interface style</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Wybierz styl interfejsu RetroShare</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose the language used in RetroShare</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Wybierz jÄ™zyk używany przez RetroShare</p></body></html> + + + + blue + niebieski + + + + silver + srebrny + + + + ed2k + ed2k + + + + over + nad + + + + black + czarny + + + + arachnophobia + arachnophobia + + + + Skin2 + Skin2 + + + + Login + Login + + + + Remove Auto Login + UsuÅ„ Auto Login + + + + PreferencesWindow + + + Directories + Katalogi + + + + Error Saving Configuration + BÅ‚Ä…d zapisu konfiguracji + + + + About + O + + + + General + Główne + + + + Server + Serwer + + + + Options + Opcje + + + + Cancel + Anuluj + + + + OK + Ok + + + + QObject + + + and + + + + + and / or + + + + + or + + + + + Name + Nazwa + + + + Path + + + + + Extension + + + + + Date + Data + + + + Size + Rozmiar + + + + Popularity + + + + + contains + + + + + contains all + + + + + is + + + + + less than + + + + + less than or equal + + + + + equals + + + + + greater than or equal + + + + + greater than + + + + + is in range + + + + + Rshare + + + Invalid language code specified: + BÅ‚Ä™dny kod jÄ™zyka: + + + + Invalid GUI style specified: + BÅ‚Ä™dny styl GUI: + + + + SearchDialog + + + File Name + Nazwa pliku + + + + Sources + ŹródÅ‚a + + + + Search Pattern + Wzorzec wyszukiwania + + + + Results + Rezultat + + + + File Size + Rozmiar pliku + + + + Download + Pobieranie + + + + Broadcast on Channel + KanaÅ‚ rozsiewczy + + + + Recommend to Friends + Zarekomenduj znajomemu + + + + Remove + UsuÅ„ + + + + Remove All + UsuÅ„ wszystko + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Keywords</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SÅ‚owa kluczowe</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Format</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Format</p></body></html> + + + + Any + Dowolny + + + + Audio + Audio + + + + Video + Wideo + + + + Images + Obrazy + + + + Programs + Programy + + + + Archives + Archiwa + + + + Documents + Dokumenty + + + + search + szukaj + + + + download + pobieranie + + + + Toggle advanced searching on and off. + + + + + <h3>Simple Search:</h3> + + + + + Keywords + + + + + Perform simple search + + + + + <h3>Advanced Search:</h3> + + + + + Show Advanced Search Tool + + + + + Filename + + + + + Hash + + + + + KeyWords + + + + + Search Id + + + + + ServerDialog + + + Transfer Rates + Szybkość przesyÅ‚ania + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Total Rate (kb/s) </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CaÅ‚kowite przesyÅ‚anie (kb/s) </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Per Person </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Od osoby </p></body></html> + + + + Server Settings + Ustawienia serwera + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokalny Adres:</p></body></html> + + + + Port: + Port: + + + + behind zee Firewall + Za firewallem + + + + Forwarded External Port + NastÄ™pny zewnÄ™trzny Port (Router) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ZewnÄ™trzna Nazwa</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ZewnÄ™trzny Addres:</p></body></html> + + + + Check Settings + Check Settings + + + + DHT + DHT + + + + DHT Enabled (requires restart) + DHT wÅ‚Ä…czone (wymaga restartu) + + + + Network Configuration: + Konfiguracja sieci: + + + + I'm a Noobie, and will hide behind my firewall. + Jestem Noobie i bÄ™dÄ™ ukryty za moim firewallem. + + + + I'm a real man, let me do it myself: Manual settings. + Jestem prawdziwym czÅ‚owiekiem, pozwól zrobiÄ™ to sam: Ustawienia rÄ™czne. + + + + Use uPnP to configure my router. (default) + Użyj uPnP do konfiguracji mojego routera. (domyÅ›lne) + + + + Firewall/Router Configuration + + + + + Manual router setup. + + + + + Use uPnP to configure router + + + + + Network Address Configuration (takes effect after restart) + + + + + Use DHT to locate friends + + + + + Manual IP Addresses + + + + + Server Status And Network Settings + + + + + Firewalled + + + + + Forwarded Port + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">DHT Status</p></body></html> + + + + + uPnP Status + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Local Address:</p></body></html> + + + + + ServerPage + + + Change + Restart Server + ZmieÅ„ + Restartuj serwer + + + + Server Settings + Ustawienia serwera + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ZewnÄ™trzny Adres:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokalny Adres:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + + + + Port: + Port: + + + + Misc + Misc + + + + behinde Firewall + Za firewallem + + + + Forwarded External Port + NastÄ™pny zewnÄ™trzny Port (Router) + + + + Settings + + + Settings + Ustawienia + + + + Cancel + Anuluj + + + + Apply + Zatwierdź + + + + OK + Ok + + + + General + Główne + + + + Network + Sieć + + + + Server + Serwer + + + + Directories + Katalogi + + + + SharedFilesDialog + + + Download + Pobieranie + + + + Recommend + Recommend + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Pliki</span></p></body></html> + + + + Add to Recommend List + Dodaj do listy rekomendowanych + + + + Recommend To + Rekomenduj do + + + + Message Friend + Wiadomość od znajomego + + + + StartDialog + + + Select Trusted Friend + Select Trusted Friend + + + + Certificates (*.pqi *.pem) + Certificates (*.pqi *.pem) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:13pt; font-weight:600; color:#8b0000;">Welcome to RetroShare</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:13pt; font-weight:600; color:#8b0000;">Witamy do Retroshare!</span></p></body></html> + + + + Please Login .... + Please Login .... + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Pasword</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Pasword</span></p></body></html> + + + + Load Existing User + Load Existing User + + + + Or create a New User + Or create a New User + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Organisation:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Organisation:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Location:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Location:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Password (Again)</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Password (Again)</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">New Password</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">New Password</span></p></body></html> + + + + Load Trusted Certificate (Optional) + Load Trusted Certificate (Optional) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + + + + Select File + Select File + + + + Generate New Certificate + Generate New Certificate + + + + RetroShare setup + Retroshare setup + + + + Automatically Login in Future + Automatically Login in Future + + + + RetroShare + RetroShare + + + + QWidget { + background-color: #ECF3F6; +} + QWidget { + kolor tÅ‚a: #ECF3F6; +} + + + + Auto-login + Auto-login + + + + Name: + Nazwa: + + + + Pasword: + HasÅ‚o: + + + + QToolButton{ +border-image: url(:/images/mystatus_bg.png); +background-image: url(:/images/amsn.png); +} + + QToolButton{ +border-image: url(:/images/mystatus_bg.png); +background-image: url(:/images/amsn.png); +} + + + + + Log In + Zaloguj + + + + Create a Account + + + + + Password: + + + + + QToolButton{ +border-image: url(:/images/avatar_background.png); + +} + + + + + + StatisticDialog + + + Statistics + Statystyki + + + + Download + Pobieranie + + + + Session: + Sesja: + + + + Downloaded: + Pobierane: + + + + Average Downloadspeed: + Åšrednia prÄ™dkość pobierania: + + + + Count of Downloads: + Numer pobierania: + + + + Overall + Ogólnie + + + + Upload + WysyÅ‚anie + + + + Session + Sesja + + + + Uploaded: + WysyÅ‚ane: + + + + Average Uploadspeed: + Åšrednia prÄ™dkość wysyÅ‚ania: + + + + Count of Uploads: + Numer wysyÅ‚ania: + + + + Uploaded + WysyÅ‚ane + + + + Connections: + PoÅ‚Ä…czenia: + + + + Peers: + Peers: + + + + Misc + Misc + + + + Uptime: + Czas nieprzerwanej pracy: + + + + Overall: + Ogólnie: + + + + Uptime + Czas nieprzerwanej pracy + + + + Records + Archiwa + + + + Uploadspeed: + PrÄ™dkość wysyÅ‚ania: + + + + Downloadspeed: + PrÄ™dkość pobierania: + + + + Show Settings + Pokaż ustawienia + + + + Reset + Reset + + + + Receive Rate + Pokaż Å›ciÄ…ganie + + + + Send Rate + Pokaż wysyÅ‚anie + + + + Always On Top + Zawsze na wierzchu + + + + 100 + 100 + + + + % Opaque + % nieprzezroczysty + + + + Changes the transparency of the Bandwidth Graph + ZmieÅ„ przezroczystość wykresu przepustowoÅ›ci Å‚Ä…cza + + + + Save + Zapisz + + + + Cancel + Anuluj + + + + Hide Settings + Ukryj ustawienia + + + + TransfersDialog + + + Cancel + Anuluj + + + + Clear Completed + Wyczyść ukoÅ„czone + + + + File Name + Nazwa pliku + + + + Sources + ŹródÅ‚o + + + + Status + Status + + + + File Size + Rozmiar pliku + + + + Speed + PrÄ™dkość + + + + Progress + PostÄ™p + + + + Completed + UkoÅ„czone + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Downloads:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Pobierania:</span></p></body></html> + + + + Peer Name + Nazwa Peera + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Uploads:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">WysyÅ‚ania:</span></p></body></html> + + + + % + % + + + + Name + i.e: file name + Nazwa + + + + Size + i.e: file size + Rozmiar + + + + Progress + i.e: % downloaded + PostÄ™p + + + + Speed + i.e: Download speed + PrÄ™dkość + + + + Sources + i.e: Sources + + + + + Remaining + i.e: Estimated Time of Arrival / Time left + + + + + Core-ID + + + + + User Name + i.e: user name + + + + + Progress + i.e: % uploaded + PostÄ™p + + + + Speed + i.e: upload speed + PrÄ™dkość + + + + Transferred + + + + + ULListDelegate + + + B + + + + + KB + + + + + MB + + + + + GB + + + + + VMessageBox + + + OK + Ok + + + + Cancel + Anuluj + + + + Yes + Tak + + + + No + Nie + + + + Help + Pomoc + + + + Retry + Ponów + + + + Show Log + Pokaż Log + + + + Show Settings + Pokaż ustawienia + + + + moreinfo + + + Details + Detale + + + + OK + Ok + + + + Name + Nazwa + + + + Value + Wartość + + + diff --git a/retroshare-gui/src/lang/retroshare_pt.qm b/retroshare-gui/src/lang/retroshare_pt.qm new file mode 100644 index 000000000..c313b061b Binary files /dev/null and b/retroshare-gui/src/lang/retroshare_pt.qm differ diff --git a/retroshare-gui/src/lang/retroshare_pt.ts b/retroshare-gui/src/lang/retroshare_pt.ts new file mode 100644 index 000000000..d8e185b2c --- /dev/null +++ b/retroshare-gui/src/lang/retroshare_pt.ts @@ -0,0 +1,3974 @@ + + + + + + + Arial + Arial + + + + AddFriendDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;"> To add a new Friend, cut and paste their email </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">invitation into the box below, and click done.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Para adicionar abaixo um amigo, um corte e uma pasta seu invitation do email</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">na caixa, e um clique novos feito.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;"></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + Cancel + Cancelamento + + + + Done + Feito + + + + Load From File + Carga da lima + + + + RetroShare + Retroshare + + + + Certificate Load Failed + A carga do certificado falhou + + + + Add a Friend + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"><span style=" font-size:16pt;">Add a new Friend</span><br /><br /><span style=" font-size:10pt;">To add a new Friend, cut and paste their email </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">invitation into the box below, and click done.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + + + + + AddFriendWizard + + + < Back + + + + + Next > + + + + + Cancel + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">This Wizard helps to Connect to your Friends</span></p></body></html> + + + + + I have a .pqi/.pem file received from a Friend + + + + + I have Key received from a Friend + + + + + I want to invite a friend to my RetroShare network + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Cut and paste the text below into an email.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;"> and send it to all your friends!</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">When you press next RetroShare will attempt to launch a Email client.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Invite your Friends to join with RetroShare</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Enter the Key code you got from your friend:</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">When you press next RetroShare will attempt to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">connect using the key.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Select a pqi/pem file:</span></p></body></html> + + + + + Browse + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">When you press next RetroShare will attempt to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">connect using the .pqi/.pem file.</p></body></html> + + + + + Add Friend to my netowork Wizard + + + + + AdvancedSearchDialog + + + RetrosShare: Advanced Search + + + + + Add a further search criterion. + + + + + Add a selection criterion + + + + + Reset + + + + + Cancels the search. + + + + + Cancel + + + + + Perform the advanced search. + + + + + Search + + + + + Search Criteria + + + + + Reset the search criteria. + + + + + ApplicationWindow + + + RetroShare %1 + + + + + Example Application + + + + + Application Users: 0 Files: 0 + + + + + Down: 0.0 Up: 0.0 + + + + + Connections: 0/45 + + + + + Hide + + + + + Show + + + + + RetroShare + + + + + Home + + + + + General + + + + + Advanced + + + + + QTextBrowser { + background-color: rgb(192,192,192); + + } + + + + + QPushButton + { + border-image: url(:/images/console-small-up.png) + } + + QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + + } + + QPushButton:pressed { + border-image: url(:/images/console-small-down.png) + } + + + + + + AuthorizationDialog + + + Authenticate + Authenticate + + + + Authenticate Friend By Entering Their Code + Authenticate o amigo dando entrada ao código + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH Código:</span></p></body></html> + + + + OK + APROVAÇÃO (OK) + + + + Cancel + Cancelamento + + + + BandwidthGraph + + + RetroShare Bandwidth Usage + + + + + Show Settings + + + + + Reset + + + + + Receive Rate + + + + + Send Rate + + + + + Always on Top + + + + + Style + + + + + Changes the transparency of the Bandwidth Graph + + + + + 100 + + + + + % Opaque + + + + + Save + + + + + Cancel + + + + + Since: + + + + + Hide Settings + + + + + CallToaster + + + Message + + + + + ChanCreateDialog + + + Create a new Broadcast Channel + Criar uma canaleta nova da transmissão + + + + Create A New Broadcast Channel + Criar uma canaleta nova da transmissão + + + + Channel Name: + Nome da canaleta: + + + + Type: + Tipo: + + + + Public Channel (Signed) + Canaleta pública (assinada) + + + + Private Channel (Encrypted) + Canaleta confidencial (cifrada) + + + + Cancel Channel + Cancelar a canaleta + + + + Create Channel + Create Channel + + + + ChanMsgDialog + + + Compose + Compôr + + + + Recommended Files + Limas recomendadas + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-weight:400;"><span style=" font-weight:600;">Subject:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-weight:400;"><span style=" font-weight:600;">Tópico:</span></p></body></html> + + + + Send To: + Emitir a: + + + + Send + Emitir + + + + Delete Channel + Canaleta da supressão + + + + Create Channel MSG + Criar a mensagem da canaleta + + + + 1 + + + + + Reply + + + + + ChannelsDialog + + + New Message + Mensagem nova + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Messages</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Mensagens</span></p></body></html> + + + + Date + Data + + + + Rank + Rank + + + + From + De + + + + Title + Tópico: + + + + Msg + Mensagem + + + + Count + Contagem + + + + Size + Tamanho + + + + Type + Tipo + + + + Rs[Cert/Chan]IdSize + Rs[Cert/Chan]IDSize + + + + RsMsgId + RsMsgID + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Message Text</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Texto da mensagem</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Recommended Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Limas recomendadas</span></p></body></html> + + + + New Channel + Canaleta nova + + + + Subscribe To Channel + Subscrever à canaleta + + + + Unsubscribe To Channel + Unsubscribe à canaleta + + + + Delete Your Channel + Suprimir sua canaleta + + + + Download + Download + + + + Download All + Download tudo + + + + ChatDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:9pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:400;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:9pt; font-weight:600; font-style:normal; text-decoration:none;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:400;"></p></body></html> + + + + Chat History: + História do bate-papo: + + + + Chat With: + Bate-papo com: + + + + Chat + Bate-papo + + + + Users: + + + + + ChatToaster + + + message + mensagem + + + + You Get a New Message + Você começa uma mensagem nova + + + + Message + + + + + ConfCertDialog + + + Cancel + Cancelamento + + + + Done + Feito + + + + Apply + Aplicar + + + + Peer Settings + Ajustes do Peer + + + + Port: + Porto: + + + + behind zee Firewall + atrás de um guarda-fogo (Firewall) + + + + Forwarded External Port + Porto externo enviado (Router) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Porto:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Endereço externo:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Nome externo</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Endereço local:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Max Transfer Rate (kb/s) </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Sua velocidade máxima do upload (kb/s) </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Org / Loc:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Organização/Posição:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Nome:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Country/State:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">País/estado:</p></body></html> + + + + Trust Settings + Ajustes da confiança + + + + Trust Level + Nível da confiança + + + + Trust Their Signature + Confiar em sua assinatura + + + + Sign The Certificate + Assinar o certificado + + + + OK + + + + + Peer Adress + + + + + Peer Info + + + + + ConfirmQuitDialog + + + Exit RetroShare + + + + + You are about to exit the RetroShare application and therefore stop all transfers. <br><br>Are you sure you want to stop and exit RetroShare? + + + + + Do not show this message again. + + + + + ConnectDialog + + + Peer Details + Detalhes do Peer + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">País:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Org:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Organização:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Nome:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Trust:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Confiança:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Loc:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Posição:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Certificate</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">signers:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">certificado</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">signers:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">authenticate o código</span></p></body></html> + + + + Make Friend + Fazer o amigo + + + + Close + Fim + + + + ConnectionsDialog + + + Load Certificate + Certificado da carga + + + + Select a pem/pqi File + Selecionar uma lima do PEM/PQI + + + + File Not Found + File Not Found + + + + %1 does not exist. Would you like to create it? + %1 não existe. Você gosta de criá-lo? + + + + Failed to Create File + Não criou a lima + + + + Unable to create %1 [%2] + Incapaz de criar %1 [%2] + + + + Select Certificate + Selecionar o certificado + + + + Certificates (*.pqi *.pem) + Certificados (*.pqi *.pem) + + + + Accept + Accept + + + + Trust + Confiança + + + + Last Contact + Último contato + + + + Name + Nome + + + + Organisation + Organização + + + + Location + Posição + + + + Country + País + + + + Peer Address + Endereço do par + + + + Cert Id + ID do certificado + + + + Auth Code + AUTHenticate o código + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Rede:</span></p></body></html> + + + + Peer Details / Authenticate + Os detalhes do Peer/Authenticate + + + + CryptographyDialog + + + RSA Key Size + RSA Key Size + + + + Rijndael Block size + Rijndael Block size + + + + 128 Bits + 128 Bits + + + + 192 Bits + 192 Bits + + + + 256 Bits + 256 Bits + + + + Rijndael Key Size + Rijndael Key Size + + + + Rijndael Mode + Rijndael Mode + + + + CBC + CBC + + + + ECB + ECB + + + + CFB + CFB + + + + Rijndael Padding + Rijndael Padding + + + + PKCS7 + PKCS7 + + + + Zeros + Zeros + + + + ANSIX923 + ANSIX923 + + + + ISO10126 + ISO10126 + + + + Rijndael Feedback Size + Rijndael Feedback Size + + + + Key Size: + Key Size: + + + + Block Size: + Block Size: + + + + Feedback Size: + Feedback Size: + + + + Mode: + Mode: + + + + Padding: + Padding: + + + + DLListDelegate + + + B + + + + + KB + + + + + MB + + + + + GB + + + + + DirectoriesDialog + + + Shared Directories + Diretórios compartilhados + + + + Other Directories + Outros diretórios + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Incoming Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Limas entrantes </span></p></body></html> + + + + Add Shared Directory +  Adicionar o diretório compartilhado + + + + DirectoriesPage + + + Shared Directories + Shared Directories + + + + Incoming files + Limas entrantes + + + + ExampleDialog + + + Vote Up + + + + + Vote Down + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Friends</span></p></body></html> + + + + + # + + + + + Status + + + + + Person + + + + + Auto Connect + + + + + Trust Level + + + + + Peer Address + Endereço do par + + + + Last Contact + Último contato + + + + Organisation + Organização + + + + Location + Posição + + + + Country + País + + + + Person Id + + + + + Auth Code + AUTHenticate o código + + + + ExprParamElement + + + to + + + + + ignore case + + + + + dd.MM.yyyy + + + + + KB + + + + + MB + + + + + GB + + + + + ExpressionWidget + + + Expression Widget + + + + + Delete this expression + + + + + FileHashDialog + + + Download + Download + + + + GSettingsWin + + + General + Geral + + + + Network + Rede + + + + Directories + Diretórios + + + + Server + Peer + + + + %1 + %1 + + + + GenCertDialog + + + RetroShare setup + Instalação de Retroshare + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16pt;">Generate a new profile</span><br /><br />Please fill in the information which will<br />allow your RetroShare to connect to</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Friends.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Organisation:</p></body></html> + + + + + Password (Again) + + + + + Location: + + + + + Load Trusted Certificate (Optional) + A carga confiou no certificado (opcional) + + + + Password + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + + + + Select File + Selecionar a lima + + + + Country: + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + + + + + Generate New Certificate + Gerar o certificado novo + + + + Select Trusted Friend + Selecionar o amigo confiado + + + + Certificates (*.pqi *.pem) + Certificados (*.pqi *.pem) + + + + GeneralPage + + + Keys manager + Fecha à chave o gerente + + + + Style + Gerente do chave o do à de Fecha + + + + Choose RetroShare's interface style + Escolher o estilo da relação de Retroshare + + + + Language + Língua + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">As mudanças à língua farão exame somente do efeito após ter reiniciado RetroShare!</p></body></html> + + + + Choose the language used in RetroShare + Escolher a língua usada em Retroshare + + + + GraphFrame + + + Recv: + Recieve: + + + + %1 KB/s + %1 KB/s + + + + Sent: + Emitido: + + + + %1 KB + %1 KB + + + + %1 MB + %1 MB + + + + %1 GB + %1 GB + + + + HelpDialog + + + About + + + + + Authors + + + + + Thanks to + + + + + Translation + + + + + License Agreement + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">About/Help</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:xx-large; font-weight:600; color:#0000ff;">About RetroShare.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-weight:600;">Retroshare is a private and secure decentralised commmunication platform.<br />You can use it chat, send messages and share files with your friends.</span><br /><br />This is just a placeholder page for the moment. You can<br />improve retroshare's in-built help (this text) by<br />updating the retroshare wiki: <a href="http://retroshare.wiki.sourceforge.net/help_tab"><span style=" text-decoration: underline; color:#0000ff;">This Page in the retroshare Wiki</span></a><br /><br />The About/Help Tab is regularly updated from the Wiki page.<br /><br />External Links to more information:<br /></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.sourceforge.net"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Webpage</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.wiki.sourceforge.net/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Wiki</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://sourceforge.net/projects/retroshare/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Project Page</span></a></li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.lunamutt.com"><span style=" text-decoration: underline; color:#0000ff;">Lunamutt Homepage.</span></a></li></ul></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-size:19pt; font-weight:600; color:#0000ff;">The RetroShare Team:</span><br /> <br /><span style=" font-size:9pt; color:#0000ff;">defnax</span>: Lead GUI developer <br /><span style=" font-size:9pt; color:#0000ff;">drbob7</span>: Lead Core developer. <br /> <br /><span style=" font-size:9pt; color:#0000ff;">bmeck</span> : Our new web-developer. Joined retroshare a couple <br />of weeks ago, and already starting on an exciting new <br />design for the web-page. <br /> <br /><span style=" font-size:9pt; color:#0000ff;">noragen</span> : Developer from the SIM-IM project. Working on a retroshare plugin to SIM-IM. <br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">kernelpanix</span> : Gui and skin developer</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">libris</span><span style=" font-size:9pt;">:</span> core developer</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-size:9pt; color:#0000ff;">kashif: </span><span style=" color:#000000;">core developer</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt; color:#000000;"><span style=" font-size:8pt;"><br /></span><span style=" color:#0000ff;">agent725</span><span style=" font-size:8pt;">: Manages the 'local' Retroshare release, <br />and beta-testing retroshare on a large scale. <br /> <br /></span><span style=" color:#0000ff;">the_mgt</span><span style=" font-size:8pt;">: Maintains the Gentoo and generic linux <br />installation/compilation scripts. </span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">notdefine:</span> Maintains the .rpm, .deb installation/compilation scripts.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">zhouk</span>: developer</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Translators:</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Serbian</span>: Kunalagon Umuhanik &lt;kunalagon@gmail.com&gt;</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Polish: </span>Jarek</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">French</span>:Temet</p></body></html> + + + + + InviteDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">To </span><span style=" font-size:10pt; font-weight:600;">Invite your friends to join you with Retroshare: </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">Cut and paste the text below into an email.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">and send it to all your friends!</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Para </span><span style=" font-size:10pt; font-weight:600;">convidar seus amigos juntá-lo com Retroshare: </span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">Corte e pasta o texto abaixo em um email.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">e emiti-lo a todos seus amigos!</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + Done + Feito + + + + Cancel + Cancelamento + + + + Launch Email + Email convencional do lançamento + + + + Invite a Friend + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"><span style=" font-size:16pt;">Invite a Friend</span><br /><br /><span style=" font-size:10pt;">To Invite your friends to join you with Retroshare: </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">Cut and paste the text below into an email.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">and send it to all your friends!</p></body></html> + + + + + LogDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> + +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="ABOUT"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">About RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShare is a private peer to peer communication platform created by Dr. Bob.This program enables you to securely share files and chat with your friends (and no-one else!).</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, and the latest release go to http://www.lunamutt.com.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="START"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Quick Start Guide to RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If this is your first time using Retroshare, it is recommended that you readthis guide for instructions on how to get started. The first step is:<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Connecting to Your Friends</span></a>. Once you have managed this you can <a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">Download Files</span></a> and<a href="#START-SHARE"><span style=" text-decoration: underline; color:#0000ff;">Share with Others</span></a></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Some of the key concepts related to ensuring your sharing remains private aredescribed in the <a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">Frequently Asked Questions</span></a>. Some Key security questions are:<a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">What is a Web of Trust?</span></a>, <a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">Should I Sign this Certificate?</span></a>, and finally<a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">What does "Trust" Mean?</span></a>.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is also worthwhile reading the <a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">GUI Overview</span></a>which describes the featureson available through the User Interface.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Connecting to your Friends </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">There are four steps to connecting to a Friend:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Get Friend's Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Load Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Sign Certificate</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect to Friend.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The instructions might initially appear long and daunting, however thesesteps are required to ensure that your sharing is private and secure.These steps are only required a couple of times, to add new friends, and become quite straight forward after the first time.</p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (1) EXCHANGE CERTIFICATES </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Before you can connect, you need send your certificate to your friend, and get your friends certificate. Follow these steps to get your certificate:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on Your Certificate to Select it.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on the "Export Friend" Button to bring up a file save dialog.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select directory to save the certificate to.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Enter desired filename. (with a file type of .pqi), and Click OK.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Email this File to your Friend. (It is recommended you put thecertificate in a zip file before sending, as some email programsdon't transmit the file correctly).</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Ask your friend to do the same.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Once you have received your friend's certificate, removed itfrom the zip file and saved it to disk, you can proceed to step (2).</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Note: This exchange of certificates is only necessary to get you started.Once you are connected to some friends the exchange of certificates becomeautomated by the autoDiscovery system. See<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">GUI: Connecting</span></a> for more information.------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (2) LOAD YOUR FRIEND'S CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Import Friend"</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select your friends certificate file, then click "Okay". Their certificate should appear in the top window of the "Connect" Tab.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (3) SIGN CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select their Certificate by clicking on their name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Configure Friend" Button. This will bring up a configuration window. which allows you to look at the detailsof the certificate.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click the "Sign Certificate" button near the bottom of the "Certificate Configuration" Window.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Now close the window by clicking on the "Done" button.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Your Friends certificate should now say "Trusted (S)", indicating it is ready for connections.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can only share with "Trusted" Peers. You must sign your Friend'scertificate to prove that you know the certificate belongs to your Friend. Do not sign any/all certificates - only the people youtrust. For more information see: <br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br />------------------------------------------------------------------------<br /><br /> <br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (4) AUTOCONNECT TO PEER </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Finally You need to activate the connection:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click in the Box, next to your friends Name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> A Tick should appear in the box, a connection will be started.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> The "Offline" will change to "Online" when you have successfullyconnected.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Remember: Your initial connection attempts will fail, until your friend has signed your certificate and ticked the Auto-Connect Box.This ensures that both peers trust each other, and stops random peopleaccessing your files.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>. <br />------------------------------------------------------------------------<br /><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-DOWNLOAD"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Downloading Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have connected to friends, you can download their shared files.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can search for the files you want using either:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) File Listing Tab: This gives you a directory view of the files being shared by your peers. Double clickon the directory name (not the arrow) to diplay its subdirectories and files.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 1: This can take up to 5 seconds to fetch the information for your peer.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 2: If the directory is empty, or the person is offline, then the request will silently fail.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Search Tab: Retroshare also allows you to search your peers computers for filenames. Enter yourterm(s) in the search box at the top of the TAB and click the "Search" button. This willsearch all of the peers that you are currently connected to.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 3: If any matching files are found they will be displayed within 5 - 10 seconds.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have found the files you want, Select the file(s), and click "Download" to begin the download process.If you click over the "File Transfer" TAB, the status of the files will appear.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 4: The files can take up to 10 seconds to appear in the transfer window.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-SHARING"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Sharing Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can specify which files you want to share in the "Config" Tab.In the "Share Directories" section, click the "Add Directory" Button, and select the directory you want to share.The files and subdirectories will become available for you peers.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can remove a directory from the Shared Directories List by clicking onthe directory name in the list, and then clicking "Remove Directory".</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="GUI"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Gui Overview (Tab Description) </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The GUI is divided up into several sections which can be accessed by clicking on the Tabs along the top of the main window. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect: Manage Connections and Friends.(<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">getting started</span></a> and<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Listing: A directory view of available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Search: Search for available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Messages: For Sending/Recving Message. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Channels: A broadcast/subscription system. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Transfer: Listing of Current and completed Transfers.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Config: Specify of share diectories and IP Addresses.(<a href="#GUI-CONFIG"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> About: Help and other Information.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Chat: Accessed by the clicking on the "Chat" button.</li></ul> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Connect Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Connect TAB consists of two windows. The upper windowshows a list of your friends. This window indicates each friendscurrent trust level, as well as their connection state.The "Trust_Lvl" Column indicates if the certificate has beenAuthenticated using the web of trust. You can only connect to "Trusted" certificates. Tick the "Auto_Connect" box to connect to your trusted friends.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The lower window provides a list of the friends of your friends.This window shows the neighbour's name and how long ago they attempted to connect to you. This window is automatically populatedby the autoDiscovery system, and should be used to expand yourretroShare network. A word of warning: Do not automatically trust (or sign) anyonethat appears in this window. First verify by some other means (email/phone)that certificate belongs to the person you think it does.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use the "Neighbour List" window to expand your friend list. Select the desired entry in the lower window by clicking on it, then click the "Add to Friends" Button to move it to the upper window.Likewise the "Remove from Friends" button moved a person from the upper window to the lower window.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The "Configure Friend" Button opens a Certificate Configuration window.This window can be used to examine the certificate details, sign the certificate or manually change the peer's IP Address.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">See Also:<br /><a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Getting Started: Connecting to your friends</span></a>.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>.<br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONFIG"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Config Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Configuration Tab allows you to select the share directories, as well as the directory that downloaded files are saved to.<br />See <a href="#STARTUP-SHARING"><span style=" text-decoration: underline; color:#0000ff;">Sharing you Files</span></a> for details. </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Config Tab also allows you to control the IP Address and Portused by RetroShare. Under most cirumstances you do not need to changethese setting. If you are behind a firewall and can setup a forwarded port, the selected IP Address and Port should be specified here.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="FAQ"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Frequently Asked Questions </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">How does the security/privacy work? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShares uses a Web of Trust Authentication system to ensurethat your "friends" are your friends, and uses SSL to encryptthe communcications between peers. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What is a Web of Trust? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Web of Trust relies on a collection of peers to identify eachother. Look it up on the Web!</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-TRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What does "Trust" Mean in RetroShare?</span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Anyone can generate a certificate, with any name on it. So howdo you know that the certificate that claims to be from "Joe Bloggs"is really from your mate Joe. This is the "AuthenticationProblem". RetroShare uses a Web of Trust to Authenticate your peers.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-SIGN"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Should I Sign this Certificate? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should only sign a certificate if you are completely surethat it comes from the "right" person. If you sign a certificateyou are "Authenticating" the person to yourself and others.If you sign certificates that you haven't checked, then you aredestroying your own privacy and security.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">How do you verify a certificate? Use an alternative method ofcommunication to send the certificate: E.g. email or USB stick. This will improve you confidence that the certificate belongsto the correct person. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><span style=" font-size:small;"> </span><a name="FAQ-CONNECT"></a><span style=" font-size:small;">W</span><span style=" font-size:small;">hy won't it Connect?</span><span style=" font-size:small;"> </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A connection can fail for a number of reasons:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) Failed Authentication. Have both peers signed each otherscertificates? </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Firewalls. If both peers are behind firewalls then they cannotconnect directly. RetroShare has a built in proxy system to circumventfirewalls - However this can only function if both peers can connect to a common third party that is not behind a firewall. Thisis the most likely reason for initial connections to fail. The only solution to find a common friend that isn't firewalled (know anyone with Broadband?)</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(3) IP Addresses are wrong. You can manually examine and change these using the Certificate configuration.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +</body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="ABOUT"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">About RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShare is a private peer to peer communication platform created by Dr. Bob.This program enables you to securely share files and chat with your friends (and no-one else!).</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, and the latest release go to http://www.lunamutt.com.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="START"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Quick Start Guide to RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If this is your first time using Retroshare, it is recommended that you readthis guide for instructions on how to get started. The first step is:<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Connecting to Your Friends</span></a>. Once you have managed this you can <a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">Download Files</span></a> and<a href="#START-SHARE"><span style=" text-decoration: underline; color:#0000ff;">Share with Others</span></a></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Some of the key concepts related to ensuring your sharing remains private aredescribed in the <a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">Frequently Asked Questions</span></a>. Some Key security questions are:<a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">What is a Web of Trust?</span></a>, <a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">Should I Sign this Certificate?</span></a>, and finally<a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">What does "Trust" Mean?</span></a>.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is also worthwhile reading the <a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">GUI Overview</span></a>which describes the featureson available through the User Interface.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Connecting to your Friends </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">There are four steps to connecting to a Friend:</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Get Friend's Certificate</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Load Certificate</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Sign Certificate</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect to Friend.</li></ul><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The instructions might initially appear long and daunting, however thesesteps are required to ensure that your sharing is private and secure.These steps are only required a couple of times, to add new friends, and become quite straight forward after the first time.</p><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (1) EXCHANGE CERTIFICATES </span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Before you can connect, you need send your certificate to your friend, and get your friends certificate. Follow these steps to get your certificate:</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on Your Certificate to Select it.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on the "Export Friend" Button to bring up a file save dialog.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select directory to save the certificate to.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Enter desired filename. (with a file type of .pqi), and Click OK.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Email this File to your Friend. (It is recommended you put thecertificate in a zip file before sending, as some email programsdon't transmit the file correctly).</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Ask your friend to do the same.</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Once you have received your friend's certificate, removed itfrom the zip file and saved it to disk, you can proceed to step (2).</li></ul><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Note: This exchange of certificates is only necessary to get you started.Once you are connected to some friends the exchange of certificates becomeautomated by the autoDiscovery system. See<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">GUI: Connecting</span></a> for more information.------------------------------------------------------------------------<br /><br /><br /></p><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (2) LOAD YOUR FRIEND'S CERTIFICATE </span></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Import Friend"</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select your friends certificate file, then click "Okay". Their certificate should appear in the top window of the "Connect" Tab.</li></ul><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">------------------------------------------------------------------------<br /><br /><br /></p><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (3) SIGN CERTIFICATE </span></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select their Certificate by clicking on their name.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Configure Friend" Button. This will bring up a configuration window. which allows you to look at the detailsof the certificate.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click the "Sign Certificate" button near the bottom of the "Certificate Configuration" Window.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Now close the window by clicking on the "Done" button.</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Your Friends certificate should now say "Trusted (S)", indicating it is ready for connections.</li></ul><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can only share with "Trusted" Peers. You must sign your Friend'scertificate to prove that you know the certificate belongs to your Friend. Do not sign any/all certificates - only the people youtrust. For more information see: <br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br />------------------------------------------------------------------------<br /><br /> <br /></p><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (4) AUTOCONNECT TO PEER </span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Finally You need to activate the connection:</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click in the Box, next to your friends Name.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> A Tick should appear in the box, a connection will be started.</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> The "Offline" will change to "Online" when you have successfullyconnected.</li></ul><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Remember: Your initial connection attempts will fail, until your friend has signed your certificate and ticked the Auto-Connect Box.This ensures that both peers trust each other, and stops random peopleaccessing your files.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>. <br />------------------------------------------------------------------------<br /><br /><br /></p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-DOWNLOAD"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Downloading Files </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have connected to friends, you can download their shared files.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can search for the files you want using either:</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) File Listing Tab: This gives you a directory view of the files being shared by your peers. Double clickon the directory name (not the arrow) to diplay its subdirectories and files.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 1: This can take up to 5 seconds to fetch the information for your peer.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 2: If the directory is empty, or the person is offline, then the request will silently fail.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Search Tab: Retroshare also allows you to search your peers computers for filenames. Enter yourterm(s) in the search box at the top of the TAB and click the "Search" button. This willsearch all of the peers that you are currently connected to.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 3: If any matching files are found they will be displayed within 5 - 10 seconds.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have found the files you want, Select the file(s), and click "Download" to begin the download process.If you click over the "File Transfer" TAB, the status of the files will appear.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 4: The files can take up to 10 seconds to appear in the transfer window.</p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-SHARING"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Sharing Files </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can specify which files you want to share in the "Config" Tab.In the "Share Directories" section, click the "Add Directory" Button, and select the directory you want to share.The files and subdirectories will become available for you peers.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can remove a directory from the Shared Directories List by clicking onthe directory name in the list, and then clicking "Remove Directory".</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="GUI"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Gui Overview (Tab Description) </span><span style=" font-size:medium;"> </span></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The GUI is divided up into several sections which can be accessed by clicking on the Tabs along the top of the main window. </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect: Manage Connections and Friends.(<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">getting started</span></a> and<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Listing: A directory view of available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Search: Search for available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Messages: For Sending/Recving Message. (Coming Soon)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Channels: A broadcast/subscription system. (Coming Soon)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Transfer: Listing of Current and completed Transfers.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Config: Specify of share diectories and IP Addresses.(<a href="#GUI-CONFIG"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> About: Help and other Information.</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Chat: Accessed by the clicking on the "Chat" button.</li></ul><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Connect Tab </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Connect TAB consists of two windows. The upper windowshows a list of your friends. This window indicates each friendscurrent trust level, as well as their connection state.The "Trust_Lvl" Column indicates if the certificate has beenAuthenticated using the web of trust. You can only connect to "Trusted" certificates. Tick the "Auto_Connect" box to connect to your trusted friends.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The lower window provides a list of the friends of your friends.This window shows the neighbour's name and how long ago they attempted to connect to you. This window is automatically populatedby the autoDiscovery system, and should be used to expand yourretroShare network. A word of warning: Do not automatically trust (or sign) anyonethat appears in this window. First verify by some other means (email/phone)that certificate belongs to the person you think it does.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use the "Neighbour List" window to expand your friend list. Select the desired entry in the lower window by clicking on it, then click the "Add to Friends" Button to move it to the upper window.Likewise the "Remove from Friends" button moved a person from the upper window to the lower window.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The "Configure Friend" Button opens a Certificate Configuration window.This window can be used to examine the certificate details, sign the certificate or manually change the peer's IP Address.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">See Also:<br /><a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Getting Started: Connecting to your friends</span></a>.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>.<br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br /></p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONFIG"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Config Tab </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Configuration Tab allows you to select the share directories, as well as the directory that downloaded files are saved to.<br />See <a href="#STARTUP-SHARING"><span style=" text-decoration: underline; color:#0000ff;">Sharing you Files</span></a> for details. </p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Config Tab also allows you to control the IP Address and Portused by RetroShare. Under most cirumstances you do not need to changethese setting. If you are behind a firewall and can setup a forwarded port, the selected IP Address and Port should be specified here.</p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="FAQ"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Frequently Asked Questions </span><span style=" font-size:medium;"> </span></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">How does the security/privacy work? </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShares uses a Web of Trust Authentication system to ensurethat your "friends" are your friends, and uses SSL to encryptthe communcications between peers. </p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What is a Web of Trust? </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Web of Trust relies on a collection of peers to identify eachother. Look it up on the Web!</p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-TRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What does "Trust" Mean in RetroShare?</span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Anyone can generate a certificate, with any name on it. So howdo you know that the certificate that claims to be from "Joe Bloggs"is really from your mate Joe. This is the "AuthenticationProblem". RetroShare uses a Web of Trust to Authenticate your peers.</p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-SIGN"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Should I Sign this Certificate? </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should only sign a certificate if you are completely surethat it comes from the "right" person. If you sign a certificateyou are "Authenticating" the person to yourself and others.If you sign certificates that you haven't checked, then you aredestroying your own privacy and security.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">How do you verify a certificate? Use an alternative method ofcommunication to send the certificate: E.g. email or USB stick. This will improve you confidence that the certificate belongsto the correct person. </p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><span style=" font-size:small;"> </span><a name="FAQ-CONNECT"></a><span style=" font-size:small;">W</span><span style=" font-size:small;">hy won't it Connect?</span><span style=" font-size:small;"> </span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A connection can fail for a number of reasons:</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) Failed Authentication. Have both peers signed each otherscertificates? </p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Firewalls. If both peers are behind firewalls then they cannotconnect directly. RetroShare has a built in proxy system to circumventfirewalls - However this can only function if both peers can connect to a common third party that is not behind a firewall. Thisis the most likely reason for initial connections to fail. The only solution to find a common friend that isn't firewalled (know anyone with Broadband?)</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(3) IP Addresses are wrong. You can manually examine and change these using the Certificate configuration.</p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table></body></html> + + + + MainWindow + + + Preferences + Preferências + + + + Network + Rede + + + + Friends + Bate-papo aos amigos + + + + Transfers + Transferências + + + + Messages + Email-Mensagens + + + + Channels + Canaletas + + + + Options + Opções + + + + Users: 0 Files: 0 + Usuários: 0 Limas: 0 + + + + Down: 0.0 Up: 0.0 + Down: 0.0 Up: 0.0 + + + + Connections: 0/45 + Conexões: 1/45 + + + + System tray is unavailable + A bandeja do sistema é unavailable + + + + System tray unavailable + A bandeja do sistema é unavailable + + + + RetroShare System tray + Bandeja do sistema de Retroshare + + + + Application will continue running. Quit using context menu in the system tray +  A aplicação continuará funcionando. Menu usando-se parado do contexto na bandeja do sistema. + + + + Hide + não mostrar + + + + Show + Mostra + + + + RetroShare + Retroshare + + + + Home + Home + + + + General + General + + + + Invite Friend + Convidar o amigo + + + + Add Friend + Amigo de Convidar o + + + + Add Share + Adicionar a parte + + + + Advanced + Advanced + + + + QTextBrowser { + background-color: rgb(192,192,192); + +} + QTextBrowser { background-color: rgb(192,192,192);} + + + + QPushButton +{ + border-image: url(:/images/console-small-up.png) +} + +QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + +} + +QPushButton:pressed { + border-image: url(:/images/console-small-down.png) +} + + QPushButton{ border-image: url(:/images/console-small-up.png) }QPushButton:hover { border-image: url(:/images/console-small-hover.png) }QPushButton:pressed { border-image: url(:/images/console-small-down.png) } + + + + Exit + Saída + + + + Search + Busca + + + + Files + Limas + + + + Chat + Bate-papo do grupo + + + + Add Shared Directory + Adicionar o diretório compartilhado + + + + About/Help + + + + + Messenger + + + + + Show/Hide + + + + + &Quit + + + + + Bandwidth Graph + + + + + Open Messenger + + + + + RetroShare %1 + + + + + Add a Friend + + + + + Invite a Friend + + + + + Add a Share + + + + + Quit + + + + + Minimize + + + + + Maximize + + + + + Hide Console + + + + + Show Console + + + + + Hide ToolBox + + + + + :images/hide_toolbox_frame.png + + + + + Show ToolBox + + + + + :images/show_toolbox_frame.png + + + + + QTextBrowser { + background-color: rgb(192,192,192); + + } + + + + + QPushButton + { + border-image: url(:/images/console-small-up.png) + } + + QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + + } + + QPushButton:pressed { + border-image: url(:/images/console-small-down.png) + } + + + + + + Apps + + + + + MessageToaster + + + message + mensagem + + + + MessagesDialog + + + New Message + Mensagem nova + + + + Reply to Message + + + + + Remove Message + Remover a mensagem + + + + Date + Data + + + + From + De + + + + Title + Título + + + + Msg + Mensagem + + + + Count + Contagem + + + + Size + Tamanho + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Recommended Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Limas recomendadas</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">remove selected message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">remover a mensagem selecionada </p></body></html> + + + + QPushButton +{ +border-image: url(:/images/deletemail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/deletemail-hover.png); +} + QPushButton{border-image: url(:/images/deletemail24.png);}QPushButton:pressed{border-image: url(:/images/deletemail-hover.png);} + + + + Inbox + Email-Inbox + + + + Outbox + Email-Outbox + + + + Draft + Esboço + + + + Sent + Email-Emitido + + + + Timestamp + Timestamp + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">reply to selected message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">resposta à mensagem selecionada </p></body></html> + + + + +QPushButton +{ +border-image: url(:/images/replymail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/replymail-hover.png); +} + + QPushButton{border-image: url(:/images/replymail24.png);}QPushButton:pressed{border-image: url(:/images/replymail-hover.png);} + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">New Message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mensagem nova</p></body></html> + + + + QPushButton +{ +border-image: url(:/images/folder-draft24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/folder-draft24-hover.png); +} + + QPushButton{border-image: url(:/images/folder-draft24.png);}QPushButton:pressed {border-image: url(:/images/folder-draft24-hover.png);} + + + + You get Message testing + Você começa esta mensagem para testar + + + + Download All + Download tudo + + + + QPushButton +{ +border-image: url(:/images/deletemail24.png); +} + +QPushButton:hover +{ +border-image: url(:/images/deletemail-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/deletemail-pressed.png); +} + + + + + +QPushButton +{ +border-image: url(:/images/replymail24.png); +} + +QPushButton:hover +{ +border-image: url(:/images/replymail24-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/replymail-pressed.png); +} + + + + + + QPushButton +{ +border-image: url(:/images/folder-draft24.png); +} +QPushButton:hover +{ +border-image: url(:/images/folder-draft24-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/folder-draft24-pressed.png); +} + + + + + + MessengerWindow + + + QWidget#MessengerWindow { +background-color: #ECF3F6; background-image:url(:/images/backgroundimage.png); +background-position: top right; +background-repeat: no-repeat +} + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click to change your avatar</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Change your Status and your display</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">picture here.</p></body></html> + + + + + Online + + + + + Busy + + + + + Be right Back + + + + + Away + + + + + In a Call + + + + + Out of lunch + + + + + Apear Offline + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Share a personal message with your contacts</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Add a Friend</p></body></html> + + + + + Chat + + + + + Connect To Friend + + + + + NetworkDialog + + + Peer Details / Authenticate + Os detalhes do Peer/Authenticate + + + + Load Certificate + Certificado da carga + + + + Select a pem/pqi File + Selecionar uma lima do PEM/PQI + + + + File Not Found + File Not Found + + + + %1 does not exist. Would you like to create it? + %1 não existe. Você gosta de criá-lo? + + + + Failed to Create File + Não criou a lima + + + + Unable to create %1 [%2] + Incapaz de criar %1 [%2] + + + + Select Certificate + Selecionar o certificado + + + + Certificates (*.pqi *.pem) + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Rede:</span></p></body></html> + + + + # + + + + + Accept + Accept + + + + Trust + Confiança + + + + Last Contact + Último contato + + + + Name + Nome + + + + Peer Address + Endereço do par + + + + Organisation + Organização + + + + Location + Posição + + + + Country + País + + + + Cert Id + ID do certificado + + + + Auth Code + AUTHenticate o código + + + + NetworkPage + + + Rate Options + Opções da velocidade + + + + Max Total Data Rate (KB/S): + Sua velocidade máxima do upload (KB/S): + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Rate per Person (KB/S):</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Velocidade por a pessoa (KB/S):</p></body></html> + + + + PeersDialog + + + Chat + bate-papo + + + + Configure Friend + Configurar o amigo + + + + Export Friend + Export Friend + + + + Remove Friend + Remover o amigo + + + + Save Certificate + Excepto o certificado + + + + Certificates (*.pqi) + Certificados (*.pqi) + + + + Status + Status + + + + Person + Pessoa + + + + Auto Connect + O automóvel conecta + + + + Trust Level + Nível da confiança + + + + Peer Address + Endereço do par + + + + Last Contact + Last Contact + + + + Organisation + Último contato + + + + Location + Posição + + + + Country + Country + + + + Person Id + ID de pessoa + + + + Auth Code + AUTHenticate o código + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Friends</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Amigos</span></p></body></html> + + + + Connect To Friend + Conectar ao amigo + + + + # + + + + + PopupChatDialog + + + RetroShare Friend Chat + Bate-papo do amigo de Retroshare + + + + RetroShare User Chat + + + + + PreferencesDialog + + + Language + Língua + + + + Style + Língua + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">As mudanças à língua farão exame somente do efeito após ter reiniciado Retroshare!</p></body></html> + + + + Style Sheet + Folha do estilo + + + + Default + Defeito + + + + Pagefold + Pagefold + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose RetroShare's interface style</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Escolher o estilo da relação de Retroshare</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose the language used in RetroShare</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Escolher a língua usada em Retroshare </p></body></html> + + + + blue + azul + + + + silver + prata + + + + ed2k + emule-ed2k + + + + over + over + + + + black + preto + + + + arachnophobia + arachnophobia + + + + Skin2 + Pele2 + + + + Login + Início de uma sessão (Login) + + + + Remove Auto Login + Remover o auto início de uma sessão + + + + PreferencesWindow + + + Directories + Diretórios + + + + Error Saving Configuration + Configuração do Saving do erro + + + + About + Sobre + + + + General + Geral + + + + Server + Peer + + + + Options + Opções + + + + Cancel + Cancelamento + + + + OK + APROVAÇÃO (OK) + + + + QObject + + + Name + Nome + + + + Path + + + + + Extension + + + + + Date + + + + + Size + + + + + Popularity + + + + + contains + + + + + contains all + + + + + is + + + + + less than + + + + + less than or equal + + + + + greater than or equal + + + + + greater than + + + + + is in range + + + + + and + + + + + and / or + + + + + or + + + + + equals + + + + + Rshare + + + Invalid language code specified: + Código inválido da língua especificado: + + + + Invalid GUI style specified: + Estilo inválido do GUI especificado: + + + + SearchDialog + + + File Name + Lima - nome + + + + Sources + Fontes + + + + Search Pattern + Teste padrão da busca + + + + Results + Resultados + + + + File Size + Tamanho de lima + + + + Download + Download + + + + Broadcast on Channel + Transmissão na canaleta + + + + Recommend to Friends + Recomendar aos amigos + + + + Remove + Remover + + + + Remove All + Remover tudo + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Keywords</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Keywords</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Format</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Formato</p></body></html> + + + + Any + Alguns + + + + Audio + Audio + + + + Video + Vídeo + + + + Images + Imagens + + + + Programs + Programs + + + + Archives + Arquivos + + + + Documents + Originais + + + + search + busca + + + + download + download + + + + Toggle advanced searching on and off. + + + + + <h3>Simple Search:</h3> + + + + + Keywords + + + + + Perform simple search + + + + + Show Advanced Search Tool + + + + + Filename + + + + + Hash + + + + + KeyWords + + + + + Search Id + + + + + <h3>Advanced Search:</h3> + + + + + ServerDialog + + + Transfer Rates + Velocidade de transferência + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Total Rate (kb/s) </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Sua velocidade máxima do upload (KB/S) </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Per Person </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Por a pessoa </p></body></html> + + + + Server Settings + Ajustes do Peer + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Endereço local:</p></body></html> + + + + Port: + Porto: + + + + behind zee Firewall + atrás de um guarda-fogo + + + + Forwarded External Port + Porto externo enviado (Router) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Porto:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Nome externo</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Endereço externo:</p></body></html> + + + + Check Settings + Verificar ajustes + + + + Firewall/Router Configuration + + + + + Manual router setup. + + + + + Use uPnP to configure router + + + + + Network Address Configuration (takes effect after restart) + + + + + Use DHT to locate friends + + + + + Manual IP Addresses + + + + + Server Status And Network Settings + + + + + Firewalled + + + + + Forwarded Port + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">DHT Status</p></body></html> + + + + + uPnP Status + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Local Address:</p></body></html> + + + + + ServerPage + + + Change + Restart Server + Mudança + Reinício + + + + Server Settings + Ajustes do Peer + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Endereço externo:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Endereço local:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Porto:</p></body></html> + + + + Port: + Porto: + + + + Misc + Misc + + + + behinde Firewall + rás de um guarda-fogo (Firewall) + + + + Forwarded External Port + Porto externo enviado (Router) + + + + Settings + + + Settings + Ajustes + + + + Cancel + Cancelamento + + + + Apply + Aplicar + + + + OK + APROVAÇÃO (OK) + + + + General + Geral + + + + Network + Rede + + + + Server + Peer + + + + Directories + Diretórios + + + + SharedFilesDialog + + + Download + Download + + + + Recommend + Recomendar + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Limas</span></p></body></html> + + + + Add to Recommend List + + + + + Recommend To + + + + + Message Friend + + + + + StartDialog + + + Select Trusted Friend + Selecionar o amigo confiado + + + + Certificates (*.pqi *.pem) + Certificados (*.pqi *.pem) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:13pt; font-weight:600; color:#8b0000;">Welcome to RetroShare</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:13pt; font-weight:600; color:#8b0000;">Boa vinda a Retroshare</span></p></body></html> + + + + Please Login .... + Por favor início de uma sessão (Login)…. + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Nome:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Pasword</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Senha (Password)</span></p></body></html> + + + + Load Existing User + Usuário existente da carga + + + + Or create a New User + Ou criar um usuário novo + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Organisation:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Organização:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">País:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Location:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Posição:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Password (Again)</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Senha (outra vez)</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">New Password</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">senha nova </span></p></body></html> + + + + Load Trusted Certificate (Optional) + A carga confiou no certificado (opcional) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + + + + Select File + Selecionar a lima + + + + Generate New Certificate + Gerar o certificado novo + + + + RetroShare setup + Instalação de Retroshare + + + + Automatically Login in Future + Automaticamente início de uma sessão no futuro + + + + RetroShare + + + + + QWidget { + background-color: #ECF3F6; +} + + + + + Auto-login + + + + + Name: + + + + + Log In + + + + + Password: + + + + + Create a Account + + + + + QToolButton{ +border-image: url(:/images/avatar_background.png); + +} + + + + + + StatisticDialog + + + Statistics + Statistics + + + + Download + + + + + Session: + Session: + + + + Downloaded: + Downloaded: + + + + Average Downloadspeed: + Average Downloadspeed: + + + + Count of Downloads: + Count of Downloads: + + + + Overall + Overall + + + + Upload + Upload + + + + Session + Session + + + + Uploaded: + Uploaded: + + + + Average Uploadspeed: + Average Uploadspeed: + + + + Count of Uploads: + Count of Uploads: + + + + Uploaded + Uploaded + + + + Connections: + Connections: + + + + Peers: + Peers: + + + + Misc + Misc + + + + Uptime: + Uptime: + + + + Overall: + Overall: + + + + Uptime + Uptime + + + + Records + Records + + + + Uploadspeed: + Uploadspeed: + + + + Downloadspeed: + Downloadspeed: + + + + Show Settings + Show Settings + + + + Reset + Restauração + + + + Receive Rate + Receive Rate + + + + Send Rate + Send Rate + + + + Always On Top + Sempre no alto + + + + 100 + 100 + + + + % Opaque + % Opaque + + + + Changes the transparency of the Bandwidth Graph + Muda a transparência do gráfico da largura de faixa + + + + Save + Excepto + + + + Cancel + Cancelamento + + + + Hide Settings + Não mostrar ajustes + + + + TransfersDialog + + + Cancel + Cancelamento + + + + Clear Completed + O espaço livre terminou + + + + File Name + Lima - nome + + + + Sources + Fontes + + + + Status + Status + + + + File Size + Tamanho de lima + + + + Speed + Velocidade + + + + Progress + Progresso + + + + Completed + Terminado + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Downloads:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Downloads:</span></p></body></html> + + + + Peer Name + Peer Nome + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Uploads:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Uploads:</span></p></body></html> + + + + Name + i.e: file name + Nome + + + + Size + i.e: file size + + + + + Progress + i.e: % downloaded + Progresso + + + + Speed + i.e: Download speed + Velocidade + + + + Sources + i.e: Sources + Fontes + + + + Remaining + i.e: Estimated Time of Arrival / Time left + + + + + Core-ID + + + + + User Name + i.e: user name + + + + + Progress + i.e: % uploaded + Progresso + + + + Speed + i.e: upload speed + Velocidade + + + + Transferred + + + + + ULListDelegate + + + B + + + + + KB + + + + + MB + + + + + GB + + + + + VMessageBox + + + OK + APROVAÇÃO (OK) + + + + Cancel + Cancelamento + + + + Yes + Sim + + + + No + Não + + + + Help + Ajuda + + + + Retry + Nova tentativa + + + + Show Log + Mostrar a história + + + + Show Settings + Mostrar ajustes + + + + moreinfo + + + Details + Detalhes + + + + OK + APROVAÇÃO (OK) + + + + Name + Nome + + + + Value + Valor + + + diff --git a/retroshare-gui/src/lang/retroshare_ru.qm b/retroshare-gui/src/lang/retroshare_ru.qm new file mode 100644 index 000000000..89a9c5da7 Binary files /dev/null and b/retroshare-gui/src/lang/retroshare_ru.qm differ diff --git a/retroshare-gui/src/lang/retroshare_ru.ts b/retroshare-gui/src/lang/retroshare_ru.ts new file mode 100644 index 000000000..f7a2695a3 --- /dev/null +++ b/retroshare-gui/src/lang/retroshare_ru.ts @@ -0,0 +1,3974 @@ + + + + + + + Arial + Arial + + + + AddFriendDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;"> To add a new Friend, cut and paste their email </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">invitation into the box below, and click done.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Чтобы добавить нового друга, вырезать и вÑтавить их приглашение по Ñлектронной почте</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">в поле, раÑположенном ниже и нажмите кнопку Ñделали.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;"></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + Cancel + ВернутьÑÑ/Отмена + + + + Done + Готово + + + + Load From File + Загрузка из файла + + + + RetroShare + Retroshare + + + + Certificate Load Failed + СвидетельÑтво нагрузки не + + + + Add a Friend + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"><span style=" font-size:16pt;">Add a new Friend</span><br /><br /><span style=" font-size:10pt;">To add a new Friend, cut and paste their email </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">invitation into the box below, and click done.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + + + + + AddFriendWizard + + + < Back + + + + + Next > + + + + + Cancel + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">This Wizard helps to Connect to your Friends</span></p></body></html> + + + + + I have a .pqi/.pem file received from a Friend + + + + + I have Key received from a Friend + + + + + I want to invite a friend to my RetroShare network + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Cut and paste the text below into an email.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;"> and send it to all your friends!</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">When you press next RetroShare will attempt to launch a Email client.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Invite your Friends to join with RetroShare</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Enter the Key code you got from your friend:</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">When you press next RetroShare will attempt to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">connect using the key.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Select a pqi/pem file:</span></p></body></html> + + + + + Browse + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">When you press next RetroShare will attempt to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">connect using the .pqi/.pem file.</p></body></html> + + + + + Add Friend to my netowork Wizard + + + + + AdvancedSearchDialog + + + RetrosShare: Advanced Search + + + + + Add a further search criterion. + + + + + Add a selection criterion + + + + + Reset + + + + + Cancels the search. + + + + + Cancel + + + + + Perform the advanced search. + + + + + Search + + + + + Search Criteria + + + + + Reset the search criteria. + + + + + ApplicationWindow + + + RetroShare %1 + + + + + Example Application + + + + + Application Users: 0 Files: 0 + + + + + Down: 0.0 Up: 0.0 + + + + + Connections: 0/45 + + + + + Hide + + + + + Show + + + + + RetroShare + + + + + Home + + + + + General + + + + + Advanced + + + + + QTextBrowser { + background-color: rgb(192,192,192); + + } + + + + + QPushButton + { + border-image: url(:/images/console-small-up.png) + } + + QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + + } + + QPushButton:pressed { + border-image: url(:/images/console-small-down.png) + } + + + + + + AuthorizationDialog + + + Authenticate + Ðвторизовать / аутентификации + + + + Authenticate Friend By Entering Their Code + Ðвторизовать/ аутентификации друг, Ð²Ð²ÐµÐ´Ñ ÐºÐ¾Ð´ + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">аутентификации Code:</span></p></body></html> + + + + OK + OK (нууу) + + + + Cancel + ВернутьÑÑ/Отмена + + + + BandwidthGraph + + + RetroShare Bandwidth Usage + + + + + Show Settings + + + + + Reset + + + + + Receive Rate + + + + + Send Rate + + + + + Always on Top + + + + + Style + + + + + Changes the transparency of the Bandwidth Graph + + + + + 100 + + + + + % Opaque + + + + + Save + + + + + Cancel + + + + + Since: + + + + + Hide Settings + + + + + CallToaster + + + Message + + + + + ChanCreateDialog + + + Create a new Broadcast Channel + Создайте новый канал Ð²ÐµÑ‰Ð°Ð½Ð¸Ñ + + + + Create A New Broadcast Channel + Создать новый канал Ð²ÐµÑ‰Ð°Ð½Ð¸Ñ + + + + Channel Name: + Ð˜Ð¼Ñ ÐºÐ°Ð½Ð°Ð»Ð°: + + + + Type: + Тип: + + + + Public Channel (Signed) + ОбщеÑтвенной Channel (ПодпиÑÑŒ) + + + + Private Channel (Encrypted) + ЧаÑтные Channel (Шифрование) + + + + Cancel Channel + Отмена Channel + + + + Create Channel + Создать Channel + + + + ChanMsgDialog + + + Compose + ÐапиÑать + + + + Recommended Files + Рекомендуемые Файлы + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-weight:400;"><span style=" font-weight:600;">Subject:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-weight:400;"><span style=" font-weight:600;">Заголовок:</span></p></body></html> + + + + Send To: + Отправить: + + + + Send + Отправить + + + + Delete Channel + Удалить канал + + + + Create Channel MSG + Создать канал Ñообщение + + + + 1 + + + + + Reply + + + + + ChannelsDialog + + + New Message + Ðовое Ñообщение + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Messages</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">СообщениÑ</span></p></body></html> + + + + Date + чаÑÑ‹ + + + + Rank + Ранг + + + + From + разоÑлан + + + + Title + Заголовок + + + + Msg + новоÑти / ТекÑÑ‚ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ + + + + Count + Ð’Ñего + + + + Size + Size + + + + Type + Type + + + + Rs[Cert/Chan]IdSize + Rs[Cert/Chan]IdSize + + + + RsMsgId + RsMsgID/ новоÑти-Ð˜Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Message Text</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">ТекÑÑ‚ ÑообщениÑ</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Recommended Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Рекомендуемые Файлы</span></p></body></html> + + + + New Channel + Ðовый канал + + + + Subscribe To Channel + ПодпиÑка на канал + + + + Unsubscribe To Channel + ОтпиÑатьÑÑ Ð½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ + + + + Delete Your Channel + Удалить Ваш канал + + + + Download + Скачать (Download) + + + + Download All + Загрузить вÑе (Download All) + + + + ChatDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:9pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:400;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:9pt; font-weight:600; font-style:normal; text-decoration:none;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:400;"></p></body></html> + + + + Chat History: + ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ñ‡Ð°Ñ‚Ð°: + + + + Chat With: + Что Чат: + + + + Chat + Чат + + + + Users: + + + + + ChatToaster + + + message + новоÑти / ТекÑÑ‚ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ + + + + You Get a New Message + Ð’Ñ‹ получите новое Ñообщение + + + + Message + + + + + ConfCertDialog + + + Cancel + ВернутьÑÑ/Отмена + + + + Done + Готово + + + + Apply + подтвердить + + + + Peer Settings + ЭкÑпертный ÐаÑтройки (Peer Settings) + + + + Port: + Порт: + + + + behind zee Firewall + За Firewall + + + + Forwarded External Port + Разрешены внешний порт + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Внешние ÐдреÑ:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Внешние ИмÑ</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Локал ÐдреÑ:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Max Transfer Rate (kb/s) </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑкороÑÑ‚ÑŒ загрузки (kb/s) </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Org / Loc:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Org / Loc:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name/Ñетевой карты:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Country/State:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Страна / гоÑударÑтво:</p></body></html> + + + + Trust Settings + Целевой ÐаÑтройки + + + + Trust Level + Целевой уровень + + + + Trust Their Signature + Целевой подпиÑÑŒ + + + + Sign The Certificate + Знак Ñертификата + + + + OK + + + + + Peer Adress + + + + + Peer Info + + + + + ConfirmQuitDialog + + + Exit RetroShare + + + + + You are about to exit the RetroShare application and therefore stop all transfers. <br><br>Are you sure you want to stop and exit RetroShare? + + + + + Do not show this message again. + + + + + ConnectDialog + + + Peer Details + ЭкÑпертный ПодробноÑти + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">где жить / country:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Org:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ОрганизациÑ:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name/Ñетевой карты:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Trust:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Целевой:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Loc:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">МеÑтонахождение:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Certificate</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">signers:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Ñертификат</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">подпиÑавшихÑÑ:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Код аутентификации:</span></p></body></html> + + + + Make Friend + Сделать Другу + + + + Close + закрыть + + + + ConnectionsDialog + + + Load Certificate + Загрузить Ñертификат + + + + Select a pem/pqi File + Выберите PEM / PQI Файл + + + + File Not Found + Файл не найден + + + + %1 does not exist. Would you like to create it? + %1 нет. Хотите Ñоздать его? + + + + Failed to Create File + Ðе удалоÑÑŒ Ñоздать файл + + + + Unable to create %1 [%2] + Ðе удаетÑÑ Ñоздать %1 [%2] + + + + Select Certificate + Выберите Ñертификат + + + + Certificates (*.pqi *.pem) + Сертификаты (*.pqi / *.pem) + + + + Accept + ПринÑÑ‚ÑŒ + + + + Trust + Целевой + + + + Last Contact + ПоÑледнее Контакты + + + + Name + Name/Ñетевой карты + + + + Organisation + ÐžÑ€Ð³Ð°Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ + + + + Location + МеÑтонахождение + + + + Country + Страна + + + + Peer Address + ЭкÑпертный ÐÐ´Ñ€ÐµÑ Peer + + + + Cert Id + Серт ID + + + + Auth Code + Ðвторизовать/ аутентификации код + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + + + + Peer Details / Authenticate + ЭкÑпертный ПодробноÑти Peer/ Ðвторизовать-аутентификации + + + + CryptographyDialog + + + RSA Key Size + RSA Key Size + + + + Rijndael Block size + Rijndael Block size + + + + 128 Bits + 128 Bits + + + + 192 Bits + 192 Bits + + + + 256 Bits + 256 Bits + + + + Rijndael Key Size + Rijndael Key Size + + + + Rijndael Mode + Rijndael Mode + + + + CBC + CBC + + + + ECB + ECB + + + + CFB + CFB + + + + Rijndael Padding + Rijndael Padding + + + + PKCS7 + PKCS7 + + + + Zeros + Zeros + + + + ANSIX923 + ANSIX923 + + + + ISO10126 + ISO10126 + + + + Rijndael Feedback Size + Rijndael Feedback Size + + + + Key Size: + Key Size: + + + + Block Size: + Block Size: + + + + Feedback Size: + Feedback Size: + + + + Mode: + Mode: + + + + Padding: + Padding: + + + + DLListDelegate + + + B + + + + + KB + + + + + MB + + + + + GB + + + + + DirectoriesDialog + + + Shared Directories + Общие Ñправочники + + + + Other Directories + Другие Ñправочники + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Incoming Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Incoming Files</span></p></body></html> + + + + Add Shared Directory + Добавить общей директории + + + + DirectoriesPage + + + Shared Directories + Общие Ñправочники + + + + Incoming files + ВходÑщие файлы + + + + ExampleDialog + + + Vote Up + + + + + Vote Down + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Friends</span></p></body></html> + + + + + # + + + + + Status + + + + + Person + + + + + Auto Connect + + + + + Trust Level + + + + + Peer Address + ЭкÑпертный ÐÐ´Ñ€ÐµÑ Peer + + + + Last Contact + ПоÑледнее Контакты + + + + Organisation + ÐžÑ€Ð³Ð°Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ + + + + Location + МеÑтонахождение + + + + Country + Страна + + + + Person Id + + + + + Auth Code + Ðвторизовать/ аутентификации код + + + + ExprParamElement + + + to + + + + + ignore case + + + + + dd.MM.yyyy + + + + + KB + + + + + MB + + + + + GB + + + + + ExpressionWidget + + + Expression Widget + + + + + Delete this expression + + + + + FileHashDialog + + + Download + Скачать (Download) + + + + GSettingsWin + + + General + Общий + + + + Network + Network + + + + Directories + Справочники + + + + Server + Peer + + + + %1 + %1 + + + + GenCertDialog + + + RetroShare setup + Retroshare наÑтройки + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16pt;">Generate a new profile</span><br /><br />Please fill in the information which will<br />allow your RetroShare to connect to</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Friends.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Organisation:</p></body></html> + + + + + Password (Again) + + + + + Location: + + + + + Load Trusted Certificate (Optional) + Загрузка доверенный Ñертификат (опционально) + + + + Password + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Другу</span></p></body></html> + + + + Select File + выберите Файл + + + + Country: + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + + + + + Generate New Certificate + Создать новый Ñертификат + + + + Select Trusted Friend + Выбор верного друга + + + + Certificates (*.pqi *.pem) + Сертификаты (*.pqi /*.pem) + + + + GeneralPage + + + Keys manager + Клавиши менеджер + + + + Style + Style + + + + Choose RetroShare's interface style + Выберите Ñтиль интерфейÑа Retroshare + + + + Language + Ñзыка + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñзыка вÑтупÑÑ‚ в Ñилу только поÑле перезапуÑка Retroshare!</p></body></html> + + + + Choose the language used in RetroShare + Выберите Ñзык, иÑпользуемый в Retroshare + + + + GraphFrame + + + Recv: + Recv: + + + + %1 KB/s + %1 KB/s + + + + Sent: + Отправлено: + + + + %1 KB + %1 KB + + + + %1 MB + %1 MB + + + + %1 GB + %1 GB + + + + HelpDialog + + + About + + + + + Authors + + + + + Thanks to + + + + + Translation + + + + + License Agreement + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">About/Help</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:xx-large; font-weight:600; color:#0000ff;">About RetroShare.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-weight:600;">Retroshare is a private and secure decentralised commmunication platform.<br />You can use it chat, send messages and share files with your friends.</span><br /><br />This is just a placeholder page for the moment. You can<br />improve retroshare's in-built help (this text) by<br />updating the retroshare wiki: <a href="http://retroshare.wiki.sourceforge.net/help_tab"><span style=" text-decoration: underline; color:#0000ff;">This Page in the retroshare Wiki</span></a><br /><br />The About/Help Tab is regularly updated from the Wiki page.<br /><br />External Links to more information:<br /></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.sourceforge.net"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Webpage</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.wiki.sourceforge.net/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Wiki</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://sourceforge.net/projects/retroshare/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Project Page</span></a></li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.lunamutt.com"><span style=" text-decoration: underline; color:#0000ff;">Lunamutt Homepage.</span></a></li></ul></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-size:19pt; font-weight:600; color:#0000ff;">The RetroShare Team:</span><br /> <br /><span style=" font-size:9pt; color:#0000ff;">defnax</span>: Lead GUI developer <br /><span style=" font-size:9pt; color:#0000ff;">drbob7</span>: Lead Core developer. <br /> <br /><span style=" font-size:9pt; color:#0000ff;">bmeck</span> : Our new web-developer. Joined retroshare a couple <br />of weeks ago, and already starting on an exciting new <br />design for the web-page. <br /> <br /><span style=" font-size:9pt; color:#0000ff;">noragen</span> : Developer from the SIM-IM project. Working on a retroshare plugin to SIM-IM. <br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">kernelpanix</span> : Gui and skin developer</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">libris</span><span style=" font-size:9pt;">:</span> core developer</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-size:9pt; color:#0000ff;">kashif: </span><span style=" color:#000000;">core developer</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt; color:#000000;"><span style=" font-size:8pt;"><br /></span><span style=" color:#0000ff;">agent725</span><span style=" font-size:8pt;">: Manages the 'local' Retroshare release, <br />and beta-testing retroshare on a large scale. <br /> <br /></span><span style=" color:#0000ff;">the_mgt</span><span style=" font-size:8pt;">: Maintains the Gentoo and generic linux <br />installation/compilation scripts. </span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">notdefine:</span> Maintains the .rpm, .deb installation/compilation scripts.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">zhouk</span>: developer</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Translators:</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Serbian</span>: Kunalagon Umuhanik &lt;kunalagon@gmail.com&gt;</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Polish: </span>Jarek</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">French</span>:Temet</p></body></html> + + + + + InviteDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">To </span><span style=" font-size:10pt; font-weight:600;">Invite your friends to join you with Retroshare: </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">Cut and paste the text below into an email.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">and send it to all your friends!</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">To </span><span style=" font-size:10pt; font-weight:600;">ПриглаÑите друзей приÑоединитьÑÑ Ðº Вам Ñ Retroshare:</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">Вырезать и вÑтавить текÑÑ‚ в Ñообщение Ñлектронной почты ниже.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">и направить его Ð´Ð»Ñ Ð²Ñех Ñвоих друзей!</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + Done + Готово + + + + Cancel + ВернутьÑÑ/Отмена + + + + Launch Email + Ðачало Email + + + + Invite a Friend + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"><span style=" font-size:16pt;">Invite a Friend</span><br /><br /><span style=" font-size:10pt;">To Invite your friends to join you with Retroshare: </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">Cut and paste the text below into an email.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">and send it to all your friends!</p></body></html> + + + + + LogDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> + +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="ABOUT"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">About RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShare is a private peer to peer communication platform created by Dr. Bob.This program enables you to securely share files and chat with your friends (and no-one else!).</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, and the latest release go to http://www.lunamutt.com.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="START"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Quick Start Guide to RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If this is your first time using Retroshare, it is recommended that you readthis guide for instructions on how to get started. The first step is:<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Connecting to Your Friends</span></a>. Once you have managed this you can <a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">Download Files</span></a> and<a href="#START-SHARE"><span style=" text-decoration: underline; color:#0000ff;">Share with Others</span></a></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Some of the key concepts related to ensuring your sharing remains private aredescribed in the <a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">Frequently Asked Questions</span></a>. Some Key security questions are:<a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">What is a Web of Trust?</span></a>, <a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">Should I Sign this Certificate?</span></a>, and finally<a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">What does "Trust" Mean?</span></a>.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is also worthwhile reading the <a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">GUI Overview</span></a>which describes the featureson available through the User Interface.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Connecting to your Friends </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">There are four steps to connecting to a Friend:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Get Friend's Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Load Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Sign Certificate</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect to Friend.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The instructions might initially appear long and daunting, however thesesteps are required to ensure that your sharing is private and secure.These steps are only required a couple of times, to add new friends, and become quite straight forward after the first time.</p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (1) EXCHANGE CERTIFICATES </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Before you can connect, you need send your certificate to your friend, and get your friends certificate. Follow these steps to get your certificate:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on Your Certificate to Select it.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on the "Export Friend" Button to bring up a file save dialog.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select directory to save the certificate to.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Enter desired filename. (with a file type of .pqi), and Click OK.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Email this File to your Friend. (It is recommended you put thecertificate in a zip file before sending, as some email programsdon't transmit the file correctly).</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Ask your friend to do the same.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Once you have received your friend's certificate, removed itfrom the zip file and saved it to disk, you can proceed to step (2).</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Note: This exchange of certificates is only necessary to get you started.Once you are connected to some friends the exchange of certificates becomeautomated by the autoDiscovery system. See<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">GUI: Connecting</span></a> for more information.------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (2) LOAD YOUR FRIEND'S CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Import Friend"</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select your friends certificate file, then click "Okay". Their certificate should appear in the top window of the "Connect" Tab.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (3) SIGN CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select their Certificate by clicking on their name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Configure Friend" Button. This will bring up a configuration window. which allows you to look at the detailsof the certificate.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click the "Sign Certificate" button near the bottom of the "Certificate Configuration" Window.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Now close the window by clicking on the "Done" button.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Your Friends certificate should now say "Trusted (S)", indicating it is ready for connections.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can only share with "Trusted" Peers. You must sign your Friend'scertificate to prove that you know the certificate belongs to your Friend. Do not sign any/all certificates - only the people youtrust. For more information see: <br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br />------------------------------------------------------------------------<br /><br /> <br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (4) AUTOCONNECT TO PEER </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Finally You need to activate the connection:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click in the Box, next to your friends Name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> A Tick should appear in the box, a connection will be started.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> The "Offline" will change to "Online" when you have successfullyconnected.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Remember: Your initial connection attempts will fail, until your friend has signed your certificate and ticked the Auto-Connect Box.This ensures that both peers trust each other, and stops random peopleaccessing your files.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>. <br />------------------------------------------------------------------------<br /><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-DOWNLOAD"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Downloading Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have connected to friends, you can download their shared files.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can search for the files you want using either:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) File Listing Tab: This gives you a directory view of the files being shared by your peers. Double clickon the directory name (not the arrow) to diplay its subdirectories and files.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 1: This can take up to 5 seconds to fetch the information for your peer.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 2: If the directory is empty, or the person is offline, then the request will silently fail.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Search Tab: Retroshare also allows you to search your peers computers for filenames. Enter yourterm(s) in the search box at the top of the TAB and click the "Search" button. This willsearch all of the peers that you are currently connected to.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 3: If any matching files are found they will be displayed within 5 - 10 seconds.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have found the files you want, Select the file(s), and click "Download" to begin the download process.If you click over the "File Transfer" TAB, the status of the files will appear.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 4: The files can take up to 10 seconds to appear in the transfer window.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-SHARING"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Sharing Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can specify which files you want to share in the "Config" Tab.In the "Share Directories" section, click the "Add Directory" Button, and select the directory you want to share.The files and subdirectories will become available for you peers.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can remove a directory from the Shared Directories List by clicking onthe directory name in the list, and then clicking "Remove Directory".</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="GUI"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Gui Overview (Tab Description) </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The GUI is divided up into several sections which can be accessed by clicking on the Tabs along the top of the main window. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect: Manage Connections and Friends.(<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">getting started</span></a> and<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Listing: A directory view of available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Search: Search for available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Messages: For Sending/Recving Message. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Channels: A broadcast/subscription system. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Transfer: Listing of Current and completed Transfers.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Config: Specify of share diectories and IP Addresses.(<a href="#GUI-CONFIG"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> About: Help and other Information.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Chat: Accessed by the clicking on the "Chat" button.</li></ul> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Connect Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Connect TAB consists of two windows. The upper windowshows a list of your friends. This window indicates each friendscurrent trust level, as well as their connection state.The "Trust_Lvl" Column indicates if the certificate has beenAuthenticated using the web of trust. You can only connect to "Trusted" certificates. Tick the "Auto_Connect" box to connect to your trusted friends.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The lower window provides a list of the friends of your friends.This window shows the neighbour's name and how long ago they attempted to connect to you. This window is automatically populatedby the autoDiscovery system, and should be used to expand yourretroShare network. A word of warning: Do not automatically trust (or sign) anyonethat appears in this window. First verify by some other means (email/phone)that certificate belongs to the person you think it does.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use the "Neighbour List" window to expand your friend list. Select the desired entry in the lower window by clicking on it, then click the "Add to Friends" Button to move it to the upper window.Likewise the "Remove from Friends" button moved a person from the upper window to the lower window.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The "Configure Friend" Button opens a Certificate Configuration window.This window can be used to examine the certificate details, sign the certificate or manually change the peer's IP Address.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">See Also:<br /><a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Getting Started: Connecting to your friends</span></a>.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>.<br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONFIG"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Config Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Configuration Tab allows you to select the share directories, as well as the directory that downloaded files are saved to.<br />See <a href="#STARTUP-SHARING"><span style=" text-decoration: underline; color:#0000ff;">Sharing you Files</span></a> for details. </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Config Tab also allows you to control the IP Address and Portused by RetroShare. Under most cirumstances you do not need to changethese setting. If you are behind a firewall and can setup a forwarded port, the selected IP Address and Port should be specified here.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="FAQ"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Frequently Asked Questions </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">How does the security/privacy work? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShares uses a Web of Trust Authentication system to ensurethat your "friends" are your friends, and uses SSL to encryptthe communcications between peers. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What is a Web of Trust? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Web of Trust relies on a collection of peers to identify eachother. Look it up on the Web!</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-TRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What does "Trust" Mean in RetroShare?</span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Anyone can generate a certificate, with any name on it. So howdo you know that the certificate that claims to be from "Joe Bloggs"is really from your mate Joe. This is the "AuthenticationProblem". RetroShare uses a Web of Trust to Authenticate your peers.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-SIGN"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Should I Sign this Certificate? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should only sign a certificate if you are completely surethat it comes from the "right" person. If you sign a certificateyou are "Authenticating" the person to yourself and others.If you sign certificates that you haven't checked, then you aredestroying your own privacy and security.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">How do you verify a certificate? Use an alternative method ofcommunication to send the certificate: E.g. email or USB stick. This will improve you confidence that the certificate belongsto the correct person. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><span style=" font-size:small;"> </span><a name="FAQ-CONNECT"></a><span style=" font-size:small;">W</span><span style=" font-size:small;">hy won't it Connect?</span><span style=" font-size:small;"> </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A connection can fail for a number of reasons:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) Failed Authentication. Have both peers signed each otherscertificates? </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Firewalls. If both peers are behind firewalls then they cannotconnect directly. RetroShare has a built in proxy system to circumventfirewalls - However this can only function if both peers can connect to a common third party that is not behind a firewall. Thisis the most likely reason for initial connections to fail. The only solution to find a common friend that isn't firewalled (know anyone with Broadband?)</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(3) IP Addresses are wrong. You can manually examine and change these using the Certificate configuration.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +</body></html> + + + + + MainWindow + + + Preferences + ÐаÑтройки + + + + Network + Параметры Ñети + + + + Friends + Ð”Ñ€ÑƒÐ·ÑŒÑ + + + + Transfers + Переводы + + + + Messages + E-Mail-Ð¡Ð¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ + + + + Channels + Каналы + + + + Options + Опции + + + + Users: 0 Files: 0 + Users: 0 Файлы : 0 + + + + Down: 0.0 Up: 0.0 + Down: 0.0 Up: 0.0 + + + + Connections: 0/45 + ПодключениÑ: 0/45 + + + + System tray is unavailable + Ð’ ÑиÑтемной панели отÑутÑтвует + + + + System tray unavailable + Ð’ ÑиÑтемной панели отÑутÑтвует + + + + RetroShare System tray + Retroshare панели + + + + Application will continue running. Quit using context menu in the system tray + Статьи будут продолжать работать. Выход иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÐºÐ¾Ð½Ñ‚ÐµÐºÑтное меню в ÑиÑтемной панели. + + + + Hide + Скрыт + + + + Show + Показать + + + + RetroShare + Retroshare + + + + Home + Home + + + + General + Общий + + + + Invite Friend + ПриглаÑить друга + + + + Add Friend + Добавить друга + + + + Add Share + Добавить Ð”Ð¾Ð»Ñ + + + + Advanced + РаÑширенный + + + + QTextBrowser { + background-color: rgb(192,192,192); + +} + QTextBrowser { background-color: rgb(192,192,192);} + + + + QPushButton +{ + border-image: url(:/images/console-small-up.png) +} + +QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + +} + +QPushButton:pressed { + border-image: url(:/images/console-small-down.png) +} + + QPushButton{ border-image: url(:/images/console-small-up.png) }QPushButton:hover { border-image: url(:/images/console-small-hover.png) }QPushButton:pressed { border-image: url(:/images/console-small-down.png) } + + + + Exit + Выход + + + + Search + ПоиÑк + + + + Files + Файлы + + + + Chat + Группы Чат + + + + Add Shared Directory + Добавить общей директории + + + + About/Help + + + + + Messenger + + + + + Show/Hide + + + + + &Quit + + + + + Bandwidth Graph + + + + + Open Messenger + + + + + RetroShare %1 + + + + + Add a Friend + + + + + Invite a Friend + + + + + Add a Share + + + + + Quit + + + + + Minimize + + + + + Maximize + + + + + Hide Console + + + + + Show Console + + + + + Hide ToolBox + + + + + :images/hide_toolbox_frame.png + + + + + Show ToolBox + + + + + :images/show_toolbox_frame.png + + + + + QTextBrowser { + background-color: rgb(192,192,192); + + } + + + + + QPushButton + { + border-image: url(:/images/console-small-up.png) + } + + QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + + } + + QPushButton:pressed { + border-image: url(:/images/console-small-down.png) + } + + + + + + Apps + + + + + MessageToaster + + + message + новоÑти / ТекÑÑ‚ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ + + + + MessagesDialog + + + New Message + Ðовое Ñообщение + + + + Reply to Message + Ответить на Ñообщение + + + + Remove Message + Удалить Ñообщение + + + + Date + чаÑÑ‹ + + + + From + разоÑлан + + + + Title + Заголовок + + + + Msg + ТекÑÑ‚ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ + + + + Count + Ð’Ñего + + + + Size + Size + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Recommended Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Recommended Files</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">remove selected message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">удалить выбранные ÑообщениÑ</p></body></html> + + + + QPushButton +{ +border-image: url(:/images/deletemail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/deletemail-hover.png); +} + QPushButton{border-image: url(:/images/deletemail24.png);}QPushButton:pressed{border-image: url(:/images/deletemail-hover.png);} + + + + Inbox + Email-ВходÑщие + + + + Outbox + Email-ИÑходÑщие + + + + Draft + Дизайн неотправленных (draft) + + + + Sent + Email-Отправлено + + + + Timestamp + Времени + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">reply to selected message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ÐžÑ‚Ð²ÐµÑ‡Ð°Ñ Ð½Ð° выбранные ÑообщениÑ</p></body></html> + + + + +QPushButton +{ +border-image: url(:/images/replymail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/replymail-hover.png); +} + + QPushButton{border-image: url(:/images/replymail24.png);}QPushButton:pressed{border-image: url(:/images/replymail-hover.png);} + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">New Message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ðовое Ñообщение</p></body></html> + + + + QPushButton +{ +border-image: url(:/images/folder-draft24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/folder-draft24-hover.png); +} + + QPushButton{border-image: url(:/images/folder-draft24.png);}QPushButton:pressed {border-image: url(:/images/folder-draft24-hover.png);} + + + + You get Message testing + Ð’Ñ‹ получаете Ñообщение Ð´Ð»Ñ Ð¸Ñпытаний + + + + Download All + Скачать Ð’Ñе + + + + QPushButton +{ +border-image: url(:/images/deletemail24.png); +} + +QPushButton:hover +{ +border-image: url(:/images/deletemail-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/deletemail-pressed.png); +} + + + + + +QPushButton +{ +border-image: url(:/images/replymail24.png); +} + +QPushButton:hover +{ +border-image: url(:/images/replymail24-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/replymail-pressed.png); +} + + + + + + QPushButton +{ +border-image: url(:/images/folder-draft24.png); +} +QPushButton:hover +{ +border-image: url(:/images/folder-draft24-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/folder-draft24-pressed.png); +} + + + + + + MessengerWindow + + + QWidget#MessengerWindow { +background-color: #ECF3F6; background-image:url(:/images/backgroundimage.png); +background-position: top right; +background-repeat: no-repeat +} + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click to change your avatar</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Change your Status and your display</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">picture here.</p></body></html> + + + + + Online + + + + + Busy + + + + + Be right Back + + + + + Away + + + + + In a Call + + + + + Out of lunch + + + + + Apear Offline + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Share a personal message with your contacts</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Add a Friend</p></body></html> + + + + + Chat + + + + + Connect To Friend + + + + + NetworkDialog + + + Peer Details / Authenticate + ЭкÑпертный ПодробноÑти Peer/ Ðвторизовать-аутентификации + + + + Load Certificate + Загрузить Ñертификат + + + + Select a pem/pqi File + Выберите PEM / PQI Файл + + + + File Not Found + Файл не найден + + + + %1 does not exist. Would you like to create it? + %1 нет. Хотите Ñоздать его? + + + + Failed to Create File + Ðе удалоÑÑŒ Ñоздать файл + + + + Unable to create %1 [%2] + Ðе удаетÑÑ Ñоздать %1 [%2] + + + + Select Certificate + Выберите Ñертификат + + + + Certificates (*.pqi *.pem) + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + + + + # + + + + + Accept + ПринÑÑ‚ÑŒ + + + + Trust + Целевой + + + + Last Contact + ПоÑледнее Контакты + + + + Name + Name/Ñетевой карты + + + + Peer Address + ЭкÑпертный ÐÐ´Ñ€ÐµÑ Peer + + + + Organisation + ÐžÑ€Ð³Ð°Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ + + + + Location + МеÑтонахождение + + + + Country + Страна + + + + Cert Id + Серт ID + + + + Auth Code + Ðвторизовать/ аутентификации код + + + + NetworkPage + + + Rate Options + СкороÑÑ‚ÑŒ Опции + + + + Max Total Data Rate (KB/S): + МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑкороÑÑ‚ÑŒ загрузки (KB/S): + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Rate per Person (KB/S):</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">СкороÑÑ‚ÑŒ на личноÑти (KB/S):</p></body></html> + + + + PeersDialog + + + Chat + Чат + + + + Configure Friend + ÐаÑтроить Другу + + + + Export Friend + ЭкÑпорт Другу + + + + Remove Friend + Удалить знакомого + + + + Save Certificate + Сохранить Ñертификат + + + + Certificates (*.pqi) + Сертификаты (*. pqi) + + + + Status + Status + + + + Person + Person + + + + Auto Connect + Ðвто Подключите + + + + Trust Level + Trust Level + + + + Peer Address + ЭкÑпертный ÐÐ´Ñ€ÐµÑ + + + + Last Contact + ПоÑледнее Контакты + + + + Organisation + Organisation + + + + Location + МеÑтонахождение + + + + Country + Страна + + + + Person Id + Person ID + + + + Auth Code + Код аутентификации + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Friends</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">ДрузьÑ</span></p></body></html> + + + + Connect To Friend + ПодключитьÑÑ Ðº другу + + + + # + + + + + PopupChatDialog + + + RetroShare Friend Chat + Retroshare другу чат + + + + RetroShare User Chat + + + + + PreferencesDialog + + + Language + Ñзыка / Language + + + + Style + Style + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting Retroshare!</p></body></html> + + + + Style Sheet + Стиль Ð¡Ð¿ÐµÑ†Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ + + + + Default + Default + + + + Pagefold + Pagefold + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose RetroShare's interface style</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Выберите Ñтиль интерфейÑа Retroshare </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose the language used in RetroShare</p></body></html> + Выберите Ñзык, иÑпользуемый в Retroshare + + + + blue + Ñиний + + + + silver + silver + + + + ed2k + emule-ed2k + + + + over + over + + + + black + black + + + + arachnophobia + arachnophobia + + + + Skin2 + кожа2 + + + + Login + Login (логин) + + + + Remove Auto Login + Удалить Ðвто Логин + + + + PreferencesWindow + + + Directories + Справочники + + + + Error Saving Configuration + Ошибка при Ñохранении конфигурации + + + + About + Об Ñтом + + + + General + Общий + + + + Server + ЭкÑпертный (Peer) + + + + Options + Опции + + + + Cancel + ВернутьÑÑ/Отмена + + + + OK + OK (Хорошо) + + + + QObject + + + Name + Name/Ñетевой карты + + + + Path + + + + + Extension + + + + + Date + + + + + Size + + + + + Popularity + + + + + contains + + + + + contains all + + + + + is + + + + + less than + + + + + less than or equal + + + + + greater than or equal + + + + + greater than + + + + + is in range + + + + + and + + + + + and / or + + + + + or + + + + + equals + + + + + Rshare + + + Invalid language code specified: + Ðеправильный код Ñзыка указываетÑÑ: + + + + Invalid GUI style specified: + Ðеправильный Ñтиль GUI указываетÑÑ: + + + + SearchDialog + + + File Name + Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° + + + + Sources + ИÑточники + + + + Search Pattern + ПоиÑк План + + + + Results + Результаты + + + + File Size + Размер файла + + + + Download + Скачать (Download) + + + + Broadcast on Channel + Ð’ÐµÑ‰Ð°Ð½Ð¸Ñ Ð½Ð° канале + + + + Recommend to Friends + Рекомендовать Ð”Ñ€ÑƒÐ·ÑŒÑ + + + + Remove + Удалить + + + + Remove All + Remove All + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Keywords</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ключевые Ñлова</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Format</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Формат</p></body></html> + + + + Any + Любой + + + + Audio + Ðудио + + + + Video + Video + + + + Images + Ð¤Ð¾Ñ‚Ð¾Ð³Ð°Ð»ÐµÑ€ÐµÑ + + + + Programs + Программы + + + + Archives + Archives + + + + Documents + Документы + + + + search + поиÑк + + + + download + Ñкачать (download) + + + + Toggle advanced searching on and off. + + + + + <h3>Simple Search:</h3> + + + + + Keywords + + + + + Perform simple search + + + + + Show Advanced Search Tool + + + + + Filename + + + + + Hash + + + + + KeyWords + + + + + Search Id + + + + + <h3>Advanced Search:</h3> + + + + + ServerDialog + + + Transfer Rates + СкороÑÑ‚ÑŒ передачи + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Total Rate (kb/s) </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ð’Ñего СкороÑÑ‚ÑŒ (на ÑкороÑÑ‚ÑŒ загрузки ) (kb/s) </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Per Person </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ðа человека </p></body></html> + + + + Server Settings + ЭкÑпертный ÐаÑтройки Peer + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Локал ÐдреÑ:</p></body></html> + + + + Port: + Порт: + + + + behind zee Firewall + За брандмауÑÑ€ (Firewall) + + + + Forwarded External Port + Разрешены внешний порт + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Порт:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Внешние ИмÑ</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Внешние ÐдреÑ:</p></body></html> + + + + Check Settings + Проверьте ÐаÑтройки + + + + Firewall/Router Configuration + + + + + Manual router setup. + + + + + Use uPnP to configure router + + + + + Network Address Configuration (takes effect after restart) + + + + + Use DHT to locate friends + + + + + Manual IP Addresses + + + + + Server Status And Network Settings + + + + + Firewalled + + + + + Forwarded Port + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">DHT Status</p></body></html> + + + + + uPnP Status + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Local Address:</p></body></html> + + + + + ServerPage + + + Change + Restart Server + Изменить + Перезагрузить + + + + Server Settings + ЭкÑпертный ÐаÑтройки Peer + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Внешние ÐдреÑ:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Локал ÐÐ´Ñ€ÐµÑ :</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Порт:</p></body></html> + + + + Port: + Порт: + + + + Misc + Misc/Разное + + + + behinde Firewall + За брандмауÑÑ€ (Firewall) + + + + Forwarded External Port + Разрешены внешний порт + + + + Settings + + + Settings + ÐаÑтройки + + + + Cancel + ВернутьÑÑ/Отмена + + + + Apply + подтвердить + + + + OK + OK (Хорошо) + + + + General + Общий + + + + Network + Network + + + + Server + Peer (ЭкÑпертный) + + + + Directories + Справочники + + + + SharedFilesDialog + + + Download + Скачать (Download) + + + + Recommend + Рекомендуемые + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Files</span></p></body></html> + + + + Add to Recommend List + + + + + Recommend To + + + + + Message Friend + + + + + StartDialog + + + Select Trusted Friend + Выбор верного друга + + + + Certificates (*.pqi *.pem) + Сертификаты (*.pqi /*.pem) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:13pt; font-weight:600; color:#8b0000;">Welcome to RetroShare</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:13pt; font-weight:600; color:#8b0000;">Добро пожаловать в Retroshare</span></p></body></html> + + + + Please Login .... + ПожалуйÑта, Войти (Login) ... + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name/Ñетевой карты</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Pasword</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Password</span></p></body></html> + + + + Load Existing User + Загрузка ÑущеÑтвующего Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ + + + + Or create a New User + Или Ñоздать нового Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Organisation:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ОрганизациÑ:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Страна / гоÑударÑтво:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Location:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">МеÑтонахождение:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Password (Again)</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Password (Again,раз)</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">New Password</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">New Password</span></p></body></html> + + + + Load Trusted Certificate (Optional) + Загрузка доверенный Ñертификат (опционально) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Другу</span></p></body></html> + + + + Select File + выберите Файл + + + + Generate New Certificate + Создать новый Ñертификат + + + + RetroShare setup + Retroshare наÑтройки + + + + Automatically Login in Future + ÐвтоматичеÑки Войти в будущем (Auto-Login) + + + + RetroShare + + + + + QWidget { + background-color: #ECF3F6; +} + + + + + Auto-login + + + + + Name: + + + + + Log In + + + + + Password: + + + + + Create a Account + + + + + QToolButton{ +border-image: url(:/images/avatar_background.png); + +} + + + + + + StatisticDialog + + + Statistics + Statistics (ÑтатиÑтика) + + + + Download + Download + + + + Session: + Session: + + + + Downloaded: + Downloaded: + + + + Average Downloadspeed: + Average Downloadspeed: + + + + Count of Downloads: + Count of Downloads: + + + + Overall + Overall + + + + Upload + Upload + + + + Session + Session + + + + Uploaded: + Uploaded: + + + + Average Uploadspeed: + Average Uploadspeed: + + + + Count of Uploads: + Count of Uploads: + + + + Uploaded + Uploaded + + + + Connections: + Connections: + + + + Peers: + Peers: + + + + Misc + Misc + + + + Uptime: + Uptime: + + + + Overall: + Overall: + + + + Uptime + Uptime + + + + Records + Records + + + + Uploadspeed: + Uploadspeed: + + + + Downloadspeed: + Downloadspeed: + + + + Show Settings + Show Settings + + + + Reset + Reset + + + + Receive Rate + Receive Rate + + + + Send Rate + Send Rate + + + + Always On Top + Always On Top + + + + 100 + 100 + + + + % Opaque + % Opaque + + + + Changes the transparency of the Bandwidth Graph + Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð·Ñ€Ð°Ñ‡Ð½Ð¾Ñти Bandwidth Graph + + + + Save + Сохранить + + + + Cancel + ВернутьÑÑ/Отмена + + + + Hide Settings + Скрыть наÑтройки + + + + TransfersDialog + + + Cancel + ВернутьÑÑ/Отмена + + + + Clear Completed + ОчиÑтка завершена + + + + File Name + Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° + + + + Sources + ИÑточники + + + + Status + Status + + + + File Size + Размер файла + + + + Speed + Speed + + + + Progress + Progress + + + + Completed + Завершено + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Downloads:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Скачать (Downloads):</span></p></body></html> + + + + Peer Name + ЭкÑпертный Ð˜Ð¼Ñ + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Uploads:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Выгрузки (Uploads):</span></p></body></html> + + + + Name + i.e: file name + Name/Ñетевой карты + + + + Size + i.e: file size + + + + + Progress + i.e: % downloaded + Progress + + + + Speed + i.e: Download speed + Speed + + + + Sources + i.e: Sources + ИÑточники + + + + Remaining + i.e: Estimated Time of Arrival / Time left + + + + + Core-ID + + + + + User Name + i.e: user name + + + + + Progress + i.e: % uploaded + Progress + + + + Speed + i.e: upload speed + Speed + + + + Transferred + + + + + ULListDelegate + + + B + + + + + KB + + + + + MB + + + + + GB + + + + + VMessageBox + + + OK + OK (Хорошо) + + + + Cancel + ВернутьÑÑ/Отмена + + + + Yes + Yes + + + + No + No + + + + Help + Help + + + + Retry + Повторить + + + + Show Log + Показать ИÑÑ‚Ð¾Ñ€Ð¸Ñ + + + + Show Settings + Show Settings + + + + moreinfo + + + Details + Details + + + + OK + OK (Хорошо) + + + + Name + Name/Ñетевой карты + + + + Value + Value + + + diff --git a/retroshare-gui/src/lang/retroshare_se.qm b/retroshare-gui/src/lang/retroshare_se.qm new file mode 100644 index 000000000..2d1746ebd Binary files /dev/null and b/retroshare-gui/src/lang/retroshare_se.qm differ diff --git a/retroshare-gui/src/lang/retroshare_se.ts b/retroshare-gui/src/lang/retroshare_se.ts new file mode 100644 index 000000000..1dd70613d --- /dev/null +++ b/retroshare-gui/src/lang/retroshare_se.ts @@ -0,0 +1,2606 @@ + + + + + Arial + Arial + + + + AddFriendDialog + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;"> To add a new Friend, cut and paste their email </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">invitation into the box below, and click done.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;"> Lägg till en ny vän genom att klipp ut och klistra in dennes e-postinbjudan </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">i rutan nedanför och klicka sedan pÃ¥ färdig.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;"></p></body></html> + + + Cancel + Avbryt + + + Done + Färdig + + + Load From File + Läs in frÃ¥n fil + + + RetroShare + RetroShare + + + Certificate Load Failed + Inläsning av certifikat misslyckades + + + Add a Friend + Lägg till en vän + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + + + + AddFriendWizard + + Add Friend to my netowork Wizard + Lägg till vän till min nätverksguide + + + < Back + < Tillbaka + + + Next > + Nästa > + + + Cancel + Avbryt + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">This Wizard helps to Connect to your Friends</span></p></body></html> + + + + I have a .pqi/.pem file received from a Friend + Jag har en .pqi/.pem-fil som jag tagit emot frÃ¥n en vän + + + I have Key received from a Friend + Jag har en nyckel som jag tagit emot frÃ¥n en vän + + + I want to invite a friend to my RetroShare network + Jag vill bjuda in en vän till mitt RetroShare-nätverk + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Cut and paste the text below into an email.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;"> and send it to all your friends!</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">When you press next RetroShare will attempt to launch a Email client.</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Invite your Friends to join with RetroShare</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Enter the Key code you got from your friend:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">When you press next RetroShare will attempt to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">connect using the key.</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Select a pqi/pem file:</span></p></body></html> + + + + Browse + Bläddra + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">When you press next RetroShare will attempt to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">connect using the .pqi/.pem file.</p></body></html> + + + + + AuthorizationDialog + + Authenticate + Autentisera + + + Authenticate Friend By Entering Their Code + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + + + + OK + OK + + + Cancel + Avbryt + + + + BandwidthGraph + + RetroShare Bandwidth Usage + + + + Show Settings + Visa inställningar + + + Reset + Nollställ + + + Receive Rate + + + + Send Rate + + + + Always on Top + Alltid överst + + + Style + Stil + + + Changes the transparency of the Bandwidth Graph + + + + 100 + + + + % Opaque + + + + Save + Spara + + + Cancel + Avbryt + + + Since: + Sedan: + + + Hide Settings + Dölj inställningar + + + + CallToaster + + Message + Meddelande + + + + ChanCreateDialog + + Create a new Broadcast Channel + + + + Create A New Broadcast Channel + + + + Channel Name: + Kanalnamn: + + + Type: + Typ: + + + Public Channel (Signed) + Publik kanal (signerad) + + + Private Channel (Encrypted) + Privat kanal (krypterad) + + + Cancel Channel + Avbryt kanal + + + Create Channel + Skapa kanal + + + + ChanMsgDialog + + Compose + + + + Recommended Files + Rekommenderade filer + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-weight:400;"><span style=" font-weight:600;">Subject:</span></p></body></html> + + + + Send To: + Skicka till: + + + Send + Skicka + + + Delete Channel + Ta bort kanal + + + Create Channel MSG + + + + + ChannelsDialog + + New Message + Nytt meddelande + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Messages</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Meddelanden</span></p></body></html> + + + Date + Datum + + + Rank + + + + From + FrÃ¥n + + + Title + Titel + + + Msg + Meddelande + + + Count + Antal + + + Size + Storlek + + + Type + Typ + + + Rs[Cert/Chan]IdSize + + + + RsMsgId + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Message Text</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Recommended Files</span></p></body></html> + + + + New Channel + Ny kanal + + + Subscribe To Channel + Prenumerera pÃ¥ kanal + + + Unsubscribe To Channel + Avprenumerera pÃ¥ kanal + + + Delete Your Channel + Ta bort din kanal + + + Download + Hämta + + + Download All + Hämta alla + + + + ChatDialog + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:9pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:400;"></p></body></html> + + + + Chat History: + Chatthistorik: + + + Chat With: + Chatta med: + + + Chat + Chatta + + + + ChatToaster + + Message + Meddelande + + + + ConfCertDialog + + Cancel + Avbryt + + + Port: + Port: + + + behind zee Firewall + bakom brandvägg + + + Forwarded External Port + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Max Transfer Rate (kb/s) </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Org / Loc:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Country/State:</p></body></html> + + + + Trust Settings + + + + Trust Level + + + + Trust Their Signature + + + + Sign The Certificate + Signera certifikatet + + + OK + OK + + + Peer Adress + + + + Peer Info + + + + + ConnectDialog + + Peer Details + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Org:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Trust:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Loc:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Certificate</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">signers:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + + + + Make Friend + + + + Close + Stäng + + + + ConnectionsDialog + + Load Certificate + Läs in certifikat + + + Select a pem/pqi File + Välj en pem/pqi-fil + + + File Not Found + Filen hittades inte + + + %1 does not exist. Would you like to create it? + %1 finns inte. Vill du skapa den? + + + Failed to Create File + Misslyckades med att skapa fil + + + Unable to create %1 [%2] + Kunde inte skapa %1 [%2] + + + Select Certificate + Välj certifikat + + + Certificates (*.pqi *.pem) + Certifikat (*.pqi *.pem) + + + Accept + Godkänn + + + Trust + + + + Last Contact + + + + Name + Namn + + + Organisation + Organisation + + + Location + Plats + + + Country + Land + + + Peer Address + + + + Cert Id + + + + Auth Code + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + + + + Peer Details / Authenticate + + + + # + # + + + + CryptographyDialog + + RSA Key Size + + + + Rijndael Block size + + + + 128 Bits + 128 bitar + + + 192 Bits + 192 bitar + + + 256 Bits + 256 bitar + + + Rijndael Key Size + + + + Rijndael Mode + + + + CBC + CBC + + + ECB + ECB + + + CFB + CFB + + + Rijndael Padding + + + + PKCS7 + PKCS7 + + + Zeros + + + + ANSIX923 + ANSIX923 + + + ISO10126 + ISO10126 + + + Rijndael Feedback Size + + + + Key Size: + Nyckelstorlek: + + + Block Size: + Blockstorlek: + + + Feedback Size: + + + + Mode: + Läge: + + + Padding: + + + + + DirectoriesDialog + + Shared Directories + Utdelade kataloger + + + Other Directories + Övriga kataloger + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Incoming Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Inkommande filer</span></p></body></html> + + + Add Shared Directory + Lägg till delad katalog + + + + DirectoriesPage + + Shared Directories + Delade kataloger + + + Incoming files + Inkommande filer + + + + FileHashDialog + + Download + Hämta + + + + GSettingsWin + + General + Allmänt + + + Network + Nätverk + + + Directories + Kataloger + + + Server + Server + + + %1 + %1 + + + + GenCertDialog + + RetroShare setup + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16pt;">Generate a new profile</span><br /><br />Please fill in the information which will<br />allow your RetroShare to connect to</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Friends.</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16pt;">Generera en ny profil</span><br /><br />Fyll i informationen som gör att<br />ditt RetroShare kan ansluta till</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">dina vänner.</p></body></html> + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Organisation:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Organisation:</p></body></html> + + + Password (Again) + Lösenord (igen) + + + Location: + Plats: + + + Load Trusted Certificate (Optional) + Läs in pÃ¥litligt certifikat (valfritt) + + + Password + Lösenord + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Vän</span></p></body></html> + + + Select File + Välj fil + + + Country: + Land: + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Namn:</p></body></html> + + + Generate New Certificate + Generera nytt certifikat + + + Select Trusted Friend + Välj pÃ¥litlig vän + + + Certificates (*.pqi *.pem) + Certifikat (*.pqi *.pem) + + + + GeneralPage + + Keys manager + Nyckelhanterare + + + Style + Stil + + + Choose RetroShare's interface style + + + + Language + SprÃ¥k + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + + + + Choose the language used in RetroShare + Välj sprÃ¥ket som ska användas i RetroShare + + + + GraphFrame + + Recv: + Mottaget: + + + %1 KB/s + %1 KB/s + + + Sent: + Skickat: + + + %1 KB + %1 KB + + + %1 MB + %1 MB + + + %1 GB + %1 GB + + + + HelpDialog + + About + Om + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:large; font-weight:600; text-decoration: underline; color:#0000ff;"><span style=" font-size:xx-large; text-decoration:none;">About RetroShare.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />Retroshare is a private and secure decentralised commmunication platform.<br />You can use it chat, send messages and share files with your friends.<br /><br />This is just a placeholder page for the moment. You can<br />improve retroshare's in-built help (this text) by<br />updating the retroshare wiki: <a href="http://retroshare.wiki.sourceforge.net/help_tab"><span style=" text-decoration: underline; color:#0000ff;">This Page in the retroshare Wiki</span></a><br /><br />The About/Help Tab is regularly updated from the Wiki page.<br /><br />External Links to more information:<br /></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.sourceforge.net"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Webpage</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.wiki.sourceforge.net/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Wiki</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://sourceforge.net/projects/retroshare/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Project Page</span></a></li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.lunamutt.com"><span style=" text-decoration: underline; color:#0000ff;">Lunamutt Homepage.</span></a></li></ul></body></html> + + + + Authors + Upphovsmän + + + Thanks to + Tack till + + + Translation + Översättning + + + License Agreement + Licensavtal + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">About/Help</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Om/Hjälp</span></p></body></html> + + + + InviteDialog + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">To </span><span style=" font-size:10pt; font-weight:600;">Invite your friends to join you with Retroshare: </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">Cut and paste the text below into an email.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">and send it to all your friends!</p></body></html> + + + + Done + Färdig + + + Cancel + Avbryt + + + Launch Email + + + + Invite a Friend + Bjud in en vän + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + + + + + LogDialog + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> + +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="ABOUT"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">About RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShare is a private peer to peer communication platform created by Dr. Bob.This program enables you to securely share files and chat with your friends (and no-one else!).</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, and the latest release go to http://www.lunamutt.com.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="START"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Quick Start Guide to RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If this is your first time using Retroshare, it is recommended that you readthis guide for instructions on how to get started. The first step is:<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Connecting to Your Friends</span></a>. Once you have managed this you can <a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">Download Files</span></a> and<a href="#START-SHARE"><span style=" text-decoration: underline; color:#0000ff;">Share with Others</span></a></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Some of the key concepts related to ensuring your sharing remains private aredescribed in the <a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">Frequently Asked Questions</span></a>. Some Key security questions are:<a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">What is a Web of Trust?</span></a>, <a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">Should I Sign this Certificate?</span></a>, and finally<a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">What does "Trust" Mean?</span></a>.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is also worthwhile reading the <a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">GUI Overview</span></a>which describes the featureson available through the User Interface.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Connecting to your Friends </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">There are four steps to connecting to a Friend:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Get Friend's Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Load Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Sign Certificate</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect to Friend.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The instructions might initially appear long and daunting, however thesesteps are required to ensure that your sharing is private and secure.These steps are only required a couple of times, to add new friends, and become quite straight forward after the first time.</p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (1) EXCHANGE CERTIFICATES </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Before you can connect, you need send your certificate to your friend, and get your friends certificate. Follow these steps to get your certificate:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on Your Certificate to Select it.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on the "Export Friend" Button to bring up a file save dialog.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select directory to save the certificate to.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Enter desired filename. (with a file type of .pqi), and Click OK.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Email this File to your Friend. (It is recommended you put thecertificate in a zip file before sending, as some email programsdon't transmit the file correctly).</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Ask your friend to do the same.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Once you have received your friend's certificate, removed itfrom the zip file and saved it to disk, you can proceed to step (2).</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Note: This exchange of certificates is only necessary to get you started.Once you are connected to some friends the exchange of certificates becomeautomated by the autoDiscovery system. See<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">GUI: Connecting</span></a> for more information.------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (2) LOAD YOUR FRIEND'S CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Import Friend"</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select your friends certificate file, then click "Okay". Their certificate should appear in the top window of the "Connect" Tab.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (3) SIGN CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select their Certificate by clicking on their name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Configure Friend" Button. This will bring up a configuration window. which allows you to look at the detailsof the certificate.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click the "Sign Certificate" button near the bottom of the "Certificate Configuration" Window.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Now close the window by clicking on the "Done" button.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Your Friends certificate should now say "Trusted (S)", indicating it is ready for connections.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can only share with "Trusted" Peers. You must sign your Friend'scertificate to prove that you know the certificate belongs to your Friend. Do not sign any/all certificates - only the people youtrust. For more information see: <br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br />------------------------------------------------------------------------<br /><br /> <br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (4) AUTOCONNECT TO PEER </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Finally You need to activate the connection:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click in the Box, next to your friends Name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> A Tick should appear in the box, a connection will be started.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> The "Offline" will change to "Online" when you have successfullyconnected.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Remember: Your initial connection attempts will fail, until your friend has signed your certificate and ticked the Auto-Connect Box.This ensures that both peers trust each other, and stops random peopleaccessing your files.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>. <br />------------------------------------------------------------------------<br /><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-DOWNLOAD"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Downloading Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have connected to friends, you can download their shared files.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can search for the files you want using either:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) File Listing Tab: This gives you a directory view of the files being shared by your peers. Double clickon the directory name (not the arrow) to diplay its subdirectories and files.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 1: This can take up to 5 seconds to fetch the information for your peer.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 2: If the directory is empty, or the person is offline, then the request will silently fail.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Search Tab: Retroshare also allows you to search your peers computers for filenames. Enter yourterm(s) in the search box at the top of the TAB and click the "Search" button. This willsearch all of the peers that you are currently connected to.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 3: If any matching files are found they will be displayed within 5 - 10 seconds.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have found the files you want, Select the file(s), and click "Download" to begin the download process.If you click over the "File Transfer" TAB, the status of the files will appear.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 4: The files can take up to 10 seconds to appear in the transfer window.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-SHARING"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Sharing Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can specify which files you want to share in the "Config" Tab.In the "Share Directories" section, click the "Add Directory" Button, and select the directory you want to share.The files and subdirectories will become available for you peers.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can remove a directory from the Shared Directories List by clicking onthe directory name in the list, and then clicking "Remove Directory".</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="GUI"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Gui Overview (Tab Description) </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The GUI is divided up into several sections which can be accessed by clicking on the Tabs along the top of the main window. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect: Manage Connections and Friends.(<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">getting started</span></a> and<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Listing: A directory view of available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Search: Search for available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Messages: For Sending/Recving Message. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Channels: A broadcast/subscription system. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Transfer: Listing of Current and completed Transfers.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Config: Specify of share diectories and IP Addresses.(<a href="#GUI-CONFIG"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> About: Help and other Information.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Chat: Accessed by the clicking on the "Chat" button.</li></ul> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Connect Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Connect TAB consists of two windows. The upper windowshows a list of your friends. This window indicates each friendscurrent trust level, as well as their connection state.The "Trust_Lvl" Column indicates if the certificate has beenAuthenticated using the web of trust. You can only connect to "Trusted" certificates. Tick the "Auto_Connect" box to connect to your trusted friends.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The lower window provides a list of the friends of your friends.This window shows the neighbour's name and how long ago they attempted to connect to you. This window is automatically populatedby the autoDiscovery system, and should be used to expand yourretroShare network. A word of warning: Do not automatically trust (or sign) anyonethat appears in this window. First verify by some other means (email/phone)that certificate belongs to the person you think it does.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use the "Neighbour List" window to expand your friend list. Select the desired entry in the lower window by clicking on it, then click the "Add to Friends" Button to move it to the upper window.Likewise the "Remove from Friends" button moved a person from the upper window to the lower window.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The "Configure Friend" Button opens a Certificate Configuration window.This window can be used to examine the certificate details, sign the certificate or manually change the peer's IP Address.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">See Also:<br /><a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Getting Started: Connecting to your friends</span></a>.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>.<br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONFIG"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Config Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Configuration Tab allows you to select the share directories, as well as the directory that downloaded files are saved to.<br />See <a href="#STARTUP-SHARING"><span style=" text-decoration: underline; color:#0000ff;">Sharing you Files</span></a> for details. </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Config Tab also allows you to control the IP Address and Portused by RetroShare. Under most cirumstances you do not need to changethese setting. If you are behind a firewall and can setup a forwarded port, the selected IP Address and Port should be specified here.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="FAQ"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Frequently Asked Questions </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">How does the security/privacy work? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShares uses a Web of Trust Authentication system to ensurethat your "friends" are your friends, and uses SSL to encryptthe communcications between peers. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What is a Web of Trust? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Web of Trust relies on a collection of peers to identify eachother. Look it up on the Web!</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-TRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What does "Trust" Mean in RetroShare?</span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Anyone can generate a certificate, with any name on it. So howdo you know that the certificate that claims to be from "Joe Bloggs"is really from your mate Joe. This is the "AuthenticationProblem". RetroShare uses a Web of Trust to Authenticate your peers.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-SIGN"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Should I Sign this Certificate? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should only sign a certificate if you are completely surethat it comes from the "right" person. If you sign a certificateyou are "Authenticating" the person to yourself and others.If you sign certificates that you haven't checked, then you aredestroying your own privacy and security.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">How do you verify a certificate? Use an alternative method ofcommunication to send the certificate: E.g. email or USB stick. This will improve you confidence that the certificate belongsto the correct person. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><span style=" font-size:small;"> </span><a name="FAQ-CONNECT"></a><span style=" font-size:small;">W</span><span style=" font-size:small;">hy won't it Connect?</span><span style=" font-size:small;"> </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A connection can fail for a number of reasons:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) Failed Authentication. Have both peers signed each otherscertificates? </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Firewalls. If both peers are behind firewalls then they cannotconnect directly. RetroShare has a built in proxy system to circumventfirewalls - However this can only function if both peers can connect to a common third party that is not behind a firewall. Thisis the most likely reason for initial connections to fail. The only solution to find a common friend that isn't firewalled (know anyone with Broadband?)</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(3) IP Addresses are wrong. You can manually examine and change these using the Certificate configuration.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +</body></html> + + + + + MainWindow + + Network + Nätverk + + + Friends + Vänner + + + Transfers + Överföringar + + + Messages + Meddelanden + + + Channels + Kanaler + + + Options + Alternativ + + + Users: 0 Files: 0 + Användare: 0 Filer: 0 + + + Down: 0.0 Up: 0.0 + Ned: 0.0 Upp: 0.0 + + + Connections: 0/45 + Anslutningar: 0/45 + + + RetroShare System tray + + + + Application will continue running. Quit using context menu in the system tray + Programmet kommer att fortsätta köras. Avsluta via sammanhangsmenyn i aktivitetsfältets ikon + + + Hide + Dölj + + + Show + Visa + + + RetroShare + RetroShare + + + Home + Hem + + + General + Allmänt + + + Invite Friend + Bjud in vän + + + Add Friend + Lägg till vän + + + Add Share + Lägg till utdelning + + + Advanced + Avancerat + + + QTextBrowser { + background-color: rgb(192,192,192); + +} + QTextBrowser { + background-color: rgb(192,192,192); + +} + + + QPushButton +{ + border-image: url(:/images/console-small-up.png) +} + +QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + +} + +QPushButton:pressed { + border-image: url(:/images/console-small-down.png) +} + + QPushButton +{ + border-image: url(:/images/console-small-up.png) +} + +QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + +} + +QPushButton:pressed { + border-image: url(:/images/console-small-down.png) +} + + + + Exit + Avsluta + + + Search + Sök + + + Files + Filer + + + Chat + Chatt + + + Add Shared Directory + Lägg till delad katalog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Select StyleSheet</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Välj stilmall</p></body></html> + + + Default + Standard + + + blue + blÃ¥ + + + silver + silver + + + ed2k + ed2k + + + over + över + + + black + svart + + + arachnophobia + araknofobi + + + Skin2 + Skin2 + + + Pagefold + Pagefold + + + About/Help + Om/Hjälp + + + Messenger + + + + Show/Hide + Visa/Dölj + + + &Quit + &Avsluta + + + Bandwidth Graph + Bandbreddsdiagram + + + Open Messenger + + + + + MessageToaster + + message + meddelande + + + + MessagesDialog + + New Message + Nytt meddelande + + + Reply to Message + Svara pÃ¥ meddelande + + + Remove Message + Ta bort meddelande + + + Date + Datum + + + From + FrÃ¥n + + + Title + Titel + + + Msg + Meddelande + + + Count + Antal + + + Size + Storlek + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Recommended Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Rekommenderade filer</span></p></body></html> + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">remove selected message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ta bort markerat meddelande</p></body></html> + + + QPushButton +{ +border-image: url(:/images/deletemail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/deletemail-hover.png); +} + QPushButton +{ +border-image: url(:/images/deletemail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/deletemail-hover.png); +} + + + Inbox + Inkorg + + + Outbox + Utkorg + + + Draft + Utkast + + + Sent + Skickat + + + Timestamp + Tidsstämpel + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">reply to selected message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">svara pÃ¥ markerat meddelande</p></body></html> + + + +QPushButton +{ +border-image: url(:/images/replymail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/replymail-hover.png); +} + + +QPushButton +{ +border-image: url(:/images/replymail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/replymail-hover.png); +} + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">New Message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Nytt meddelande</p></body></html> + + + QPushButton +{ +border-image: url(:/images/folder-draft24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/folder-draft24-hover.png); +} + + QPushButton +{ +border-image: url(:/images/folder-draft24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/folder-draft24-hover.png); +} + + + + You get Message testing + + + + Download All + Hämta alla + + + + MessengerWindow + + QWidget#MessengerWindow { +background-color: #ECF3F6; background-image:url(:/images/backgroundimage.png); +background-position: top right; +background-repeat: no-repeat +} + QWidget#MessengerWindow { +background-color: #ECF3F6; background-image:url(:/images/backgroundimage.png); +background-position: top right; +background-repeat: no-repeat +} + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click to change your avatar</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Klicka för att byta din avatar</p></body></html> + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Change your Status and your display</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">picture here.</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ändra din status och din</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">visningsbild här.</p></body></html> + + + Online + Ansluten + + + Busy + Upptagen + + + Be right Back + Strax tillbaka + + + Away + FrÃ¥nvarande + + + In a Call + Sitter i telefon + + + Out of lunch + Ute pÃ¥ lunch + + + Apear Offline + Visa som frÃ¥nkopplad + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Share a personal message with your contacts</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Dela ett personligt meddelande med dina kontakter</p></body></html> + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Add a Friend</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lägg till en vän</p></body></html> + + + Chat + Chatt + + + Connect To Friend + Anslut till vän + + + + NetworkPage + + Rate Options + + + + Max Total Data Rate (KB/S): + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Rate per Person (KB/S):</p></body></html> + + + + + PeersDialog + + Chat + + + + Configure Friend + Konfigurera vän + + + Export Friend + Exportera vän + + + Remove Friend + Ta bort vän + + + Save Certificate + Spara certifikat + + + Certificates (*.pqi) + Certifikat (*.pqi) + + + Status + Status + + + Person + Person + + + Auto Connect + + + + Trust Level + + + + Peer Address + + + + Last Contact + + + + Organisation + Organisation + + + Location + Plats + + + Country + Land + + + Person Id + + + + Auth Code + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Friends</span></p></body></html> + + + + Connect To Friend + Anslut till vän + + + # + + + + + PopupChatDialog + + RetroShare User Chat + + + + + PreferencesDialog + + Language + SprÃ¥k + + + Style + Stil + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + + + + Style Sheet + Stilmall + + + Default + Standard + + + Pagefold + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose RetroShare's interface style</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose the language used in RetroShare</p></body></html> + + + + blue + blÃ¥ + + + silver + silver + + + ed2k + ed2k + + + over + över + + + black + svart + + + arachnophobia + araknofobi + + + Skin2 + Skin2 + + + Login + + + + Remove Auto Login + + + + + PreferencesWindow + + Directories + Kataloger + + + Error Saving Configuration + Fel vid sparande av konfiguration + + + About + Om + + + General + Allmänt + + + Server + Server + + + Options + Alternativ + + + Cancel + Avbryt + + + OK + OK + + + + Rshare + + Invalid language code specified: + Ogiltig sprÃ¥kkod angiven: + + + Invalid GUI style specified: + + + + + SearchDialog + + File Name + Filnamn + + + Sources + Källor + + + Search Pattern + Sökmönster + + + Results + Resultat + + + File Size + Filstorlek + + + Download + Hämta + + + Broadcast on Channel + + + + Recommend to Friends + Rekommendera till vänner + + + Remove + Ta bort + + + Remove All + Ta bort alla + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Keywords</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Nyckelord</p></body></html> + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Format</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Format</p></body></html> + + + Any + Alla + + + Audio + Ljud + + + Video + Video + + + Images + Bilder + + + Programs + Program + + + Archives + Arkiv + + + Documents + Dokument + + + search + sök + + + download + hämta + + + + ServerDialog + + Transfer Rates + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Total Rate (kb/s) </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Per Person </p></body></html> + + + + Server Settings + Serverinställningar + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + + + + Port: + Port: + + + behind zee Firewall + bakom brandväggen + + + Forwarded External Port + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Extern adress:</p></body></html> + + + DHT + DHT + + + DHT Enabled (requires restart) + + + + Network Configuration: + Nätverkskonfiguration: + + + I'm a Noobie, and will hide behind my firewall. + Jag är en nybörjare och vill gömma mig bakom min brandvägg. + + + I'm a real man, let me do it myself: Manual settings. + Jag är en riktig man, lÃ¥t mig göra det själv: Manuella inställningar. + + + Use uPnP to configure my router. (default) + + + + + ServerPage + + Change + Restart Server + + + + Server Settings + Serverinställningar + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Extern adress:</p></body></html> + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal adress:</p></body></html> + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + + + Port: + Port: + + + Misc + Diverse + + + behinde Firewall + + + + Forwarded External Port + + + + + Settings + + Settings + Inställningar + + + Cancel + Avbryt + + + Apply + Verkställ + + + OK + OK + + + General + Allmänt + + + Network + Nätverk + + + Server + Server + + + Directories + Kataloger + + + + SharedFilesDialog + + Download + Hämta + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Filer</span></p></body></html> + + + Add to Recommend List + Lägg till i rekommendationer + + + Recommend To + Rekommendera till + + + Message Friend + + + + + StartDialog + + RetroShare + RetroShare + + + QWidget { + background-color: #ECF3F6; +} + QWidget { + background-color: #ECF3F6; +} + + + Auto-login + Automatisk inloggning + + + Name: + Namn: + + + Pasword: + Lösenord: + + + QToolButton{ +border-image: url(:/images/mystatus_bg.png); +background-image: url(:/images/amsn.png); +} + + QToolButton{ +border-image: url(:/images/mystatus_bg.png); +background-image: url(:/images/amsn.png); +} + + + + Log In + Logga in + + + + StatisticDialog + + Statistics + Statistik + + + Download + Hämta + + + Session: + Session: + + + Downloaded: + Hämtat: + + + Average Downloadspeed: + + + + Count of Downloads: + + + + Overall + + + + Upload + + + + Session + Session + + + Uploaded: + + + + Average Uploadspeed: + + + + Count of Uploads: + + + + Uploaded + + + + Connections: + Anslutningar: + + + Peers: + + + + Misc + Diverse + + + Uptime: + + + + Overall: + + + + Uptime + + + + Records + + + + Uploadspeed: + + + + Downloadspeed: + + + + Show Settings + + + + Reset + Nollställ + + + Receive Rate + + + + Send Rate + + + + Always On Top + Alltid överst + + + 100 + 100 + + + % Opaque + + + + Changes the transparency of the Bandwidth Graph + + + + Save + Spara + + + Cancel + Avbryt + + + Hide Settings + Dölj inställningar + + + + TransfersDialog + + Cancel + Avbryt + + + Clear Completed + Töm färdiga + + + File Name + Filnamn + + + Sources + Källor + + + Status + Status + + + File Size + Filstorlek + + + Speed + Hastighet + + + Progress + Förlopp + + + Completed + Färdig + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Downloads:</span></p></body></html> + + + + Peer Name + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Uploads:</span></p></body></html> + + + + % + % + + + + VMessageBox + + OK + OK + + + Cancel + Avbryt + + + Yes + Ja + + + No + Nej + + + Help + Hjälp + + + Retry + Försök igen + + + Show Log + Visa logg + + + Show Settings + Visa inställningar + + + + moreinfo + + Details + Detaljer + + + OK + OK + + + Name + Namn + + + Value + Värde + + + diff --git a/retroshare-gui/src/lang/retroshare_sl.qm b/retroshare-gui/src/lang/retroshare_sl.qm new file mode 100644 index 000000000..cb1bd60ea Binary files /dev/null and b/retroshare-gui/src/lang/retroshare_sl.qm differ diff --git a/retroshare-gui/src/lang/retroshare_sl.ts b/retroshare-gui/src/lang/retroshare_sl.ts new file mode 100644 index 000000000..ce370ecc9 --- /dev/null +++ b/retroshare-gui/src/lang/retroshare_sl.ts @@ -0,0 +1,4460 @@ + + + + + + + Arial + Arial + + + + AddFriendDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;"> To add a new Friend, cut and paste their email </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">invitation into the box below, and click done.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;"> Za dodajanje prijatelja skopirajte in prilepite njihovo povabilo </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">prek e-poÅ¡te v spodnje polje in kliknite Opravljeno.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;"></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + Cancel + PrekliÄi + + + + Done + Opravljeno + + + + Load From File + Naloži iz datoteke + + + + RetroShare + RetroShare + + + + Certificate Load Failed + Nalaganje potrdila ni uspelo + + + + Add a Friend + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"><span style=" font-size:16pt;">Add a new Friend</span><br /><br /><span style=" font-size:10pt;">To add a new Friend, cut and paste their email </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">invitation into the box below, and click done.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + + + + + AddFriendWizard + + + < Back + + + + + Next > + + + + + Cancel + PrekliÄi + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">This Wizard helps to Connect to your Friends</span></p></body></html> + + + + + I have a .pqi/.pem file received from a Friend + + + + + I have Key received from a Friend + + + + + I want to invite a friend to my RetroShare network + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Cut and paste the text below into an email.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;"> and send it to all your friends!</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">When you press next RetroShare will attempt to launch a Email client.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Invite your Friends to join with RetroShare</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Enter the Key code you got from your friend:</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">When you press next RetroShare will attempt to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">connect using the key.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Select a pqi/pem file:</span></p></body></html> + + + + + Browse + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">When you press next RetroShare will attempt to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">connect using the .pqi/.pem file.</p></body></html> + + + + + Add Friend to my netowork Wizard + + + + + AdvancedSearchDialog + + + RetrosShare: Advanced Search + + + + + Add a further search criterion. + + + + + Add a selection criterion + + + + + Reset + + + + + Cancels the search. + + + + + Cancel + PrekliÄi + + + + Perform the advanced search. + + + + + Search + Najdi + + + + Search Criteria + + + + + Reset the search criteria. + + + + + ApplicationWindow + + + RetroShare %1 + + + + + Example Application + + + + + Application Users: 0 Files: 0 + + + + + Down: 0.0 Up: 0.0 + Dol: 0,0 Gor: 0,0 + + + + Connections: 0/45 + Povezave: 0/45 + + + + Hide + Skrij + + + + Show + Pokaži + + + + RetroShare + RetroShare + + + + Home + Domov + + + + General + SploÅ¡no + + + + Advanced + Napredno + + + + QTextBrowser { + background-color: rgb(192,192,192); + + } + + + + + QPushButton + { + border-image: url(:/images/console-small-up.png) + } + + QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + + } + + QPushButton:pressed { + border-image: url(:/images/console-small-down.png) + } + + + + + + AuthorizationDialog + + + Authenticate + Preveri istovetnost + + + + Authenticate Friend By Entering Their Code + Preveri istovetnost prijatelja, tako da vnesete njegovo kodo + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AVTORIZACIJSKA KODA:</span></p></body></html> + + + + OK + V redu + + + + Cancel + PrekliÄi + + + + BandwidthGraph + + + RetroShare Bandwidth Usage + + + + + Show Settings + Pokaži nastavitve + + + + Reset + Ponastavi + + + + Receive Rate + Razmerje prejemanja + + + + Send Rate + Razmerje poÅ¡iljanja + + + + Always on Top + + + + + Style + Slog + + + + Changes the transparency of the Bandwidth Graph + Spremeni prosojnost grafa pretoÄnosti + + + + 100 + 100 + + + + % Opaque + % prekrivno + + + + Save + Shrani + + + + Cancel + PrekliÄi + + + + Since: + + + + + Hide Settings + Skrij nastavitve + + + + CallToaster + + + Message + + + + + ChanCreateDialog + + + Create a new Broadcast Channel + Ustvari nov oddajni kanal + + + + Create A New Broadcast Channel + Ustvari novi oddajni kanal + + + + Channel Name: + Ime kanala: + + + + Type: + Vrsta: + + + + Public Channel (Signed) + Javni kanal (podpisano) + + + + Private Channel (Encrypted) + Zasebni kanal (Å¡ifrirano) + + + + Cancel Channel + PrekliÄi kanal + + + + Create Channel + Ustvari kanal + + + + ChanMsgDialog + + + Compose + Sestavi + + + + Recommended Files + PriporoÄene datoteke + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-weight:400;"><span style=" font-weight:600;">Subject:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-weight:400;"><span style=" font-weight:600;">Zadeva:</span></p></body></html> + + + + Send To: + Prejemnik: + + + + Send + PoÅ¡lji + + + + Delete Channel + IzbriÅ¡i kanal + + + + Create Channel MSG + Ustvari sporoÄilo za kanal + + + + 1 + 1 + + + + Reply + + + + + ChannelsDialog + + + New Message + Novo sporoÄilo + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Messages</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">SporoÄila</span></p></body></html> + + + + Date + Datum + + + + Rank + Uvrstitev + + + + From + Od + + + + Title + Naslov + + + + Msg + SporoÄilo + + + + Count + Å tevilo + + + + Size + Velikost + + + + Type + Vrsta + + + + Rs[Cert/Chan]IdSize + Rs[Cert/Chan]IdSize + + + + RsMsgId + RsMsgId + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Message Text</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Besedilo sporoÄila</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Recommended Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">PriporoÄene datoteke</span></p></body></html> + + + + New Channel + Nov kanal + + + + Subscribe To Channel + NaroÄi se na kanal + + + + Unsubscribe To Channel + Odjavi se s kanala + + + + Delete Your Channel + IzbriÅ¡i kanal + + + + Download + Prenesi + + + + Download All + Prenesi vse + + + + ChatDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:9pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:400;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:9pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:400;"></p></body></html> + + + + Chat History: + Zgodovina klepeta: + + + + Chat With: + Klepetaj z: + + + + Chat + Klepet + + + + Users: + + + + + ChatToaster + + + message + sporoÄilo + + + + You Get a New Message + Prejeli ste novo sporoÄilo + + + + Message + + + + + ConfCertDialog + + + Cancel + PrekliÄi + + + + Done + Opravljeno + + + + Apply + Uporabi + + + + Peer Settings + Nastavitve vrstnika + + + + Port: + Vrata: + + + + behind zee Firewall + za požarnim zidom + + + + Forwarded External Port + Posredovana zunanja vrata + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Vrata:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zunanji naslov:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zunanje ime</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Krajevni naslov:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Max Transfer Rate (kb/s) </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NajveÄji prenos (kB/s) </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Org / Loc:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Org / Mes:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ime:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Country/State:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Država:</p></body></html> + + + + Trust Settings + Nastavitve zaupanja + + + + Trust Level + Raven zaupanja + + + + Trust Their Signature + Zaupaj podpisu + + + + Sign The Certificate + PodpiÅ¡i digitalno potrdilo + + + + OK + V redu + + + + Peer Adress + + + + + Peer Info + + + + + ConfirmQuitDialog + + + Exit RetroShare + + + + + You are about to exit the RetroShare application and therefore stop all transfers. <br><br>Are you sure you want to stop and exit RetroShare? + + + + + Do not show this message again. + + + + + ConnectDialog + + + Peer Details + Podrobnosti o vrstniku + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Država:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Org:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Org:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Ime:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Trust:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Zaupanje:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Loc:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Mesto:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Certificate</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">signers:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Podpisniki</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">potrdila:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AVTORIZACIJSKA KODA:</span></p></body></html> + + + + Make Friend + Ustvari prijatelja + + + + Close + Zapri + + + + ConnectionsDialog + + + Load Certificate + Naloži digitalno potrdilo + + + + Select a pem/pqi File + Izberite datoteko pem/pqi + + + + File Not Found + Datoteke ni mogoÄe najti + + + + %1 does not exist. Would you like to create it? + %1 ne obstaja. Jo želite ustvariti? + + + + Failed to Create File + Datoteke ni mogoÄe ustvariti + + + + Unable to create %1 [%2] + Ni mogoÄe ustvariti %1 [%2] + + + + Select Certificate + Izberi digitalno potrdilo + + + + Certificates (*.pqi *.pem) + Digitalna potrdila (*.pqi, *.pem) + + + + Accept + Sprejmi + + + + Trust + Zaupaj + + + + Last Contact + Zadnji stik + + + + Name + Ime + + + + Organisation + Organizacija + + + + Location + Kraj + + + + Country + Država + + + + Peer Address + Naslov vrstnika + + + + Cert Id + Id potrdila + + + + Auth Code + Avtorizacijska koda + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Omrežje:</span></p></body></html> + + + + Peer Details / Authenticate + Podrobnosti o vrstniku / Overi + + + + CryptographyDialog + + + RSA Key Size + Velikost kljuÄa RSA + + + + Rijndael Block size + Velikost bloka Rijndael + + + + 128 Bits + 128-bitni + + + + 192 Bits + 192-bitni + + + + 256 Bits + 256-bitni + + + + Rijndael Key Size + Velikost kljuÄa Rijndael + + + + Rijndael Mode + NaÄin Rijndael + + + + CBC + CBC + + + + ECB + ECB + + + + CFB + CFB + + + + Rijndael Padding + Bitno zapolnjevanje Rijndael + + + + PKCS7 + PKCS7 + + + + Zeros + NiÄle + + + + ANSIX923 + ANSIX923 + + + + ISO10126 + ISO10126 + + + + Rijndael Feedback Size + Velikost odziva Rijndael + + + + Key Size: + Velikost kljuÄa: + + + + Block Size: + Velikost bloka: + + + + Feedback Size: + Velikost odziva: + + + + Mode: + NaÄin: + + + + Padding: + Bitno zapolnjevanje: + + + + DLListDelegate + + + B + + + + + KB + + + + + MB + + + + + GB + + + + + DirectoriesDialog + + + Shared Directories + Mape v skupni rabi + + + + Other Directories + Druge mape + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Incoming Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Dohodne datoteke</span></p></body></html> + + + + Add Shared Directory + Dodaj mapo v skupni rabi + + + + DirectoriesPage + + + Shared Directories + Mape v skupni rabi + + + + Incoming files + Dohodne datoteke + + + + ExampleDialog + + + Vote Up + + + + + Vote Down + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Friends</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Prijatelji</span></p></body></html> + + + + # + + + + + Status + Stanje + + + + Person + Oseba + + + + Auto Connect + Samodejno poveži + + + + Trust Level + Raven zaupanja + + + + Peer Address + Naslov vrstnika + + + + Last Contact + Zadnji stik + + + + Organisation + Organizacija + + + + Location + Kraj + + + + Country + Država + + + + Person Id + Id osebe + + + + Auth Code + Avtorizacijska koda + + + + ExprParamElement + + + to + + + + + ignore case + + + + + dd.MM.yyyy + + + + + KB + + + + + MB + + + + + GB + + + + + ExpressionWidget + + + Expression Widget + + + + + Delete this expression + + + + + FileHashDialog + + + Download + Prenesi + + + + GSettingsWin + + + General + SploÅ¡no + + + + Network + Omrežje + + + + Directories + Mape + + + + Server + Strežnik + + + + %1 + %1 + + + + GenCertDialog + + + RetroShare setup + Namestitev RetroShare + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16pt;">Generate a new profile</span><br /><br />Please fill in the information which will<br />allow your RetroShare to connect to</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Friends.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Organisation:</p></body></html> + + + + + Password (Again) + + + + + Location: + + + + + Load Trusted Certificate (Optional) + Naloži zaupanja vredna digitalna potrdila (dodatno) + + + + Password + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Prijatelj</span></p></body></html> + + + + Select File + Izberite datoteko + + + + Country: + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ime:</p></body></html> + + + + Generate New Certificate + Ustvari novo digitalno potrdilo + + + + Select Trusted Friend + Izberite zaupanja vrednega prijatelja + + + + Certificates (*.pqi *.pem) + Digitalna potrdila (*.pqi, *.pem) + + + + GeneralPage + + + Keys manager + Upravitelj kljuÄev + + + + Style + Slog + + + + Choose RetroShare's interface style + Izberite slog vmesnika za RetroShare + + + + Language + Jezik + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Sprememba jezika bo veljala Å¡ele po ponovnem zagonu aplikacije RetroShare!</p></body></html> + + + + Choose the language used in RetroShare + Izberite jezik, ki ga bo uporabljal RetroShare + + + + GraphFrame + + + Recv: + Prejeto: + + + + %1 KB/s + %1 kB/s + + + + Sent: + Poslano: + + + + %1 KB + %1 kB + + + + %1 MB + %1 MB + + + + %1 GB + %1 GB + + + + HelpDialog + + + About + O programu + + + + Authors + + + + + Thanks to + + + + + Translation + + + + + License Agreement + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">About/Help</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:xx-large; font-weight:600; color:#0000ff;">About RetroShare.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-weight:600;">Retroshare is a private and secure decentralised commmunication platform.<br />You can use it chat, send messages and share files with your friends.</span><br /><br />This is just a placeholder page for the moment. You can<br />improve retroshare's in-built help (this text) by<br />updating the retroshare wiki: <a href="http://retroshare.wiki.sourceforge.net/help_tab"><span style=" text-decoration: underline; color:#0000ff;">This Page in the retroshare Wiki</span></a><br /><br />The About/Help Tab is regularly updated from the Wiki page.<br /><br />External Links to more information:<br /></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.sourceforge.net"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Webpage</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.wiki.sourceforge.net/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Wiki</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://sourceforge.net/projects/retroshare/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Project Page</span></a></li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.lunamutt.com"><span style=" text-decoration: underline; color:#0000ff;">Lunamutt Homepage.</span></a></li></ul></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-size:19pt; font-weight:600; color:#0000ff;">The RetroShare Team:</span><br /> <br /><span style=" font-size:9pt; color:#0000ff;">defnax</span>: Lead GUI developer <br /><span style=" font-size:9pt; color:#0000ff;">drbob7</span>: Lead Core developer. <br /> <br /><span style=" font-size:9pt; color:#0000ff;">bmeck</span> : Our new web-developer. Joined retroshare a couple <br />of weeks ago, and already starting on an exciting new <br />design for the web-page. <br /> <br /><span style=" font-size:9pt; color:#0000ff;">noragen</span> : Developer from the SIM-IM project. Working on a retroshare plugin to SIM-IM. <br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">kernelpanix</span> : Gui and skin developer</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">libris</span><span style=" font-size:9pt;">:</span> core developer</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-size:9pt; color:#0000ff;">kashif: </span><span style=" color:#000000;">core developer</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt; color:#000000;"><span style=" font-size:8pt;"><br /></span><span style=" color:#0000ff;">agent725</span><span style=" font-size:8pt;">: Manages the 'local' Retroshare release, <br />and beta-testing retroshare on a large scale. <br /> <br /></span><span style=" color:#0000ff;">the_mgt</span><span style=" font-size:8pt;">: Maintains the Gentoo and generic linux <br />installation/compilation scripts. </span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">notdefine:</span> Maintains the .rpm, .deb installation/compilation scripts.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">zhouk</span>: developer</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Translators:</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Serbian</span>: Kunalagon Umuhanik &lt;kunalagon@gmail.com&gt;</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Polish: </span>Jarek</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">French</span>:Temet</p></body></html> + + + + + InviteDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">To </span><span style=" font-size:10pt; font-weight:600;">Invite your friends to join you with Retroshare: </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">Cut and paste the text below into an email.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">and send it to all your friends!</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ÄŒe želite </span><span style=" font-size:10pt; font-weight:600;">povabiti svoje prijatelje, da se pridružijo v Retroshare: </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">izrežite in prilepite spodnje besedilo v e-sporoÄilo</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">ter ga poÅ¡ljite vsem svojim prijateljem!</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + Done + Opravljeno + + + + Cancel + PrekliÄi + + + + Launch Email + Zaženi program za poÅ¡to + + + + Invite a Friend + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"><span style=" font-size:16pt;">Invite a Friend</span><br /><br /><span style=" font-size:10pt;">To Invite your friends to join you with Retroshare: </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">Cut and paste the text below into an email.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">and send it to all your friends!</p></body></html> + + + + + LogDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> + +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="ABOUT"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">About RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShare is a private peer to peer communication platform created by Dr. Bob.This program enables you to securely share files and chat with your friends (and no-one else!).</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, and the latest release go to http://www.lunamutt.com.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="START"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Quick Start Guide to RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If this is your first time using Retroshare, it is recommended that you readthis guide for instructions on how to get started. The first step is:<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Connecting to Your Friends</span></a>. Once you have managed this you can <a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">Download Files</span></a> and<a href="#START-SHARE"><span style=" text-decoration: underline; color:#0000ff;">Share with Others</span></a></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Some of the key concepts related to ensuring your sharing remains private aredescribed in the <a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">Frequently Asked Questions</span></a>. Some Key security questions are:<a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">What is a Web of Trust?</span></a>, <a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">Should I Sign this Certificate?</span></a>, and finally<a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">What does "Trust" Mean?</span></a>.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is also worthwhile reading the <a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">GUI Overview</span></a>which describes the featureson available through the User Interface.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Connecting to your Friends </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">There are four steps to connecting to a Friend:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Get Friend's Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Load Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Sign Certificate</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect to Friend.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The instructions might initially appear long and daunting, however thesesteps are required to ensure that your sharing is private and secure.These steps are only required a couple of times, to add new friends, and become quite straight forward after the first time.</p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (1) EXCHANGE CERTIFICATES </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Before you can connect, you need send your certificate to your friend, and get your friends certificate. Follow these steps to get your certificate:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on Your Certificate to Select it.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on the "Export Friend" Button to bring up a file save dialog.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select directory to save the certificate to.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Enter desired filename. (with a file type of .pqi), and Click OK.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Email this File to your Friend. (It is recommended you put thecertificate in a zip file before sending, as some email programsdon't transmit the file correctly).</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Ask your friend to do the same.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Once you have received your friend's certificate, removed itfrom the zip file and saved it to disk, you can proceed to step (2).</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Note: This exchange of certificates is only necessary to get you started.Once you are connected to some friends the exchange of certificates becomeautomated by the autoDiscovery system. See<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">GUI: Connecting</span></a> for more information.------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (2) LOAD YOUR FRIEND'S CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Import Friend"</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select your friends certificate file, then click "Okay". Their certificate should appear in the top window of the "Connect" Tab.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (3) SIGN CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select their Certificate by clicking on their name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Configure Friend" Button. This will bring up a configuration window. which allows you to look at the detailsof the certificate.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click the "Sign Certificate" button near the bottom of the "Certificate Configuration" Window.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Now close the window by clicking on the "Done" button.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Your Friends certificate should now say "Trusted (S)", indicating it is ready for connections.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can only share with "Trusted" Peers. You must sign your Friend'scertificate to prove that you know the certificate belongs to your Friend. Do not sign any/all certificates - only the people youtrust. For more information see: <br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br />------------------------------------------------------------------------<br /><br /> <br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (4) AUTOCONNECT TO PEER </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Finally You need to activate the connection:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click in the Box, next to your friends Name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> A Tick should appear in the box, a connection will be started.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> The "Offline" will change to "Online" when you have successfullyconnected.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Remember: Your initial connection attempts will fail, until your friend has signed your certificate and ticked the Auto-Connect Box.This ensures that both peers trust each other, and stops random peopleaccessing your files.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>. <br />------------------------------------------------------------------------<br /><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-DOWNLOAD"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Downloading Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have connected to friends, you can download their shared files.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can search for the files you want using either:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) File Listing Tab: This gives you a directory view of the files being shared by your peers. Double clickon the directory name (not the arrow) to diplay its subdirectories and files.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 1: This can take up to 5 seconds to fetch the information for your peer.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 2: If the directory is empty, or the person is offline, then the request will silently fail.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Search Tab: Retroshare also allows you to search your peers computers for filenames. Enter yourterm(s) in the search box at the top of the TAB and click the "Search" button. This willsearch all of the peers that you are currently connected to.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 3: If any matching files are found they will be displayed within 5 - 10 seconds.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have found the files you want, Select the file(s), and click "Download" to begin the download process.If you click over the "File Transfer" TAB, the status of the files will appear.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 4: The files can take up to 10 seconds to appear in the transfer window.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-SHARING"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Sharing Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can specify which files you want to share in the "Config" Tab.In the "Share Directories" section, click the "Add Directory" Button, and select the directory you want to share.The files and subdirectories will become available for you peers.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can remove a directory from the Shared Directories List by clicking onthe directory name in the list, and then clicking "Remove Directory".</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="GUI"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Gui Overview (Tab Description) </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The GUI is divided up into several sections which can be accessed by clicking on the Tabs along the top of the main window. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect: Manage Connections and Friends.(<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">getting started</span></a> and<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Listing: A directory view of available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Search: Search for available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Messages: For Sending/Recving Message. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Channels: A broadcast/subscription system. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Transfer: Listing of Current and completed Transfers.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Config: Specify of share diectories and IP Addresses.(<a href="#GUI-CONFIG"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> About: Help and other Information.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Chat: Accessed by the clicking on the "Chat" button.</li></ul> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Connect Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Connect TAB consists of two windows. The upper windowshows a list of your friends. This window indicates each friendscurrent trust level, as well as their connection state.The "Trust_Lvl" Column indicates if the certificate has beenAuthenticated using the web of trust. You can only connect to "Trusted" certificates. Tick the "Auto_Connect" box to connect to your trusted friends.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The lower window provides a list of the friends of your friends.This window shows the neighbour's name and how long ago they attempted to connect to you. This window is automatically populatedby the autoDiscovery system, and should be used to expand yourretroShare network. A word of warning: Do not automatically trust (or sign) anyonethat appears in this window. First verify by some other means (email/phone)that certificate belongs to the person you think it does.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use the "Neighbour List" window to expand your friend list. Select the desired entry in the lower window by clicking on it, then click the "Add to Friends" Button to move it to the upper window.Likewise the "Remove from Friends" button moved a person from the upper window to the lower window.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The "Configure Friend" Button opens a Certificate Configuration window.This window can be used to examine the certificate details, sign the certificate or manually change the peer's IP Address.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">See Also:<br /><a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Getting Started: Connecting to your friends</span></a>.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>.<br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONFIG"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Config Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Configuration Tab allows you to select the share directories, as well as the directory that downloaded files are saved to.<br />See <a href="#STARTUP-SHARING"><span style=" text-decoration: underline; color:#0000ff;">Sharing you Files</span></a> for details. </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Config Tab also allows you to control the IP Address and Portused by RetroShare. Under most cirumstances you do not need to changethese setting. If you are behind a firewall and can setup a forwarded port, the selected IP Address and Port should be specified here.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="FAQ"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Frequently Asked Questions </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">How does the security/privacy work? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShares uses a Web of Trust Authentication system to ensurethat your "friends" are your friends, and uses SSL to encryptthe communcications between peers. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What is a Web of Trust? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Web of Trust relies on a collection of peers to identify eachother. Look it up on the Web!</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-TRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What does "Trust" Mean in RetroShare?</span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Anyone can generate a certificate, with any name on it. So howdo you know that the certificate that claims to be from "Joe Bloggs"is really from your mate Joe. This is the "AuthenticationProblem". RetroShare uses a Web of Trust to Authenticate your peers.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-SIGN"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Should I Sign this Certificate? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should only sign a certificate if you are completely surethat it comes from the "right" person. If you sign a certificateyou are "Authenticating" the person to yourself and others.If you sign certificates that you haven't checked, then you aredestroying your own privacy and security.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">How do you verify a certificate? Use an alternative method ofcommunication to send the certificate: E.g. email or USB stick. This will improve you confidence that the certificate belongsto the correct person. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><span style=" font-size:small;"> </span><a name="FAQ-CONNECT"></a><span style=" font-size:small;">W</span><span style=" font-size:small;">hy won't it Connect?</span><span style=" font-size:small;"> </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A connection can fail for a number of reasons:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) Failed Authentication. Have both peers signed each otherscertificates? </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Firewalls. If both peers are behind firewalls then they cannotconnect directly. RetroShare has a built in proxy system to circumventfirewalls - However this can only function if both peers can connect to a common third party that is not behind a firewall. Thisis the most likely reason for initial connections to fail. The only solution to find a common friend that isn't firewalled (know anyone with Broadband?)</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(3) IP Addresses are wrong. You can manually examine and change these using the Certificate configuration.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +</body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> + +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="ABOUT"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">O programu RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Hitre povezave: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">O programu</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Prvi koraki</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Osnove uporabniÅ¡kega vmesnika</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">Pogosto zastavljena vpraÅ¡anja (FAQ)</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShare is a private peer to peer communication platform created by Dr. Bob.This program enables you to securely share files and chat with your friends (and no-one else!).</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, and the latest release go to http://www.lunamutt.com.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="START"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Quick Start Guide to RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Hitre povezave: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If this is your first time using Retroshare, it is recommended that you readthis guide for instructions on how to get started. The first step is:<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Connecting to Your Friends</span></a>. Once you have managed this you can <a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">Download Files</span></a> and<a href="#START-SHARE"><span style=" text-decoration: underline; color:#0000ff;">Share with Others</span></a></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Some of the key concepts related to ensuring your sharing remains private aredescribed in the <a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">Frequently Asked Questions</span></a>. Some Key security questions are:<a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">What is a Web of Trust?</span></a>, <a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">Should I Sign this Certificate?</span></a>, and finally<a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">What does "Trust" Mean?</span></a>.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is also worthwhile reading the <a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">GUI Overview</span></a>which describes the featureson available through the User Interface.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Connecting to your Friends </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">There are four steps to connecting to a Friend:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Get Friend's Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Load Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Sign Certificate</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect to Friend.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The instructions might initially appear long and daunting, however thesesteps are required to ensure that your sharing is private and secure.These steps are only required a couple of times, to add new friends, and become quite straight forward after the first time.</p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (1) EXCHANGE CERTIFICATES </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Before you can connect, you need send your certificate to your friend, and get your friends certificate. Follow these steps to get your certificate:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on Your Certificate to Select it.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on the "Export Friend" Button to bring up a file save dialog.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select directory to save the certificate to.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Enter desired filename. (with a file type of .pqi), and Click OK.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Email this File to your Friend. (It is recommended you put thecertificate in a zip file before sending, as some email programsdon't transmit the file correctly).</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Ask your friend to do the same.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Once you have received your friend's certificate, removed itfrom the zip file and saved it to disk, you can proceed to step (2).</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Note: This exchange of certificates is only necessary to get you started.Once you are connected to some friends the exchange of certificates becomeautomated by the autoDiscovery system. See<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">GUI: Connecting</span></a> for more information.------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (2) LOAD YOUR FRIEND'S CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Import Friend"</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select your friends certificate file, then click "Okay". Their certificate should appear in the top window of the "Connect" Tab.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (3) SIGN CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select their Certificate by clicking on their name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Configure Friend" Button. This will bring up a configuration window. which allows you to look at the detailsof the certificate.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click the "Sign Certificate" button near the bottom of the "Certificate Configuration" Window.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Now close the window by clicking on the "Done" button.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Your Friends certificate should now say "Trusted (S)", indicating it is ready for connections.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can only share with "Trusted" Peers. You must sign your Friend'scertificate to prove that you know the certificate belongs to your Friend. Do not sign any/all certificates - only the people youtrust. For more information see: <br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br />------------------------------------------------------------------------<br /><br /> <br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (4) AUTOCONNECT TO PEER </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Finally You need to activate the connection:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click in the Box, next to your friends Name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> A Tick should appear in the box, a connection will be started.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> The "Offline" will change to "Online" when you have successfullyconnected.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Remember: Your initial connection attempts will fail, until your friend has signed your certificate and ticked the Auto-Connect Box.This ensures that both peers trust each other, and stops random peopleaccessing your files.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>. <br />------------------------------------------------------------------------<br /><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-DOWNLOAD"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Downloading Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have connected to friends, you can download their shared files.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can search for the files you want using either:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) File Listing Tab: This gives you a directory view of the files being shared by your peers. Double clickon the directory name (not the arrow) to diplay its subdirectories and files.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 1: This can take up to 5 seconds to fetch the information for your peer.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 2: If the directory is empty, or the person is offline, then the request will silently fail.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Search Tab: Retroshare also allows you to search your peers computers for filenames. Enter yourterm(s) in the search box at the top of the TAB and click the "Search" button. This willsearch all of the peers that you are currently connected to.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 3: If any matching files are found they will be displayed within 5 - 10 seconds.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have found the files you want, Select the file(s), and click "Download" to begin the download process.If you click over the "File Transfer" TAB, the status of the files will appear.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 4: The files can take up to 10 seconds to appear in the transfer window.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-SHARING"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Sharing Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can specify which files you want to share in the "Config" Tab.In the "Share Directories" section, click the "Add Directory" Button, and select the directory you want to share.The files and subdirectories will become available for you peers.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can remove a directory from the Shared Directories List by clicking onthe directory name in the list, and then clicking "Remove Directory".</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="GUI"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Gui Overview (Tab Description) </span><span style=" font-size:medium;"> </span></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The GUI is divided up into several sections which can be accessed by clicking on the Tabs along the top of the main window. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect: Manage Connections and Friends.(<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">getting started</span></a> and<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Listing: A directory view of available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Search: Search for available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Messages: For Sending/Recving Message. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Channels: A broadcast/subscription system. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Transfer: Listing of Current and completed Transfers.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Config: Specify of share diectories and IP Addresses.(<a href="#GUI-CONFIG"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> About: Help and other Information.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Chat: Accessed by the clicking on the "Chat" button.</li></ul> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Connect Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Connect TAB consists of two windows. The upper windowshows a list of your friends. This window indicates each friendscurrent trust level, as well as their connection state.The "Trust_Lvl" Column indicates if the certificate has beenAuthenticated using the web of trust. You can only connect to "Trusted" certificates. Tick the "Auto_Connect" box to connect to your trusted friends.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The lower window provides a list of the friends of your friends.This window shows the neighbour's name and how long ago they attempted to connect to you. This window is automatically populatedby the autoDiscovery system, and should be used to expand yourretroShare network. A word of warning: Do not automatically trust (or sign) anyonethat appears in this window. First verify by some other means (email/phone)that certificate belongs to the person you think it does.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use the "Neighbour List" window to expand your friend list. Select the desired entry in the lower window by clicking on it, then click the "Add to Friends" Button to move it to the upper window.Likewise the "Remove from Friends" button moved a person from the upper window to the lower window.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The "Configure Friend" Button opens a Certificate Configuration window.This window can be used to examine the certificate details, sign the certificate or manually change the peer's IP Address.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">See Also:<br /><a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Getting Started: Connecting to your friends</span></a>.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>.<br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONFIG"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Config Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Configuration Tab allows you to select the share directories, as well as the directory that downloaded files are saved to.<br />See <a href="#STARTUP-SHARING"><span style=" text-decoration: underline; color:#0000ff;">Sharing you Files</span></a> for details. </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Config Tab also allows you to control the IP Address and Portused by RetroShare. Under most cirumstances you do not need to changethese setting. If you are behind a firewall and can setup a forwarded port, the selected IP Address and Port should be specified here.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="FAQ"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Pogosto zastavljena vpraÅ¡anja </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Hitre povezave: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">O programu</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Prvi koraki</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Osnove uporabniÅ¡kega vmesnika</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">Pogosto zastavljena vpraÅ¡anja (FAQ)</span></a></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">How does the security/privacy work? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShares uses a Web of Trust Authentication system to ensurethat your "friends" are your friends, and uses SSL to encryptthe communcications between peers. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What is a Web of Trust? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Web of Trust relies on a collection of peers to identify eachother. Look it up on the Web!</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-TRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What does "Trust" Mean in RetroShare?</span><span style=" font-size:small;"> +</span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Anyone can generate a certificate, with any name on it. So howdo you know that the certificate that claims to be from "Joe Bloggs"is really from your mate Joe. This is the "AuthenticationProblem". RetroShare uses a Web of Trust to Authenticate your peers.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-SIGN"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Should I Sign this Certificate? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should only sign a certificate if you are completely surethat it comes from the "right" person. If you sign a certificateyou are "Authenticating" the person to yourself and others.If you sign certificates that you haven't checked, then you aredestroying your own privacy and security.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">How do you verify a certificate? Use an alternative method ofcommunication to send the certificate: E.g. email or USB stick. This will improve you confidence that the certificate belongsto the correct person. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><span style=" font-size:small;"> </span><a name="FAQ-CONNECT"></a><span style=" font-size:small;">Z</span><span style=" font-size:small;">akaj se noÄe povezati?</span><span style=" font-size:small;"> </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A connection can fail for a number of reasons:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) Failed Authentication. Have both peers signed each otherscertificates? </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Firewalls. If both peers are behind firewalls then they cannotconnect directly. +RetroShare has a built in proxy system to circumventfirewalls - However this can only function if both peers can connect to a common third party that is not behind a firewall. Thisis the most likely reason for initial connections to fail. The only solution to find a common friend that isn't firewalled (know anyone with Broadband?)</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(3) IP Addresses are wrong. You can manually examine and change these using the Certificate configuration.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Hitre povezave: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">O programu</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Prvi koraki</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Osnove uporabniÅ¡kega vmesnika</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">Pogosto zastavljena vpraÅ¡anja (FAQ)</span></a></p></td></tr></table> +</body></html> + + + + MainWindow + + + Preferences + Nastavitve + + + + Network + Omrežje + + + + Friends + Prijatelji + + + + Transfers + Prenosi + + + + Messages + SporoÄila + + + + Channels + Kanali + + + + Options + Možnosti + + + + Users: 0 Files: 0 + Uporabniki: 0 Datoteke: 0 + + + + Down: 0.0 Up: 0.0 + Dol: 0,0 Gor: 0,0 + + + + Connections: 0/45 + Povezave: 0/45 + + + + System tray is unavailable + Sistemski pladenj ni na voljo + + + + System tray unavailable + Sistemski pladenj ni na voljo + + + + RetroShare System tray + Sistemski pladenj RetroShare + + + + Application will continue running. Quit using context menu in the system tray + Aplikacija bo Å¡e naprej tekla. Zapustite jo prek pojavnega menija v sistemskem pladnju + + + + Hide + Skrij + + + + Show + Pokaži + + + + RetroShare + RetroShare + + + + Home + Domov + + + + General + SploÅ¡no + + + + Invite Friend + Povabi prijatelja + + + + Add Friend + Dodaj prijatelja + + + + Add Share + Dodaj skupno rabo + + + + Advanced + Napredno + + + + QTextBrowser { + background-color: rgb(192,192,192); + +} + QTextBrowser { + background-color: rgb(192,192,192); + +} + + + + QPushButton +{ + border-image: url(:/images/console-small-up.png) +} + +QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + +} + +QPushButton:pressed { + border-image: url(:/images/console-small-down.png) +} + + QPushButton +{ + border-image: url(:/images/console-small-up.png) +} + +QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + +} + +QPushButton:pressed { + border-image: url(:/images/console-small-down.png) +} + + + + + Exit + Izhod + + + + Search + Najdi + + + + Files + Datoteke + + + + Chat + Klepet + + + + Add Shared Directory + Dodaj mapo v skupni rabi + + + + Default + Privzeto + + + + blue + modra + + + + silver + srebrna + + + + ed2k + ed2k + + + + over + preko + + + + black + Ärna + + + + arachnophobia + arachnophobia + + + + Skin2 + Preobleka2 + + + + Pagefold + Prelom strani + + + + About/Help + + + + + Messenger + + + + + Show/Hide + + + + + &Quit + + + + + Bandwidth Graph + + + + + Open Messenger + + + + + RetroShare %1 + + + + + Add a Friend + + + + + Invite a Friend + + + + + Add a Share + + + + + Quit + + + + + Minimize + + + + + Maximize + + + + + Hide Console + + + + + Show Console + + + + + Hide ToolBox + + + + + :images/hide_toolbox_frame.png + + + + + Show ToolBox + + + + + :images/show_toolbox_frame.png + + + + + QTextBrowser { + background-color: rgb(192,192,192); + + } + + + + + QPushButton + { + border-image: url(:/images/console-small-up.png) + } + + QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + + } + + QPushButton:pressed { + border-image: url(:/images/console-small-down.png) + } + + + + + + Apps + + + + + MessageToaster + + + message + sporoÄilo + + + + MessagesDialog + + + New Message + Novo sporoÄilo + + + + Reply to Message + Odgovori + + + + Remove Message + Odstrani sporoÄilo + + + + Date + Datum + + + + From + Od + + + + Title + Zadeva + + + + Msg + SporoÄilo + + + + Count + Å tevilo + + + + Size + Velikost + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Recommended Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">PriporoÄene datoteke</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">remove selected message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Odstrani izbrano sporoÄilo</p></body></html> + + + + QPushButton +{ +border-image: url(:/images/deletemail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/deletemail-hover.png); +} + QPushButton +{ +border-image: url(:/images/deletemail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/deletemail-hover.png); +} + + + + Inbox + Prejeto + + + + Outbox + Odhodna poÅ¡ta + + + + Draft + Osnutki + + + + Sent + Poslano + + + + Timestamp + ÄŒasovni žig + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">reply to selected message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Odgovori izbranemu sporoÄilu</p></body></html> + + + + +QPushButton +{ +border-image: url(:/images/replymail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/replymail-hover.png); +} + + +QPushButton +{ +border-image: url(:/images/replymail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/replymail-hover.png); +} + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">New Message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Novo sporoÄilo</p></body></html> + + + + QPushButton +{ +border-image: url(:/images/folder-draft24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/folder-draft24-hover.png); +} + + QPushButton +{ +border-image: url(:/images/folder-draft24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/folder-draft24-hover.png); +} + + + + + You get Message testing + Poteka preverjanje sporoÄil + + + + Download All + Prenesi vse + + + + QPushButton +{ +border-image: url(:/images/deletemail24.png); +} + +QPushButton:hover +{ +border-image: url(:/images/deletemail-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/deletemail-pressed.png); +} + + + + + +QPushButton +{ +border-image: url(:/images/replymail24.png); +} + +QPushButton:hover +{ +border-image: url(:/images/replymail24-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/replymail-pressed.png); +} + + + + + + QPushButton +{ +border-image: url(:/images/folder-draft24.png); +} +QPushButton:hover +{ +border-image: url(:/images/folder-draft24-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/folder-draft24-pressed.png); +} + + + + + + MessengerWindow + + + QWidget#MessengerWindow { +background-color: #ECF3F6; background-image:url(:/images/backgroundimage.png); +background-position: top right; +background-repeat: no-repeat +} + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click to change your avatar</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Change your Status and your display</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">picture here.</p></body></html> + + + + + Online + + + + + Busy + + + + + Be right Back + + + + + Away + + + + + In a Call + + + + + Out of lunch + + + + + Apear Offline + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Share a personal message with your contacts</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Add a Friend</p></body></html> + + + + + Chat + Klepet + + + + Connect To Friend + Poveži se s prijateljem + + + + NetworkDialog + + + Peer Details / Authenticate + Podrobnosti o vrstniku / Overi + + + + Load Certificate + Naloži digitalno potrdilo + + + + Select a pem/pqi File + Izberite datoteko pem/pqi + + + + File Not Found + Datoteke ni mogoÄe najti + + + + %1 does not exist. Would you like to create it? + %1 ne obstaja. Jo želite ustvariti? + + + + Failed to Create File + Datoteke ni mogoÄe ustvariti + + + + Unable to create %1 [%2] + Ni mogoÄe ustvariti %1 [%2] + + + + Select Certificate + Izberi digitalno potrdilo + + + + Certificates (*.pqi *.pem) + Digitalna potrdila (*.pqi, *.pem) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Omrežje:</span></p></body></html> + + + + # + + + + + Accept + Sprejmi + + + + Trust + Zaupaj + + + + Last Contact + Zadnji stik + + + + Name + Ime + + + + Peer Address + Naslov vrstnika + + + + Organisation + Organizacija + + + + Location + Kraj + + + + Country + Država + + + + Cert Id + Id potrdila + + + + Auth Code + Avtorizacijska koda + + + + NetworkPage + + + Rate Options + Možnosti prepustnosti + + + + Max Total Data Rate (KB/S): + NajveÄji prenos podatkov (kB/s): + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Rate per Person (KB/S):</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Hitrost na osebo (kB/s):</p></body></html> + + + + PeersDialog + + + Chat + Klepet + + + + Configure Friend + Prilagodi prijatelja + + + + Export Friend + Izvozi prijatelja + + + + Remove Friend + Odstrani prijatelja + + + + Save Certificate + Shrani digitalno potrdilo + + + + Certificates (*.pqi) + Digitalna potrdila (*.pqi) + + + + Status + Stanje + + + + Person + Oseba + + + + Auto Connect + Samodejno poveži + + + + Trust Level + Raven zaupanja + + + + Peer Address + Naslov vrstnika + + + + Last Contact + Zadnji stik + + + + Organisation + Organizacija + + + + Location + Kraj + + + + Country + Država + + + + Person Id + Id osebe + + + + Auth Code + Avtorizacijska koda + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Friends</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Prijatelji</span></p></body></html> + + + + Connect To Friend + Poveži se s prijateljem + + + + # + + + + + PopupChatDialog + + + RetroShare Friend Chat + Prijateljski klepet RetroShare + + + + RetroShare User Chat + + + + + PreferencesDialog + + + Language + Jezik + + + + Style + Slog + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Sprememba jezika bo obveljala Å¡ele po ponovnem zagonu aplikacije RetroShare!</p></body></html> + + + + Style Sheet + Slogovna predloga + + + + Default + Privzeto + + + + Pagefold + Prelom strani + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose RetroShare's interface style</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Izberite slog vmesnika za RetroShare</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose the language used in RetroShare</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Izberite jezik vmesnika za RetroShare</p></body></html> + + + + blue + modra + + + + silver + srebrna + + + + ed2k + ed2k + + + + over + preko + + + + black + Ärna + + + + arachnophobia + arachnophobia + + + + Skin2 + Preobleka2 + + + + Login + Prijava + + + + Remove Auto Login + Izklopi samodejno prijavo + + + + PreferencesWindow + + + Directories + Mape + + + + Error Saving Configuration + Napaka pri shranjevanju nastavitev + + + + About + O programu + + + + General + SploÅ¡no + + + + Server + Strežnik + + + + Options + Možnosti + + + + Cancel + PrekliÄi + + + + OK + V redu + + + + QObject + + + Name + Ime + + + + Path + + + + + Extension + + + + + Date + Datum + + + + Size + Velikost + + + + Popularity + + + + + contains + + + + + contains all + + + + + is + + + + + less than + + + + + less than or equal + + + + + greater than or equal + + + + + greater than + + + + + is in range + + + + + and + + + + + and / or + + + + + or + + + + + equals + + + + + Rshare + + + Invalid language code specified: + Navedena neveljavna koda jezika: + + + + Invalid GUI style specified: + Naveden neveljaven slog vmesnika: + + + + SearchDialog + + + File Name + Ime datoteke + + + + Sources + Viri + + + + Search Pattern + Iskani vzorec + + + + Results + Rezultati + + + + File Size + Velikost datoteke + + + + Download + Prenesi + + + + Broadcast on Channel + Oddajaj na kanalu + + + + Recommend to Friends + PriporoÄi prijateljem + + + + Remove + Odstrani + + + + Remove All + Odstrani vse + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Keywords</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">KljuÄne besede</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Format</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Vrsta</p></body></html> + + + + Any + Karkoli + + + + Audio + Zvok + + + + Video + Video + + + + Images + Slike + + + + Programs + Programi + + + + Archives + Arhivi + + + + Documents + Dokumenti + + + + search + najdi + + + + download + prenesi + + + + Toggle advanced searching on and off. + + + + + <h3>Simple Search:</h3> + + + + + Keywords + + + + + Perform simple search + + + + + Show Advanced Search Tool + + + + + Filename + + + + + Hash + + + + + KeyWords + + + + + Search Id + + + + + <h3>Advanced Search:</h3> + + + + + ServerDialog + + + Transfer Rates + Hitrost prenosov + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Total Rate (kb/s) </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Skupna hitrost (kB/s) </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Per Person </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Na osebo </p></body></html> + + + + Server Settings + Nastavitve strežnika + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Krajevni naslov:</p></body></html> + + + + Port: + Vrata: + + + + behind zee Firewall + za požarnim zidom + + + + Forwarded External Port + Posredovana zunanja vrata + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Vrata:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zunanje ime</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zunanji naslov:</p></body></html> + + + + Check Settings + Preveri nastavitve + + + + Firewall/Router Configuration + + + + + Manual router setup. + + + + + Use uPnP to configure router + + + + + Network Address Configuration (takes effect after restart) + + + + + Use DHT to locate friends + + + + + Manual IP Addresses + + + + + Server Status And Network Settings + + + + + Firewalled + + + + + Forwarded Port + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">DHT Status</p></body></html> + + + + + uPnP Status + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Local Address:</p></body></html> + + + + + ServerPage + + + Change + Restart Server + Spremeni in ponovno zaženi strežnik + + + + Server Settings + Nastavitve strežnika + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zunanji naslov:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Krajevni naslov:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Vrata:</p></body></html> + + + + Port: + Vrata: + + + + Misc + Razno + + + + behinde Firewall + za požarnim zidom + + + + Forwarded External Port + Posredovana zunanja vrata + + + + Settings + + + Settings + Nastavitve + + + + Cancel + PrekliÄi + + + + Apply + Uporabi + + + + OK + V redu + + + + General + SploÅ¡no + + + + Network + Omrežje + + + + Server + Strežnik + + + + Directories + Mape + + + + SharedFilesDialog + + + Download + Prenesi + + + + Recommend + PriporoÄi + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Datoteke</span></p></body></html> + + + + Add to Recommend List + + + + + Recommend To + + + + + Message Friend + + + + + StartDialog + + + Select Trusted Friend + Izberite zaupanja vrednega prijatelja + + + + Certificates (*.pqi *.pem) + Digitalna potrdila (*.pqi, *.pem) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:13pt; font-weight:600; color:#8b0000;">Welcome to RetroShare</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:13pt; font-weight:600; color:#8b0000;">DobrodoÅ¡li v RetroShare</span></p></body></html> + + + + Please Login .... + Prosimo, prijavite se ... + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Ime:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Pasword</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Geslo</span></p></body></html> + + + + Load Existing User + Naloži obstojeÄega uporabnika + + + + Or create a New User + Ali ustvari novega uporabnika + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Organisation:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Organizacija:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Država:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Location:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Mesto:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Password (Again)</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Geslo (znova)</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">New Password</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Novo geslo</span></p></body></html> + + + + Load Trusted Certificate (Optional) + Naloži zaupanja vredna digitalna potrdila (dodatno) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Prijatelj</span></p></body></html> + + + + Select File + Izberite datoteko + + + + Generate New Certificate + Ustvari novo digitalno potrdilo + + + + RetroShare setup + Namestitev RetroShare + + + + Automatically Login in Future + Samodejna prijava v prihodnje + + + + RetroShare + RetroShare + + + + QWidget { + background-color: #ECF3F6; +} + + + + + Auto-login + + + + + Name: + + + + + Log In + + + + + Password: + + + + + Create a Account + + + + + QToolButton{ +border-image: url(:/images/avatar_background.png); + +} + + + + + + StatisticDialog + + + Statistics + Statistika + + + + Download + Prenosi na raÄunalnik + + + + Session: + Seja: + + + + Downloaded: + Preneseno: + + + + Average Downloadspeed: + PovpreÄna hitrost prenosov: + + + + Count of Downloads: + Å tevilo prenosov: + + + + Overall + Skupaj + + + + Upload + Prenosi z raÄunalnika + + + + Session + Seja + + + + Uploaded: + Preneseno: + + + + Average Uploadspeed: + PovpreÄna hitrost prenosov: + + + + Count of Uploads: + Å tevilo prenosov: + + + + Uploaded + Preneseno + + + + Connections: + Povezave: + + + + Peers: + Vrstniki: + + + + Misc + Razno + + + + Uptime: + ÄŒas povezave: + + + + Overall: + Skupno: + + + + Uptime + ÄŒas povezave + + + + Records + Zapisi + + + + Uploadspeed: + Hitrost prenosov z raÄunalnika: + + + + Downloadspeed: + Hitrost prenosov na raÄunalnik: + + + + Show Settings + Pokaži nastavitve + + + + Reset + Ponastavi + + + + Receive Rate + Razmerje prejemanja + + + + Send Rate + Razmerje poÅ¡iljanja + + + + Always On Top + Vedno na vrhu + + + + 100 + 100 + + + + % Opaque + % prekrivno + + + + Changes the transparency of the Bandwidth Graph + Spremeni prosojnost grafa pretoÄnosti + + + + Save + Shrani + + + + Cancel + PrekliÄi + + + + Hide Settings + Skrij nastavitve + + + + TransfersDialog + + + Cancel + PrekliÄi + + + + Clear Completed + PoÄisti zakljuÄene + + + + File Name + Ime datoteke + + + + Sources + Viri + + + + Status + Stanje + + + + File Size + Velikost datoteke + + + + Speed + Hitrost + + + + Progress + Napredek + + + + Completed + DokonÄano + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Downloads:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Prenosi na raÄunalnik:</span></p></body></html> + + + + Peer Name + Ime vrstnika + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Uploads:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Prenosi z raÄunalnika:</span></p></body></html> + + + + Name + i.e: file name + Ime + + + + Size + i.e: file size + Velikost + + + + Progress + i.e: % downloaded + Napredek + + + + Speed + i.e: Download speed + Hitrost + + + + Sources + i.e: Sources + Viri + + + + Remaining + i.e: Estimated Time of Arrival / Time left + + + + + Core-ID + + + + + User Name + i.e: user name + + + + + Progress + i.e: % uploaded + Napredek + + + + Speed + i.e: upload speed + Hitrost + + + + Transferred + + + + + ULListDelegate + + + B + + + + + KB + + + + + MB + + + + + GB + + + + + VMessageBox + + + OK + V redu + + + + Cancel + PrekliÄi + + + + Yes + Da + + + + No + Ne + + + + Help + PomoÄ + + + + Retry + Poskusi ponovno + + + + Show Log + Pokaži dnevnik + + + + Show Settings + Pokaži nastavitve + + + + moreinfo + + + Details + Podrobnosti + + + + OK + V redu + + + + Name + Ime + + + + Value + Vrednost + + + diff --git a/retroshare-gui/src/lang/retroshare_sr.qm b/retroshare-gui/src/lang/retroshare_sr.qm new file mode 100644 index 000000000..958e7d340 Binary files /dev/null and b/retroshare-gui/src/lang/retroshare_sr.qm differ diff --git a/retroshare-gui/src/lang/retroshare_sr.ts b/retroshare-gui/src/lang/retroshare_sr.ts new file mode 100644 index 000000000..eb12cc9df --- /dev/null +++ b/retroshare-gui/src/lang/retroshare_sr.ts @@ -0,0 +1,2185 @@ + + + + + + + + Arial + Ðриал + + + + AuthorizationDialog + + + Authenticate + Ðутентификуј + + + + Authenticate Friend By Entering Their Code + Ðутентификуј Пријатеља Уношењем Његовог Кода + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">ÐУТЕÐТ КОД:</span></p></body></html> + + + + OK + У Реду + + + + Cancel + Поништи + + + + ChannelsDialog + + + Delete Channel + Обриши Канал + + + + Create Channel MSG + Ðаправи Поруку Канала + + + + New Message + Ðова Порука + + + + Send To: + Пошаљи: + + + + Recommended Files + Препоручени Фајлови + + + + ChatDialog + + + Peer Name + Име Мреже + + + + Send + Пошаљи + + + + ConnectDialog + + + Peer Details + Подаци Мреже + + + + OK + У Реду + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Земља::</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Org:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Орг:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Име:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Trust:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Поверење:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Loc:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Лок:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Certificate</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">signers:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Certificate</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">ПотпиÑаоци:</p></body></html> + + + + ConnectionsDialog + + + Peer Details + Детаљи Мреже + + + + Authenticate + Ðутентификуј + + + + Load Certificate + Учитај Сертификат + + + + Select a pem/pqi File + Изабери pem/pqi Фајл + + + + File Not Found + Фајл Ðије Ðађен + + + + %1 does not exist. Would you like to create it? + %1 не поÑтоји. Да ли желите да га направите? + + + + Failed to Create File + ÐеуÑпешно Прављење Фајла + + + + Unable to create %1 [%2] + Ðије Могуће Ðаправити %1 [%2] + + + + Select Certificate + Изабери Сертификат + + + + Certificates (*.pqi *.pem) + Сертификати (*.pqi *.pem) + + + + Accept + Прихвати + + + + Trust + Поверење + + + + Last Contact + ПоÑледњи Контакт + + + + Name + Име + + + + Organisation + Организација + + + + Location + Локација + + + + Country + Земља + + + + Peer Address + ÐдреÑа Мреже + + + + Cert Id + Серт ID + + + + Auth Code + Ðутент Код + + + + CryptographyDialog + + + RSA Key Size + RSA Величина Кључа + + + + Rijndael Block size + Rijndael Величина Блока + + + + 128 Bits + 128 Бита + + + + 192 Bits + 192 Бита + + + + 256 Bits + 256 Бита + + + + Rijndael Key Size + Rijndael Величина Кључа + + + + Rijndael Mode + Rijndael Мод + + + + CBC + CBC + + + + ECB + ECB + + + + CFB + CFB + + + + Rijndael Padding + Rijndael Пуњење + + + + PKCS7 + PKCS7 + + + + Zeros + Zeros + + + + ANSIX923 + ANSIX923 + + + + ISO10126 + ISO10126 + + + + Rijndael Feedback Size + Rijndael Величина Повратне Спреге + + + + Key Size: + Величина Кључа: + + + + Block Size: + Величина Блока: + + + + Feedback Size: + Величина Повратне Спреге: + + + + Mode: + Мод: + + + + Padding: + Пуњење: + + + + DirectoriesDialog + + + Shared Directories + Дељени Директоријуми + + + + Other Directories + ОÑтали Директоријуми + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Incoming Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Долазећи Фајлови</span></p></body></html> + + + + Add Shared Directory + Додај Дељени Директоријум + + + + DirectoriesPage + + + Shared Directories + Дељени Директоријуми + + + + Incoming files + Долазећи Фајлови + + + + FileHashDialog + + + Download + + + + + GSettingsWin + + + General + Опште + + + + Network + Мрежа + + + + Directories + Директоријуми + + + + Server + Сервер + + + + %1 + %1 + + + + GeneralPage + + + Keys manager + Менаџер Кључева + + + + Style + Стил + + + + Choose RetroShare's interface style + Изабери Стил ИнтерфејÑа RetroShare-a + + + + Language + Језик + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">При промени језика морате реÑтартовати RetroShare! </p></body></html> + + + + Choose the language used in RetroShare + Изабери Језик За RetroShare + + + + GraphFrame + + + Recv: + Прим: + + + + %1 KB/s + %1 KB/s + + + + Sent: + ПоÑлато: + + + + %1 KB + %1 KB + + + + %1 MB + %1 MB + + + + %1 GB + %1 GB + + + + LogDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> + +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="ABOUT"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">About RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShare is a private peer to peer communication platform created by Dr. Bob.This program enables you to securely share files and chat with your friends (and no-one else!).</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, and the latest release go to http://www.lunamutt.com.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="START"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Quick Start Guide to RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If this is your first time using Retroshare, it is recommended that you readthis guide for instructions on how to get started. The first step is:<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Connecting to Your Friends</span></a>. Once you have managed this you can <a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">Download Files</span></a> and<a href="#START-SHARE"><span style=" text-decoration: underline; color:#0000ff;">Share with Others</span></a></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Some of the key concepts related to ensuring your sharing remains private aredescribed in the <a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">Frequently Asked Questions</span></a>. Some Key security questions are:<a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">What is a Web of Trust?</span></a>, <a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">Should I Sign this Certificate?</span></a>, and finally<a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">What does "Trust" Mean?</span></a>.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is also worthwhile reading the <a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">GUI Overview</span></a>which describes the featureson available through the User Interface.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Connecting to your Friends </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">There are four steps to connecting to a Friend:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Get Friend's Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Load Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Sign Certificate</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect to Friend.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The instructions might initially appear long and daunting, however thesesteps are required to ensure that your sharing is private and secure.These steps are only required a couple of times, to add new friends, and become quite straight forward after the first time.</p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (1) EXCHANGE CERTIFICATES </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Before you can connect, you need send your certificate to your friend, and get your friends certificate. Follow these steps to get your certificate:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on Your Certificate to Select it.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on the "Export Friend" Button to bring up a file save dialog.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select directory to save the certificate to.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Enter desired filename. (with a file type of .pqi), and Click OK.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Email this File to your Friend. (It is recommended you put thecertificate in a zip file before sending, as some email programsdon't transmit the file correctly).</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Ask your friend to do the same.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Once you have received your friend's certificate, removed itfrom the zip file and saved it to disk, you can proceed to step (2).</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Note: This exchange of certificates is only necessary to get you started.Once you are connected to some friends the exchange of certificates becomeautomated by the autoDiscovery system. See<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">GUI: Connecting</span></a> for more information.------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (2) LOAD YOUR FRIEND'S CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Import Friend"</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select your friends certificate file, then click "Okay". Their certificate should appear in the top window of the "Connect" Tab.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (3) SIGN CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select their Certificate by clicking on their name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Configure Friend" Button. This will bring up a configuration window. which allows you to look at the detailsof the certificate.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click the "Sign Certificate" button near the bottom of the "Certificate Configuration" Window.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Now close the window by clicking on the "Done" button.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Your Friends certificate should now say "Trusted (S)", indicating it is ready for connections.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can only share with "Trusted" Peers. You must sign your Friend'scertificate to prove that you know the certificate belongs to your Friend. Do not sign any/all certificates - only the people youtrust. For more information see: <br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br />------------------------------------------------------------------------<br /><br /> <br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (4) AUTOCONNECT TO PEER </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Finally You need to activate the connection:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click in the Box, next to your friends Name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> A Tick should appear in the box, a connection will be started.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> The "Offline" will change to "Online" when you have successfullyconnected.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Remember: Your initial connection attempts will fail, until your friend has signed your certificate and ticked the Auto-Connect Box.This ensures that both peers trust each other, and stops random peopleaccessing your files.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>. <br />------------------------------------------------------------------------<br /><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-DOWNLOAD"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Downloading Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have connected to friends, you can download their shared files.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can search for the files you want using either:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) File Listing Tab: This gives you a directory view of the files being shared by your peers. Double clickon the directory name (not the arrow) to diplay its subdirectories and files.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 1: This can take up to 5 seconds to fetch the information for your peer.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 2: If the directory is empty, or the person is offline, then the request will silently fail.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Search Tab: Retroshare also allows you to search your peers computers for filenames. Enter yourterm(s) in the search box at the top of the TAB and click the "Search" button. This willsearch all of the peers that you are currently connected to.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 3: If any matching files are found they will be displayed within 5 - 10 seconds.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have found the files you want, Select the file(s), and click "Download" to begin the download process.If you click over the "File Transfer" TAB, the status of the files will appear.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 4: The files can take up to 10 seconds to appear in the transfer window.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-SHARING"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Sharing Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can specify which files you want to share in the "Config" Tab.In the "Share Directories" section, click the "Add Directory" Button, and select the directory you want to share.The files and subdirectories will become available for you peers.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can remove a directory from the Shared Directories List by clicking onthe directory name in the list, and then clicking "Remove Directory".</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="GUI"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Gui Overview (Tab Description) </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The GUI is divided up into several sections which can be accessed by clicking on the Tabs along the top of the main window. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect: Manage Connections and Friends.(<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">getting started</span></a> and<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Listing: A directory view of available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Search: Search for available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Messages: For Sending/Recving Message. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Channels: A broadcast/subscription system. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Transfer: Listing of Current and completed Transfers.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Config: Specify of share diectories and IP Addresses.(<a href="#GUI-CONFIG"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> About: Help and other Information.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Chat: Accessed by the clicking on the "Chat" button.</li></ul> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Connect Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Connect TAB consists of two windows. The upper windowshows a list of your friends. This window indicates each friendscurrent trust level, as well as their connection state.The "Trust_Lvl" Column indicates if the certificate has beenAuthenticated using the web of trust. You can only connect to "Trusted" certificates. Tick the "Auto_Connect" box to connect to your trusted friends.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The lower window provides a list of the friends of your friends.This window shows the neighbour's name and how long ago they attempted to connect to you. This window is automatically populatedby the autoDiscovery system, and should be used to expand yourretroShare network. A word of warning: Do not automatically trust (or sign) anyonethat appears in this window. First verify by some other means (email/phone)that certificate belongs to the person you think it does.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use the "Neighbour List" window to expand your friend list. Select the desired entry in the lower window by clicking on it, then click the "Add to Friends" Button to move it to the upper window.Likewise the "Remove from Friends" button moved a person from the upper window to the lower window.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The "Configure Friend" Button opens a Certificate Configuration window.This window can be used to examine the certificate details, sign the certificate or manually change the peer's IP Address.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">See Also:<br /><a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Getting Started: Connecting to your friends</span></a>.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>.<br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONFIG"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Config Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Configuration Tab allows you to select the share directories, as well as the directory that downloaded files are saved to.<br />See <a href="#STARTUP-SHARING"><span style=" text-decoration: underline; color:#0000ff;">Sharing you Files</span></a> for details. </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Config Tab also allows you to control the IP Address and Portused by RetroShare. Under most cirumstances you do not need to changethese setting. If you are behind a firewall and can setup a forwarded port, the selected IP Address and Port should be specified here.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="FAQ"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Frequently Asked Questions </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">How does the security/privacy work? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShares uses a Web of Trust Authentication system to ensurethat your "friends" are your friends, and uses SSL to encryptthe communcications between peers. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What is a Web of Trust? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Web of Trust relies on a collection of peers to identify eachother. Look it up on the Web!</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-TRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What does "Trust" Mean in RetroShare?</span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Anyone can generate a certificate, with any name on it. So howdo you know that the certificate that claims to be from "Joe Bloggs"is really from your mate Joe. This is the "AuthenticationProblem". RetroShare uses a Web of Trust to Authenticate your peers.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-SIGN"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Should I Sign this Certificate? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should only sign a certificate if you are completely surethat it comes from the "right" person. If you sign a certificateyou are "Authenticating" the person to yourself and others.If you sign certificates that you haven't checked, then you aredestroying your own privacy and security.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">How do you verify a certificate? Use an alternative method ofcommunication to send the certificate: E.g. email or USB stick. This will improve you confidence that the certificate belongsto the correct person. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><span style=" font-size:small;"> </span><a name="FAQ-CONNECT"></a><span style=" font-size:small;">W</span><span style=" font-size:small;">hy won't it Connect?</span><span style=" font-size:small;"> </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A connection can fail for a number of reasons:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) Failed Authentication. Have both peers signed each otherscertificates? </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Firewalls. If both peers are behind firewalls then they cannotconnect directly. RetroShare has a built in proxy system to circumventfirewalls - However this can only function if both peers can connect to a common third party that is not behind a firewall. Thisis the most likely reason for initial connections to fail. The only solution to find a common friend that isn't firewalled (know anyone with Broadband?)</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(3) IP Addresses are wrong. You can manually examine and change these using the Certificate configuration.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +</body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="ABOUT"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">About RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShare is a private peer to peer communication platform created by Dr. Bob.This program enables you to securely share files and chat with your friends (and no-one else!).</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, and the latest release go to http://www.lunamutt.com.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="START"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Quick Start Guide to RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If this is your first time using Retroshare, it is recommended that you readthis guide for instructions on how to get started. The first step is:<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Connecting to Your Friends</span></a>. Once you have managed this you can <a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">Download Files</span></a> and<a href="#START-SHARE"><span style=" text-decoration: underline; color:#0000ff;">Share with Others</span></a></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Some of the key concepts related to ensuring your sharing remains private aredescribed in the <a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">Frequently Asked Questions</span></a>. Some Key security questions are:<a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">What is a Web of Trust?</span></a>, <a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">Should I Sign this Certificate?</span></a>, and finally<a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">What does "Trust" Mean?</span></a>.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is also worthwhile reading the <a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">GUI Overview</span></a>which describes the featureson available through the User Interface.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Connecting to your Friends </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">There are four steps to connecting to a Friend:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Get Friend's Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Load Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Sign Certificate</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect to Friend.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The instructions might initially appear long and daunting, however thesesteps are required to ensure that your sharing is private and secure.These steps are only required a couple of times, to add new friends, and become quite straight forward after the first time.</p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (1) EXCHANGE CERTIFICATES </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Before you can connect, you need send your certificate to your friend, and get your friends certificate. Follow these steps to get your certificate:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on Your Certificate to Select it.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on the "Export Friend" Button to bring up a file save dialog.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select directory to save the certificate to.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Enter desired filename. (with a file type of .pqi), and Click OK.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Email this File to your Friend. (It is recommended you put thecertificate in a zip file before sending, as some email programsdon't transmit the file correctly).</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Ask your friend to do the same.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Once you have received your friend's certificate, removed itfrom the zip file and saved it to disk, you can proceed to step (2).</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Note: This exchange of certificates is only necessary to get you started.Once you are connected to some friends the exchange of certificates becomeautomated by the autoDiscovery system. See<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">GUI: Connecting</span></a> for more information.------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (2) LOAD YOUR FRIEND'S CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Import Friend"</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select your friends certificate file, then click "Okay". Their certificate should appear in the top window of the "Connect" Tab.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (3) SIGN CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select their Certificate by clicking on their name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Configure Friend" Button. This will bring up a configuration window. which allows you to look at the detailsof the certificate.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click the "Sign Certificate" button near the bottom of the "Certificate Configuration" Window.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Now close the window by clicking on the "Done" button.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Your Friends certificate should now say "Trusted (S)", indicating it is ready for connections.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can only share with "Trusted" Peers. You must sign your Friend'scertificate to prove that you know the certificate belongs to your Friend. Do not sign any/all certificates - only the people youtrust. For more information see: <br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br />------------------------------------------------------------------------<br /><br /> <br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (4) AUTOCONNECT TO PEER </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Finally You need to activate the connection:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click in the Box, next to your friends Name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> A Tick should appear in the box, a connection will be started.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> The "Offline" will change to "Online" when you have successfullyconnected.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Remember: Your initial connection attempts will fail, until your friend has signed your certificate and ticked the Auto-Connect Box.This ensures that both peers trust each other, and stops random peopleaccessing your files.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>. <br />------------------------------------------------------------------------<br /><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-DOWNLOAD"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Downloading Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have connected to friends, you can download their shared files.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can search for the files you want using either:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) File Listing Tab: This gives you a directory view of the files being shared by your peers. Double clickon the directory name (not the arrow) to diplay its subdirectories and files.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 1: This can take up to 5 seconds to fetch the information for your peer.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 2: If the directory is empty, or the person is offline, then the request will silently fail.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Search Tab: Retroshare also allows you to search your peers computers for filenames. Enter yourterm(s) in the search box at the top of the TAB and click the "Search" button. This willsearch all of the peers that you are currently connected to.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 3: If any matching files are found they will be displayed within 5 - 10 seconds.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have found the files you want, Select the file(s), and click "Download" to begin the download process.If you click over the "File Transfer" TAB, the status of the files will appear.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 4: The files can take up to 10 seconds to appear in the transfer window.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-SHARING"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Sharing Files </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can specify which files you want to share in the "Config" Tab.In the "Share Directories" section, click the "Add Directory" Button, and select the directory you want to share.The files and subdirectories will become available for you peers.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can remove a directory from the Shared Directories List by clicking onthe directory name in the list, and then clicking "Remove Directory".</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="GUI"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Gui Overview (Tab Description) </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The GUI is divided up into several sections which can be accessed by clicking on the Tabs along the top of the main window. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect: Manage Connections and Friends.(<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">getting started</span></a> and<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Listing: A directory view of available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Search: Search for available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Messages: For Sending/Recving Message. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Channels: A broadcast/subscription system. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Transfer: Listing of Current and completed Transfers.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Config: Specify of share diectories and IP Addresses.(<a href="#GUI-CONFIG"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> About: Help and other Information.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Chat: Accessed by the clicking on the "Chat" button.</li></ul> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Connect Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Connect TAB consists of two windows. The upper windowshows a list of your friends. This window indicates each friendscurrent trust level, as well as their connection state.The "Trust_Lvl" Column indicates if the certificate has beenAuthenticated using the web of trust. You can only connect to "Trusted" certificates. Tick the "Auto_Connect" box to connect to your trusted friends.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The lower window provides a list of the friends of your friends.This window shows the neighbour's name and how long ago they attempted to connect to you. This window is automatically populatedby the autoDiscovery system, and should be used to expand yourretroShare network. A word of warning: Do not automatically trust (or sign) anyonethat appears in this window. First verify by some other means (email/phone)that certificate belongs to the person you think it does.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use the "Neighbour List" window to expand your friend list. Select the desired entry in the lower window by clicking on it, then click the "Add to Friends" Button to move it to the upper window.Likewise the "Remove from Friends" button moved a person from the upper window to the lower window.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The "Configure Friend" Button opens a Certificate Configuration window.This window can be used to examine the certificate details, sign the certificate or manually change the peer's IP Address.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">See Also:<br /><a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Getting Started: Connecting to your friends</span></a>.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>.<br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONFIG"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Config Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Configuration Tab allows you to select the share directories, as well as the directory that downloaded files are saved to.<br />See <a href="#STARTUP-SHARING"><span style=" text-decoration: underline; color:#0000ff;">Sharing you Files</span></a> for details. </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Config Tab also allows you to control the IP Address and Portused by RetroShare. Under most cirumstances you do not need to changethese setting. If you are behind a firewall and can setup a forwarded port, the selected IP Address and Port should be specified here.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="FAQ"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Frequently Asked Questions </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">How does the security/privacy work? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShares uses a Web of Trust Authentication system to ensurethat your "friends" are your friends, and uses SSL to encryptthe communcications between peers. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What is a Web of Trust? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Web of Trust relies on a collection of peers to identify eachother. Look it up on the Web!</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-TRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What does "Trust" Mean in RetroShare?</span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Anyone can generate a certificate, with any name on it. So howdo you know that the certificate that claims to be from "Joe Bloggs"is really from your mate Joe. This is the "AuthenticationProblem". RetroShare uses a Web of Trust to Authenticate your peers.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-SIGN"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Should I Sign this Certificate? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should only sign a certificate if you are completely surethat it comes from the "right" person. If you sign a certificateyou are "Authenticating" the person to yourself and others.If you sign certificates that you haven't checked, then you aredestroying your own privacy and security.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">How do you verify a certificate? Use an alternative method ofcommunication to send the certificate: E.g. email or USB stick. This will improve you confidence that the certificate belongsto the correct person. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><span style=" font-size:small;"> </span><a name="FAQ-CONNECT"></a><span style=" font-size:small;">W</span><span style=" font-size:small;">hy won't it Connect?</span><span style=" font-size:small;"> </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A connection can fail for a number of reasons:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) Failed Authentication. Have both peers signed each otherscertificates? </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Firewalls. If both peers are behind firewalls then they cannotconnect directly. RetroShare has a built in proxy system to circumventfirewalls - However this can only function if both peers can connect to a common third party that is not behind a firewall. Thisis the most likely reason for initial connections to fail. The only solution to find a common friend that isn't firewalled (know anyone with Broadband?)</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(3) IP Addresses are wrong. You can manually examine and change these using the Certificate configuration.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +</body></html> + + + + MainWindow + + + Preferences + Подешавања + + + + Network + Мрежа + + + + Friends + Пријатељи + + + + Transfers + ТранÑфер + + + + Shared Files + Дељени Фајлови + + + + Messages + Поруке + + + + Channels + Канали + + + + Options + Опције + + + + Users: 0 Files: 0 + КориÑници: 0(sp)(sp)Фајлова: 0(sp) + + + + Down: 0.0 Up: 0.0 + Прима: 0.0(sp)(sp)Шаље: 0.0(sp) + + + + Connections: 0/45 + Конекције: 0/45(sp) + + + + System tray is unavailable + Икона У СиÑтем Треју Је ÐедоÑтупна + + + + System tray unavailable + Икона У СиÑтем Треју Је ÐедоÑтупна + + + + Message Title + ÐаÑлов Поруке + + + + Message Contents + Садржај Поруке + + + + Man is more ape than many of the apes + Човек Је Више Мајмум Ðего Много Мајмума + + + + Message Type + Тип Поруке + + + + Balloon message + Балон Порука + + + + Click here to balloon the message + Кликни Овде Да Ставиш Поруку У Балон + + + + Status messages will be visible here + СтатуÑна Порука Ће Бити Овде Видљива + + + + Show system tray icon + Прикажи Икону У СиÑтем Треју + + + + RetroShare System tray + RetroShare СиÑтем Треј + + + + Application will continue running. Quit using context menu in the system tray + Ðпликација Ће ÐаÑтавити Да Ради- Изађи КориÑтећи КонтекÑÑ‚ мени У СиÑтем Треју + + + + Hide + Сакри + + + + Show + Прикажи + + + + System tray example + Пример СиÑтем Треја + + + + Balloon tips are not supported on Mac OS X + Балон Ðаговешзаји ÐиÑу Подржани У Mac OS X + + + + Balloon message was clicked + Балон Порука Је Кликнута + + + + Unknown + Ðепознато + + + + Context + КонтекÑÑ‚ + + + + DoubleClick + Дупли Клик + + + + Trigger + Окидач + + + + MiddleClick + СредњиКлик + + + + RetroShare + RetroShare + + + + MessagesDialog + + + New Message + Ðова Порука + + + + Reply to Message + Одговори Ðа Поруку + + + + Remove Message + Уклони Поруку + + + + Download + Преузимање + + + + Download Alle + Преузми Alle + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Messages</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Порука</span></p></body></html> + + + + Date + Датум + + + + Rank + Категорија + + + + From + Од + + + + Title + Ðазив + + + + Msg + Пор + + + + Count + Бројање + + + + Size + Величина + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Message Text</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">ТекÑÑ‚ Поруке</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Recommended Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Препоручени Фајлови</span></p></body></html> + + + + NetworkPage + + + Rate Options + Опције Брзине + + + + Max Total Data Rate (KB/S): + ÐœÐ°ÐºÑ Ð¢Ð¾Ñ‚Ð°Ð»Ð½Ð° Брзина (KB/S): + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Rate per Person (KB/S):</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Брзина По ОÑоби (KB/S):</p></body></html> + + + + PeersDialog + + + Chat + Чет + + + + Configure Friend + Конфигуриши Пријатеља + + + + Export Friend + Извези Пријатеља + + + + Remove Friend + Уклони Пријатеља + + + + Save Certificate + Сачувај Сертификат + + + + Certificates (*.pqi) + Сертификати (*.pqi) + + + + Status + Ð¡Ñ‚Ð°Ñ‚ÑƒÑ + + + + Person + ОÑоба + + + + Auto Connect + ÐутоматÑко Конектовање + + + + Trust Level + Ðиво Поверења + + + + Peer Address + ÐдреÑа Мреже + + + + Last Contact + ПоÑедње Конектовање + + + + Organisation + Организација + + + + Location + Локација + + + + Country + Земља + + + + Person Id + ID ОÑобе + + + + Auth Code + Ðуте Код + + + + PopupChatDialog + + + RetroShare Friend Chat + RetroShare Чет Ñа Пријатељем + + + + PreferencesDialog + + + Language + Језик + + + + Style + Стил + + + + Choose the language used in RShare + Изабери Језик Коришћен У RShare + + + + Choose RShare's interface style + Изабери Стил ИнтерфејÑа За RShare + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Морате реÑтовати RetroShare!</p></body></html> + + + + Style Sheet + Стил Странице + + + + Default + ОÑновно + + + + Coffee + Кафа + + + + Pagefold + Омот Стране + + + + PreferencesWindow + + + Preferences + + + + + Directories + + + + + Save + + + + + Error Saving Configuration + + + + + About + + + + + General + Опште + + + + Server + Сервер + + + + Rshare + + + Invalid language code specified: + Изабран Је Погрешан Код Језика: + + + + Invalid GUI style specified: + Погрешан GUI Стил Је Изабран: + + + + SearchDialog + + + File Name + + + + + Sources + + + + + Search Pattern + + + + + Results + + + + + File Size + + + + + Download + Преузимање + + + + Broadcast on Channel + БродкеÑÑ‚ Ðа Каналу + + + + Recommend to Friends + Препоручено Пријатељима + + + + Remove + Уклони + + + + Remove All + Уклони Све + + + + ServerDialog + + + Transfer Rates + Брзина ТранÑфера + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Total Rate (kb/s) </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Укупна Брзина (kb/s) </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Per Person </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">По ОÑоби(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)</p></body></html> + + + + Server Settings + Подешавање Сервера + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Локална ÐдреÑа:</p></body></html> + + + + Port: + Порт: + + + + behind zee Firewall + иза zee Фајервола + + + + Forwarded External Port + ПроÑлеђени Спољашњи Порт + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Порт:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Спољашње Име</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Спољашња ÐдреÑа:</p></body></html> + + + + Check Settings + Провери Подешавања + + + + ServerPage + + + Change + Restart Server + Промени + РеÑтартује Сервер + + + + Server Settings + Подешавање Сервера + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Спољашња ÐдреÑа:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Локална ÐдреÑа:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Порт:</p></body></html> + + + + Port: + Порт: + + + + Misc + Разно + + + + behinde Firewall + иза Фајервола + + + + Forwarded External Port + ПролÑеђени Спољашњи Порт + + + + Settings + + + Settings + Подешавања + + + + Cancel + Поништи + + + + Apply + Задај + + + + OK + У Реду + + + + General + Опште + + + + Network + Мрежа + + + + Server + Сервер + + + + Directories + Директоријуми + + + + SharedFilesDialog + + + Download + Преузимање + + + + Add to Message + Додај Поруци + + + + Recommend + Препоручено + + + + Play File + ПуÑти Фајл + + + + StartDialog + + + Select Trusted Friend + Изабери Пријатеља Од Поверења + + + + Certificates (*.pqi *.pem) + Сертификат (*.pqi *.pem) + + + + Peer Details + Детаљи Пира(мреже) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:13pt; font-weight:600; color:#8b0000;">Welcome to RetroShare</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:13pt; font-weight:600; color:#8b0000;">Добродошли У RetroShare</span></p></body></html> + + + + Please Login .... + (sp)Молим Ð’Ð°Ñ Ð£Ð»Ð¾Ð³ÑƒÑ˜Ñ‚Ðµ Се .... + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Име:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Pasword</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Лозинка</span></p></body></html> + + + + Load Existing User + Учитај ПоÑтојећег КориÑника + + + + Or create a New User + Или Ðаправи Ðовог КориÑника + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Organisation:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Организација:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Држава:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Location:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Локација:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Password (Again)</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Лозинка (Поново)</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">New Password</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Ðова Лозинка</span></p></body></html> + + + + Load Trusted Certificate (Optional) + Учитај Сертификат Од Поверења (Опционо) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Пријатељ</span></p></body></html> + + + + Select File + Изабери Фајл + + + + Generate New Certificate + Генериши Ðови Сертификат + + + + StatisticDialog + + + Statistics + СтатиÑтике + + + + Download + Преузимање + + + + Session: + СеÑија: + + + + Downloaded: + Преузето: + + + + Average Downloadspeed: + ПроÑечна Брзина Преузимања: + + + + Count of Downloads: + Број Преузимања: + + + + Overall + Укупно + + + + Upload + Слање + + + + Session + СеÑиа + + + + Uploaded: + ПоÑлато: + + + + Average Uploadspeed: + ПроÑечна Брзина Слања: + + + + Count of Uploads: + Прој Слања: + + + + Uploaded + ПоÑлато + + + + Connections: + Конекције: + + + + Peers: + Мреже(пирови): + + + + Misc + Разно + + + + Uptime: + Време рада: + + + + Overall: + Укупно: + + + + Uptime + Време рада + + + + Records + Забелешке + + + + Uploadspeed: + Брзина Слања: + + + + Downloadspeed: + Брзина Преузимања: + + + + Show Settings + Прикажи Подешавања + + + + Reset + РеÑет + + + + Receive Rate + Брзина Примања + + + + Send Rate + Брзина Слања + + + + Always On Top + Увек Ðа Врху + + + + 100 + 100 + + + + % Opaque + % Ðепровидан + + + + Changes the transparency of the Bandwidth Graph + Промени ПровидноÑÑ‚ Графика Протока + + + + Save + Сачувај + + + + Cancel + Поништи + + + + Hide Settings + Сакри Подешавања + + + + TransfersDialog + + + Details... + Детаљи... + + + + Cancel + Поништи + + + + Clear Completed + ОчиÑти Завршено + + + + File Name + Име Фајла + + + + Sources + Изворишта + + + + Status + Ð¡Ñ‚Ð°Ñ‚ÑƒÑ + + + + File Size + Величина Фајла + + + + Speed + Брзина + + + + Progress + ÐŸÑ€Ð¾Ð³Ñ€ÐµÑ + + + + Completed + Завршено + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Downloads:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Преузимање:</span></p></body></html> + + + + Peer Name + Име Пира(мреже) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Uploads:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Слање:</span></p></body></html> + + + + VMessageBox + + + OK + У Реду + + + + Cancel + Поништи + + + + Yes + Да + + + + No + Ðе + + + + Help + Помоћ + + + + Retry + Покушај Поново + + + + Show Log + Прикажи Лог + + + + Show Settings + Прикажи Подешавања + + + + moreinfo + + + Details + Детаљи + + + + OK + У Реду + + + + Name + Име + + + + Value + ВредноÑÑ‚ + + + diff --git a/retroshare-gui/src/lang/retroshare_tr.qm b/retroshare-gui/src/lang/retroshare_tr.qm new file mode 100644 index 000000000..919da78c4 Binary files /dev/null and b/retroshare-gui/src/lang/retroshare_tr.qm differ diff --git a/retroshare-gui/src/lang/retroshare_tr.ts b/retroshare-gui/src/lang/retroshare_tr.ts new file mode 100644 index 000000000..3f9d010e0 --- /dev/null +++ b/retroshare-gui/src/lang/retroshare_tr.ts @@ -0,0 +1,3974 @@ + + + + + + + Arial + Arial + + + + AddFriendDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;"> To add a new Friend, cut and paste their email </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">invitation into the box below, and click done.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;"> To add a new Friend, cut and paste their email </span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">invitation into the box below, and click done.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;"></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + Cancel + geçersiz kılmak + + + + Done + olmuÅŸ + + + + Load From File + yüklemek den dosya + + + + RetroShare + Retroshare + + + + Certificate Load Failed + sertifika yüklemek baÅŸaramamak + + + + Add a Friend + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"><span style=" font-size:16pt;">Add a new Friend</span><br /><br /><span style=" font-size:10pt;">To add a new Friend, cut and paste their email </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">invitation into the box below, and click done.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + + + + + AddFriendWizard + + + < Back + + + + + Next > + + + + + Cancel + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">This Wizard helps to Connect to your Friends</span></p></body></html> + + + + + I have a .pqi/.pem file received from a Friend + + + + + I have Key received from a Friend + + + + + I want to invite a friend to my RetroShare network + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Cut and paste the text below into an email.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;"> and send it to all your friends!</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">When you press next RetroShare will attempt to launch a Email client.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Invite your Friends to join with RetroShare</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Enter the Key code you got from your friend:</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">When you press next RetroShare will attempt to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">connect using the key.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Select a pqi/pem file:</span></p></body></html> + + + + + Browse + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">When you press next RetroShare will attempt to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">connect using the .pqi/.pem file.</p></body></html> + + + + + Add Friend to my netowork Wizard + + + + + AdvancedSearchDialog + + + RetrosShare: Advanced Search + + + + + Add a further search criterion. + + + + + Add a selection criterion + + + + + Reset + + + + + Cancels the search. + + + + + Cancel + + + + + Perform the advanced search. + + + + + Search + + + + + Search Criteria + + + + + Reset the search criteria. + + + + + ApplicationWindow + + + RetroShare %1 + + + + + Example Application + + + + + Application Users: 0 Files: 0 + + + + + Down: 0.0 Up: 0.0 + + + + + Connections: 0/45 + + + + + Hide + + + + + Show + + + + + RetroShare + + + + + Home + + + + + General + + + + + Advanced + + + + + QTextBrowser { + background-color: rgb(192,192,192); + + } + + + + + QPushButton + { + border-image: url(:/images/console-small-up.png) + } + + QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + + } + + QPushButton:pressed { + border-image: url(:/images/console-small-down.png) + } + + + + + + AuthorizationDialog + + + Authenticate + belgelemek + + + + Authenticate Friend By Entering Their Code + belgelemek arkadaÅŸ ile girme kodlamak + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">belgelemek kodlamak:</span></p></body></html> + + + + OK + OKey + + + + Cancel + geçersiz kılmak + + + + BandwidthGraph + + + RetroShare Bandwidth Usage + + + + + Show Settings + + + + + Reset + + + + + Receive Rate + + + + + Send Rate + + + + + Always on Top + + + + + Style + + + + + Changes the transparency of the Bandwidth Graph + + + + + 100 + + + + + % Opaque + + + + + Save + + + + + Cancel + + + + + Since: + + + + + Hide Settings + + + + + CallToaster + + + Message + + + + + ChanCreateDialog + + + Create a new Broadcast Channel + yaratmak yeni yayın kanal + + + + Create A New Broadcast Channel + yaratmak yeni yayın kanal + + + + Channel Name: + kanal nam: + + + + Type: + Tip: + + + + Public Channel (Signed) + Halk kanal (imzalamak) + + + + Private Channel (Encrypted) + er kanal (kilise bodrumu) + + + + Cancel Channel + geçersiz kılmak kanal + + + + Create Channel + yaratmak kanal + + + + ChanMsgDialog + + + Compose + oluÅŸturmak + + + + Recommended Files + tavsiye etmek dosya + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-weight:400;"><span style=" font-weight:600;">Subject:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-weight:400;"><span style=" font-weight:600;">BaÅŸlık:</span></p></body></html> + + + + Send To: + Göndermek e: + + + + Send + Göndermek + + + + Delete Channel + Silmek kanal + + + + Create Channel MSG + yaratmak kanal mesaj + + + + 1 + + + + + Reply + + + + + ChannelsDialog + + + New Message + Yeni Mesaj + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Messages</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">mesaj</span></p></body></html> + + + + Date + Date + + + + Rank + Rank + + + + From + den + + + + Title + BaÅŸlık: + + + + Msg + Mesaj + + + + Count + Count + + + + Size + Size + + + + Type + Type + + + + Rs[Cert/Chan]IdSize + Rs[Cert/Chan]IdSize + + + + RsMsgId + RsMsgId + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Message Text</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Mesaj Tekst</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Recommended Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">tavsiye etmek dosya</span></p></body></html> + + + + New Channel + Yeni kanal + + + + Subscribe To Channel + Subscribe To Kanal + + + + Unsubscribe To Channel + Unsubscribe To Kanal + + + + Delete Your Channel + silmek senin Kanal + + + + Download + Download + + + + Download All + Download alayı + + + + ChatDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:9pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:400;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:9pt; font-weight:600; font-style:normal; text-decoration:none;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:400;"></p></body></html> + + + + Chat History: + Sohbet Tarih: + + + + Chat With: + Sohbet ile: + + + + Chat + Sohbet + + + + Users: + + + + + ChatToaster + + + message + Mesaj + + + + You Get a New Message + Yeni Mesaj giren + + + + Message + + + + + ConfCertDialog + + + Cancel + geçersiz kılmak + + + + Done + olmuÅŸ + + + + Apply + baÅŸvurmak + + + + Peer Settings + Peer düzenleme + + + + Port: + Port: + + + + behind zee Firewall + popo Firewall + + + + Forwarded External Port + Forwarded External Port + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Max Transfer Rate (kb/s) </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Max Transfer Rate (kb/s) </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Org / Loc:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Org / Loc:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Country/State:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Country/State:</p></body></html> + + + + Trust Settings + Güven Düzenleme + + + + Trust Level + Güven Düzlük + + + + Trust Their Signature + Güven den imza + + + + Sign The Certificate + imzalamak sertifika + + + + OK + + + + + Peer Adress + + + + + Peer Info + + + + + ConfirmQuitDialog + + + Exit RetroShare + + + + + You are about to exit the RetroShare application and therefore stop all transfers. <br><br>Are you sure you want to stop and exit RetroShare? + + + + + Do not show this message again. + + + + + ConnectDialog + + + Peer Details + Peer ayrıntılar + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Org:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Org:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Trust:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Güven:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Loc:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Loc:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Certificate</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">signers:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Certificate</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">imzalamak / signers:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">AUTH CODE:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">belgelemek kodlamak:</span></p></body></html> + + + + Make Friend + Yapı ArkadaÅŸ + + + + Close + baÄŸlantılı + + + + ConnectionsDialog + + + Load Certificate + Yüklemek Sertifika + + + + Select a pem/pqi File + Select a pem/pqi File + + + + File Not Found + File Not Found + + + + %1 does not exist. Would you like to create it? + %1 does not exist. Would you like to create it? + + + + Failed to Create File + Failed to Create File + + + + Unable to create %1 [%2] + Unable to create %1 [%2] + + + + Select Certificate + Select Certificate + + + + Certificates (*.pqi *.pem) + Certificates (*.pqi *.pem) + + + + Accept + Accept + + + + Trust + Güven + + + + Last Contact + Last Contact + + + + Name + Name + + + + Organisation + Organisation + + + + Location + Location + + + + Country + Country + + + + Peer Address + Peer Address + + + + Cert Id + Cert Id + + + + Auth Code + belgelemek kodlamak: + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + + + + Peer Details / Authenticate + Peer Details / Authenticate + + + + CryptographyDialog + + + RSA Key Size + RSA Key Size + + + + Rijndael Block size + Rijndael Block size + + + + 128 Bits + 128 Bits + + + + 192 Bits + 192 Bits + + + + 256 Bits + 256 Bits + + + + Rijndael Key Size + Rijndael Key Size + + + + Rijndael Mode + Rijndael Mode + + + + CBC + CBC + + + + ECB + ECB + + + + CFB + CFB + + + + Rijndael Padding + Rijndael Padding + + + + PKCS7 + PKCS7 + + + + Zeros + Zeros + + + + ANSIX923 + ANSIX923 + + + + ISO10126 + ISO10126 + + + + Rijndael Feedback Size + Rijndael Feedback Size + + + + Key Size: + Key Size: + + + + Block Size: + Block Size: + + + + Feedback Size: + Feedback Size: + + + + Mode: + Mode: + + + + Padding: + Padding: + + + + DLListDelegate + + + B + + + + + KB + + + + + MB + + + + + GB + + + + + DirectoriesDialog + + + Shared Directories + Shared Directories + + + + Other Directories + Other Directories + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Incoming Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Incoming Files</span></p></body></html> + + + + Add Shared Directory + Add Shared Directory + + + + DirectoriesPage + + + Shared Directories + Shared Directories + + + + Incoming files + Incoming files + + + + ExampleDialog + + + Vote Up + + + + + Vote Down + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Friends</span></p></body></html> + + + + + # + + + + + Status + + + + + Person + + + + + Auto Connect + + + + + Trust Level + + + + + Peer Address + Peer Address + + + + Last Contact + Last Contact + + + + Organisation + Organisation + + + + Location + Location + + + + Country + Country + + + + Person Id + + + + + Auth Code + belgelemek kodlamak: + + + + ExprParamElement + + + to + + + + + ignore case + + + + + dd.MM.yyyy + + + + + KB + + + + + MB + + + + + GB + + + + + ExpressionWidget + + + Expression Widget + + + + + Delete this expression + + + + + FileHashDialog + + + Download + Download + + + + GSettingsWin + + + General + General + + + + Network + Network + + + + Directories + Directories + + + + Server + Peer Settings + + + + %1 + %1 + + + + GenCertDialog + + + RetroShare setup + Retroshare setup + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16pt;">Generate a new profile</span><br /><br />Please fill in the information which will<br />allow your RetroShare to connect to</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Friends.</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Organisation:</p></body></html> + + + + + Password (Again) + + + + + Location: + + + + + Load Trusted Certificate (Optional) + Load Trusted Certificate (Optional) + + + + Password + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + + + + Select File + Select File + + + + Country: + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Name:</p></body></html> + + + + + Generate New Certificate + Generate New Certificate + + + + Select Trusted Friend + Select Trusted Friend + + + + Certificates (*.pqi *.pem) + Certificates (*.pqi *.pem) + + + + GeneralPage + + + Keys manager + Keys manager + + + + Style + Style + + + + Choose RetroShare's interface style + Choose Retroshare's interface style + + + + Language + Language + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + + + + Choose the language used in RetroShare + Choose the language used in RetroShare + + + + GraphFrame + + + Recv: + Recv: + + + + %1 KB/s + %1 KB/s + + + + Sent: + Sent: + + + + %1 KB + %1 KB + + + + %1 MB + %1 MB + + + + %1 GB + %1 GB + + + + HelpDialog + + + About + + + + + Authors + + + + + Thanks to + + + + + Translation + + + + + License Agreement + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">About/Help</span></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:xx-large; font-weight:600; color:#0000ff;">About RetroShare.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-weight:600;">Retroshare is a private and secure decentralised commmunication platform.<br />You can use it chat, send messages and share files with your friends.</span><br /><br />This is just a placeholder page for the moment. You can<br />improve retroshare's in-built help (this text) by<br />updating the retroshare wiki: <a href="http://retroshare.wiki.sourceforge.net/help_tab"><span style=" text-decoration: underline; color:#0000ff;">This Page in the retroshare Wiki</span></a><br /><br />The About/Help Tab is regularly updated from the Wiki page.<br /><br />External Links to more information:<br /></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.sourceforge.net"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Webpage</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.wiki.sourceforge.net/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Wiki</span></a></li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://sourceforge.net/projects/retroshare/"><span style=" text-decoration: underline; color:#0000ff;">Retroshare Project Page</span></a></li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.lunamutt.com"><span style=" text-decoration: underline; color:#0000ff;">Lunamutt Homepage.</span></a></li></ul></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-size:19pt; font-weight:600; color:#0000ff;">The RetroShare Team:</span><br /> <br /><span style=" font-size:9pt; color:#0000ff;">defnax</span>: Lead GUI developer <br /><span style=" font-size:9pt; color:#0000ff;">drbob7</span>: Lead Core developer. <br /> <br /><span style=" font-size:9pt; color:#0000ff;">bmeck</span> : Our new web-developer. Joined retroshare a couple <br />of weeks ago, and already starting on an exciting new <br />design for the web-page. <br /> <br /><span style=" font-size:9pt; color:#0000ff;">noragen</span> : Developer from the SIM-IM project. Working on a retroshare plugin to SIM-IM. <br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">kernelpanix</span> : Gui and skin developer</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">libris</span><span style=" font-size:9pt;">:</span> core developer</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><span style=" font-size:9pt; color:#0000ff;">kashif: </span><span style=" color:#000000;">core developer</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt; color:#000000;"><span style=" font-size:8pt;"><br /></span><span style=" color:#0000ff;">agent725</span><span style=" font-size:8pt;">: Manages the 'local' Retroshare release, <br />and beta-testing retroshare on a large scale. <br /> <br /></span><span style=" color:#0000ff;">the_mgt</span><span style=" font-size:8pt;">: Maintains the Gentoo and generic linux <br />installation/compilation scripts. </span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">notdefine:</span> Maintains the .rpm, .deb installation/compilation scripts.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; color:#0000ff;">zhouk</span>: developer</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Translators:</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Serbian</span>: Kunalagon Umuhanik &lt;kunalagon@gmail.com&gt;</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Polish: </span>Jarek</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">French</span>:Temet</p></body></html> + + + + + InviteDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">To </span><span style=" font-size:10pt; font-weight:600;">Invite your friends to join you with Retroshare: </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">Cut and paste the text below into an email.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">and send it to all your friends!</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">To </span><span style=" font-size:10pt; font-weight:600;">Invite your friends to join you with Retroshare: </span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">Cut and paste the text below into an email.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;">and send it to all your friends!</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + + Done + olmuÅŸ + + + + Cancel + geçersiz kılmak + + + + Launch Email + denize indirmek Email + + + + Invite a Friend + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"></p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:8pt;"><span style=" font-size:16pt;">Invite a Friend</span><br /><br /><span style=" font-size:10pt;">To Invite your friends to join you with Retroshare: </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">Cut and paste the text below into an email.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Arial'; font-size:10pt;">and send it to all your friends!</p></body></html> + + + + + LogDialog + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> + +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="ABOUT"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">About RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShare is a private peer to peer communication platform created by Dr. Bob.This program enables you to securely share files and chat with your friends (and no-one else!).</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, and the latest release go to http://www.lunamutt.com.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="START"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Quick Start Guide to RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If this is your first time using Retroshare, it is recommended that you readthis guide for instructions on how to get started. The first step is:<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Connecting to Your Friends</span></a>. Once you have managed this you can <a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">Download Files</span></a> and<a href="#START-SHARE"><span style=" text-decoration: underline; color:#0000ff;">Share with Others</span></a></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Some of the key concepts related to ensuring your sharing remains private aredescribed in the <a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">Frequently Asked Questions</span></a>. Some Key security questions are:<a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">What is a Web of Trust?</span></a>, <a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">Should I Sign this Certificate?</span></a>, and finally<a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">What does "Trust" Mean?</span></a>.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is also worthwhile reading the <a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">GUI Overview</span></a>which describes the featureson available through the User Interface.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Connecting to your Friends </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">There are four steps to connecting to a Friend:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Get Friend's Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Load Certificate</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Sign Certificate</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect to Friend.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The instructions might initially appear long and daunting, however thesesteps are required to ensure that your sharing is private and secure.These steps are only required a couple of times, to add new friends, and become quite straight forward after the first time.</p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (1) EXCHANGE CERTIFICATES </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Before you can connect, you need send your certificate to your friend, and get your friends certificate. Follow these steps to get your certificate:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on Your Certificate to Select it.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on the "Export Friend" Button to bring up a file save dialog.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select directory to save the certificate to.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Enter desired filename. (with a file type of .pqi), and Click OK.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Email this File to your Friend. (It is recommended you put thecertificate in a zip file before sending, as some email programsdon't transmit the file correctly).</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Ask your friend to do the same.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Once you have received your friend's certificate, removed itfrom the zip file and saved it to disk, you can proceed to step (2).</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Note: This exchange of certificates is only necessary to get you started.Once you are connected to some friends the exchange of certificates becomeautomated by the autoDiscovery system. See<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">GUI: Connecting</span></a> for more information.------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (2) LOAD YOUR FRIEND'S CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Import Friend"</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select your friends certificate file, then click "Okay". Their certificate should appear in the top window of the "Connect" Tab.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">------------------------------------------------------------------------<br /><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (3) SIGN CERTIFICATE </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select their Certificate by clicking on their name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Configure Friend" Button. This will bring up a configuration window. which allows you to look at the detailsof the certificate.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click the "Sign Certificate" button near the bottom of the "Certificate Configuration" Window.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Now close the window by clicking on the "Done" button.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Your Friends certificate should now say "Trusted (S)", indicating it is ready for connections.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can only share with "Trusted" Peers. You must sign your Friend'scertificate to prove that you know the certificate belongs to your Friend. Do not sign any/all certificates - only the people youtrust. For more information see: <br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br />------------------------------------------------------------------------<br /><br /> <br /></p> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (4) AUTOCONNECT TO PEER </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Finally You need to activate the connection:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click in the Box, next to your friends Name.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> A Tick should appear in the box, a connection will be started.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> The "Offline" will change to "Online" when you have successfullyconnected.</li></ul> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Remember: Your initial connection attempts will fail, until your friend has signed your certificate and ticked the Auto-Connect Box.This ensures that both peers trust each other, and stops random peopleaccessing your files.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>. <br />------------------------------------------------------------------------<br /><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-DOWNLOAD"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Downloading Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have connected to friends, you can download their shared files.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can search for the files you want using either:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) File Listing Tab: This gives you a directory view of the files being shared by your peers. Double clickon the directory name (not the arrow) to diplay its subdirectories and files.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 1: This can take up to 5 seconds to fetch the information for your peer.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 2: If the directory is empty, or the person is offline, then the request will silently fail.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Search Tab: Retroshare also allows you to search your peers computers for filenames. Enter yourterm(s) in the search box at the top of the TAB and click the "Search" button. This willsearch all of the peers that you are currently connected to.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 3: If any matching files are found they will be displayed within 5 - 10 seconds.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have found the files you want, Select the file(s), and click "Download" to begin the download process.If you click over the "File Transfer" TAB, the status of the files will appear.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 4: The files can take up to 10 seconds to appear in the transfer window.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-SHARING"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Sharing Files </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can specify which files you want to share in the "Config" Tab.In the "Share Directories" section, click the "Add Directory" Button, and select the directory you want to share.The files and subdirectories will become available for you peers.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can remove a directory from the Shared Directories List by clicking onthe directory name in the list, and then clicking "Remove Directory".</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="GUI"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Gui Overview (Tab Description) </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The GUI is divided up into several sections which can be accessed by clicking on the Tabs along the top of the main window. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p> +<ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect: Manage Connections and Friends.(<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">getting started</span></a> and<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Listing: A directory view of available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Search: Search for available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Messages: For Sending/Recving Message. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Channels: A broadcast/subscription system. (Coming Soon)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Transfer: Listing of Current and completed Transfers.</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Config: Specify of share diectories and IP Addresses.(<a href="#GUI-CONFIG"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> About: Help and other Information.</li> +<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Chat: Accessed by the clicking on the "Chat" button.</li></ul> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Connect Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Connect TAB consists of two windows. The upper windowshows a list of your friends. This window indicates each friendscurrent trust level, as well as their connection state.The "Trust_Lvl" Column indicates if the certificate has beenAuthenticated using the web of trust. You can only connect to "Trusted" certificates. Tick the "Auto_Connect" box to connect to your trusted friends.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The lower window provides a list of the friends of your friends.This window shows the neighbour's name and how long ago they attempted to connect to you. This window is automatically populatedby the autoDiscovery system, and should be used to expand yourretroShare network. A word of warning: Do not automatically trust (or sign) anyonethat appears in this window. First verify by some other means (email/phone)that certificate belongs to the person you think it does.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use the "Neighbour List" window to expand your friend list. Select the desired entry in the lower window by clicking on it, then click the "Add to Friends" Button to move it to the upper window.Likewise the "Remove from Friends" button moved a person from the upper window to the lower window.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The "Configure Friend" Button opens a Certificate Configuration window.This window can be used to examine the certificate details, sign the certificate or manually change the peer's IP Address.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">See Also:<br /><a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Getting Started: Connecting to your friends</span></a>.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>.<br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br /></p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONFIG"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Config Tab </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Configuration Tab allows you to select the share directories, as well as the directory that downloaded files are saved to.<br />See <a href="#STARTUP-SHARING"><span style=" text-decoration: underline; color:#0000ff;">Sharing you Files</span></a> for details. </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Config Tab also allows you to control the IP Address and Portused by RetroShare. Under most cirumstances you do not need to changethese setting. If you are behind a firewall and can setup a forwarded port, the selected IP Address and Port should be specified here.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="FAQ"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Frequently Asked Questions </span><span style=" font-size:medium;"> </span></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">How does the security/privacy work? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShares uses a Web of Trust Authentication system to ensurethat your "friends" are your friends, and uses SSL to encryptthe communcications between peers. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What is a Web of Trust? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Web of Trust relies on a collection of peers to identify eachother. Look it up on the Web!</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-TRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What does "Trust" Mean in RetroShare?</span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Anyone can generate a certificate, with any name on it. So howdo you know that the certificate that claims to be from "Joe Bloggs"is really from your mate Joe. This is the "AuthenticationProblem". RetroShare uses a Web of Trust to Authenticate your peers.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-SIGN"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Should I Sign this Certificate? </span><span style=" font-size:small;"> </span></p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should only sign a certificate if you are completely surethat it comes from the "right" person. If you sign a certificateyou are "Authenticating" the person to yourself and others.If you sign certificates that you haven't checked, then you aredestroying your own privacy and security.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">How do you verify a certificate? Use an alternative method ofcommunication to send the certificate: E.g. email or USB stick. This will improve you confidence that the certificate belongsto the correct person. </p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#cccccc"> +<p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><span style=" font-size:small;"> </span><a name="FAQ-CONNECT"></a><span style=" font-size:small;">W</span><span style=" font-size:small;">hy won't it Connect?</span><span style=" font-size:small;"> </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p></td></tr></table> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A connection can fail for a number of reasons:</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) Failed Authentication. Have both peers signed each otherscertificates? </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Firewalls. If both peers are behind firewalls then they cannotconnect directly. RetroShare has a built in proxy system to circumventfirewalls - However this can only function if both peers can connect to a common third party that is not behind a firewall. Thisis the most likely reason for initial connections to fail. The only solution to find a common friend that isn't firewalled (know anyone with Broadband?)</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(3) IP Addresses are wrong. You can manually examine and change these using the Certificate configuration.</p> +<table border="0" width="100%" cellspacing="2" cellpadding="2"> +<tr> +<td bgcolor="#aaaaaa"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td> +<td bgcolor="#cccccc"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table> +</body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="ABOUT"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">About RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShare is a private peer to peer communication platform created by Dr. Bob.This program enables you to securely share files and chat with your friends (and no-one else!).</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, and the latest release go to http://www.lunamutt.com.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="START"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Quick Start Guide to RetroShare </span><span style=" font-size:medium;"> </span></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If this is your first time using Retroshare, it is recommended that you readthis guide for instructions on how to get started. The first step is:<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Connecting to Your Friends</span></a>. Once you have managed this you can <a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">Download Files</span></a> and<a href="#START-SHARE"><span style=" text-decoration: underline; color:#0000ff;">Share with Others</span></a></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Some of the key concepts related to ensuring your sharing remains private aredescribed in the <a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">Frequently Asked Questions</span></a>. Some Key security questions are:<a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">What is a Web of Trust?</span></a>, <a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">Should I Sign this Certificate?</span></a>, and finally<a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">What does "Trust" Mean?</span></a>.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is also worthwhile reading the <a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">GUI Overview</span></a>which describes the featureson available through the User Interface.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Connecting to your Friends </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">There are four steps to connecting to a Friend:</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Get Friend's Certificate</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Load Certificate</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Sign Certificate</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect to Friend.</li></ul><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The instructions might initially appear long and daunting, however thesesteps are required to ensure that your sharing is private and secure.These steps are only required a couple of times, to add new friends, and become quite straight forward after the first time.</p><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (1) EXCHANGE CERTIFICATES </span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Before you can connect, you need send your certificate to your friend, and get your friends certificate. Follow these steps to get your certificate:</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on Your Certificate to Select it.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click on the "Export Friend" Button to bring up a file save dialog.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select directory to save the certificate to.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Enter desired filename. (with a file type of .pqi), and Click OK.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Email this File to your Friend. (It is recommended you put thecertificate in a zip file before sending, as some email programsdon't transmit the file correctly).</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Ask your friend to do the same.</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Once you have received your friend's certificate, removed itfrom the zip file and saved it to disk, you can proceed to step (2).</li></ul><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Note: This exchange of certificates is only necessary to get you started.Once you are connected to some friends the exchange of certificates becomeautomated by the autoDiscovery system. See<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">GUI: Connecting</span></a> for more information.------------------------------------------------------------------------<br /><br /><br /></p><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (2) LOAD YOUR FRIEND'S CERTIFICATE </span></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Go to the "Connect" Tab</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Import Friend"</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select your friends certificate file, then click "Okay". Their certificate should appear in the top window of the "Connect" Tab.</li></ul><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">------------------------------------------------------------------------<br /><br /><br /></p><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (3) SIGN CERTIFICATE </span></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Select their Certificate by clicking on their name.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click "Configure Friend" Button. This will bring up a configuration window. which allows you to look at the detailsof the certificate.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click the "Sign Certificate" button near the bottom of the "Certificate Configuration" Window.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Now close the window by clicking on the "Done" button.</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Your Friends certificate should now say "Trusted (S)", indicating it is ready for connections.</li></ul><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can only share with "Trusted" Peers. You must sign your Friend'scertificate to prove that you know the certificate belongs to your Friend. Do not sign any/all certificates - only the people youtrust. For more information see: <br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br />------------------------------------------------------------------------<br /><br /> <br /></p><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600;"><span style=" font-size:small;"> (4) AUTOCONNECT TO PEER </span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Finally You need to activate the connection:</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Click in the Box, next to your friends Name.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> A Tick should appear in the box, a connection will be started.</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> The "Offline" will change to "Online" when you have successfullyconnected.</li></ul><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Remember: Your initial connection attempts will fail, until your friend has signed your certificate and ticked the Auto-Connect Box.This ensures that both peers trust each other, and stops random peopleaccessing your files.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>. <br />------------------------------------------------------------------------<br /><br /><br /></p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-DOWNLOAD"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Downloading Files </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have connected to friends, you can download their shared files.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can search for the files you want using either:</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) File Listing Tab: This gives you a directory view of the files being shared by your peers. Double clickon the directory name (not the arrow) to diplay its subdirectories and files.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 1: This can take up to 5 seconds to fetch the information for your peer.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 2: If the directory is empty, or the person is offline, then the request will silently fail.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Search Tab: Retroshare also allows you to search your peers computers for filenames. Enter yourterm(s) in the search box at the top of the TAB and click the "Search" button. This willsearch all of the peers that you are currently connected to.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 3: If any matching files are found they will be displayed within 5 - 10 seconds.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Once you have found the files you want, Select the file(s), and click "Download" to begin the download process.If you click over the "File Transfer" TAB, the status of the files will appear.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NOTE 4: The files can take up to 10 seconds to appear in the transfer window.</p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="START-SHARING"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Sharing Files </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can specify which files you want to share in the "Config" Tab.In the "Share Directories" section, click the "Add Directory" Button, and select the directory you want to share.The files and subdirectories will become available for you peers.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can remove a directory from the Shared Directories List by clicking onthe directory name in the list, and then clicking "Remove Directory".</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="GUI"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Gui Overview (Tab Description) </span><span style=" font-size:medium;"> </span></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The GUI is divided up into several sections which can be accessed by clicking on the Tabs along the top of the main window. </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /><br /></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:1px;"></p><ul style="-qt-list-indent: 1;"><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Connect: Manage Connections and Friends.(<a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">getting started</span></a> and<a href="#GUI-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Listing: A directory view of available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Search: Search for available files.(<a href="#START-DOWNLOAD"><span style=" text-decoration: underline; color:#0000ff;">downloading</span></a>)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Messages: For Sending/Recving Message. (Coming Soon)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Channels: A broadcast/subscription system. (Coming Soon)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> File Transfer: Listing of Current and completed Transfers.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Config: Specify of share diectories and IP Addresses.(<a href="#GUI-CONFIG"><span style=" text-decoration: underline; color:#0000ff;">more info</span></a>)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> About: Help and other Information.</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Chat: Accessed by the clicking on the "Chat" button.</li></ul><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONNECT"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Connect Tab </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Connect TAB consists of two windows. The upper windowshows a list of your friends. This window indicates each friendscurrent trust level, as well as their connection state.The "Trust_Lvl" Column indicates if the certificate has beenAuthenticated using the web of trust. You can only connect to "Trusted" certificates. Tick the "Auto_Connect" box to connect to your trusted friends.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The lower window provides a list of the friends of your friends.This window shows the neighbour's name and how long ago they attempted to connect to you. This window is automatically populatedby the autoDiscovery system, and should be used to expand yourretroShare network. A word of warning: Do not automatically trust (or sign) anyonethat appears in this window. First verify by some other means (email/phone)that certificate belongs to the person you think it does.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use the "Neighbour List" window to expand your friend list. Select the desired entry in the lower window by clicking on it, then click the "Add to Friends" Button to move it to the upper window.Likewise the "Remove from Friends" button moved a person from the upper window to the lower window.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The "Configure Friend" Button opens a Certificate Configuration window.This window can be used to examine the certificate details, sign the certificate or manually change the peer's IP Address.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">See Also:<br /><a href="#START-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">Getting Started: Connecting to your friends</span></a>.<br /><a href="#FAQ-CONNECT"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Why won't it Connect?</span></a>.<br /><a href="#FAQ-SIGN"><span style=" text-decoration: underline; color:#0000ff;">FAQ: Should I Sign this Certificate?</span></a>.<br /><a href="#FAQ-TRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What does "Trust" Mean?</span></a>.<br /><a href="#FAQ-WEBOFTRUST"><span style=" text-decoration: underline; color:#0000ff;">FAQ: What is a Web of Trust?</span></a>. <br /></p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="GUI-CONFIG"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">The Config Tab </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Configuration Tab allows you to select the share directories, as well as the directory that downloaded files are saved to.<br />See <a href="#STARTUP-SHARING"><span style=" text-decoration: underline; color:#0000ff;">Sharing you Files</span></a> for details. </p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Config Tab also allows you to control the IP Address and Portused by RetroShare. Under most cirumstances you do not need to changethese setting. If you are behind a firewall and can setup a forwarded port, the selected IP Address and Port should be specified here.</p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:medium; font-weight:600; background-color:#aaaaaa;"><a name="FAQ"></a><span style=" font-size:medium;"> </span><span style=" font-size:medium;">Frequently Asked Questions </span><span style=" font-size:medium;"> </span></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">How does the security/privacy work? </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">RetroShares uses a Web of Trust Authentication system to ensurethat your "friends" are your friends, and uses SSL to encryptthe communcications between peers. </p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-WEBOFTRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What is a Web of Trust? </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Web of Trust relies on a collection of peers to identify eachother. Look it up on the Web!</p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-TRUST"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">What does "Trust" Mean in RetroShare?</span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Anyone can generate a certificate, with any name on it. So howdo you know that the certificate that claims to be from "Joe Bloggs"is really from your mate Joe. This is the "AuthenticationProblem". RetroShare uses a Web of Trust to Authenticate your peers.</p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><a name="FAQ-SIGN"></a><span style=" font-size:small;"> </span><span style=" font-size:small;">Should I Sign this Certificate? </span><span style=" font-size:small;"> </span></p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should only sign a certificate if you are completely surethat it comes from the "right" person. If you sign a certificateyou are "Authenticating" the person to yourself and others.If you sign certificates that you haven't checked, then you aredestroying your own privacy and security.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">How do you verify a certificate? Use an alternative method ofcommunication to send the certificate: E.g. email or USB stick. This will improve you confidence that the certificate belongsto the correct person. </p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#cccccc"><p style=" margin-top:12px; margin-bottom:4px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:small; font-weight:600; background-color:#cccccc;"><span style=" font-size:small;"> </span><a name="FAQ-CONNECT"></a><span style=" font-size:small;">W</span><span style=" font-size:small;">hy won't it Connect?</span><span style=" font-size:small;"> </span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p></td></tr></table><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A connection can fail for a number of reasons:</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(1) Failed Authentication. Have both peers signed each otherscertificates? </p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(2) Firewalls. If both peers are behind firewalls then they cannotconnect directly. RetroShare has a built in proxy system to circumventfirewalls - However this can only function if both peers can connect to a common third party that is not behind a firewall. Thisis the most likely reason for initial connections to fail. The only solution to find a common friend that isn't firewalled (know anyone with Broadband?)</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(3) IP Addresses are wrong. You can manually examine and change these using the Certificate configuration.</p><table border="0" width="100%" cellspacing="2" cellpadding="2"><tr><td bgcolor="#aaaaaa"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#aaaaaa;">Quick Links: </p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#ABOUT"><span style=" text-decoration: underline; color:#0000ff;">About</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#START"><span style=" text-decoration: underline; color:#0000ff;">Getting Started</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#GUI"><span style=" text-decoration: underline; color:#0000ff;">Gui Basics</span></a></p></td><td bgcolor="#cccccc"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#cccccc;"><a href="#FAQ"><span style=" text-decoration: underline; color:#0000ff;">FAQ</span></a></p></td></tr></table></body></html> + + + + MainWindow + + + Preferences + yeÄŸleme + + + + Network + iletiÅŸim ağı + + + + Friends + Sohbet ile ArkadaÅŸ + + + + Transfers + Transfers + + + + Messages + Email + + + + Channels + Kanals + + + + Options + Opsiyon + + + + Users: 0 Files: 0 + Users: 0 Files: 0 + + + + Down: 0.0 Up: 0.0 + Down: 0.0 Up: 0.0 + + + + Connections: 0/45 + Connections: 0/45 + + + + System tray is unavailable + System tray is unavailable + + + + System tray unavailable + System tray unavailable + + + + RetroShare System tray + RetroShare System tray + + + + Application will continue running. Quit using context menu in the system tray + Application will continue running. Quit using context menu in the system tray + + + + Hide + Hide + + + + Show + Show + + + + RetroShare + Retroshare + + + + Home + Home + + + + General + General + + + + Invite Friend + davet etmek ArkadaÅŸ + + + + Add Friend + eklemek + + + + Add Share + eklemek + + + + Advanced + ilerlemiÅŸ + + + + QTextBrowser { + background-color: rgb(192,192,192); + +} + QTextBrowser { background-color: rgb(192,192,192);} + + + + QPushButton +{ + border-image: url(:/images/console-small-up.png) +} + +QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + +} + +QPushButton:pressed { + border-image: url(:/images/console-small-down.png) +} + + QPushButton{ border-image: url(:/images/console-small-up.png) }QPushButton:hover { border-image: url(:/images/console-small-hover.png) }QPushButton:pressed { border-image: url(:/images/console-small-down.png) } + + + + Exit + çıkış + + + + Search + araÅŸtırmak + + + + Files + dosya + + + + Chat + GrupSohbet + + + + Add Shared Directory + eklemek paylaÅŸmak rehber kitap + + + + About/Help + + + + + Messenger + + + + + Show/Hide + + + + + &Quit + + + + + Bandwidth Graph + + + + + Open Messenger + + + + + RetroShare %1 + + + + + Add a Friend + + + + + Invite a Friend + + + + + Add a Share + + + + + Quit + + + + + Minimize + + + + + Maximize + + + + + Hide Console + + + + + Show Console + + + + + Hide ToolBox + + + + + :images/hide_toolbox_frame.png + + + + + Show ToolBox + + + + + :images/show_toolbox_frame.png + + + + + QTextBrowser { + background-color: rgb(192,192,192); + + } + + + + + QPushButton + { + border-image: url(:/images/console-small-up.png) + } + + QPushButton:hover { + border-image: url(:/images/console-small-hover.png) + + } + + QPushButton:pressed { + border-image: url(:/images/console-small-down.png) + } + + + + + + Apps + + + + + MessageToaster + + + message + Mesaj + + + + MessagesDialog + + + New Message + Yeni Mesaj + + + + Reply to Message + Reply to Mesaj + + + + Remove Message + Remove Mesaj + + + + Date + Date + + + + From + From + + + + Title + BaÅŸlık: + + + + Msg + Mesaj + + + + Count + Count + + + + Size + Size + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Recommended Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">tavsiye etmek dosya</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">remove selected message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">remove selected message</p></body></html> + + + + QPushButton +{ +border-image: url(:/images/deletemail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/deletemail-hover.png); +} + QPushButton{border-image: url(:/images/deletemail24.png);}QPushButton:pressed{border-image: url(:/images/deletemail-hover.png);} + + + + Inbox + Email-Inbox + + + + Outbox + Email-Outbox + + + + Draft + Müsvedde + + + + Sent + Email-Sent + + + + Timestamp + Timestamp + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">reply to selected message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">reply to selected message</p></body></html> + + + + +QPushButton +{ +border-image: url(:/images/replymail24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/replymail-hover.png); +} + + QPushButton{border-image: url(:/images/replymail24.png);}QPushButton:pressed{border-image: url(:/images/replymail-hover.png);} + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">New Message</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Yeni Mesaj</p></body></html> + + + + QPushButton +{ +border-image: url(:/images/folder-draft24.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/folder-draft24-hover.png); +} + + QPushButton{border-image: url(:/images/folder-draft24.png);}QPushButton:pressed {border-image: url(:/images/folder-draft24-hover.png);} + + + + You get Message testing + You get Message testing + + + + Download All + Download All + + + + QPushButton +{ +border-image: url(:/images/deletemail24.png); +} + +QPushButton:hover +{ +border-image: url(:/images/deletemail-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/deletemail-pressed.png); +} + + + + + +QPushButton +{ +border-image: url(:/images/replymail24.png); +} + +QPushButton:hover +{ +border-image: url(:/images/replymail24-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/replymail-pressed.png); +} + + + + + + QPushButton +{ +border-image: url(:/images/folder-draft24.png); +} +QPushButton:hover +{ +border-image: url(:/images/folder-draft24-hover.png); +} + +QPushButton:pressed +{ +border-image: url(:/images/folder-draft24-pressed.png); +} + + + + + + MessengerWindow + + + QWidget#MessengerWindow { +background-color: #ECF3F6; background-image:url(:/images/backgroundimage.png); +background-position: top right; +background-repeat: no-repeat +} + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click to change your avatar</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Change your Status and your display</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">picture here.</p></body></html> + + + + + Online + + + + + Busy + + + + + Be right Back + + + + + Away + + + + + In a Call + + + + + Out of lunch + + + + + Apear Offline + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Share a personal message with your contacts</p></body></html> + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Add a Friend</p></body></html> + + + + + Chat + + + + + Connect To Friend + + + + + NetworkDialog + + + Peer Details / Authenticate + Peer Details / Authenticate + + + + Load Certificate + Yüklemek Sertifika + + + + Select a pem/pqi File + Select a pem/pqi File + + + + File Not Found + File Not Found + + + + %1 does not exist. Would you like to create it? + %1 does not exist. Would you like to create it? + + + + Failed to Create File + Failed to Create File + + + + Unable to create %1 [%2] + Unable to create %1 [%2] + + + + Select Certificate + Select Certificate + + + + Certificates (*.pqi *.pem) + Certificates (*.pqi *.pem) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Network:</span></p></body></html> + + + + # + + + + + Accept + Accept + + + + Trust + Güven + + + + Last Contact + Last Contact + + + + Name + Name + + + + Peer Address + Peer Address + + + + Organisation + Organisation + + + + Location + Location + + + + Country + Country + + + + Cert Id + Cert Id + + + + Auth Code + belgelemek kodlamak: + + + + NetworkPage + + + Rate Options + Rate Options + + + + Max Total Data Rate (KB/S): + You maximum Upload Speed (KB/S): + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Rate per Person (KB/S):</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Rate per Person (KB/S):</p></body></html> + + + + PeersDialog + + + Chat + Sohbet + + + + Configure Friend + Configure ArkadaÅŸ + + + + Export Friend + Export ArkadaÅŸ + + + + Remove Friend + Remove ArkadaÅŸ + + + + Save Certificate + Save Certificate + + + + Certificates (*.pqi) + Certificates (*.pqi) + + + + Status + Status + + + + Person + Person + + + + Auto Connect + Auto Connect + + + + Trust Level + Trust Level + + + + Peer Address + Peer Address + + + + Last Contact + Last Contact + + + + Organisation + Organisation + + + + Location + Location + + + + Country + Country + + + + Person Id + Person ID + + + + Auth Code + Belgelemek Kodlamak + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Friends</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">ArkadaÅŸ</span></p></body></html> + + + + Connect To Friend + Connect To ArkadaÅŸ + + + + # + + + + + PopupChatDialog + + + RetroShare Friend Chat + Retroshare ArkadaÅŸ Sohbet + + + + RetroShare User Chat + + + + + PreferencesDialog + + + Language + Language + + + + Style + Style + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changes to language will only take effect after restarting RetroShare!</p></body></html> + + + + Style Sheet + Style Sheet + + + + Default + Default + + + + Pagefold + Pagefold + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose RetroShare's interface style</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose RetroShare's interface style</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose the language used in RetroShare</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose the language used in RetroShare</p></body></html> + + + + blue + blue + + + + silver + silver + + + + ed2k + ed2k + + + + over + over + + + + black + black + + + + arachnophobia + arachnophobia + + + + Skin2 + Skin2 + + + + Login + Login + + + + Remove Auto Login + Remove Auto Login + + + + PreferencesWindow + + + Directories + Directories + + + + Error Saving Configuration + Error Saving Configuration + + + + About + About + + + + General + General + + + + Server + Peer Settings + + + + Options + Options + + + + Cancel + Cancel + + + + OK + OK + + + + QObject + + + Name + Name + + + + Path + + + + + Extension + + + + + Date + + + + + Size + + + + + Popularity + + + + + contains + + + + + contains all + + + + + is + + + + + less than + + + + + less than or equal + + + + + greater than or equal + + + + + greater than + + + + + is in range + + + + + and + + + + + and / or + + + + + or + + + + + equals + + + + + Rshare + + + Invalid language code specified: + Invalid language code specified: + + + + Invalid GUI style specified: + Invalid GUI style specified: + + + + SearchDialog + + + File Name + File Name + + + + Sources + Sources + + + + Search Pattern + Search Pattern + + + + Results + Results + + + + File Size + File Size + + + + Download + Download + + + + Broadcast on Channel + Broadcast on Channel + + + + Recommend to Friends + Recommend to ArkadaÅŸ + + + + Remove + Remove + + + + Remove All + Remove All + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Keywords</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Keywords</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Format</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Format</p></body></html> + + + + Any + Any + + + + Audio + Audio + + + + Video + Video + + + + Images + Images + + + + Programs + Programs + + + + Archives + Archives + + + + Documents + Documents + + + + search + araÅŸtırmak + + + + download + download + + + + Toggle advanced searching on and off. + + + + + <h3>Simple Search:</h3> + + + + + Keywords + + + + + Perform simple search + + + + + Show Advanced Search Tool + + + + + Filename + + + + + Hash + + + + + KeyWords + + + + + Search Id + + + + + <h3>Advanced Search:</h3> + + + + + ServerDialog + + + Transfer Rates + Transfer Rates + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Total Rate (kb/s) </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Total Rate (kb/s) </p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Per Person </p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Per Person </p></body></html> + + + + Server Settings + Peer Settings + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + + + + Port: + Port: + + + + behind zee Firewall + Behind a Firewall + + + + Forwarded External Port + Forwarded External Port (Router) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Name</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Address:</p></body></html> + + + + Check Settings + Check Settings + + + + Firewall/Router Configuration + + + + + Manual router setup. + + + + + Use uPnP to configure router + + + + + Network Address Configuration (takes effect after restart) + + + + + Use DHT to locate friends + + + + + Manual IP Addresses + + + + + Server Status And Network Settings + + + + + Firewalled + + + + + Forwarded Port + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">DHT Status</p></body></html> + + + + + uPnP Status + + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Local Address:</p></body></html> + + + + + ServerPage + + + Change + Restart Server + Change + Restart + + + + Server Settings + Peer Settings + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">External Adress:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lokal Adress:</p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Port:</p></body></html> + + + + Port: + Port: + + + + Misc + Misc + + + + behinde Firewall + Behind a Firewall + + + + Forwarded External Port + Forwarded External Port (Router) + + + + Settings + + + Settings + Settings + + + + Cancel + Cancel + + + + Apply + Apply + + + + OK + OK + + + + General + General + + + + Network + Network + + + + Server + Peer Settings + + + + Directories + Directories + + + + SharedFilesDialog + + + Download + Download + + + + Recommend + Recommend + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Files</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Files</span></p></body></html> + + + + Add to Recommend List + + + + + Recommend To + + + + + Message Friend + + + + + StartDialog + + + Select Trusted Friend + Select Trusted Friend + + + + Certificates (*.pqi *.pem) + Certificates (*.pqi *.pem) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:13pt; font-weight:600; color:#8b0000;">Welcome to RetroShare</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:13pt; font-weight:600; color:#8b0000;">Karşılama e Retroshare</span></p></body></html> + + + + Please Login .... + Please Login .... + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Pasword</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Pasword</span></p></body></html> + + + + Load Existing User + Load Existing User + + + + Or create a New User + Or create a New User + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Organisation:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Organisation:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Country:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Location:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Location:</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Password (Again)</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Password (Again)</span></p></body></html> + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">New Password</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">New Password</span></p></body></html> + + + + Load Trusted Certificate (Optional) + Load Trusted Certificate (Optional) + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friend</span></p></body></html> + + + + Select File + Select File + + + + Generate New Certificate + Generate New Certificate + + + + RetroShare setup + Retroshare setup + + + + Automatically Login in Future + Automatically Login in Future + + + + RetroShare + + + + + QWidget { + background-color: #ECF3F6; +} + + + + + Auto-login + + + + + Name: + + + + + Log In + + + + + Password: + + + + + Create a Account + + + + + QToolButton{ +border-image: url(:/images/avatar_background.png); + +} + + + + + + StatisticDialog + + + Statistics + Statistics + + + + Download + Download + + + + Session: + Session: + + + + Downloaded: + Downloaded: + + + + Average Downloadspeed: + Average Downloadspeed: + + + + Count of Downloads: + Count of Downloads: + + + + Overall + Overall + + + + Upload + Upload + + + + Session + Session + + + + Uploaded: + Uploaded: + + + + Average Uploadspeed: + Average Uploadspeed: + + + + Count of Uploads: + Count of Uploads: + + + + Uploaded + Uploaded + + + + Connections: + Connections: + + + + Peers: + Peers: + + + + Misc + Misc + + + + Uptime: + Uptime: + + + + Overall: + Overall: + + + + Uptime + Uptime + + + + Records + Records + + + + Uploadspeed: + Uploadspeed: + + + + Downloadspeed: + Downloadspeed: + + + + Show Settings + Show Settings + + + + Reset + Reset + + + + Receive Rate + Receive Rate + + + + Send Rate + Send Rate + + + + Always On Top + Always On Top + + + + 100 + 100 + + + + % Opaque + % Opaque + + + + Changes the transparency of the Bandwidth Graph + Changes the transparency of the Bandwidth Graph + + + + Save + Save + + + + Cancel + Cancel + + + + Hide Settings + Hide Settings + + + + TransfersDialog + + + Cancel + Cancel + + + + Clear Completed + Clear Completed + + + + File Name + File Name + + + + Sources + Sources + + + + Status + Status + + + + File Size + File Size + + + + Speed + Speed + + + + Progress + Progress + + + + Completed + Completed + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Downloads:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Downloads:</span></p></body></html> + + + + Peer Name + Peer Name + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Uploads:</span></p></body></html> + <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Arial'; font-size:8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">Uploads:</span></p></body></html> + + + + Name + i.e: file name + Name + + + + Size + i.e: file size + + + + + Progress + i.e: % downloaded + Progress + + + + Speed + i.e: Download speed + Speed + + + + Sources + i.e: Sources + Sources + + + + Remaining + i.e: Estimated Time of Arrival / Time left + + + + + Core-ID + + + + + User Name + i.e: user name + + + + + Progress + i.e: % uploaded + Progress + + + + Speed + i.e: upload speed + Speed + + + + Transferred + + + + + ULListDelegate + + + B + + + + + KB + + + + + MB + + + + + GB + + + + + VMessageBox + + + OK + OK + + + + Cancel + Cancel + + + + Yes + Yes + + + + No + No + + + + Help + Help + + + + Retry + Retry + + + + Show Log + Show Log + + + + Show Settings + Show Settings + + + + moreinfo + + + Details + Details + + + + OK + OK + + + + Name + Name + + + + Value + Value + + + diff --git a/retroshare-gui/src/main.cpp b/retroshare-gui/src/main.cpp new file mode 100644 index 000000000..5fb2a023b --- /dev/null +++ b/retroshare-gui/src/main.cpp @@ -0,0 +1,173 @@ +/**************************************************************** + * RetroShare QT Gui is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 +#include +#include +#include +#include +#include + +/*** WINDOWS DON'T LIKE THIS - REDEFINES VER numbers. +#include +****/ + +#include +#include +#include "rsiface/rsiface.h" + +#include "rsiface/notifyqt.h" + +RsIface *rsiface = NULL; +RsControl *rsicontrol = NULL; + +int main(int argc, char *argv[]) +{ + + QStringList args = char_array_to_stringlist(argv+1, argc-1); + + Q_INIT_RESOURCE(images); + + rsiface = NULL; + + /* RetroShare Core Objects */ + RsInit *config = InitRsConfig(); + bool okStart = InitRetroShare(argc, argv, config); + + + /* Setup The GUI Stuff */ + Rshare rshare(args, argc, argv, + QString(RsConfigDirectory(config))); + + /* Login Dialog */ + if (!okStart) + { + /* check for existing Certificate */ + std::string userName; + + StartDialog *sd = NULL; + bool genCert = false; + if (ValidateCertificate(config, userName)) + { + sd = new StartDialog(config); + sd->show(); + + while(sd -> isVisible()) + { + rshare.processEvents(); +#ifdef WIN32 + Sleep(10); +#else // __LINUX__ + usleep(10000); +#endif + } + + /* if we're logged in */ + genCert = sd->requestedNewCert(); + } + else + { + genCert = true; + } + + if (genCert) + { + GenCertDialog *gd = new GenCertDialog(config); + + gd->show(); + + while(gd -> isVisible()) + { + rshare.processEvents(); +#ifdef WIN32 + Sleep(10); +#else // __LINUX__ + usleep(10000); +#endif + } + } + + + } + else + { + /* don't save auto login details */ + LoadCertificates(config, false); + } + + NotifyQt *notify = new NotifyQt(); + RsIface *iface = createRsIface(*notify); + RsControl *rsServer = createRsControl(*iface, *notify); + + notify->setRsIface(iface); + + /* save to the global variables */ + rsiface = iface; + rsicontrol = rsServer; + + rsServer -> StartupRetroShare(config); + CleanupRsConfig(config); + + MainWindow *w = new MainWindow; + //QMainWindow *skinWindow = new QMainWindow(); + + //skinWindow->resize(w->size().width()+15,w->size().width()+15); + //skinWindow->setWindowTitle(w->windowTitle()); + //skinWindow->setCentralWidget(w); + + /* Attach the Dialogs, to the Notify Class */ + notify->setNetworkDialog(w->networkDialog); + notify->setPeersDialog(w->peersDialog); + notify->setDirDialog(w->sharedfilesDialog); + notify->setTransfersDialog(w->transfersDialog); + notify->setChatDialog(w->chatDialog); + notify->setMessagesDialog(w->messagesDialog); + notify->setChannelsDialog(w->channelsDialog); + notify->setMessengerWindow(w->messengerWindow); + + /* only show window, if not autologin */ +#if defined(Q_OS_WIN) + if (!okStart) + { + + w->show(); + + } +#else + + w->show(); + + //skinWindow->show(); +#endif + + /* Startup a Timer to keep the gui's updated */ + QTimer *timer = new QTimer(w); + timer -> connect(timer, SIGNAL(timeout()), notify, SLOT(UpdateGUI())); + timer->start(1000); + + /* dive into the endless loop */ + return rshare.exec(); +} + + + + + diff --git a/retroshare-gui/src/release/qss/arachnophobia.qss b/retroshare-gui/src/release/qss/arachnophobia.qss new file mode 100644 index 000000000..6daee0b29 --- /dev/null +++ b/retroshare-gui/src/release/qss/arachnophobia.qss @@ -0,0 +1,56 @@ + + +/* Customize the toolbar. */ +QToolBar { + + min-height: 89px; +} + +QToolBar { + + border-image: url(qss/arachnophobia/background.png); + +} + + +QPushButton#addfriendButton { + color: white; + min-height: 34px; + min-width: 48px; +} + +QPushButton#invitefriendButton { + color: white; + min-height: 34px; + min-width: 48px; +} + +QPushButton#addshareButton { + color: white; + min-height: 34px; + min-width: 48px; +} + +QPushButton#optionsButton { + color: white; + min-height: 34px; + min-width: 48px; +} + +QPushButton#quitButton { + color: white; + min-height: 34px; + min-width: 48px; +} + +QPushButton#okButton { + color: white; + min-height: 27px; + min-width: 77px; +} + +QPushButton#cancelButton { + color: white; + min-height: 25px; + min-width: 75px; +} diff --git a/retroshare-gui/src/release/qss/arachnophobia/background.png b/retroshare-gui/src/release/qss/arachnophobia/background.png new file mode 100644 index 000000000..5516be886 Binary files /dev/null and b/retroshare-gui/src/release/qss/arachnophobia/background.png differ diff --git a/retroshare-gui/src/release/qss/black.qss b/retroshare-gui/src/release/qss/black.qss new file mode 100644 index 000000000..1f80425ea --- /dev/null +++ b/retroshare-gui/src/release/qss/black.qss @@ -0,0 +1,161 @@ +.QWidget { + background-color: #F9F9F9; +} + +/* Customize the toolbar. */ +QToolBar { + border-image: url(qss/black/backgroundblack.png); + +} + +QToolButton { + color: white; +} + +QPushButton { + color: white; + min-height: 22px; + +} + +QPushButton#addfriendButton { + color: white; + min-height: 34px; + min-width: 48px; +} + +QPushButton#invitefriendButton { + color: white; + min-height: 34px; + min-width: 48px; +} + +QPushButton#addshareButton { + color: white; + min-height: 34px; + min-width: 48px; +} + +QPushButton#optionsButton { + color: white; + min-height: 34px; + min-width: 48px; +} + +QPushButton#quitButton { + color: white; + min-height: 34px; + min-width: 48px; +} + +QPushButton#okButton { + color: white; + min-height: 27px; + min-width: 77px; +} + +QPushButton#cancelButton#afcancelButton#doneButton { + color: white; + min-height: 25px; + min-width: 75px; +} + +QPushButton#fileButton#emailButton { + color: white; + min-height: 27px; + min-width: 77px; +} + +QPushButton#cancelprefButton { + color: white; + min-height: 25px; + min-width: 75px; +} + +QPushButton#toggleAdvancedSearchBtn{ + min-height: 34px; + min-width: 34px; +} + +QPushButton#pushButtonDownload{ + min-height: 34px; + min-width: 34px; +} + +QPushButton +{ +border-image: url(qss/black/button.png) ; +} + +QPushButton:hover +{ +border-image: url(qss/black/button_hover.png); +} + +QPushButton:pressed +{ +border-image: url(qss/black/button_pressed.png) ; +} + + +QSplitter +{ +background-color: #F9F9F9; +} + +QLineEdit +{ +border-image: url(qss/black/border.png) 4; +border-width: 3; +} + +QLabel +{ +color: #306090; +} + + +QGroupBox +{ +color: #306090; +font: bold; +} + + +QRadioButton::indicator::unchecked { + image: url(qss/black/checkBox.png); +} + +QRadioButton::indicator:unchecked:hover { + image: url(qss/black/checkBox_hover.png); +} + + + +QRadioButton::indicator::checked { + image: url(qss/black/checkBox_selected.png); +} + +QRadioButton::indicator:checked:hover { + image: url(qss/black/checkBox_hoverAndSelected.png); +} + + +QCheckBox::indicator:unchecked { + image: url(qss/black/checkBox.png); +} + +QCheckBox::indicator:unchecked:hover { + image: url(qss/black/checkBox_hover.png); +} + + +QCheckBox::indicator:checked { + image: url(qss/black/checkBox_selected.png); +} + +QCheckBox::indicator:checked:hover { + image: url(qss/black/checkBox_hoverAndSelected.png); +} + + diff --git a/retroshare-gui/src/release/qss/black/arrowButtonX.png b/retroshare-gui/src/release/qss/black/arrowButtonX.png new file mode 100644 index 000000000..ed4e0e557 Binary files /dev/null and b/retroshare-gui/src/release/qss/black/arrowButtonX.png differ diff --git a/retroshare-gui/src/release/qss/black/arrowButtonX_disabled.png b/retroshare-gui/src/release/qss/black/arrowButtonX_disabled.png new file mode 100644 index 000000000..0656fb49a Binary files /dev/null and b/retroshare-gui/src/release/qss/black/arrowButtonX_disabled.png differ diff --git a/retroshare-gui/src/release/qss/black/arrowButtonX_hover.png b/retroshare-gui/src/release/qss/black/arrowButtonX_hover.png new file mode 100644 index 000000000..32bc1d193 Binary files /dev/null and b/retroshare-gui/src/release/qss/black/arrowButtonX_hover.png differ diff --git a/retroshare-gui/src/release/qss/black/arrowDown.png b/retroshare-gui/src/release/qss/black/arrowDown.png new file mode 100644 index 000000000..4afd3a157 Binary files /dev/null and b/retroshare-gui/src/release/qss/black/arrowDown.png differ diff --git a/retroshare-gui/src/release/qss/black/arrowDown_disabled.png b/retroshare-gui/src/release/qss/black/arrowDown_disabled.png new file mode 100644 index 000000000..1ec2e2663 Binary files /dev/null and b/retroshare-gui/src/release/qss/black/arrowDown_disabled.png differ diff --git a/retroshare-gui/src/release/qss/black/arrowDown_hover.png b/retroshare-gui/src/release/qss/black/arrowDown_hover.png new file mode 100644 index 000000000..8a69e1f94 Binary files /dev/null and b/retroshare-gui/src/release/qss/black/arrowDown_hover.png differ diff --git a/retroshare-gui/src/release/qss/black/arrowDown_pressed.png b/retroshare-gui/src/release/qss/black/arrowDown_pressed.png new file mode 100644 index 000000000..217c3bec6 Binary files /dev/null and b/retroshare-gui/src/release/qss/black/arrowDown_pressed.png differ diff --git a/retroshare-gui/src/release/qss/black/backgroundblack.png b/retroshare-gui/src/release/qss/black/backgroundblack.png new file mode 100644 index 000000000..4edc99fc0 Binary files /dev/null and b/retroshare-gui/src/release/qss/black/backgroundblack.png differ diff --git a/retroshare-gui/src/release/qss/black/border.png b/retroshare-gui/src/release/qss/black/border.png new file mode 100644 index 000000000..b31e7f960 Binary files /dev/null and b/retroshare-gui/src/release/qss/black/border.png differ diff --git a/retroshare-gui/src/release/qss/black/button.png b/retroshare-gui/src/release/qss/black/button.png new file mode 100644 index 000000000..1aa7052e8 Binary files /dev/null and b/retroshare-gui/src/release/qss/black/button.png differ diff --git a/retroshare-gui/src/release/qss/black/button_default.png b/retroshare-gui/src/release/qss/black/button_default.png new file mode 100644 index 000000000..7505052e8 Binary files /dev/null and b/retroshare-gui/src/release/qss/black/button_default.png differ diff --git a/retroshare-gui/src/release/qss/black/button_hover.png b/retroshare-gui/src/release/qss/black/button_hover.png new file mode 100644 index 000000000..92ecba15c Binary files /dev/null and b/retroshare-gui/src/release/qss/black/button_hover.png differ diff --git a/retroshare-gui/src/release/qss/black/button_pressed.png b/retroshare-gui/src/release/qss/black/button_pressed.png new file mode 100644 index 000000000..796a7166c Binary files /dev/null and b/retroshare-gui/src/release/qss/black/button_pressed.png differ diff --git a/retroshare-gui/src/release/qss/black/button_pressedAndHover.png b/retroshare-gui/src/release/qss/black/button_pressedAndHover.png new file mode 100644 index 000000000..d50222848 Binary files /dev/null and b/retroshare-gui/src/release/qss/black/button_pressedAndHover.png differ diff --git a/retroshare-gui/src/release/qss/black/checkBox.png b/retroshare-gui/src/release/qss/black/checkBox.png new file mode 100644 index 000000000..73deed8b9 Binary files /dev/null and b/retroshare-gui/src/release/qss/black/checkBox.png differ diff --git a/retroshare-gui/src/release/qss/black/checkBox_disabled.png b/retroshare-gui/src/release/qss/black/checkBox_disabled.png new file mode 100644 index 000000000..dce030df2 Binary files /dev/null and b/retroshare-gui/src/release/qss/black/checkBox_disabled.png differ diff --git a/retroshare-gui/src/release/qss/black/checkBox_disabledAndSelected.png b/retroshare-gui/src/release/qss/black/checkBox_disabledAndSelected.png new file mode 100644 index 000000000..07c091c48 Binary files /dev/null and b/retroshare-gui/src/release/qss/black/checkBox_disabledAndSelected.png differ diff --git a/retroshare-gui/src/release/qss/black/checkBox_hover.png b/retroshare-gui/src/release/qss/black/checkBox_hover.png new file mode 100644 index 000000000..8db50bcaa Binary files /dev/null and b/retroshare-gui/src/release/qss/black/checkBox_hover.png differ diff --git a/retroshare-gui/src/release/qss/black/checkBox_hoverAndSelected.png b/retroshare-gui/src/release/qss/black/checkBox_hoverAndSelected.png new file mode 100644 index 000000000..f5af48f3c Binary files /dev/null and b/retroshare-gui/src/release/qss/black/checkBox_hoverAndSelected.png differ diff --git a/retroshare-gui/src/release/qss/black/checkBox_selected.png b/retroshare-gui/src/release/qss/black/checkBox_selected.png new file mode 100644 index 000000000..5f8800266 Binary files /dev/null and b/retroshare-gui/src/release/qss/black/checkBox_selected.png differ diff --git a/retroshare-gui/src/release/qss/black/radioButton.png b/retroshare-gui/src/release/qss/black/radioButton.png new file mode 100644 index 000000000..b3fb4ebe5 Binary files /dev/null and b/retroshare-gui/src/release/qss/black/radioButton.png differ diff --git a/retroshare-gui/src/release/qss/black/radioButtonIcon_default.png b/retroshare-gui/src/release/qss/black/radioButtonIcon_default.png new file mode 100644 index 000000000..1a1b979aa Binary files /dev/null and b/retroshare-gui/src/release/qss/black/radioButtonIcon_default.png differ diff --git a/retroshare-gui/src/release/qss/black/radioButtonIcon_disabled.png b/retroshare-gui/src/release/qss/black/radioButtonIcon_disabled.png new file mode 100644 index 000000000..66923f79f Binary files /dev/null and b/retroshare-gui/src/release/qss/black/radioButtonIcon_disabled.png differ diff --git a/retroshare-gui/src/release/qss/black/radioButtonIcon_disabledAndSelected.png b/retroshare-gui/src/release/qss/black/radioButtonIcon_disabledAndSelected.png new file mode 100644 index 000000000..92b81b1b5 Binary files /dev/null and b/retroshare-gui/src/release/qss/black/radioButtonIcon_disabledAndSelected.png differ diff --git a/retroshare-gui/src/release/qss/black/radioButtonIcon_selected.png b/retroshare-gui/src/release/qss/black/radioButtonIcon_selected.png new file mode 100644 index 000000000..264f95f45 Binary files /dev/null and b/retroshare-gui/src/release/qss/black/radioButtonIcon_selected.png differ diff --git a/retroshare-gui/src/release/qss/black/radioButton_disabled.png b/retroshare-gui/src/release/qss/black/radioButton_disabled.png new file mode 100644 index 000000000..3477cae61 Binary files /dev/null and b/retroshare-gui/src/release/qss/black/radioButton_disabled.png differ diff --git a/retroshare-gui/src/release/qss/black/radioButton_disabledAndSelected.png b/retroshare-gui/src/release/qss/black/radioButton_disabledAndSelected.png new file mode 100644 index 000000000..224f370e3 Binary files /dev/null and b/retroshare-gui/src/release/qss/black/radioButton_disabledAndSelected.png differ diff --git a/retroshare-gui/src/release/qss/black/radioButton_hover.png b/retroshare-gui/src/release/qss/black/radioButton_hover.png new file mode 100644 index 000000000..b2d5bcc71 Binary files /dev/null and b/retroshare-gui/src/release/qss/black/radioButton_hover.png differ diff --git a/retroshare-gui/src/release/qss/black/radioButton_hoverAndSelected.png b/retroshare-gui/src/release/qss/black/radioButton_hoverAndSelected.png new file mode 100644 index 000000000..67b9b865a Binary files /dev/null and b/retroshare-gui/src/release/qss/black/radioButton_hoverAndSelected.png differ diff --git a/retroshare-gui/src/release/qss/black/radioButton_selected.png b/retroshare-gui/src/release/qss/black/radioButton_selected.png new file mode 100644 index 000000000..165a1e491 Binary files /dev/null and b/retroshare-gui/src/release/qss/black/radioButton_selected.png differ diff --git a/retroshare-gui/src/release/qss/blue.qss b/retroshare-gui/src/release/qss/blue.qss new file mode 100644 index 000000000..b956f97a8 --- /dev/null +++ b/retroshare-gui/src/release/qss/blue.qss @@ -0,0 +1,51 @@ +.QWidget { + background-color: #c4dafa; +} + + +/* Customize the toolbar. */ +QToolBar { + border-image: url(qss/blue/blue.png); + +} + +QPushButton#addfriendButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#invitefriendButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#addshareButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#optionsButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#quitButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#okButton { + min-height: 27px; + min-width: 77px; +} + +QPushButton#cancelButton { + min-height: 25px; + min-width: 75px; +} + + + + + + diff --git a/retroshare-gui/src/release/qss/blue/Thumbs.db b/retroshare-gui/src/release/qss/blue/Thumbs.db new file mode 100644 index 000000000..c85a48cf7 Binary files /dev/null and b/retroshare-gui/src/release/qss/blue/Thumbs.db differ diff --git a/retroshare-gui/src/release/qss/blue/blue.png b/retroshare-gui/src/release/qss/blue/blue.png new file mode 100644 index 000000000..28a723edd Binary files /dev/null and b/retroshare-gui/src/release/qss/blue/blue.png differ diff --git a/retroshare-gui/src/release/qss/default.qss b/retroshare-gui/src/release/qss/default.qss new file mode 100644 index 000000000..95efbf857 --- /dev/null +++ b/retroshare-gui/src/release/qss/default.qss @@ -0,0 +1,44 @@ +.QWidget { + background-color: #ECF3F6; +} + +/* Customize the toolbar. */ +QToolBar { + border-image: url(qss/default/retrotoolbar.png); + +} + +QPushButton#addfriendButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#invitefriendButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#addshareButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#optionsButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#quitButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#okButton { + min-height: 27px; + min-width: 77px; +} + +QPushButton#cancelButton { + min-height: 25px; + min-width: 75px; +} diff --git a/retroshare-gui/src/release/qss/default/retrotoolbar.png b/retroshare-gui/src/release/qss/default/retrotoolbar.png new file mode 100644 index 000000000..4a8e6cd39 Binary files /dev/null and b/retroshare-gui/src/release/qss/default/retrotoolbar.png differ diff --git a/retroshare-gui/src/release/qss/ed2k.qss b/retroshare-gui/src/release/qss/ed2k.qss new file mode 100644 index 000000000..cea7a656b --- /dev/null +++ b/retroshare-gui/src/release/qss/ed2k.qss @@ -0,0 +1,73 @@ +.QWidget { + background-image: url(qss/ed2k/little-back.png); +} + + +/* Customize the toolbar. */ +QToolBar { + border-image: url(qss/ed2k/backed2k.png); + +} + + +QPushButton { + min-height: 22px; +} + + +QPushButton +{ +border-image: url(qss/ed2k/button-down.png) ; +} + +QPushButton:hover +{ +border-image: url(qss/ed2k/button-hover.png); +} + +QPushButton:pressed +{ +border-image: url(qss/ed2k/button-up.png) ; +} + + +QPushButton#addfriendButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#invitefriendButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#addshareButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#optionsButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#quitButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#okButton { + min-height: 27px; + min-width: 77px; +} + +QPushButton#cancelButton { + min-height: 25px; + min-width: 75px; +} + +QPushButton#cancelprefButton { + + min-height: 25px; + min-width: 75px; +} diff --git a/retroshare-gui/src/release/qss/ed2k/Thumbs.db b/retroshare-gui/src/release/qss/ed2k/Thumbs.db new file mode 100644 index 000000000..13989ffdd Binary files /dev/null and b/retroshare-gui/src/release/qss/ed2k/Thumbs.db differ diff --git a/retroshare-gui/src/release/qss/ed2k/backed2k.png b/retroshare-gui/src/release/qss/ed2k/backed2k.png new file mode 100644 index 000000000..61a7573ed Binary files /dev/null and b/retroshare-gui/src/release/qss/ed2k/backed2k.png differ diff --git a/retroshare-gui/src/release/qss/ed2k/button-down.png b/retroshare-gui/src/release/qss/ed2k/button-down.png new file mode 100644 index 000000000..91bcb06b8 Binary files /dev/null and b/retroshare-gui/src/release/qss/ed2k/button-down.png differ diff --git a/retroshare-gui/src/release/qss/ed2k/button-hover.png b/retroshare-gui/src/release/qss/ed2k/button-hover.png new file mode 100644 index 000000000..842eba29d Binary files /dev/null and b/retroshare-gui/src/release/qss/ed2k/button-hover.png differ diff --git a/retroshare-gui/src/release/qss/ed2k/button-up.png b/retroshare-gui/src/release/qss/ed2k/button-up.png new file mode 100644 index 000000000..e27a751bf Binary files /dev/null and b/retroshare-gui/src/release/qss/ed2k/button-up.png differ diff --git a/retroshare-gui/src/release/qss/ed2k/little-back.png b/retroshare-gui/src/release/qss/ed2k/little-back.png new file mode 100644 index 000000000..18ed14ad4 Binary files /dev/null and b/retroshare-gui/src/release/qss/ed2k/little-back.png differ diff --git a/retroshare-gui/src/release/qss/over.qss b/retroshare-gui/src/release/qss/over.qss new file mode 100644 index 000000000..835f7f379 --- /dev/null +++ b/retroshare-gui/src/release/qss/over.qss @@ -0,0 +1,81 @@ +.QWidget { + background-color: #66ff33; +} + +/* Customize the toolbar. */ +QToolBar { + + border-image: url(qss/over/backover.png); + +} + + +QPushButton { + + min-height: 22px; +} + + +QPushButton +{ +border-image: url(qss/over/greenbot.png) ; +} + +QPushButton:hover +{ +border-image: url(qss/over/greenhover.png); +} + +QPushButton:pressed +{ +color: white; +border-image: url(qss/over/greentop.png) ; +} + +QPushButton#addfriendButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#invitefriendButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#addshareButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#optionsButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#quitButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#okButton { + min-height: 27px; + min-width: 77px; +} + +QPushButton#cancelButton { + min-height: 25px; + min-width: 75px; +} + +QPushButton#cancelprefButton { + color: white; + min-height: 25px; + min-width: 75px; +} + +QSplitter +{ +background-color: #66ff33; +} + + diff --git a/retroshare-gui/src/release/qss/over/Thumbs.db b/retroshare-gui/src/release/qss/over/Thumbs.db new file mode 100644 index 000000000..9ec11d59e Binary files /dev/null and b/retroshare-gui/src/release/qss/over/Thumbs.db differ diff --git a/retroshare-gui/src/release/qss/over/background.bmp b/retroshare-gui/src/release/qss/over/background.bmp new file mode 100644 index 000000000..ace3d29ac Binary files /dev/null and b/retroshare-gui/src/release/qss/over/background.bmp differ diff --git a/retroshare-gui/src/release/qss/over/background_filler.bmp b/retroshare-gui/src/release/qss/over/background_filler.bmp new file mode 100644 index 000000000..dd19c4bf5 Binary files /dev/null and b/retroshare-gui/src/release/qss/over/background_filler.bmp differ diff --git a/retroshare-gui/src/release/qss/over/backover.png b/retroshare-gui/src/release/qss/over/backover.png new file mode 100644 index 000000000..208e244b6 Binary files /dev/null and b/retroshare-gui/src/release/qss/over/backover.png differ diff --git a/retroshare-gui/src/release/qss/over/greenbot.png b/retroshare-gui/src/release/qss/over/greenbot.png new file mode 100644 index 000000000..f0f5e00a8 Binary files /dev/null and b/retroshare-gui/src/release/qss/over/greenbot.png differ diff --git a/retroshare-gui/src/release/qss/over/greenhover.png b/retroshare-gui/src/release/qss/over/greenhover.png new file mode 100644 index 000000000..64dde08bf Binary files /dev/null and b/retroshare-gui/src/release/qss/over/greenhover.png differ diff --git a/retroshare-gui/src/release/qss/over/greentop.png b/retroshare-gui/src/release/qss/over/greentop.png new file mode 100644 index 000000000..0e065e387 Binary files /dev/null and b/retroshare-gui/src/release/qss/over/greentop.png differ diff --git a/retroshare-gui/src/release/qss/over/orig searchanim.bmp b/retroshare-gui/src/release/qss/over/orig searchanim.bmp new file mode 100644 index 000000000..659ea4a22 Binary files /dev/null and b/retroshare-gui/src/release/qss/over/orig searchanim.bmp differ diff --git a/retroshare-gui/src/release/qss/over/searchanim.bmp b/retroshare-gui/src/release/qss/over/searchanim.bmp new file mode 100644 index 000000000..a442402ff Binary files /dev/null and b/retroshare-gui/src/release/qss/over/searchanim.bmp differ diff --git a/retroshare-gui/src/release/qss/silver.qss b/retroshare-gui/src/release/qss/silver.qss new file mode 100644 index 000000000..e5c140652 --- /dev/null +++ b/retroshare-gui/src/release/qss/silver.qss @@ -0,0 +1,45 @@ + +/* Customize the toolbar. */ +QToolBar { + border-image: url(qss/silver/silver.png); + +} + + + +QPushButton#addfriendButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#invitefriendButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#addshareButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#optionsButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#quitButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#okButton { + min-height: 27px; + min-width: 77px; +} + +QPushButton#cancelButton { + min-height: 25px; + min-width: 75px; +} + + diff --git a/retroshare-gui/src/release/qss/silver/silver.png b/retroshare-gui/src/release/qss/silver/silver.png new file mode 100644 index 000000000..2559aa8d8 Binary files /dev/null and b/retroshare-gui/src/release/qss/silver/silver.png differ diff --git a/retroshare-gui/src/release/qss/skin2.qss b/retroshare-gui/src/release/qss/skin2.qss new file mode 100644 index 000000000..48bf476c0 --- /dev/null +++ b/retroshare-gui/src/release/qss/skin2.qss @@ -0,0 +1,43 @@ + + +/* Customize the toolbar. */ +QToolBar { + border-image: url(qss/skin2/background.png); + +} + + +QPushButton#addfriendButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#invitefriendButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#addshareButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#optionsButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#quitButton { + min-height: 34px; + min-width: 48px; +} + +QPushButton#okButton { + min-height: 27px; + min-width: 77px; +} + +QPushButton#cancelButton { + min-height: 25px; + min-width: 75px; +} diff --git a/retroshare-gui/src/release/qss/skin2/background.png b/retroshare-gui/src/release/qss/skin2/background.png new file mode 100644 index 000000000..6c3182dca Binary files /dev/null and b/retroshare-gui/src/release/qss/skin2/background.png differ diff --git a/retroshare-gui/src/release/skin/Bliss/maxButton.png b/retroshare-gui/src/release/skin/Bliss/maxButton.png new file mode 100644 index 000000000..4d83bcd35 Binary files /dev/null and b/retroshare-gui/src/release/skin/Bliss/maxButton.png differ diff --git a/retroshare-gui/src/release/skin/Bliss/maxButton1.png b/retroshare-gui/src/release/skin/Bliss/maxButton1.png new file mode 100644 index 000000000..a916ba483 Binary files /dev/null and b/retroshare-gui/src/release/skin/Bliss/maxButton1.png differ diff --git a/retroshare-gui/src/release/skin/Bliss/maxButton2.png b/retroshare-gui/src/release/skin/Bliss/maxButton2.png new file mode 100644 index 000000000..aaba43674 Binary files /dev/null and b/retroshare-gui/src/release/skin/Bliss/maxButton2.png differ diff --git a/retroshare-gui/src/release/skin/Bliss/minButton.png b/retroshare-gui/src/release/skin/Bliss/minButton.png new file mode 100644 index 000000000..7f1553a6e Binary files /dev/null and b/retroshare-gui/src/release/skin/Bliss/minButton.png differ diff --git a/retroshare-gui/src/release/skin/Bliss/minButton1.png b/retroshare-gui/src/release/skin/Bliss/minButton1.png new file mode 100644 index 000000000..a3c564cdd Binary files /dev/null and b/retroshare-gui/src/release/skin/Bliss/minButton1.png differ diff --git a/retroshare-gui/src/release/skin/Bliss/minButton2.png b/retroshare-gui/src/release/skin/Bliss/minButton2.png new file mode 100644 index 000000000..01af810b0 Binary files /dev/null and b/retroshare-gui/src/release/skin/Bliss/minButton2.png differ diff --git a/retroshare-gui/src/release/skin/Bliss/quiButton.png b/retroshare-gui/src/release/skin/Bliss/quiButton.png new file mode 100644 index 000000000..6a657ae1a Binary files /dev/null and b/retroshare-gui/src/release/skin/Bliss/quiButton.png differ diff --git a/retroshare-gui/src/release/skin/Bliss/quiButton1.png b/retroshare-gui/src/release/skin/Bliss/quiButton1.png new file mode 100644 index 000000000..174c7b2ee Binary files /dev/null and b/retroshare-gui/src/release/skin/Bliss/quiButton1.png differ diff --git a/retroshare-gui/src/release/skin/Bliss/quiButton2.png b/retroshare-gui/src/release/skin/Bliss/quiButton2.png new file mode 100644 index 000000000..f379e9431 Binary files /dev/null and b/retroshare-gui/src/release/skin/Bliss/quiButton2.png differ diff --git a/retroshare-gui/src/release/skin/Bliss/sl.png b/retroshare-gui/src/release/skin/Bliss/sl.png new file mode 100644 index 000000000..851821b6a Binary files /dev/null and b/retroshare-gui/src/release/skin/Bliss/sl.png differ diff --git a/retroshare-gui/src/release/skin/Bliss/so.png b/retroshare-gui/src/release/skin/Bliss/so.png new file mode 100644 index 000000000..6497639b3 Binary files /dev/null and b/retroshare-gui/src/release/skin/Bliss/so.png differ diff --git a/retroshare-gui/src/release/skin/Bliss/sr.png b/retroshare-gui/src/release/skin/Bliss/sr.png new file mode 100644 index 000000000..6689549b3 Binary files /dev/null and b/retroshare-gui/src/release/skin/Bliss/sr.png differ diff --git a/retroshare-gui/src/release/skin/Bliss/su.png b/retroshare-gui/src/release/skin/Bliss/su.png new file mode 100644 index 000000000..9862742f0 Binary files /dev/null and b/retroshare-gui/src/release/skin/Bliss/su.png differ diff --git a/retroshare-gui/src/release/skin/Glassy/Thumbs.db b/retroshare-gui/src/release/skin/Glassy/Thumbs.db new file mode 100644 index 000000000..092683caf Binary files /dev/null and b/retroshare-gui/src/release/skin/Glassy/Thumbs.db differ diff --git a/retroshare-gui/src/release/skin/Glassy/maxButton.png b/retroshare-gui/src/release/skin/Glassy/maxButton.png new file mode 100644 index 000000000..469d21e40 Binary files /dev/null and b/retroshare-gui/src/release/skin/Glassy/maxButton.png differ diff --git a/retroshare-gui/src/release/skin/Glassy/minButton.png b/retroshare-gui/src/release/skin/Glassy/minButton.png new file mode 100644 index 000000000..40c6ba78c Binary files /dev/null and b/retroshare-gui/src/release/skin/Glassy/minButton.png differ diff --git a/retroshare-gui/src/release/skin/Glassy/quiButton.png b/retroshare-gui/src/release/skin/Glassy/quiButton.png new file mode 100644 index 000000000..da6390211 Binary files /dev/null and b/retroshare-gui/src/release/skin/Glassy/quiButton.png differ diff --git a/retroshare-gui/src/release/skin/Glassy/sl.png b/retroshare-gui/src/release/skin/Glassy/sl.png new file mode 100644 index 000000000..f259a74c7 Binary files /dev/null and b/retroshare-gui/src/release/skin/Glassy/sl.png differ diff --git a/retroshare-gui/src/release/skin/Glassy/so.png b/retroshare-gui/src/release/skin/Glassy/so.png new file mode 100644 index 000000000..9b554663d Binary files /dev/null and b/retroshare-gui/src/release/skin/Glassy/so.png differ diff --git a/retroshare-gui/src/release/skin/Glassy/sr.png b/retroshare-gui/src/release/skin/Glassy/sr.png new file mode 100644 index 000000000..f259a74c7 Binary files /dev/null and b/retroshare-gui/src/release/skin/Glassy/sr.png differ diff --git a/retroshare-gui/src/release/skin/Glassy/su.png b/retroshare-gui/src/release/skin/Glassy/su.png new file mode 100644 index 000000000..0e96fdbed Binary files /dev/null and b/retroshare-gui/src/release/skin/Glassy/su.png differ diff --git a/retroshare-gui/src/release/skin/Green/Thumbs.db b/retroshare-gui/src/release/skin/Green/Thumbs.db new file mode 100644 index 000000000..5077a61b5 Binary files /dev/null and b/retroshare-gui/src/release/skin/Green/Thumbs.db differ diff --git a/retroshare-gui/src/release/skin/Green/maxButton.png b/retroshare-gui/src/release/skin/Green/maxButton.png new file mode 100644 index 000000000..73f1fc27d Binary files /dev/null and b/retroshare-gui/src/release/skin/Green/maxButton.png differ diff --git a/retroshare-gui/src/release/skin/Green/minButton.png b/retroshare-gui/src/release/skin/Green/minButton.png new file mode 100644 index 000000000..1c9adaa6c Binary files /dev/null and b/retroshare-gui/src/release/skin/Green/minButton.png differ diff --git a/retroshare-gui/src/release/skin/Green/quiButton.png b/retroshare-gui/src/release/skin/Green/quiButton.png new file mode 100644 index 000000000..6134015ef Binary files /dev/null and b/retroshare-gui/src/release/skin/Green/quiButton.png differ diff --git a/retroshare-gui/src/release/skin/Green/sl.png b/retroshare-gui/src/release/skin/Green/sl.png new file mode 100644 index 000000000..06af00e82 Binary files /dev/null and b/retroshare-gui/src/release/skin/Green/sl.png differ diff --git a/retroshare-gui/src/release/skin/Green/so.png b/retroshare-gui/src/release/skin/Green/so.png new file mode 100644 index 000000000..661ffd761 Binary files /dev/null and b/retroshare-gui/src/release/skin/Green/so.png differ diff --git a/retroshare-gui/src/release/skin/Green/sr.png b/retroshare-gui/src/release/skin/Green/sr.png new file mode 100644 index 000000000..7f62f1c0b Binary files /dev/null and b/retroshare-gui/src/release/skin/Green/sr.png differ diff --git a/retroshare-gui/src/release/skin/Green/su.png b/retroshare-gui/src/release/skin/Green/su.png new file mode 100644 index 000000000..8e04d5077 Binary files /dev/null and b/retroshare-gui/src/release/skin/Green/su.png differ diff --git a/retroshare-gui/src/release/skin/Night Vision/maxButton.png b/retroshare-gui/src/release/skin/Night Vision/maxButton.png new file mode 100644 index 000000000..cbb27c3cb Binary files /dev/null and b/retroshare-gui/src/release/skin/Night Vision/maxButton.png differ diff --git a/retroshare-gui/src/release/skin/Night Vision/minButton.png b/retroshare-gui/src/release/skin/Night Vision/minButton.png new file mode 100644 index 000000000..5892a982c Binary files /dev/null and b/retroshare-gui/src/release/skin/Night Vision/minButton.png differ diff --git a/retroshare-gui/src/release/skin/Night Vision/quiButton.png b/retroshare-gui/src/release/skin/Night Vision/quiButton.png new file mode 100644 index 000000000..1443caa9d Binary files /dev/null and b/retroshare-gui/src/release/skin/Night Vision/quiButton.png differ diff --git a/retroshare-gui/src/release/skin/Night Vision/sl.png b/retroshare-gui/src/release/skin/Night Vision/sl.png new file mode 100644 index 000000000..acc9db3d1 Binary files /dev/null and b/retroshare-gui/src/release/skin/Night Vision/sl.png differ diff --git a/retroshare-gui/src/release/skin/Night Vision/so.png b/retroshare-gui/src/release/skin/Night Vision/so.png new file mode 100644 index 000000000..900e051a9 Binary files /dev/null and b/retroshare-gui/src/release/skin/Night Vision/so.png differ diff --git a/retroshare-gui/src/release/skin/Night Vision/sr.png b/retroshare-gui/src/release/skin/Night Vision/sr.png new file mode 100644 index 000000000..0d0f296ec Binary files /dev/null and b/retroshare-gui/src/release/skin/Night Vision/sr.png differ diff --git a/retroshare-gui/src/release/skin/Night Vision/su.png b/retroshare-gui/src/release/skin/Night Vision/su.png new file mode 100644 index 000000000..32b195e0d Binary files /dev/null and b/retroshare-gui/src/release/skin/Night Vision/su.png differ diff --git a/retroshare-gui/src/release/skin/Vista/maxButton.png b/retroshare-gui/src/release/skin/Vista/maxButton.png new file mode 100644 index 000000000..cbb27c3cb Binary files /dev/null and b/retroshare-gui/src/release/skin/Vista/maxButton.png differ diff --git a/retroshare-gui/src/release/skin/Vista/maxButton1.png b/retroshare-gui/src/release/skin/Vista/maxButton1.png new file mode 100644 index 000000000..1bed27a49 Binary files /dev/null and b/retroshare-gui/src/release/skin/Vista/maxButton1.png differ diff --git a/retroshare-gui/src/release/skin/Vista/maxButton2.png b/retroshare-gui/src/release/skin/Vista/maxButton2.png new file mode 100644 index 000000000..a9ece6da2 Binary files /dev/null and b/retroshare-gui/src/release/skin/Vista/maxButton2.png differ diff --git a/retroshare-gui/src/release/skin/Vista/minButton.png b/retroshare-gui/src/release/skin/Vista/minButton.png new file mode 100644 index 000000000..5892a982c Binary files /dev/null and b/retroshare-gui/src/release/skin/Vista/minButton.png differ diff --git a/retroshare-gui/src/release/skin/Vista/minButton1.png b/retroshare-gui/src/release/skin/Vista/minButton1.png new file mode 100644 index 000000000..79207e5df Binary files /dev/null and b/retroshare-gui/src/release/skin/Vista/minButton1.png differ diff --git a/retroshare-gui/src/release/skin/Vista/minButton2.png b/retroshare-gui/src/release/skin/Vista/minButton2.png new file mode 100644 index 000000000..b52bdb299 Binary files /dev/null and b/retroshare-gui/src/release/skin/Vista/minButton2.png differ diff --git a/retroshare-gui/src/release/skin/Vista/quiButton.png b/retroshare-gui/src/release/skin/Vista/quiButton.png new file mode 100644 index 000000000..1443caa9d Binary files /dev/null and b/retroshare-gui/src/release/skin/Vista/quiButton.png differ diff --git a/retroshare-gui/src/release/skin/Vista/quiButton1.png b/retroshare-gui/src/release/skin/Vista/quiButton1.png new file mode 100644 index 000000000..008b25e2e Binary files /dev/null and b/retroshare-gui/src/release/skin/Vista/quiButton1.png differ diff --git a/retroshare-gui/src/release/skin/Vista/quiButton2.png b/retroshare-gui/src/release/skin/Vista/quiButton2.png new file mode 100644 index 000000000..3e79d9f08 Binary files /dev/null and b/retroshare-gui/src/release/skin/Vista/quiButton2.png differ diff --git a/retroshare-gui/src/release/skin/Vista/sl.png b/retroshare-gui/src/release/skin/Vista/sl.png new file mode 100644 index 000000000..05628496b Binary files /dev/null and b/retroshare-gui/src/release/skin/Vista/sl.png differ diff --git a/retroshare-gui/src/release/skin/Vista/so.png b/retroshare-gui/src/release/skin/Vista/so.png new file mode 100644 index 000000000..d9472686c Binary files /dev/null and b/retroshare-gui/src/release/skin/Vista/so.png differ diff --git a/retroshare-gui/src/release/skin/Vista/sr.png b/retroshare-gui/src/release/skin/Vista/sr.png new file mode 100644 index 000000000..60e8e091f Binary files /dev/null and b/retroshare-gui/src/release/skin/Vista/sr.png differ diff --git a/retroshare-gui/src/release/skin/Vista/su.png b/retroshare-gui/src/release/skin/Vista/su.png new file mode 100644 index 000000000..c62254cfb Binary files /dev/null and b/retroshare-gui/src/release/skin/Vista/su.png differ diff --git a/retroshare-gui/src/release/skin/VistaAlpha/bg.png b/retroshare-gui/src/release/skin/VistaAlpha/bg.png new file mode 100644 index 000000000..f7ead614a Binary files /dev/null and b/retroshare-gui/src/release/skin/VistaAlpha/bg.png differ diff --git a/retroshare-gui/src/release/skin/VistaAlpha/maxButton.png b/retroshare-gui/src/release/skin/VistaAlpha/maxButton.png new file mode 100644 index 000000000..bb1c53ee4 Binary files /dev/null and b/retroshare-gui/src/release/skin/VistaAlpha/maxButton.png differ diff --git a/retroshare-gui/src/release/skin/VistaAlpha/maxButton1.png b/retroshare-gui/src/release/skin/VistaAlpha/maxButton1.png new file mode 100644 index 000000000..1bed27a49 Binary files /dev/null and b/retroshare-gui/src/release/skin/VistaAlpha/maxButton1.png differ diff --git a/retroshare-gui/src/release/skin/VistaAlpha/maxButton2.png b/retroshare-gui/src/release/skin/VistaAlpha/maxButton2.png new file mode 100644 index 000000000..a9ece6da2 Binary files /dev/null and b/retroshare-gui/src/release/skin/VistaAlpha/maxButton2.png differ diff --git a/retroshare-gui/src/release/skin/VistaAlpha/minButton.png b/retroshare-gui/src/release/skin/VistaAlpha/minButton.png new file mode 100644 index 000000000..379bfa4cb Binary files /dev/null and b/retroshare-gui/src/release/skin/VistaAlpha/minButton.png differ diff --git a/retroshare-gui/src/release/skin/VistaAlpha/minButton1.png b/retroshare-gui/src/release/skin/VistaAlpha/minButton1.png new file mode 100644 index 000000000..79207e5df Binary files /dev/null and b/retroshare-gui/src/release/skin/VistaAlpha/minButton1.png differ diff --git a/retroshare-gui/src/release/skin/VistaAlpha/minButton2.png b/retroshare-gui/src/release/skin/VistaAlpha/minButton2.png new file mode 100644 index 000000000..b52bdb299 Binary files /dev/null and b/retroshare-gui/src/release/skin/VistaAlpha/minButton2.png differ diff --git a/retroshare-gui/src/release/skin/VistaAlpha/quiButton.png b/retroshare-gui/src/release/skin/VistaAlpha/quiButton.png new file mode 100644 index 000000000..e3882e9ff Binary files /dev/null and b/retroshare-gui/src/release/skin/VistaAlpha/quiButton.png differ diff --git a/retroshare-gui/src/release/skin/VistaAlpha/quiButton1.png b/retroshare-gui/src/release/skin/VistaAlpha/quiButton1.png new file mode 100644 index 000000000..008b25e2e Binary files /dev/null and b/retroshare-gui/src/release/skin/VistaAlpha/quiButton1.png differ diff --git a/retroshare-gui/src/release/skin/VistaAlpha/quiButton2.png b/retroshare-gui/src/release/skin/VistaAlpha/quiButton2.png new file mode 100644 index 000000000..3e79d9f08 Binary files /dev/null and b/retroshare-gui/src/release/skin/VistaAlpha/quiButton2.png differ diff --git a/retroshare-gui/src/release/skin/VistaAlpha/sl.png b/retroshare-gui/src/release/skin/VistaAlpha/sl.png new file mode 100644 index 000000000..82deb022e Binary files /dev/null and b/retroshare-gui/src/release/skin/VistaAlpha/sl.png differ diff --git a/retroshare-gui/src/release/skin/VistaAlpha/so.png b/retroshare-gui/src/release/skin/VistaAlpha/so.png new file mode 100644 index 000000000..677255b01 Binary files /dev/null and b/retroshare-gui/src/release/skin/VistaAlpha/so.png differ diff --git a/retroshare-gui/src/release/skin/VistaAlpha/sr.png b/retroshare-gui/src/release/skin/VistaAlpha/sr.png new file mode 100644 index 000000000..22f2e74fe Binary files /dev/null and b/retroshare-gui/src/release/skin/VistaAlpha/sr.png differ diff --git a/retroshare-gui/src/release/skin/VistaAlpha/su.png b/retroshare-gui/src/release/skin/VistaAlpha/su.png new file mode 100644 index 000000000..6f19cdc00 Binary files /dev/null and b/retroshare-gui/src/release/skin/VistaAlpha/su.png differ diff --git a/retroshare-gui/src/release/skin/skin.dat b/retroshare-gui/src/release/skin/skin.dat new file mode 100644 index 000000000..b71347157 --- /dev/null +++ b/retroshare-gui/src/release/skin/skin.dat @@ -0,0 +1,7 @@ +[Skin] +Blur=false +Hintergrundfarbe=@Variant(\0\0\0\x43\x1\xff\xff\xd5\xd5\xd5\xd5\xd5\xd5\0\0) +SkinOn=true +Skinpfad=skin/Bliss/ +Titelfarbe=@Variant(\0\0\0\x43\x1\xff\xff\0\0\0\0\0\0\0\0) +Titelschrift=@Variant(\0\0\0@\0\0\0\x1a\0\x43\0o\0m\0i\0\x63\0 \0S\0\x61\0n\0s\0 \0M\0S@$\0\0\0\0\0\0\xff\xff\xff\xff\x5\x1\0K\x10) diff --git a/retroshare-gui/src/retroshare.nsi b/retroshare-gui/src/retroshare.nsi new file mode 100644 index 000000000..7294d332c --- /dev/null +++ b/retroshare-gui/src/retroshare.nsi @@ -0,0 +1,193 @@ +; Script generated with the Venis Install Wizard & modified by defnax + +; Define your application name +!define APPNAME "RetroShare" +!define VERSION "0.3.52a" +!define APPNAMEANDVERSION "${APPNAME} ${VERSION}" + +; Main Install settings +Name "${APPNAMEANDVERSION}" +InstallDir "$PROGRAMFILES\RetroShare" +InstallDirRegKey HKLM "Software\${APPNAME}" "" +OutFile "RetroShare_${VERSION}_setup.exe" +BrandingText "${APPNAMEANDVERSION}" +; Use compression +SetCompressor LZMA + +; Modern interface settings +!include "MUI.nsh" + +!define MUI_ABORTWARNING +!define MUI_COMPONENTSPAGE_SMALLDESC +!define MUI_FINISHPAGE_RUN "$INSTDIR\RetroShare.exe" + +!insertmacro MUI_PAGE_WELCOME +!insertmacro MUI_PAGE_COMPONENTS +!insertmacro MUI_PAGE_DIRECTORY + +!insertmacro MUI_PAGE_INSTFILES + +!insertmacro MUI_PAGE_FINISH + +!insertmacro MUI_UNPAGE_CONFIRM +!insertmacro MUI_UNPAGE_INSTFILES + +; Set languages (first is default language) +!insertmacro MUI_LANGUAGE "English" +!insertmacro MUI_RESERVEFILE_LANGDLL + +LangString TEXT_FLocations_TITLE ${LANG_ENGLISH} "Choose Default Save Locations" +LangString TEXT_FLocations_SUBTITLE ${LANG_ENGLISH} "Choose the folders to save your downloads to." + +!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS + +Section "RetroShare Core" Section1 + + ; Set Section properties + SetOverwrite on + + ; Clears previous error logs + Delete "$INSTDIR\*.log" + + ; Set Section Files and Shortcuts + SetOutPath "$INSTDIR\" + File /r "release\*" + + +SectionEnd + +Section "RetroShare Data" Section1b + + ; Set Section properties + SetOverwrite on + + ; Set Section Files and Shortcuts + SetOutPath "$APPDATA\RetroShare\" + File /r "data\*" + + ; We're not ready for external skins... + ; Set Section qss + ; SetOutPath "$INSTDIR\qss\" + ; File /r release\qss\*.* + + ; Set Section skin + ; SetOutPath "$INSTDIR\skin\" + ; File /r release\skin\*.* + +SectionEnd + +Section "File Association" section2 + ; Delete any existing keys + + + ; Write the file association + WriteRegStr HKCR .pqi "" retroshare + WriteRegStr HKCR retroshare "" "PQI File" + WriteRegBin HKCR retroshare EditFlags 00000100 + WriteRegStr HKCR "retroshare\shell" "" open + WriteRegStr HKCR "retroshare\shell\open\command" "" `"$INSTDIR\RetroShare.exe" "%1"` + +SectionEnd + +Section "Start Menu Shortcuts" section3 + + SetOutPath "$INSTDIR" + CreateDirectory "$SMPROGRAMS\${APPNAME}" + CreateShortCut "$SMPROGRAMS\${APPNAME}\Uninstall.lnk" "$INSTDIR\uninstall.exe" "" "$INSTDIR\uninstall.exe" 0 + CreateShortCut "$SMPROGRAMS\${APPNAME}\${APPNAME}.lnk" "$INSTDIR\RetroShare.exe" "" "$INSTDIR\RetroShare.exe" 0 + +SectionEnd + +Section "Desktop Shortcuts" section4 + + CreateShortCut "$DESKTOP\${APPNAME}.lnk" "$INSTDIR\RetroShare.exe" "" "$INSTDIR\RetroShare.exe" 0 + +SectionEnd + +Section "Automatic Startup" section5 + + WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Run" "RetroRun" "$INSTDIR\${APPNAME}.exe -a" + +SectionEnd + +Section -FinishSection + + WriteRegStr HKLM "Software\${APPNAME}" "" "$INSTDIR" + WriteRegStr HKLM "Software\${APPNAME}" "Version" "${VERSION}" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "DisplayName" "${APPNAME}" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "UninstallString" "$INSTDIR\uninstall.exe" + WriteUninstaller "$INSTDIR\uninstall.exe" + +SectionEnd + +; Modern install component descriptions +!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN +!insertmacro MUI_DESCRIPTION_TEXT ${Section1} "RetroShare program files" +!insertmacro MUI_DESCRIPTION_TEXT ${Section1b} "RetroShare data files" +!insertmacro MUI_DESCRIPTION_TEXT ${Section2} "Associate RetroShare with .pqi file extension" +!insertmacro MUI_DESCRIPTION_TEXT ${Section3} "Create RetroShare Start Menu shortcuts" +!insertmacro MUI_DESCRIPTION_TEXT ${Section4} "Create RetroShare Desktop shortcut" +!insertmacro MUI_DESCRIPTION_TEXT ${Section5} "Auto-Run and Login at Startup" +!insertmacro MUI_FUNCTION_DESCRIPTION_END + +;Uninstall section +Section "Uninstall" + + ; Remove file association registry keys + DeleteRegKey HKCR .pqi + DeleteRegKey HKCR retroshare + + ; Remove program/uninstall regsitry keys + DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" + DeleteRegKey HKLM SOFTWARE\${APPNAME} + + DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Run" "RetroRun" + + ; Remove files and uninstaller + Delete $INSTDIR\RetroShare.exe + Delete $INSTDIR\*.dll + Delete $INSTDIR\*.dat + Delete $INSTDIR\*.txt + Delete $INSTDIR\*.ini + Delete $INSTDIR\*.log + + Delete $INSTDIR\uninstall.exe + + ; Remove the kadc.ini file. + ; Don't remove the directory, otherwise + ; we lose the XPGP keys. + ; Should make this an option though... + Delete $APPDATA\RetroShare\kadc.ini + + ; Remove shortcuts, if any + Delete "$SMPROGRAMS\${APPNAME}\*.*" + + ; Remove desktop icon + Delete "$DESKTOP\${APPNAME}.lnk" + + ; Remove directories used + RMDir "$SMPROGRAMS\${APPNAME}" + RMDir "$INSTDIR" + +SectionEnd + +Function .onInit + + + + ;This was written by Vytautas - http://nsis.sourceforge.net/archive/nsisweb.php?page=453 + System::Call 'kernel32::CreateMutexA(i 0, i 0, t "RetroShare") i .r1 ?e' + Pop $R0 + StrCmp $R0 0 +3 + MessageBox MB_OK "The ${APPNAME} installer is already running." + Abort + +FunctionEnd + + + + + + + +; eof diff --git a/retroshare-gui/src/rshare.cpp b/retroshare-gui/src/rshare.cpp new file mode 100644 index 000000000..8fd575adc --- /dev/null +++ b/retroshare-gui/src/rshare.cpp @@ -0,0 +1,285 @@ +/**************************************************************** + * Retroshare QT gui is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 +#include +#include +#include +#include +#include "config/rsharesettings.h" + +#include "rshare.h" + +/* Available command-line arguments. */ +#define ARG_LANGUAGE "lang" /**< Argument specifying language. */ +#define ARG_GUISTYLE "style" /**< Argument specfying GUI style. */ +#define ARG_RESET "reset" /**< Reset Rshare's saved settings. */ +#define ARG_DATADIR "datadir" /**< Directory to use for data files. */ + + +/* Static member variables */ +QMap Rshare::_args; /**< List of command-line arguments. */ +QString Rshare::_style; /**< The current GUI style. */ +QString Rshare::_language; /**< The current language. */ +bool Rshare::useConfigDir; +QString Rshare::configDir; + + + +/** Constructor. Parses the command-line arguments, resets Rshare's + * configuration (if requested), and sets up the GUI style and language + * translation. */ +Rshare::Rshare(QStringList args, int &argc, char **argv, QString dir) +: QApplication(argc, argv) +{ + /* Read in all our command-line arguments. */ + parseArguments(args); + + /* Check if we're supposed to reset our config before proceeding. */ + if (_args.contains(ARG_RESET)) { + RshareSettings settings; + settings.reset(); + } + + /* config directory */ + useConfigDir = false; + if (dir != "") + { + setConfigDirectory(dir); + } + + /** Initialize support for language translations. */ + LanguageSupport::initialize(); + + /** Translate the GUI to the appropriate language. */ + setLanguage(_args.value(ARG_LANGUAGE)); + + /** Set the GUI style appropriately. */ + setStyle(_args.value(ARG_GUISTYLE)); + +} + +/** Destructor */ +Rshare::~Rshare() +{ + // delete _help; + //delete _torControl; +} + +#if defined(Q_OS_WIN) +/** On Windows, we need to catch the WM_QUERYENDSESSION message + * so we know that it is time to shutdown. */ +bool +Rshare::winEventFilter(MSG *msg, long *result) +{ + if (msg->message == WM_QUERYENDSESSION) { + emit shutdown(); + } + return QApplication::winEventFilter(msg, result); +} +#endif + +/** Display usage information regarding command-line arguments. */ +void +Rshare::printUsage(QString errmsg) +{ + QTextStream out(stdout); + + /* If there was an error message, print it out. */ + if (!errmsg.isEmpty()) { + out << "** " << errmsg << " **" << endl << endl; + } + + /* Now print the application usage */ + out << "Usage: " << endl; + out << "\t" << qApp->arguments().at(0) << " [options]" << endl; + + /* And available options */ + out << endl << "Available Options:" << endl; + out << "\t-"ARG_RESET"\t\tResets ALL stored Rshare settings." << endl; + out << "\t-"ARG_DATADIR"\tSets the directory Rshare uses for data files"<< endl; + out << "\t-"ARG_GUISTYLE"\t\tSets Rshare's interface style." << endl; + out << "\t\t\t[" << QStyleFactory::keys().join("|") << "]" << endl; + out << "\t-"ARG_LANGUAGE"\t\tSets Rshare's language." << endl; + out << "\t\t\t[" << LanguageSupport::languageCodes().join("|") << "]" << endl; +} + +/** Returns true if the specified argument expects a value. */ +bool +Rshare::argNeedsValue(QString argName) +{ + return (argName == ARG_GUISTYLE || + argName == ARG_LANGUAGE || + argName == ARG_DATADIR); + +} + +/** Parses the list of command-line arguments for their argument names and + * values. */ +void +Rshare::parseArguments(QStringList args) +{ + QString arg, value; + + /* Loop through all command-line args/values and put them in a map */ + for (int i = 0; i < args.size(); i++) { + /* Get the argument name and set a blank value */ + arg = args.at(i).toLower(); + value = ""; + + /* Check if it starts with a - or -- */ + if (arg.startsWith("-")) { + arg = arg.mid((arg.startsWith("--") ? 2 : 1)); + } + /* Check if it takes a value and there is one on the command-line */ + if (i < args.size()-1 && argNeedsValue(arg)) { + value = args.at(++i); + } + /* Place this arg/value in the map */ + _args.insert(arg, value); + } +} + +/** Verifies that all specified arguments were valid. */ +bool +Rshare::validateArguments(QString &errmsg) +{ + /* If they want help, just return false now + if (_args.contains(ARG_HELP)) { + return false; + }*/ + /* Check for a language that Rshare recognizes. */ + if (_args.contains(ARG_LANGUAGE) && + !LanguageSupport::isValidLanguageCode(_args.value(ARG_LANGUAGE))) { + errmsg = tr("Invalid language code specified: ") + _args.value(ARG_LANGUAGE); + return false; + } + /* Check for a valid GUI style */ + if (_args.contains(ARG_GUISTYLE) && + !QStyleFactory::keys().contains(_args.value(ARG_GUISTYLE), + Qt::CaseInsensitive)) { + errmsg = tr("Invalid GUI style specified: ") + _args.value(ARG_GUISTYLE); + return false; + } + return true; +} + +/** Sets the translation Rshare will use. If one was specified on the + * command-line, we will use that. Otherwise, we'll check to see if one was + * saved previously. If not, we'll default to one appropriate for the system + * locale. */ +bool +Rshare::setLanguage(QString languageCode) +{ + /* If the language code is empty, use the previously-saved setting */ + if (languageCode.isEmpty()) { + RshareSettings settings; + languageCode = settings.getLanguageCode(); + } + /* Translate into the desired langauge */ + if (LanguageSupport::translate(languageCode)) { + _language = languageCode; + return true; + } + return false; +} + +/** Sets the GUI style Rshare will use. If one was specified on the + * command-line, we will use that. Otherwise, we'll check to see if one was + * saved previously. If not, we'll default to one appropriate for the + * operating system. */ +bool +Rshare::setStyle(QString styleKey) +{ + /* If no style was specified, use the previously-saved setting */ + if (styleKey.isEmpty()) { + RshareSettings settings; + styleKey = settings.getInterfaceStyle(); + } + /* Apply the specified GUI style */ + if (QApplication::setStyle(styleKey)) { + _style = styleKey; + return true; + } + return false; +} + +/** Displays the help page associated with the specified topic. If no topic is + * specified, then the default help page will be displayed. */ +/**void +Rshare::help(QString topic) +{ + _help->show(topic); +}*/ + +/** Returns the directory RetroShare uses for its data files. */ +QString +Rshare::dataDirectory() +{ + if (useConfigDir) + { + return configDir; + } + else if (_args.contains(ARG_DATADIR)) { + return _args.value(ARG_DATADIR); + } + return defaultDataDirectory(); +} + +/** Returns the default location of RetroShare's data directory. */ +QString +Rshare::defaultDataDirectory() +{ +#if defined(Q_OS_WIN32) + return (win32_app_data_folder() + "\\RetroShare"); +#else + return (QDir::homePath() + "/.RetroShare"); +#endif +} + +/** Creates Rshare's data directory, if it doesn't already exist. */ +bool +Rshare::createDataDirectory(QString *errmsg) +{ + QDir datadir(dataDirectory()); + if (!datadir.exists()) { + QString path = datadir.absolutePath(); + if (!datadir.mkpath(path)) { + return err(errmsg, + QString("Could not create data directory: %1").arg(path)); + } + } + return true; +} + + +/** Set Rshare's data directory - externally */ +bool Rshare::setConfigDirectory(QString dir) +{ + useConfigDir = true; + configDir = dir; + return true; +} + + + diff --git a/retroshare-gui/src/rshare.h b/retroshare-gui/src/rshare.h new file mode 100644 index 000000000..b6bc40de2 --- /dev/null +++ b/retroshare-gui/src/rshare.h @@ -0,0 +1,111 @@ +/**************************************************************** + * Retroshare QT Gui is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 _RSHARE_H +#define _RSHARE_H + +#if defined(Q_OS_WIN) +#include +#include +#endif + +#include +#include +#include + + +/** Rshare's version string */ +#define RSHARE_VERSION "0.7" + + +class Rshare : public QApplication +{ + Q_OBJECT + +public: + /** Constructor. */ + Rshare(QStringList args, int &argc, char **argv, QString dir); + /** Destructor. */ + ~Rshare(); + + /** Return the map of command-line arguments and values. */ + static QMap arguments() { return _args; } + /** Validates that all arguments were well-formed. */ + bool validateArguments(QString &errmsg); + /** Prints usage information to the given text stream. */ + void printUsage(QString errmsg = QString()); + + /** Sets the current language. */ + static bool setLanguage(QString languageCode = QString()); + /** Sets the current GUI style. */ + static bool setStyle(QString styleKey = QString()); + /** Shows the specified help topic, or the default if empty. */ + //static void help(QString topic = QString()); + + /** Returns the current language. */ + static QString language() { return _language; } + /** Returns the current GUI style. */ + static QString style() { return _style; } + /** Returns Rshare's application version. */ + static QString version() { return RSHARE_VERSION; } + + /** Returns Rshare's main TorControl object. */ +// static TorControl* torControl() { return _torControl; } + + /** Returns the location Rshare uses for its data files. */ + static QString dataDirectory(); + /** Returns the default location of Rshare's data directory. */ + static QString defaultDataDirectory(); + /** Creates Rshare's data directory, if it doesn't already exist. */ + static bool createDataDirectory(QString *errmsg); + + /** Creates Rshare's data directory, if it doesn't already exist. */ + static bool setConfigDirectory(QString dir); + +signals: + /** Signals that the application needs to shutdown now. */ + void shutdown(); + +protected: +#if defined(Q_OS_WIN) + /** Filters Windows events, looking for events of interest */ + bool winEventFilter(MSG *msg, long *result); +#endif + +private: + /** Parse the list of command-line arguments. */ + void parseArguments(QStringList args); + /** Returns true if the specified arguments wants a value. */ + bool argNeedsValue(QString argName); + + static QMap _args; /**< List of command-line arguments. */ + static QString _style; /**< The current GUI style. */ + static QString _language; /**< The current language. */ + + static bool useConfigDir; + static QString configDir; + +}; + +#endif + diff --git a/retroshare-gui/src/rsiface/RemoteDirModel.cpp b/retroshare-gui/src/rsiface/RemoteDirModel.cpp new file mode 100644 index 000000000..02e71b4b2 --- /dev/null +++ b/retroshare-gui/src/rsiface/RemoteDirModel.cpp @@ -0,0 +1,694 @@ + +#include "RemoteDirModel.h" +#include "rsiface.h" +#include + + +#include +#include +#include + + + bool RemoteDirModel::hasChildren(const QModelIndex &parent) const + { + +#ifdef RDM_DEBUG + std::cerr << "RemoteDirModel::hasChildren() :" << parent.internalPointer(); + std::cerr << ": "; +#endif + + if (!parent.isValid()) + { +#ifdef RDM_DEBUG + std::cerr << "root -> true "; + std::cerr << std::endl; +#endif + return true; + } + + void *ref = parent.internalPointer(); + + DirDetails details; + uint32_t flags = DIR_FLAGS_CHILDREN; + if (RemoteMode) + flags |= DIR_FLAGS_REMOTE; + else + flags |= DIR_FLAGS_LOCAL; + + if (!rsicontrol->RequestDirDetails(ref, details, flags)) + { + /* error */ +#ifdef RDM_DEBUG + std::cerr << "lookup failed -> false"; + std::cerr << std::endl; +#endif + return false; + } + + if (details.type == DIR_TYPE_FILE) + { +#ifdef RDM_DEBUG + std::cerr << "lookup FILE -> false"; + std::cerr << std::endl; +#endif + return false; + } + /* PERSON/DIR*/ +#ifdef RDM_DEBUG + std::cerr << "lookup PER/DIR #" << details.count; + std::cerr << std::endl; +#endif + return (details.count > 0); /* do we have children? */ + } + + + int RemoteDirModel::rowCount(const QModelIndex &parent) const + { +#ifdef RDM_DEBUG + std::cerr << "RemoteDirModel::rowCount(): " << parent.internalPointer(); + std::cerr << ": "; +#endif + + void *ref = NULL; + if (parent.isValid()) + { + ref = parent.internalPointer(); + } + + DirDetails details; + uint32_t flags = DIR_FLAGS_CHILDREN; + if (RemoteMode) + flags |= DIR_FLAGS_REMOTE; + else + flags |= DIR_FLAGS_LOCAL; + + if (!rsicontrol->RequestDirDetails(ref, details, flags)) + { +#ifdef RDM_DEBUG + std::cerr << "lookup failed -> 0"; + std::cerr << std::endl; +#endif + return 0; + } + if (details.type == DIR_TYPE_FILE) + { +#ifdef RDM_DEBUG + std::cerr << "lookup FILE: 0"; + std::cerr << std::endl; +#endif + return 0; + } + + /* else PERSON/DIR*/ +#ifdef RDM_DEBUG + std::cerr << "lookup PER/DIR #" << details.count; + std::cerr << std::endl; +#endif + + return details.count; + } + + int RemoteDirModel::columnCount(const QModelIndex &parent) const + { + return 4; + } + + QVariant RemoteDirModel::data(const QModelIndex &index, int role) const + { +#ifdef RDM_DEBUG + std::cerr << "RemoteDirModel::data(): " << index.internalPointer(); + std::cerr << ": "; + std::cerr << std::endl; +#endif + + if (!index.isValid()) + return QVariant(); + + /* get the data from the index */ + void *ref = index.internalPointer(); + int coln = index.column(); + + DirDetails details; + uint32_t flags = DIR_FLAGS_DETAILS; + if (RemoteMode) + flags |= DIR_FLAGS_REMOTE; + else + flags |= DIR_FLAGS_LOCAL; + + if (!rsicontrol->RequestDirDetails(ref, details, flags)) + { + return QVariant(); + } + + if (role == Qt::BackgroundRole) + { + /*** colour entries based on rank/age/count **/ + /*** rank (0-10) ***/ + uint32_t r = details.rank; + if (r > 10) r = 10; + r = 200 + r * 5; /* 0->250 */ + + /*** age: log2(age) *** + * 1 hour = 3,600 - 250 + * 1 day = 86,400 - 200 + * 1 week = 604,800 - 100 + * 1 month = 2,419,200 - 50 + * + * + * 250 - log2( 1 + (age / 100) ) * 10 + * 0 => 1 => 0 => 0 => 250 + * 900 => 10 => 3.2 => 32 => 220 + * 3600 => 37 => 5.2 => 52 => 200 + * 86400 => 865 => 9.2 => 92 => 160 + * 604800 => 6049 => 12.3 => 120 => 130 + * 2419200 => 24193 => 14.4 => 140 => 110 + * + * value log2 + * + * 1 0 + * 2 1 + * 4 2 + * 8 3 + * 16 4 + * 32 5 + * 64 6 + * 128 7 + * 256 8 + * 512 9 + * 1024 10 + * 2048 11 + * 4096 12 + * 8192 13 + * 16384 14 + * 32K 15 + * + */ + + uint32_t g = (uint32_t) log2 ( 1.0 + ( details.age / 100 ) ) * 4; + if (g > 250) g = 250; + g = 250 - g; + + if (details.type == DIR_TYPE_PERSON) + { + return QVariant(); + } + else if (details.type == DIR_TYPE_DIR) + { + uint32_t b = 200 + details.count; + if (b > 250) b = 250; + + QBrush brush(QColor(r,g,b)); + return brush; + } + else if (details.type == DIR_TYPE_FILE) + { + uint32_t b = (uint32_t) (200 + 2 * log2(details.count)); + if (b > 250) b = 250; + + QBrush brush(QColor(r,g,b)); + return brush; + } + else + { + return QVariant(); + } + } + + /************* + Qt::EditRole + Qt::ToolTipRole + Qt::StatusTipRole + Qt::WhatsThisRole + Qt::SizeHintRole + ****************/ + + if (role == Qt::DisplayRole) + { + + /* + * Person: name, id, 0, 0; + * File : name, size, rank, (0) ts + * Dir : name, (0) count, (0) path, (0) ts + */ + + + if (details.type == DIR_TYPE_PERSON) /* Person */ + { + switch(coln) + { + case 0: + return QString::fromStdString(details.name); + break; + case 1: + //return QString(""); + return QString::fromStdString(details.id); + break; + default: + //return QString(""); + return QString::fromStdString("P"); + break; + } + } + else if (details.type == DIR_TYPE_FILE) /* File */ + { + switch(coln) + { + case 0: + return QString::fromStdString(details.name); + break; + case 1: + { + std::ostringstream out; + out << details.count; + return QString::fromStdString(out.str()); + } + break; + case 2: + { + std::ostringstream out; + out << details.rank; + return QString::fromStdString(out.str()); + } + break; + case 3: + { + std::ostringstream out; + out << details.age; + return QString::fromStdString(out.str()); + } + break; + default: + return QString::fromStdString("FILE"); + break; + } + } + else if (details.type == DIR_TYPE_DIR) /* Dir */ + { + switch(coln) + { + case 0: + return QString::fromStdString(details.name); + break; + case 1: + //return QString(""); + { + std::ostringstream out; + out << details.count; + return QString::fromStdString(out.str()); + } + break; + case 2: + //return QString(""); + return QString::fromStdString(details.path); + break; + + default: + return QString::fromStdString("DIR"); + break; + } + } + } /* end of DisplayRole */ + return QVariant(); + } + + QVariant RemoteDirModel::headerData(int section, Qt::Orientation orientation, + int role) const + { + if (role == Qt::SizeHintRole) + { + int defw = 50; + int defh = 30; + if (section < 2) + { + defw = 200; + } + return QSize(defw, defh); + } + + if (role != Qt::DisplayRole) + return QVariant(); + + if (orientation == Qt::Horizontal) + { + switch(section) + { + case 0: + if (RemoteMode) + { + return QString("Remote Directories"); + } + else + { + return QString("Local Directories"); + } + break; + case 1: + return QString("Size"); + break; + case 2: + return QString("Rank"); + break; + case 3: + return QString("Age"); + break; + } + return QString("Column %1").arg(section); + } + else + return QString("Row %1").arg(section); + } + + QModelIndex RemoteDirModel::index(int row, int column, + const QModelIndex & parent) const + { +#ifdef RDM_DEBUG + std::cerr << "RemoteDirModel::index(): " << parent.internalPointer(); + std::cerr << ": row:" << row << " col:" << column << " "; +#endif + + void *ref = NULL; + + if (parent.isValid()) + { + ref = parent.internalPointer(); + } + + /******** + if (!RemoteMode) + { + remote = &(rsiface->getLocalDirectoryList()); + } + ********/ + + DirDetails details; + uint32_t flags = DIR_FLAGS_CHILDREN; + if (RemoteMode) + flags |= DIR_FLAGS_REMOTE; + else + flags |= DIR_FLAGS_LOCAL; + + if (!rsicontrol->RequestDirDetails(ref, details, flags)) + { +#ifdef RDM_DEBUG + std::cerr << "lookup failed -> invalid"; + std::cerr << std::endl; +#endif + return QModelIndex(); + } + + /* now iterate through the details to + * get the reference number + */ + + std::list::iterator it; + int i = 0; + for(it = details.children.begin(); + (i < row) && (it != details.children.end()); it++, i++); + + if (it == details.children.end()) + { +#ifdef RDM_DEBUG + std::cerr << "wrong number of children -> invalid"; + std::cerr << std::endl; +#endif + return QModelIndex(); + } + +#ifdef RDM_DEBUG + std::cerr << "success index(" << row << "," << column << "," << it->ref << ")"; + std::cerr << std::endl; +#endif + + /* we can just grab the reference now */ + QModelIndex qmi = createIndex(row, column, it->ref); + return qmi; + } + + + QModelIndex RemoteDirModel::parent( const QModelIndex & index ) const + { +#ifdef RDM_DEBUG + std::cerr << "RemoteDirModel::parent(): " << index.internalPointer(); + std::cerr << ": "; +#endif + + /* create the index */ + if (!index.isValid()) + { +#ifdef RDM_DEBUG + std::cerr << "Invalid Index -> invalid"; + std::cerr << std::endl; +#endif + /* Parent is invalid too */ + return QModelIndex(); + } + void *ref = index.internalPointer(); + + DirDetails details; + uint32_t flags = DIR_FLAGS_PARENT; + if (RemoteMode) + flags |= DIR_FLAGS_REMOTE; + else + flags |= DIR_FLAGS_LOCAL; + + if (!rsicontrol->RequestDirDetails(ref, details, flags)) + { +#ifdef RDM_DEBUG + std::cerr << "Failed Lookup -> invalid"; + std::cerr << std::endl; +#endif + return QModelIndex(); + } + + if (!(details.parent)) + { +#ifdef RDM_DEBUG + std::cerr << "success. parent is Root/NULL --> invalid"; + std::cerr << std::endl; +#endif + return QModelIndex(); + } + +#ifdef RDM_DEBUG + std::cerr << "success index(" << details.prow << ",0," << details.parent << ")"; + std::cerr << std::endl; + +#endif + return createIndex(details.prow, 0, details.parent); + } + + Qt::ItemFlags RemoteDirModel::flags( const QModelIndex & index ) const + { +#ifdef RDM_DEBUG + std::cerr << "RemoteDirModel::flags()"; + std::cerr << std::endl; +#endif + + if (!index.isValid()) + return (Qt::ItemIsSelectable); // Error. + + void *ref = index.internalPointer(); + + DirDetails details; + uint32_t flags = DIR_FLAGS_DETAILS; + if (RemoteMode) + flags |= DIR_FLAGS_REMOTE; + else + flags |= DIR_FLAGS_LOCAL; + + if (!rsicontrol->RequestDirDetails(ref, details, flags)) + { + return (Qt::ItemIsSelectable); // Error. + } + + if (details.type == DIR_TYPE_PERSON) + { + return (Qt::ItemIsEnabled); + } + else if (details.type == DIR_TYPE_DIR) + { + return ( Qt::ItemIsSelectable | + Qt::ItemIsEnabled); + +// Qt::ItemIsDragEnabled | +// Qt::ItemIsDropEnabled | + + } + else // (details.type == DIR_TYPE_FILE) + { + return ( Qt::ItemIsSelectable | + Qt::ItemIsEnabled); + +// Qt::ItemIsDragEnabled | + + } +} + +// The other flags... +//Qt::ItemIsUserCheckable +//Qt::ItemIsEditable +//Qt::ItemIsDropEnabled +//Qt::ItemIsTristate + + + +/* Callback from */ + void RemoteDirModel::preMods() + { + std::cerr << "RemoteDirModel::preMods()" << std::endl; + //modelAboutToBeReset(); + reset(); + layoutAboutToBeChanged(); + } + +/* Callback from */ + void RemoteDirModel::postMods() + { + std::cerr << "RemoteDirModel::postMods()" << std::endl; + //modelReset(); + layoutChanged(); + //reset(); + } + + +void RemoteDirModel::update (const QModelIndex &index ) +{ + //std::cerr << "Directory Request(" << id << ") : "; + //std::cerr << path << std::endl; + //rsicontrol -> RequestDirectories(id, path, 1); +} + +void RemoteDirModel::downloadSelected(QModelIndexList list) +{ + if (!RemoteMode) + { + std::cerr << "Cannot download from local" << std::endl; + } + + /* so for all the selected .... get the name out, + * make it into something the RsControl can understand + */ + + /* Fire off requests */ + QModelIndexList::iterator it; + for(it = list.begin(); it != list.end(); it++) + { + void *ref = it -> internalPointer(); + + DirDetails details; + uint32_t flags = DIR_FLAGS_DETAILS; + if (RemoteMode) + { + flags |= DIR_FLAGS_REMOTE; + } + else + { + flags |= DIR_FLAGS_LOCAL; + continue; /* don't try to download local stuff */ + } + + if (!rsicontrol->RequestDirDetails(ref, details, flags)) + { + continue; + } + /* only request if it is a file */ + if (details.type == DIR_TYPE_FILE) + { + rsicontrol -> FileRequest(details.name, details.hash, + details.count, ""); + } + } +} + + +void RemoteDirModel::recommendSelected(QModelIndexList list) +{ + std::cerr << "recommendSelected()" << std::endl; + if (RemoteMode) + { + std::cerr << "Cannot recommend remote! (should download)" << std::endl; + } + /* Fire off requests */ + QModelIndexList::iterator it; + for(it = list.begin(); it != list.end(); it++) + { + void *ref = it -> internalPointer(); + + DirDetails details; + uint32_t flags = DIR_FLAGS_DETAILS; + if (RemoteMode) + { + flags |= DIR_FLAGS_REMOTE; + continue; /* don't recommend remote stuff */ + } + else + { + flags |= DIR_FLAGS_LOCAL; + } + + if (!rsicontrol->RequestDirDetails(ref, details, flags)) + { + continue; + } + + std::cerr << "::::::::::::FileRecommend:::: " << std::endl; + std::cerr << "Name: " << details.name << std::endl; + std::cerr << "Hash: " << details.hash << std::endl; + std::cerr << "Size: " << details.count << std::endl; + std::cerr << "Path: " << details.path << std::endl; + + rsicontrol -> FileRecommend(details.name, details.hash, details.count); + } + std::cerr << "::::::::::::Done FileRecommend" << std::endl; +} + + +void RemoteDirModel::recommendSelectedOnly(QModelIndexList list) +{ + std::cerr << "recommendSelectedOnly()" << std::endl; + if (RemoteMode) + { + std::cerr << "Cannot recommend remote! (should download)" << std::endl; + } + rsicontrol->ClearInRecommend(); + + /* Fire off requests */ + QModelIndexList::iterator it; + for(it = list.begin(); it != list.end(); it++) + { + void *ref = it -> internalPointer(); + + DirDetails details; + uint32_t flags = DIR_FLAGS_DETAILS; + if (RemoteMode) + { + flags |= DIR_FLAGS_REMOTE; + continue; /* don't recommend remote stuff */ + } + else + { + flags |= DIR_FLAGS_LOCAL; + } + + if (!rsicontrol->RequestDirDetails(ref, details, flags)) + { + continue; + } + + std::cerr << "::::::::::::FileRecommend:::: " << std::endl; + std::cerr << "Name: " << details.name << std::endl; + std::cerr << "Hash: " << details.hash << std::endl; + std::cerr << "Size: " << details.count << std::endl; + std::cerr << "Path: " << details.path << std::endl; + + rsicontrol -> FileRecommend(details.name, details.hash, details.count); + rsicontrol -> SetInRecommend(details.name, true); + } + std::cerr << "::::::::::::Done FileRecommend" << std::endl; +} + +void RemoteDirModel::openSelected(QModelIndexList list) +{ + recommendSelected(list); +} + diff --git a/retroshare-gui/src/rsiface/RemoteDirModel.h b/retroshare-gui/src/rsiface/RemoteDirModel.h new file mode 100644 index 000000000..42a7a124f --- /dev/null +++ b/retroshare-gui/src/rsiface/RemoteDirModel.h @@ -0,0 +1,93 @@ +#ifndef REMOTE_DIR_MODEL +#define REMOTE_DIR_MODEL + +#include +#include + +class RemoteDirModel : public QAbstractItemModel + { + Q_OBJECT + + public: + RemoteDirModel(bool mode, QObject *parent = 0) + : QAbstractItemModel(parent), + RemoteMode(mode), + nIndex(1), indexSet(1) /* ass zero index cant be used */ + {} + + /* These are all overloaded Virtual Functions */ + int rowCount(const QModelIndex &parent = QModelIndex()) const; + int columnCount(const QModelIndex &parent = QModelIndex()) const; + + QVariant data(const QModelIndex &index, int role) const; + QVariant headerData(int section, Qt::Orientation orientation, + int role = Qt::DisplayRole) const; + + QModelIndex index(int row, int column, + const QModelIndex & parent = QModelIndex() ) const; + QModelIndex parent ( const QModelIndex & index ) const; + + Qt::ItemFlags flags ( const QModelIndex & index ) const; + bool hasChildren(const QModelIndex & parent = QModelIndex()) const; + + /* Callback from Core */ + void preMods(); + void postMods(); + + /* Callback from GUI */ + void downloadSelected(QModelIndexList list); + void recommendSelected(QModelIndexList list); + void recommendSelectedOnly(QModelIndexList list); + void openSelected(QModelIndexList list); + + public slots: + + void collapsed ( const QModelIndex & index ) { update(index); } + void expanded ( const QModelIndex & index ) { update(index); } + + private: + void update (const QModelIndex &index ); + + class RemoteIndex + { + public: + RemoteIndex() {} + RemoteIndex(std::string in_person, + std::string in_path, + int in_idx, + int in_row, + int in_column, + std::string in_name, + int in_size, + int in_type, + int in_ts, int in_rank) + :id(in_person), path(in_path), parent(in_idx), + row(in_row), column(in_column), + name(in_name), size(in_size), + type(in_type), timestamp(in_ts), rank(in_rank) + { + return; + } + + std::string id; + std::string path; + int parent; + int row; + int column; + + /* display info */ + std::string name; + int size; + int type; + int timestamp; + int rank; + + }; + + bool RemoteMode; + + mutable int nIndex; + mutable std::vector indexSet; + }; + +#endif diff --git a/retroshare-gui/src/rsiface/notifyqt.cpp b/retroshare-gui/src/rsiface/notifyqt.cpp new file mode 100644 index 000000000..908fb17e9 --- /dev/null +++ b/retroshare-gui/src/rsiface/notifyqt.cpp @@ -0,0 +1,372 @@ + +#include "rsiface/notifyqt.h" + +#include "gui/NetworkDialog.h" +#include "gui/PeersDialog.h" +#include "gui/SharedFilesDialog.h" +#include "gui/TransfersDialog.h" +#include "gui/ChatDialog.h" +#include "gui/MessagesDialog.h" +#include "gui/ChannelsDialog.h" +#include "gui/MessengerWindow.h" + +#include +#include + +void NotifyQt::notifyErrorMsg(int list, int type, std::string msg) +{ + (void) list; + (void) type; + (void) msg; + + return; +} + +void NotifyQt::notifyChat() +{ + return; +} + +void NotifyQt::notifyListChange(int list, int type) +{ + (void) type; + std::cerr << "NotifyQt::notifyListChange()" << std::endl; + switch(list) + { + case NOTIFY_LIST_NEIGHBOURS: + //displayNeighbours(); + break; + case NOTIFY_LIST_FRIENDS: + //displayFriends(); + break; + case NOTIFY_LIST_DIRLIST: + displayDirectories(); + break; + case NOTIFY_LIST_SEARCHLIST: + //displaySearch(); + break; + case NOTIFY_LIST_MESSAGELIST: + //displayMessages(); + break; + case NOTIFY_LIST_CHANNELLIST: + //displayChannels(); + break; + case NOTIFY_LIST_TRANSFERLIST: + //displayTransfers(); + break; + default: + break; + } + return; +} + + +void NotifyQt::notifyListPreChange(int list, int type) +{ + std::cerr << "NotifyQt::notifyListPreChange()" << std::endl; + switch(list) + { + case NOTIFY_LIST_NEIGHBOURS: + //preDisplayNeighbours(); + break; + case NOTIFY_LIST_FRIENDS: + //preDisplayFriends(); + break; + case NOTIFY_LIST_DIRLIST: + preDisplayDirectories(); + break; + case NOTIFY_LIST_SEARCHLIST: + //preDisplaySearch(); + break; + case NOTIFY_LIST_MESSAGELIST: + //preDisplayMessages(); + break; + case NOTIFY_LIST_CHANNELLIST: + //preDisplayChannels(); + break; + case NOTIFY_LIST_TRANSFERLIST: + //preDisplayTransfers(); + break; + default: + break; + } + return; +} + + /* New Timer Based Update scheme ... + * means correct thread seperation + * + * uses Flags, to detect changes + */ + +void NotifyQt::UpdateGUI() +{ + iface->lockData(); /* Lock Interface */ + + /* make local -> so we can release iface */ + bool uNeigh = iface->hasChanged(RsIface::Neighbour); + bool uFri = iface->hasChanged(RsIface::Friend); + bool uTrans = iface->hasChanged(RsIface::Transfer); + bool uChat = iface->hasChanged(RsIface::Chat); + bool uMsg = iface->hasChanged(RsIface::Message); + bool uChan = iface->hasChanged(RsIface::Channel); + bool uRecom = iface->hasChanged(RsIface::Recommend); + bool uConf = iface->hasChanged(RsIface::Config); + + iface->unlockData(); /* UnLock Interface */ + + if (uNeigh) + displayNeighbours(); + + if (uFri) + displayFriends(); + + if (uTrans) + displayTransfers(); + + if (uChat) + displayChat(); + + if (uMsg) + displayMessages(); + + if (uChan) + displayChannels(); + + /* TODO + if (uRecom) + displayRecommends(); + + if (uConf) + displayConfig(); + */ + +} + + + + +void NotifyQt::displayNeighbours() +{ + iface->lockData(); /* Lock Interface */ + + std::map::const_iterator it; + const std::map &neighs = iface->getNeighbourMap(); + + std::ostringstream out; + for(it = neighs.begin(); it != neighs.end(); it++) + { + out << "Neighbour: "; + out << it ->second.name << " "; + out << it ->second.status << " "; + out << it ->second.trustLvl << " "; + out << std::endl; + } + std::cerr << out.str(); + + iface->unlockData(); /* UnLock Interface */ + + /* Do the GUI */ + if (cDialog) + cDialog->insertConnect(); +} + +void NotifyQt::displayFriends() +{ + iface->lockData(); /* Lock Interface */ + + std::map::const_iterator it; + const std::map &friends = iface->getFriendMap(); + + std::ostringstream out; + for(it = friends.begin(); it != friends.end(); it++) + { + out << "Friend: "; + out << it->second.name << " "; + out << it->second.status << " "; + out << it->second.trustLvl << " "; + out << std::endl; + } + std::cerr << out.str(); + + iface->unlockData(); /* UnLock Interface */ + + if (pDialog) + pDialog->insertPeers(); + if (mWindow) + mWindow->insertPeers(); +} + + + + + +void NotifyQt::preDisplayDirectories() +{ + //iface->lockData(); /* Lock Interface */ + + std::ostringstream out; + out << "NotifyQt::preDisplayDirectories()" << std::endl; + + std::cerr << out.str(); + + //iface->unlockData(); /* UnLock Interface */ + + if (dDialog) + { + dDialog->preModDirectories(false); /* Remote */ + dDialog->preModDirectories(true); /* Local */ + } +} + + +void NotifyQt::displayDirectories() +{ + //iface->lockData(); /* Lock Interface */ + + std::ostringstream out; + out << "NotifyQt::displayDirectories()" << std::endl; + + std::cerr << out.str(); + + //iface->unlockData(); /* UnLock Interface */ + + + if (dDialog) + { + dDialog->ModDirectories(false); /* Remote */ + dDialog->ModDirectories(true); /* Local */ + } +} + + +void NotifyQt::displaySearch() +{ + iface->lockData(); /* Lock Interface */ + + std::ostringstream out; + std::cerr << out.str(); + + iface->unlockData(); /* UnLock Interface */ +} + + +void NotifyQt::displayMessages() +{ + iface->lockData(); /* Lock Interface */ + + std::ostringstream out; + std::cerr << out.str(); + + std::list::const_iterator it; + const std::list &msgs = iface->getMessages(); + + std::list::const_iterator fit; + int i; + + for(it = msgs.begin(); it != msgs.end(); it++) + { + out << "Message: "; + out << it->title << std::endl; + out << "\t" << it->msg << std::endl; + const std::list &files = it -> files; + for(fit = files.begin(), i = 1; fit != files.end(); fit++, i++) + { + out << "\t\tFile(" << i << ") " << fit->fname << std::endl; + } + out << std::endl; + } + + iface->unlockData(); /* UnLock Interface */ + + + if (mDialog) + mDialog -> insertMessages(); +} + +void NotifyQt::displayChat() +{ + iface->lockData(); /* Lock Interface */ + + std::ostringstream out; + std::cerr << out.str(); + + iface->unlockData(); /* UnLock Interface */ + + if (hDialog) + hDialog -> insertChat(); +} + + +void NotifyQt::displayChannels() +{ + iface->lockData(); /* Lock Interface */ + + std::ostringstream out; + std::cerr << out.str(); + + iface->unlockData(); /* UnLock Interface */ + + if (sDialog) + sDialog -> insertChannels(); +} + + +void NotifyQt::displayTransfers() +{ + iface->lockData(); /* Lock Interface */ + + std::list::const_iterator it; + const std::list &tlist = iface->getTransferList(); + + for(it = tlist.begin(); it != tlist.end(); it++) + { + std::ostringstream out; + out << "Transfer: "; + out << it ->fname << " "; + out << it ->path << " "; + out << std::endl; + std::cerr << out.str(); + } + + iface->unlockData(); /* UnLock Interface */ + + /* Do the GUI */ + if (tDialog) + tDialog->insertTransfers(); +} + + +void NotifyQt::preDisplayNeighbours() +{ + +} + +void NotifyQt::preDisplayFriends() +{ + +} + +void NotifyQt::preDisplaySearch() +{ + +} + +void NotifyQt::preDisplayMessages() +{ + +} + +void NotifyQt::preDisplayChannels() +{ + +} + +void NotifyQt::preDisplayTransfers() +{ + + +} + + + diff --git a/retroshare-gui/src/rsiface/notifyqt.h b/retroshare-gui/src/rsiface/notifyqt.h new file mode 100644 index 000000000..3bc0f0a89 --- /dev/null +++ b/retroshare-gui/src/rsiface/notifyqt.h @@ -0,0 +1,85 @@ +#ifndef RSIFACE_NOTIFY_TXT_H +#define RSIFACE_NOTIFY_TXT_H + +#include "rsiface/rsiface.h" +#include + +#include + +class NetworkDialog; +class PeersDialog; +class SharedFilesDialog; +class TransfersDialog; +class ChatDialog; +class MessagesDialog; +class ChannelsDialog; +class MessengerWindow; + + + +//class NotifyQt: public NotifyBase, public QObject +class NotifyQt: public QObject, public NotifyBase +{ + Q_OBJECT + public: + NotifyQt() : cDialog(NULL), pDialog(NULL), + dDialog(NULL), tDialog(NULL), + hDialog(NULL), mDialog(NULL), + sDialog(NULL), mWindow(NULL) + { return; } + + virtual ~NotifyQt() { return; } + + void setNetworkDialog(NetworkDialog *c) { cDialog = c; } + void setPeersDialog(PeersDialog *p) { pDialog = p; } + void setDirDialog(SharedFilesDialog *d) { dDialog = d; } + void setTransfersDialog(TransfersDialog *t) { tDialog = t; } + void setChatDialog(ChatDialog *m) { hDialog = m; } + void setMessagesDialog(MessagesDialog *m) { mDialog = m; } + void setChannelsDialog(ChannelsDialog *s) { sDialog = s; } + void setMessengerWindow(MessengerWindow *mw) { mWindow = mw; } + + void setRsIface(RsIface *i) { iface = i; } + +virtual void notifyListPreChange(int list, int type); +virtual void notifyListChange(int list, int type); +virtual void notifyErrorMsg(int list, int sev, std::string msg); +virtual void notifyChat(); + + public slots: + +void UpdateGUI(); /* called by timer */ + + private: + + void displayNeighbours(); + void displayFriends(); + void displayDirectories(); + void displaySearch(); + void displayChat(); + void displayMessages(); + void displayChannels(); + void displayTransfers(); + + void preDisplayNeighbours(); + void preDisplayFriends(); + void preDisplayDirectories(); + void preDisplaySearch(); + void preDisplayMessages(); + void preDisplayChannels(); + void preDisplayTransfers(); + + /* so we can update windows */ + NetworkDialog *cDialog; + PeersDialog *pDialog; + SharedFilesDialog *dDialog; + TransfersDialog *tDialog; + ChatDialog *hDialog; + MessagesDialog *mDialog; + ChannelsDialog *sDialog; + MessengerWindow *mWindow; + + RsIface *iface; +}; + +#endif diff --git a/retroshare-gui/src/rsiface/rsexpr.h b/retroshare-gui/src/rsiface/rsexpr.h new file mode 100755 index 000000000..07e9dfcad --- /dev/null +++ b/retroshare-gui/src/rsiface/rsexpr.h @@ -0,0 +1,241 @@ +#ifndef RS_EXPRESSIONS_H +#define RS_EXPRESSIONS_H + +/* + * rs-core/src/rsiface: rsexpr.h + * + * RetroShare C++ Interface. + * + * Copyright 2007-2008 by Kashif Kaleem. + * + * 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 +#include + +/****************************************************************************************** +Enumerations defining the Operators usable in the Boolean search expressions +******************************************************************************************/ + + +enum LogicalOperator{ + AndOp=0, /* exp AND exp */ + OrOp, /* exp OR exp */ + XorOp /* exp XOR exp */ +}; + + +/*Operators for String Queries*/ +enum StringOperator{ + ContainsAnyStrings = 0, /* e.g. name contains any of 'conference' 'meeting' 'presentation' */ + ContainsAllStrings, /* same as above except that it contains ALL of the strings */ + EqualsString /* exactly equal*/ +}; + +/*Relational operators ( >, <, >=, <=, == and InRange )*/ +enum RelOperator{ + Equals = 0, + GreaterEquals, + Greater, + SmallerEquals, + Smaller, + InRange /* lower limit <= value <= upper limit*/ +}; + +/****************************************************************************************** +Boolean Search Expression +classes: + + Expression: The base class of all expression typest + CompoundExpression: The expression which uses a logical operator to combine + the results of two expressions + StringExpression: An expression which uses some sort of string comparison. + RelExpression: A Relational Expression where > < >= <= == make sense. + e.g. size date etc + +******************************************************************************************/ + +class FileEntry; + +class Expression{ +public: + virtual bool eval (FileEntry *file) = 0; + virtual ~Expression() {}; +}; + + +class CompoundExpression : public Expression { +public: + CompoundExpression( enum LogicalOperator op, Expression * exp1, Expression *exp2) + : Lexp(exp1), Rexp(exp2), Op(op){ } + + bool eval (FileEntry *file) { + if (Lexp == NULL or Rexp == NULL) { + return false; + } + switch (Op){ + case AndOp: + return Lexp->eval(file) && Rexp->eval(file); + case OrOp: + return Lexp->eval(file) || Rexp->eval(file); + case XorOp: + return Lexp->eval(file) ^ Rexp->eval(file); + default: + return false; + } + } + virtual ~CompoundExpression(){ + delete Lexp; + delete Rexp; + } +private: + Expression *Lexp; + Expression *Rexp; + enum LogicalOperator Op; + +}; + +class StringExpression: public Expression { +public: + StringExpression(enum StringOperator op, std::list &t, + bool ic): Op(op),terms(t), IgnoreCase(ic){} +protected: + bool evalStr(std::string &str); +private: + enum StringOperator Op; + std::list terms; + bool IgnoreCase; +}; + +template +class RelExpression: public Expression { +public: + RelExpression(enum RelOperator op, T lv, T hv): + Op(op), LowerValue(lv), HigherValue(hv) {} +protected: + bool evalRel(T val); +private: + enum RelOperator Op; + T LowerValue; + T HigherValue; +}; + +template +bool RelExpression::evalRel(T val) { + switch (Op) { + case Equals: + return LowerValue == val; + case GreaterEquals: + return LowerValue >= val; + case Greater: + return LowerValue > val; + case SmallerEquals: + return LowerValue <= val; + case Smaller: + return LowerValue < val; + case InRange: + return (LowerValue <= val) && (val <= HigherValue); + default: + return false; + } +} + + +/****************************************************************************************** +Binary Predicate for Case Insensitive search + +******************************************************************************************/ +/*Binary predicate for case insensitive character comparison.*/ +/*TODOS: + *Factor locales in the comparison + */ +struct CompareCharIC : + public std::binary_function< char , char , bool> { + + bool operator () ( char ch1 , char ch2 ) const { + return tolower( static_cast < unsigned char > (ch1) ) + == tolower( static_cast < unsigned char > (ch2) ); + } + +}; + +/****************************************************************************************** +Some implementations of StringExpressions. + +******************************************************************************************/ + +class NameExpression: public StringExpression { +public: + NameExpression(enum StringOperator op, std::list &t, bool ic): + StringExpression(op,t,ic) {} + bool eval(FileEntry *file); +}; + +class PathExpression: public StringExpression { +public: + PathExpression(enum StringOperator op, std::list &t, bool ic): + StringExpression(op,t,ic) {} + bool eval(FileEntry *file); +}; + +class ExtExpression: public StringExpression { +public: + ExtExpression(enum StringOperator op, std::list &t, bool ic): + StringExpression(op,t,ic) {} + bool eval(FileEntry *file); +}; + +class HashExpression: public StringExpression { +public: + HashExpression(enum StringOperator op, std::list &t): + StringExpression(op,t, true) {} + bool eval(FileEntry *file); +}; + +/****************************************************************************************** +Some implementations of Relational Expressions. + +******************************************************************************************/ + +class DateExpression: public RelExpression { +public: + DateExpression(enum RelOperator op, int v): RelExpression(op,v,v){} + DateExpression(enum RelOperator op, int lv, int hv): + RelExpression(op,lv,hv) {} + bool eval(FileEntry *file); +}; + +class SizeExpression: public RelExpression { +public: + SizeExpression(enum RelOperator op, int v): RelExpression(op,v,v){} + SizeExpression(enum RelOperator op, int lv, int hv): + RelExpression(op,lv,hv) {} + bool eval(FileEntry *file); +}; + +class PopExpression: public RelExpression { +public: + PopExpression(enum RelOperator op, int v): RelExpression(op,v,v){} + PopExpression(enum RelOperator op, int lv, int hv): + RelExpression(op,lv,hv) {} + bool eval(FileEntry *file); +}; + +#endif /* RS_EXPRESSIONS_H */ diff --git a/retroshare-gui/src/rsiface/rsiface.h b/retroshare-gui/src/rsiface/rsiface.h new file mode 100644 index 000000000..a8fb3849f --- /dev/null +++ b/retroshare-gui/src/rsiface/rsiface.h @@ -0,0 +1,349 @@ +#ifndef RETROSHARE_GUI_INTERFACE_H +#define RETROSHARE_GUI_INTERFACE_H + +/* + * "$Id: rsiface.h,v 1.9 2007-04-21 19:08:51 rmf24 Exp $" + * + * RetroShare C++ Interface. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 "rstypes.h" + +#include + +class NotifyBase; +class RsIface; +class RsControl; +//class RsServer; +class RsInit; +class Expression; + +/* declare single RsIface for everyone to use! */ + +extern RsIface *rsiface; +extern RsControl *rsicontrol; + +/* RsInit -> Configuration Parameters for RetroShare Startup + */ + +RsInit *InitRsConfig(); +const char *RsConfigDirectory(RsInit *config); +void CleanupRsConfig(RsInit *); + + +// Called First... (handles comandline options) +int InitRetroShare(int argc, char **argv, RsInit *config); + +// This Functions are used for Login. +bool ValidateCertificate(RsInit *config, std::string &userName); +bool ValidateTrustedUser(RsInit *config, std::string fname, std::string &userName); +bool LoadPassword(RsInit *config, std::string passwd); +bool RsGenerateCertificate(RsInit *config, std::string name, std::string org, + std::string loc, std::string country, std::string passwd, std::string &errString); + +/* Auto Login Fns */ +bool RsTryAutoLogin(RsInit *config); +bool RsStoreAutoLogin(RsInit *config); +bool RsClearAutoLogin(std::string basedir); + +// Handle actual Login. +int LoadCertificates(RsInit *config, bool autoLoginNT); + +RsIface *createRsIface (NotifyBase ¬ify); +RsControl *createRsControl(RsIface &iface, NotifyBase ¬ify); + + +class RsIface /* The Main Interface Class - create a single one! */ +{ +public: + RsIface(NotifyBase &callback) + :cb(callback) { return; } + virtual ~RsIface() { return; } + +/****************************************/ + + /* Stubs for Very Important Fns -> Locking Functions */ +virtual void lockData() = 0; +virtual void unlockData() = 0; + + const std::map &getNeighbourMap() + { return mNeighbourMap; } + + const std::map &getFriendMap() + { return mFriendMap; } + + const NeighbourInfo * getFriend(std::string id); + + const std::list &getTransferList() + { return mTransferList; } + + const std::list &getRemoteDirectoryList() + { return mRemoteDirList; } + + const std::list &getLocalDirectoryList() + { return mLocalDirList; } + + const PersonInfo *getPerson(std::string id); + const DirInfo *getDirectory(std::string id, std::string path); + + const std::list &getMessages() + { return mMessageList; } + + const std::map &getChannels() + { return mChannelMap; } + + const std::map &getOurChannels() + { return mChannelOwnMap; } + + const MessageInfo *getMessage(std::string cId, std::string mId); + const MessageInfo *getChannelMsg(std::string chId, std::string mId); + + std::list getChatNew() + { + std::list newList = mChatList; + mChatList.clear(); + return newList; + } + + const std::list &getRecommendList() + { return mRecommendList; } + + const RsConfig &getConfig() + { return mConfig; } +/****************************************/ + + + /* Flags to indicate used or not */ + enum DataFlags + { + Neighbour = 0, + Friend = 1, + DirLocal = 2, /* Not Used - QModel instead */ + DirRemote = 3, /* Not Used - QModel instead */ + Transfer = 4, + Message = 5, + Channel = 6, + Chat = 7, + Recommend = 8, + Config = 9, + NumOfFlags = 10 + }; + + + /* + * Operations for flags + */ + +bool setChanged(DataFlags set); /* set to true */ +bool getChanged(DataFlags set); /* leaves it */ +bool hasChanged(DataFlags set); /* resets it */ + + private: + + /* Internal Fn for getting the Directory Entry */ + PersonInfo *getPersonMod(std::string id); + DirInfo *getDirectoryMod(std::string id, std::string path); + +void fillLists(); /* create some dummy data to display */ + + /* Internals */ + std::map mNeighbourMap; + std::map mFriendMap; + std::list mRemoteDirList; + std::list mLocalDirList; + std::list mTransferList; + std::list mMessageList; + std::map mChannelMap; + std::map mChannelOwnMap; + std::list mChatList; + std::list mRecommendList; + + bool mChanged[NumOfFlags]; + + RsConfig mConfig; + + NotifyBase &cb; + + /* Classes which can update the Lists! */ + friend class RsControl; + friend class RsServer; +}; + + +class RsControl /* The Main Interface Class - for controlling the server */ +{ + public: + + RsControl(RsIface &i, NotifyBase &callback) + :cb(callback), rsIface(i) { return; } + +virtual ~RsControl() { return; } + + /* Real Startup Fn */ +virtual int StartupRetroShare(RsInit *config) = 0; + +/****************************************/ + /* Neighbour Operations */ +virtual std::string NeighGetInvite() = 0; +virtual int NeighLoadPEMString(std::string pem, std::string &id) = 0; +virtual int NeighLoadCertificate(std::string fname, std::string &id) = 0; +virtual int NeighAuthFriend(std::string id, RsAuthId code) = 0; +virtual int NeighAddFriend(std::string id) = 0; +virtual int NeighGetSigners(std::string uid, char *out, int len) = 0; + +/****************************************/ + /* Friend Operations */ +virtual int FriendStatus(std::string id, bool accept) = 0; +virtual int FriendRemove(std::string id) = 0; +virtual int FriendConnectAttempt(std::string id) = 0; + +virtual int FriendSignCert(std::string id) = 0; +virtual int FriendTrustSignature(std::string id, bool trust) = 0; + +virtual int FriendSetLocalAddress(std::string id, std::string addr, + unsigned short port) = 0; +virtual int FriendSetExtAddress(std::string id, std::string addr, + unsigned short port) = 0; +virtual int FriendSetDNSAddress(std::string id, std::string addr) = 0; +virtual int FriendSetFirewall(std::string id, bool firewalled, bool forwarded) = 0; + +virtual int FriendSaveCertificate(std::string id, std::string fname) = 0; + +/* +virtual int FriendSetConnectMode(std::string id, int mode) = 0; +*/ +virtual int FriendSetBandwidth(std::string id, float outkB, float inkB) = 0; + +/****************************************/ + /* Directory Actions */ +virtual int RequestDirDetails(std::string uid, std::string path, DirDetails &details) = 0; +virtual int RequestDirDetails(void *ref, DirDetails &details, uint32_t flags) = 0; + +/****************************************/ + /* Search Actions */ +virtual int SearchKeywords(std::list keywords, std::list &results) = 0; +virtual int SearchBoolExp(Expression *exp, std::list &results) = 0; + +/****************************************/ + /* Actions For Upload/Download */ + +//virtual int FileDelete(std::string uId, std::string fname) = 0; +//virtual int FileMove(std::string uId, std::string src, std::string dest) = 0; + +virtual int FileRecommend(std::string fname, std::string hash, int size) = 0; +virtual int FileRequest(std::string fname, std::string hash, uint32_t size, std::string dest) = 0; +virtual int FileCancel(std::string fname, std::string hash, uint32_t size) = 0; + +// Transfer control. +virtual int FileClearCompleted() = 0; +virtual int FileSetBandwidthTotals(float outkB, float inkB) = 0; + +/****************************************/ + /* Message Items */ +virtual int MessageSend(MessageInfo &info) = 0; +virtual int MessageDelete(std::string id) = 0; +virtual int MessageRead(std::string id) = 0; + + /* Channel Items */ +virtual int ChannelCreateNew(ChannelInfo &info) = 0; +virtual int ChannelSendMsg(ChannelInfo &info) = 0; + +/****************************************/ + /* Chat */ +virtual int ChatSend(ChatInfo &ci) = 0; + +/****************************************/ + + /* Flagging Persons / Channels / Files in or out of a set (CheckLists) */ +virtual int SetInChat(std::string id, bool in) = 0; /* friend : chat msgs */ +virtual int SetInMsg(std::string id, bool in) = 0; /* friend : msg receipients */ +virtual int SetInBroadcast(std::string id, bool in) = 0; /* channel : channel broadcast */ +virtual int SetInSubscribe(std::string id, bool in) = 0; /* channel : subscribed channels */ +virtual int SetInRecommend(std::string id, bool in) = 0; /* file : recommended file */ +virtual int ClearInChat() = 0; +virtual int ClearInMsg() = 0; +virtual int ClearInBroadcast() = 0; +virtual int ClearInSubscribe() = 0; +virtual int ClearInRecommend() = 0; + +/****************************************/ + /* RsIface Networking */ +virtual int NetworkDHTActive(bool active) = 0; +virtual int NetworkUPnPActive(bool active) = 0; + +/****************************************/ + /* Config */ +virtual int ConfigAddSharedDir( std::string dir ) = 0; +virtual int ConfigRemoveSharedDir( std::string dir ) = 0; +virtual int ConfigSetIncomingDir( std::string dir ) = 0; + +virtual int ConfigSetLocalAddr( std::string ipAddr, int port ) = 0; +virtual int ConfigSetExtAddr( std::string ipAddr, int port ) = 0; +virtual int ConfigSetExtName( std::string addr ) = 0; +virtual int ConfigSetLanConfig( bool fire, bool forw ) = 0; + +virtual int ConfigSetDataRates( int total, int indiv ) = 0; +virtual int ConfigSetBootPrompt( bool on ) = 0; +virtual int ConfigSave( ) = 0; + +/****************************************/ + + NotifyBase &getNotify() { return cb; } + RsIface &getIface() { return rsIface; } + + private: + NotifyBase &cb; + RsIface &rsIface; +}; + + +/********************** Overload this Class for callback *****************/ + + +class NotifyBase +{ + public: + NotifyBase() { return; } + virtual ~NotifyBase() { return; } + virtual void notifyListPreChange(int list, int type) { (void) list; (void) type; return; } + virtual void notifyListChange(int list, int type) { (void) list; (void) type; return; } + virtual void notifyErrorMsg(int list, int sev, std::string msg) { (void) list; (void) sev; (void) msg; return; } + virtual void notifyChat() { return; } +}; + +const int NOTIFY_LIST_NEIGHBOURS = 1; +const int NOTIFY_LIST_FRIENDS = 2; +const int NOTIFY_LIST_DIRLIST = 3; +const int NOTIFY_LIST_SEARCHLIST = 4; +const int NOTIFY_LIST_MESSAGELIST = 5; +const int NOTIFY_LIST_CHANNELLIST = 6; +const int NOTIFY_LIST_TRANSFERLIST = 7; + +const int NOTIFY_TYPE_SAME = 0x01; +const int NOTIFY_TYPE_MOD = 0x02; /* general purpose, check all */ +const int NOTIFY_TYPE_ADD = 0x04; /* flagged additions */ +const int NOTIFY_TYPE_DEL = 0x08; /* flagged deletions */ + + + +#endif diff --git a/retroshare-gui/src/rsiface/rstypes.h b/retroshare-gui/src/rsiface/rstypes.h new file mode 100644 index 000000000..2c535d4bb --- /dev/null +++ b/retroshare-gui/src/rsiface/rstypes.h @@ -0,0 +1,410 @@ +#ifndef RS_TYPES_GUI_INTERFACE_H +#define RS_TYPES_GUI_INTERFACE_H + +/* + * "$Id: rstypes.h,v 1.7 2007-05-05 16:10:05 rmf24 Exp $" + * + * RetroShare C++ Interface. + * + * Copyright 2004-2006 by Robert Fernie. + * + * 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 +#include +#include + +#define RSCERTIDLEN 16 + +class RsCertId +{ + public: + RsCertId(); + RsCertId(std::string idstr); + + bool operator<(const RsCertId &ref) const; + bool operator==(const RsCertId &ref) const; + bool operator!=(const RsCertId &ref) const; + char data[RSCERTIDLEN]; +}; + +std::ostream &operator<<(std::ostream &out, const RsCertId &id); + +/* use RsCertId, (not unsigned long) because the definition will change +typedef unsigned long RsCertId; +*/ + +typedef RsCertId RsChanId; +typedef RsCertId RsMsgId; + +typedef std::string RsAuthId; + + +/* forward declarations of the classes */ + +#define INFO_SAME 0x01 +#define INFO_CHG 0x02 +#define INFO_NEW 0x04 +#define INFO_DEL 0x08 + +class BaseInfo +{ + public: + BaseInfo() :flags(0), mId(0) { return; } + RsCertId id; /* key for matching everything */ + int flags; /* INFO_TAG above */ + + /* allow this to be tweaked by the GUI Model */ + mutable unsigned int mId; /* (GUI) Model Id -> unique number */ +}; + +class NeighbourInfo: public BaseInfo +{ + public: + std::string name; + std::string org; + std::string loc; + std::string state; + std::string country; + int trustLvl; + std::string trustString; + std::list signers; + std::string authCode; + int status; + + std::string acceptString; + std::string statusString; + std::string connectString; + std::string lastConnect; + std::string peerAddress; + + /* server settings */ + std::string localAddr; + int localPort; + std::string extAddr; + int extPort; + std::string extName; + + bool firewalled; + bool forwardPort; + + int maxRate; /* kb */ + + bool ownsign; + + /* Flags to indicate if they are in + * chat or msg list + */ + + bool inChat; + bool inMsg; +}; + +/********************** For the Directory Listing *****************/ + +class FileInfo: public BaseInfo +{ + public: + +static const int kRsFiStatusNone = 0; +static const int kRsFiStatusStall = 1; +static const int kRsFiStatusProgress = 2; +static const int kRsFiStatusDone = 2; + + /* FileInfo(); */ + + int searchId; /* 0 if none */ + std::string path; + std::string fname; + std::string hash; + std::string ext; + + int size; + int avail; /* how much we have */ + int status; + + bool inRecommend; + + double rank; + int age; +}; + +class DirInfo: public BaseInfo +{ + public: + + DirInfo() :infoAge(0), nofiles(0), nobytes(0) { return; } + std::string path; + std::string dirname; + std::list subdirs; + std::list files; + int infoAge; + int nofiles; + int nobytes; + + double rank; + int age; + +int merge(const DirInfo &udir); + +bool exists(const DirInfo&); +DirInfo* existsPv(const DirInfo&); +bool add(const DirInfo&); +int update(const DirInfo &udir); + + +bool exists(const FileInfo&); +FileInfo* existsPv(const FileInfo&); +bool add(const FileInfo&); + +}; + +class PersonInfo: public BaseInfo +{ + public: + std::string name; + bool online; + int infoAge; /* time() at when this was last updated */ + + DirInfo rootdir; +}; + +/********************** For Messages and Channels *****************/ + +class FileTransferInfo: public FileInfo +{ + public: + std::string source; + int transfered; + double tfRate; /* kbytes */ + bool download; + int downloadStatus; /* 0 = Err, 1 = Ok, 2 = Done */ +}; + + +/********************** For Messages and Channels *****************/ + +#define RS_MSG_BOXMASK 0x000f /* Mask for determining Box */ + +#define RS_MSG_OUTGOING 0x0001 /* !Inbox */ +#define RS_MSG_PENDING 0x0002 /* OutBox */ +#define RS_MSG_DRAFT 0x0004 /* Draft */ + +/* ORs of above */ +#define RS_MSG_INBOX 0x00 /* Inbox */ +#define RS_MSG_SENTBOX 0x01 /* Sentbox */ +#define RS_MSG_OUTBOX 0x03 /* Outbox */ +#define RS_MSG_DRAFTBOX 0x05 /* Draftbox */ + +#define RS_MSG_NEW 0x0010 + +class MessageInfo: public BaseInfo +{ + public: + MessageInfo() {} + RsMsgId msgId; + + unsigned int msgflags; + std::string srcname; + std::string title; + std::string header; + std::string msg; + std::list files; + int size; /* total of files */ + int count; /* file count */ + + int ts; +}; + +class ChannelInfo: public BaseInfo +{ + public: + ChannelInfo() :publisher(false) {} + RsChanId chanId; + bool publisher; + std::string chanName; + std::list msglist; + + /* details */ + int mode; + float rank; + + bool inBroadcast; + bool inSubscribe; + + int size; /* total of msgs */ + int count; /* msg count */ +}; + +#define RS_CHAT_PUBLIC 0x0001 +#define RS_CHAT_PRIVATE 0x0002 + +class ChatInfo: public BaseInfo +{ + public: + std::string rsid; + unsigned int chatflags; + std::string name; + std::string msg; +}; + +/* matched to the uPnP states */ +#define UPNP_STATE_UNINITIALISED 0 +#define UPNP_STATE_UNAVAILABILE 1 +#define UPNP_STATE_READY 2 +#define UPNP_STATE_FAILED_TCP 3 +#define UPNP_STATE_FAILED_UDP 4 +#define UPNP_STATE_ACTIVE 5 + +class RsConfig +{ + public: + std::string ownId; + std::string ownName; + + std::list sharedDirList; + std::string incomingDir; + + std::string localAddr; + int localPort; + std::string extAddr; + int extPort; + std::string extName; + + bool firewalled; + bool forwardPort; + + int maxDataRate; /* kb */ + int maxIndivDataRate; /* kb */ + + int promptAtBoot; /* popup the password prompt */ + + bool DHTActive; + bool uPnPActive; + + int uPnPState; + int DHTPeers; +}; + +/********************** For Search Interface *****************/ + +/* This is still rough, implement later! */ + + /* text based ones */ +const std::string TypeExt = "ext"; +const std::string TypeName = "name"; +const std::string TypeHash = "hash"; +const std::string TypeSize = "size"; + +const int OpContains = 0x001; +const int OpExactMatch = 0x002; +const int OpLessThan = 0x003; +const int OpGreaterThan = 0x004; + +class Condition +{ + public: + + std::string type; + int op; + double value; + std::string name; +}; + +class SearchRequest +{ + public: + int searchId; + RsCertId toId; /* all zeros for everyone! */ + std::list tests; +}; + + +std::ostream &operator<<(std::ostream &out, const NeighbourInfo &info); +std::ostream &operator<<(std::ostream &out, const MessageInfo &info); +std::ostream &operator<<(std::ostream &out, const ChannelInfo &info); +std::ostream &operator<<(std::ostream &out, const ChatInfo &info); +std::ostream &operator<<(std::ostream &out, const PersonInfo &info); +std::ostream &print(std::ostream &out, const DirInfo &info, int indentLvl); + +/********************** For FileCache Interface *****************/ + +#define DIR_TYPE_ROOT 0x01 +#define DIR_TYPE_PERSON 0x02 +#define DIR_TYPE_DIR 0x04 +#define DIR_TYPE_FILE 0x08 + +/* flags for Directry request - + * two types; + * (1) Local / Remote (top byte) + * (2) Request type: Parent / Child - allows reduction in workload. + * (TODO) + */ + +#define DIR_FLAGS_LOCAL 0x1000 +#define DIR_FLAGS_REMOTE 0x2000 + +#define DIR_FLAGS_PARENT 0x0001 +#define DIR_FLAGS_DETAILS 0x0002 +#define DIR_FLAGS_CHILDREN 0x0004 + +class DirStub +{ + public: + uint8_t type; + std::string name; + void *ref; +}; + +class DirDetails +{ + public: + void *parent; + uint32_t prow; /* parent row */ + + void *ref; + uint8_t type; + std::string id; + std::string name; + std::string hash; + std::string path; + uint32_t count; + uint32_t age; + uint32_t rank; + + std::list children; +}; + +class FileDetail +{ + public: + std::string id; + std::string name; + std::string hash; + std::string path; + uint32_t size; + uint32_t age; + uint32_t rank; +}; + + +#endif + + diff --git a/retroshare-gui/src/util/AnimatedButton.cpp b/retroshare-gui/src/util/AnimatedButton.cpp new file mode 100644 index 000000000..5b31522cb --- /dev/null +++ b/retroshare-gui/src/util/AnimatedButton.cpp @@ -0,0 +1,47 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006,2007 crypton + * + * 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 + +//#include +//#include + +#include + +static const char * MNG_FORMAT = "MNG"; + +AnimatedButton::AnimatedButton(QAbstractButton * button, const QString & animatedIconFilename) { + _button = button; + _animatedIcon = new QMovie(animatedIconFilename, MNG_FORMAT, _button); + connect(_animatedIcon, SIGNAL(frameChanged(int)), SLOT(updateButtonIcon())); + _animatedIcon->start(); +} + +AnimatedButton::~AnimatedButton() { + _animatedIcon->stop(); + delete(_animatedIcon); +} + +void AnimatedButton::updateButtonIcon() { + QPixmap icon = _animatedIcon->currentPixmap(); + _button->setIcon(QIcon(icon)); + _button->repaint(); +} diff --git a/retroshare-gui/src/util/AnimatedButton.h b/retroshare-gui/src/util/AnimatedButton.h new file mode 100644 index 000000000..b3657b50b --- /dev/null +++ b/retroshare-gui/src/util/AnimatedButton.h @@ -0,0 +1,70 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006,2007 crypton + * + * 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 ANIMATEDBUTTON_H +#define ANIMATEDBUTTON_H + +#include + +#include + +#include + +class QAbstractButton; +class QMovie; +class QString; + +/** + * QAbstractButton with an animated icon (QMovie). + * + * Animated icon file should be a .mng file. + * + * + */ +class RSQTUTIL_API AnimatedButton : public QObject, NonCopyable { + Q_OBJECT +public: + + /** + * Constructs a animated button. + * + * @param button button' icon to animate + * @param animatedIconFilename mng filename to animate the button icon + */ + AnimatedButton(QAbstractButton * button, const QString & animatedIconFilename); + + ~AnimatedButton(); + +private Q_SLOTS: + + /** + * Button icon should be updated. + */ + void updateButtonIcon(); + +private: + + QAbstractButton * _button; + + QMovie * _animatedIcon; +}; + +#endif //ANIMATEDBUTTON_H diff --git a/retroshare-gui/src/util/EventFilter.cpp b/retroshare-gui/src/util/EventFilter.cpp new file mode 100644 index 000000000..a1072cede --- /dev/null +++ b/retroshare-gui/src/util/EventFilter.cpp @@ -0,0 +1,37 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, 2007 crypton + * + * 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 + +#include + +EventFilter::EventFilter(QObject * receiver, const char * member) + : QObject() { + connect(this, SIGNAL(activate(QEvent *)), receiver, member); +} + +void EventFilter::filter(QEvent * event) { + activate(event); +} + +bool EventFilter::eventFilter(QObject * watched, QEvent * event) { + return QObject::eventFilter(watched, event); +} diff --git a/retroshare-gui/src/util/EventFilter.h b/retroshare-gui/src/util/EventFilter.h new file mode 100644 index 000000000..1ee7d8a19 --- /dev/null +++ b/retroshare-gui/src/util/EventFilter.h @@ -0,0 +1,84 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, 2007 crypton + * + * 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 EVENTFILTER_H +#define EVENTFILTER_H + +#include + +#include + +#include + +class QEvent; + +/** + * EventFilter for QObject. + * + * Permits to make some special actions on Qt events. + * Example: + * + * QMainWindow * widget = new QMainWindow(); + * CloseEventFilter * closeFilter = new CloseEventFilter(this, SLOT(printHelloWorld())); + * ResizeEventFilter * resizeFilter = new ResizeEventFilter(this, SLOT(printHelloWorld())); + * widget->installEventFilter(closeFilter); + * widget->installEventFilter(resizeFilter); + * + * + * + */ +class RSQTUTIL_API EventFilter : public QObject, NonCopyable { + Q_OBJECT +public: + + /** + * Filters an event. + * + * @param receiver object receiver of the filter signal + * @param member member of the object called by the filter signal + * @param watched watched object the filter is going to be applied on + */ + EventFilter(QObject * receiver, const char * member); + +protected: + + /** + * Emits the filter signal. + * + * @param event event filtered + */ + void filter(QEvent * event); + + /** + * Filters the event. + * + * @param watched watched object + * @param event event filtered of the watched object + * @return true then stops the event being handled further + */ + virtual bool eventFilter(QObject * watched, QEvent * event); + +Q_SIGNALS: + + void activate(QEvent * event); +}; + +#endif //EVENTFILTER_H diff --git a/retroshare-gui/src/util/Interface.h b/retroshare-gui/src/util/Interface.h new file mode 100644 index 000000000..3734eeddd --- /dev/null +++ b/retroshare-gui/src/util/Interface.h @@ -0,0 +1,37 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006,2007 crypton + * + * 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 INTERFACE_H +#define INTERFACE_H + +#include + +/** + * + * + */ +class Interface : NonCopyable { +public: + + virtual ~Interface() { } +}; + +#endif //INTERFACE_H diff --git a/retroshare-gui/src/util/MouseEventFilter.cpp b/retroshare-gui/src/util/MouseEventFilter.cpp new file mode 100644 index 000000000..395ddefed --- /dev/null +++ b/retroshare-gui/src/util/MouseEventFilter.cpp @@ -0,0 +1,105 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, 2007 crypton + * + * 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 + +#include +#include + +#include + +MouseMoveEventFilter::MouseMoveEventFilter(QObject * receiver, const char * member) + : EventFilter(receiver, member) { +} + +bool MouseMoveEventFilter::eventFilter(QObject * watched, QEvent * event) { + if (event->type() == QEvent::MouseMove) { + filter(event); + return false; + } + return EventFilter::eventFilter(watched, event); +} + +MousePressEventFilter::MousePressEventFilter(QObject * receiver, const char * member, Qt::MouseButton button) + : EventFilter(receiver, member), + _button(button) { +} + +bool MousePressEventFilter::eventFilter(QObject * watched, QEvent * event) { + if (event->type() == QEvent::MouseButtonPress) { + try { + QMouseEvent * mouseEvent = dynamic_cast(event); + + if ((_button == Qt::NoButton) || (mouseEvent->button() == _button)) { + filter(event); + return false; + } + } catch (std::bad_cast) { + //LOG_FATAL("exception when casting a QEvent to a QMouseEvent"); + } + } + return EventFilter::eventFilter(watched, event); +} + +MouseReleaseEventFilter::MouseReleaseEventFilter(QObject * receiver, const char * member, Qt::MouseButton button) + : EventFilter(receiver, member), + _button(button) { +} + +bool MouseReleaseEventFilter::eventFilter(QObject * watched, QEvent * event) { + if (event->type() == QEvent::MouseButtonRelease) { + try { + QMouseEvent * mouseEvent = dynamic_cast(event); + + if ((_button == Qt::NoButton) || (mouseEvent->button() == _button)) { + filter(event); + return false; + } + } catch (std::bad_cast) { + //LOG_FATAL("exception when casting a QEvent to a QMouseEvent"); + } + } + return EventFilter::eventFilter(watched, event); +} + +MouseHoverEnterEventFilter::MouseHoverEnterEventFilter(QObject * receiver, const char * member) + : EventFilter(receiver, member) { +} + +bool MouseHoverEnterEventFilter::eventFilter(QObject * watched, QEvent * event) { + if (event->type() == QEvent::HoverEnter) { + filter(event); + return false; + } + return EventFilter::eventFilter(watched, event); +} + +MouseHoverLeaveEventFilter::MouseHoverLeaveEventFilter(QObject * receiver, const char * member) + : EventFilter(receiver, member) { +} + +bool MouseHoverLeaveEventFilter::eventFilter(QObject * watched, QEvent * event) { + if (event->type() == QEvent::HoverLeave) { + filter(event); + return false; + } + return EventFilter::eventFilter(watched, event); +} diff --git a/retroshare-gui/src/util/MouseEventFilter.h b/retroshare-gui/src/util/MouseEventFilter.h new file mode 100644 index 000000000..3690d7fd2 --- /dev/null +++ b/retroshare-gui/src/util/MouseEventFilter.h @@ -0,0 +1,110 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, 2007 crypton + * + * 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 MOUSEEVENTFILTER_H +#define MOUSEEVENTFILTER_H + +#include + +/** + * Catch MouseMove event. + * + * + */ +class RSQTUTIL_API MouseMoveEventFilter : public EventFilter { +public: + + MouseMoveEventFilter(QObject * receiver, const char * member); + +private: + + virtual bool eventFilter(QObject * watched, QEvent * event); +}; + + +/** + * Catch MouseButtonPress event. + * + * + */ +class RSQTUTIL_API MousePressEventFilter : public EventFilter { +public: + + MousePressEventFilter(QObject * receiver, const char * member, Qt::MouseButton button = Qt::NoButton); + +private: + + virtual bool eventFilter(QObject * watched, QEvent * event); + + Qt::MouseButton _button; +}; + + +/** + * Catch MouseButtonRelease event. + * + * + */ +class RSQTUTIL_API MouseReleaseEventFilter : public EventFilter { +public: + + MouseReleaseEventFilter(QObject * receiver, const char * member, Qt::MouseButton button = Qt::NoButton); + +private: + + virtual bool eventFilter(QObject * watched, QEvent * event); + + Qt::MouseButton _button; +}; + + +/** + * Catch HoverEnter event. + * + * + */ +class RSQTUTIL_API MouseHoverEnterEventFilter : public EventFilter { +public: + + MouseHoverEnterEventFilter(QObject * receiver, const char * member); + +private: + + virtual bool eventFilter(QObject * watched, QEvent * event); +}; + + +/** + * Catch HoverLeave event. + * + * + */ +class RSQTUTIL_API MouseHoverLeaveEventFilter : public EventFilter { +public: + + MouseHoverLeaveEventFilter(QObject * receiver, const char * member); + +private: + + virtual bool eventFilter(QObject * watched, QEvent * event); +}; + +#endif //MOUSEEVENTFILTER_H diff --git a/retroshare-gui/src/util/NonCopyable.cpp b/retroshare-gui/src/util/NonCopyable.cpp new file mode 100644 index 000000000..f14d0a19a --- /dev/null +++ b/retroshare-gui/src/util/NonCopyable.cpp @@ -0,0 +1,28 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006,2007 crypton + * + * 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 + +NonCopyable::NonCopyable() { +} + +NonCopyable::~NonCopyable() { +} diff --git a/retroshare-gui/src/util/NonCopyable.h b/retroshare-gui/src/util/NonCopyable.h new file mode 100644 index 000000000..c4b34729b --- /dev/null +++ b/retroshare-gui/src/util/NonCopyable.h @@ -0,0 +1,63 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006,2007 crypton + * + * 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 NONCOPYABLE_H +#define NONCOPYABLE_H + +#include + +/** + * Ensures derived classes have private copy constructor and copy assignment. + * + * Example: + *
    + * class MyClass : NonCopyable {
    + * public:
    + *    ...
    + * };
    + * 
    + * + * Taken from Boost library. + * + * @see boost::noncopyable + * + */ +class NonCopyable { +protected: + + RSUTIL_API NonCopyable(); + + RSUTIL_API ~NonCopyable(); + +private: + + /** + * Copy constructor is private. + */ + NonCopyable(const NonCopyable &); + + /** + * Copy assignement is private. + */ + const NonCopyable & operator=(const NonCopyable &); +}; + +#endif //NONCOPYABLE_H diff --git a/retroshare-gui/src/util/PixmapMerging.cpp b/retroshare-gui/src/util/PixmapMerging.cpp new file mode 100644 index 000000000..1b80cf1fb --- /dev/null +++ b/retroshare-gui/src/util/PixmapMerging.cpp @@ -0,0 +1,40 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006,2007 crypton + * + * 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 + +#include + +QPixmap PixmapMerging::merge(const std::string & foregroundPixmapData, const std::string & backgroundPixmapFilename) { + QImage foregroundImage; + foregroundImage.loadFromData((uchar *) foregroundPixmapData.c_str(), foregroundPixmapData.size()); + + QPixmap backgroundPixmap = QPixmap(QString::fromStdString(backgroundPixmapFilename)); + + if (!foregroundImage.isNull()) { + QPainter painter(&backgroundPixmap); + painter.drawImage(0, 0, + foregroundImage.scaled(backgroundPixmap.size(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation)); + painter.end(); + } + + return backgroundPixmap; +} diff --git a/retroshare-gui/src/util/PixmapMerging.h b/retroshare-gui/src/util/PixmapMerging.h new file mode 100644 index 000000000..78436a9fc --- /dev/null +++ b/retroshare-gui/src/util/PixmapMerging.h @@ -0,0 +1,53 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006,2007 crypton + * + * 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 PIXMAPMERGING_H +#define PIXMAPMERGING_H + +#include + +#include + +#include + +class QPixmap; + +/** + * Merges 2 pixmaps together. + * + * + */ +class PixmapMerging : NonCopyable { +public: + + /** + * Merges 2 pixmaps together. + * + * Used to have a background picture (a cadre) and a picture inside it. + * Currently used to a the avatar of a contact inside a nice background. + * + * @param foregroundPixmapData an 'array' with the foreground picture data + * @param backgroundPixmapFilename background pixmap filename e.g ":/pics/avatar_background.png" + */ + RSQTUTIL_API static QPixmap merge(const std::string & foregroundPixmapData, const std::string & backgroundPixmapFilename); +}; + +#endif //PIXMAPMERGING_H diff --git a/retroshare-gui/src/util/RetroStyleLabel.cpp b/retroshare-gui/src/util/RetroStyleLabel.cpp new file mode 100644 index 000000000..f10ba0b87 --- /dev/null +++ b/retroshare-gui/src/util/RetroStyleLabel.cpp @@ -0,0 +1,215 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006,2007 crypton + * + * 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 + +#include + +RetroStyleLabel::RetroStyleLabel(QWidget * parent, Mode mode, Qt::AlignmentFlag hAlign) + : QLabel(parent), _mode(mode) { + + _parent = parent; + _pressed = false; + _selected = false; + _toggled = false; + + //Default background color + _backgroundColor = _parent->palette().color(QPalette::Window); + //Default text color + _textColor = _parent->palette().color(QPalette::Text); + + _alignment = Qt::AlignVCenter | hAlign; +} + +RetroStyleLabel::~RetroStyleLabel() { +} + +void RetroStyleLabel::paintEvent(QPaintEvent * event) { +/* + qDebug() << "Paint event"; + QLabel::paintEvent( event ); + return; +*/ + QRect rect = this->rect(); + + QPainter painter(this); + rect.adjust(-1, -1, 1, 1); + + //painter.fillRect(rect,QBrush(_backgroundColor)); + + if (!_pressed && !_selected) { + //Draw the left side if any + if (!_normalLeftPixmap.isNull()) { + painter.drawPixmap(0,0,_normalLeftPixmap); + } + //Fill the the label + if (!_normalFillPixmap.isNull()) { + QBrush brush(_normalFillPixmap); + + QRect fillRect = rect; + if (!_normalLeftPixmap.isNull()) { + fillRect.adjust(_normalLeftPixmap.rect().width()-1,0,0,0); + } + if (!_normalRightPixmap.isNull()) { + fillRect.adjust(0,0,0-_normalRightPixmap.rect().width(),0); + } + painter.fillRect(fillRect,brush); + } + //Draw the right side + if (!_normalRightPixmap.isNull()) { + painter.drawPixmap( (rect.width()-1) - _normalRightPixmap.rect().width(),0,_normalRightPixmap); + } + + } //if (! _pressed ) + + else { + //Draw the left side if any + if (!_pressedLeftPixmap.isNull()) { + painter.drawPixmap(0, 0, _pressedLeftPixmap); + } + //Fill the the label + if (!_pressedFillPixmap.isNull()) { + QBrush brush(_pressedFillPixmap); + + QRect fillRect = rect; + if (!_pressedLeftPixmap.isNull()) { + fillRect.adjust(_pressedLeftPixmap.rect().width() - 1, 0, 0, 0); + } + if (!_pressedRightPixmap.isNull()) { + fillRect.adjust(0, 0, 0 - _pressedRightPixmap.rect().width(), 0); + } + painter.fillRect(fillRect,brush); + } + //Draw the right side + if (!_pressedRightPixmap.isNull()) { + painter.drawPixmap((rect.width() - 1) - _pressedRightPixmap.rect().width(), 0, _pressedRightPixmap); + } + } + painter.end(); + QPainter p(this); + drawText(&p); + p.end(); +} + +void RetroStyleLabel::drawText(QPainter * painter) { + QRect rect = this->rect(); + + painter->save(); + painter->setPen(_textColor); + painter->drawText(rect, _alignment, this->text(), &rect); + painter->restore(); +} + +void RetroStyleLabel::resizeEvent ( QResizeEvent * event) { + QLabel::resizeEvent(event); +} + +void RetroStyleLabel::setPixmaps(const QPixmap & normalLeftPixmap, + const QPixmap & normalRightPixmap, + const QPixmap & normalFillPixmap, + const QPixmap & pressedLeftPixmap, + const QPixmap & pressedRightPixmap, + const QPixmap & pressedFillPixmap) { + + _normalLeftPixmap = normalLeftPixmap; + _normalRightPixmap = normalRightPixmap; + _normalFillPixmap = normalFillPixmap; + + _pressedLeftPixmap = pressedLeftPixmap; + _pressedRightPixmap = pressedRightPixmap; + _pressedFillPixmap = pressedFillPixmap; +} + +/*void RetroStyleLabel::setLeftPixmaps(const QPixmap & normalLeftPixmap, const QPixmap & pressedLeftPixmap) { + _normalLeftPixmap = normalLeftPixmap; + _pressedLeftPixmap = pressedLeftPixmap; +} + +void RetroStyleLabel::setRightPixmaps(const QPixmap & normalRightPixmap, const QPixmap & pressedRightPixmap) { + _normalRightPixmap = normalRightPixmap; + _pressedRightPixmap = pressedRightPixmap; +}*/ + +void RetroStyleLabel::setTextColor(const QColor & color) { + _textColor = color; +} + +/*void RetroStyleLabel::setBackgroundColor(const QColor & color) { + _backgroundColor = color; +}*/ + +void RetroStyleLabel::mouseMoveEvent(QMouseEvent * event) { + _pressed = false; + QPoint mousePosition = event->pos(); + const QRect rect = this->rect(); + if ((mousePosition.x() >= rect.x()) && ( mousePosition.x() <= rect.width())) { + if ((mousePosition.y() >= rect.y()) && ( mousePosition.y() <= rect.height())) { + _pressed = true; + } + } + update(); +} + +void RetroStyleLabel::mousePressEvent(QMouseEvent * event) { + if (event->button() == Qt::LeftButton) { + _pressed = true; + update(); + } +} + +void RetroStyleLabel::mouseReleaseEvent(QMouseEvent * event) { + if (!_pressed) { + return; + } + //Gets the widget rect + const QRect rect = this->rect(); + + //Gets the mouse position relative to this widget + QPoint mousePosition = event->pos(); + if ((mousePosition.x() >= rect.x()) && (mousePosition.x() <= rect.width())) { + if ((mousePosition.y() >= rect.y()) && (mousePosition.y() <= rect.height())) { + clicked(); + if (_mode == Toggled) { + _toggled = !_toggled; + if (_toggled) { + _pressed = true; + } else { + _pressed = false; + } + } else { + _pressed = false; + } + update(); + } + } +} + +void RetroStyleLabel::setText(const QString & text) { + QLabel::setText(text); + QFontMetrics fm(font()); + int textWidth = fm.width(text); + textWidth += 40; + QSize s = size(); + if (textWidth > s.width()) { + //setMaximumSize(textWidth,s.height()); + setMinimumSize(textWidth,s.height()); + } +} diff --git a/retroshare-gui/src/util/RetroStyleLabel.h b/retroshare-gui/src/util/RetroStyleLabel.h new file mode 100644 index 000000000..76282d3bf --- /dev/null +++ b/retroshare-gui/src/util/RetroStyleLabel.h @@ -0,0 +1,119 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006,2007 crypton + * + * 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 RETROSTYLELABEL_H +#define RETROSTYLELABEL_H + +#include + +#include +#include +#include + + +class RSQTUTIL_API RetroStyleLabel : public QLabel { + Q_OBJECT +public: + + enum Mode { + Normal, + Toggled, + }; + + RetroStyleLabel(QWidget * parent, Mode = Normal, Qt::AlignmentFlag hAlign = Qt::AlignHCenter); + + ~RetroStyleLabel(); + + void setPixmaps(const QPixmap & normalLeftPixmap, + const QPixmap & normalRightPixmap, + const QPixmap & normalFillPixmap, + const QPixmap & pressedLeftPixmap, + const QPixmap & pressedRightPixmap, + const QPixmap & pressedFillPixmap); + + /*void setLeftPixmaps(const QPixmap & normalRightPixmap, const QPixmap & pressedRightPixmap); + + void setRightPixmaps(const QPixmap & normalRightPixmap, const QPixmap & pressedRightPixmap);*/ + + void setTextColor(const QColor & color); + + //void setBackgroundColor(const QColor & color); + + void setTextAlignment(int alignment) { + _alignment = alignment; + } + + void setSelected(bool value) { + _selected = value; + } + +public Q_SLOTS: + + void setText(const QString & text); + +Q_SIGNALS: + + void clicked(); + +private: + + void paintEvent(QPaintEvent * event); + + void resizeEvent(QResizeEvent * event); + + void drawText(QPainter * painter); + + void mouseMoveEvent(QMouseEvent * event); + + void mousePressEvent(QMouseEvent * event); + + void mouseReleaseEvent(QMouseEvent * event); + + QPixmap _normalFillPixmap; + + QPixmap _normalLeftPixmap; + + QPixmap _normalRightPixmap; + + QPixmap _pressedFillPixmap; + + QPixmap _pressedLeftPixmap; + + QPixmap _pressedRightPixmap; + + QColor _textColor; + + QColor _backgroundColor; + + bool _pressed; + + bool _selected; + + QWidget * _parent; + + int _alignment; + + bool _toggled; + + Mode _mode; +}; + +#endif //RETROSTYLELABEL_H diff --git a/retroshare-gui/src/util/RsAction.cpp b/retroshare-gui/src/util/RsAction.cpp new file mode 100644 index 000000000..f873cc978 --- /dev/null +++ b/retroshare-gui/src/util/RsAction.cpp @@ -0,0 +1,50 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2007 DrBob + * + * 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 "util/RsAction.h" + +RsAction::RsAction(QWidget * parent, std::string rsid) + : QAction(parent), RsId(rsid) +{ + connect(this, SIGNAL( triggered( bool ) ), this, SLOT( triggerEvent( bool ) ) ); +} + + +RsAction::RsAction(const QString & text, QObject * parent, std::string rsid) + : QAction(text, parent), RsId(rsid) +{ + connect(this, SIGNAL( triggered( bool ) ), this, SLOT( triggerEvent( bool ) ) ); +} + + +RsAction::RsAction(const QIcon & icon, const QString & text, QObject * parent , std::string rsid) + : QAction(icon, text, parent), RsId(rsid) +{ + connect(this, SIGNAL( triggered( bool ) ), this, SLOT( triggerEvent( bool ) ) ); +} + + +void RsAction::triggerEvent( bool checked ) +{ + triggeredId(RsId); +} + +//void triggeredId( std::string rsid ); diff --git a/retroshare-gui/src/util/RsAction.h b/retroshare-gui/src/util/RsAction.h new file mode 100644 index 000000000..ad3dfb5ec --- /dev/null +++ b/retroshare-gui/src/util/RsAction.h @@ -0,0 +1,50 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2007 drbob + * + * 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 RETRO_ACTION_H +#define RETRO_ACTION_H + + +#include + +class RsAction : public QAction { + Q_OBJECT +public: + + RsAction(QWidget * parent, std::string rsid); + RsAction(const QString & text, QObject * parent, std::string rsid); + RsAction(const QIcon & icon, const QString & text, QObject * parent , std::string rsid); + +public Q_SLOTS: + + /* attached to triggered() -> calls triggeredId() */ + void triggerEvent( bool checked ); + +Q_SIGNALS: + + void triggeredId( std::string rsid ); + +private: + + std::string RsId; +}; + +#endif //RETRO_ACTION_H diff --git a/retroshare-gui/src/util/Widget.cpp b/retroshare-gui/src/util/Widget.cpp new file mode 100644 index 000000000..dcf2aa340 --- /dev/null +++ b/retroshare-gui/src/util/Widget.cpp @@ -0,0 +1,38 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, 2007 crypton + * + * 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 + +#include + +QGridLayout * Widget::createLayout(QWidget * parent) { + QGridLayout * layout = new QGridLayout(parent); + layout->setSpacing(0); + layout->setMargin(0); + return layout; +} + +QDialog * Widget::transformToWindow(QWidget * widget) { + QDialog * dialog = new QDialog(widget->parentWidget()); + widget->setParent(NULL); + createLayout(dialog)->addWidget(widget); + return dialog; +} diff --git a/retroshare-gui/src/util/Widget.h b/retroshare-gui/src/util/Widget.h new file mode 100644 index 000000000..f3a17aba2 --- /dev/null +++ b/retroshare-gui/src/util/Widget.h @@ -0,0 +1,58 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, 2007 crypton + * + * 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 RSWIDGET_H +#define RSWIDGET_H + +#include + +#include + +class QWidget; +class QGridLayout; +class QDialog; + +/** + * Helper functions for QWidget. + * + * + */ +class Widget : NonCopyable { +public: + + /** + * Creates a QGridLayout inside a widget. + * + * @param parent QWidget where to create the layout + * @return QGridLayout + */ + RSQTUTIL_API static QGridLayout * createLayout(QWidget * parent); + + /** + * Transforms a QWidget into a QDialog. + * + * @param widget QWidget to transform into a QDialog + * @return the QDialog created + */ + RSQTUTIL_API static QDialog * transformToWindow(QWidget * widget); +}; + +#endif //RSWIDGET_H diff --git a/retroshare-gui/src/util/WidgetBackgroundImage.cpp b/retroshare-gui/src/util/WidgetBackgroundImage.cpp new file mode 100644 index 000000000..e77574752 --- /dev/null +++ b/retroshare-gui/src/util/WidgetBackgroundImage.cpp @@ -0,0 +1,53 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, 2007 crypton + * + * 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 + +#include +#include +#include +#include +#include + +void WidgetBackgroundImage::setBackgroundImage(QWidget * widget, const char * imageFile, WidgetBackgroundImage::AdjustMode adjustMode) { + widget->setAutoFillBackground(true); + + QPixmap pixmap(imageFile); + + switch (adjustMode) { + case AdjustNone: + break; + case AdjustWidth: + widget->setMinimumWidth(pixmap.width()); + break; + case AdjustHeight: + widget->setMinimumHeight(pixmap.height()); + break; + case AdjustSize: + widget->resize(pixmap.size()); + widget->setMinimumSize(pixmap.size()); + break; + } + + QPalette palette = widget->palette(); + palette.setBrush(widget->backgroundRole(), QBrush(pixmap)); + widget->setPalette(palette); +} diff --git a/retroshare-gui/src/util/WidgetBackgroundImage.h b/retroshare-gui/src/util/WidgetBackgroundImage.h new file mode 100644 index 000000000..6d15bf96c --- /dev/null +++ b/retroshare-gui/src/util/WidgetBackgroundImage.h @@ -0,0 +1,58 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006,2007 crypton + * + * 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 WIDGETBACKGROUNDIMAGE_H +#define WIDGETBACKGROUNDIMAGE_H + +#include + +#include + +class QWidget; + +/** + * Replacement for QWidget::setBackgroundPixmap() that does not exist in Qt4 anymore. + * + * Draws a background image inside a QWidget. + * + * + */ +class WidgetBackgroundImage : NonCopyable { +public: + + enum AdjustMode { + AdjustNone, + AdjustWidth, + AdjustHeight, + AdjustSize + }; + /** + * Sets a background image to a QWidget. + * + * @param widget QWidget that will get the background image + * @param imageFile background image filename + * @param adjustMode whether we should adjust the image width, height or + * both + */ + RSQTUTIL_API static void setBackgroundImage(QWidget * widget, const char * imageFile, AdjustMode adjustMode); +}; + +#endif //WIDGETBACKGROUNDIMAGE_H diff --git a/retroshare-gui/src/util/dllexport.h b/retroshare-gui/src/util/dllexport.h new file mode 100644 index 000000000..3d0c2cad8 --- /dev/null +++ b/retroshare-gui/src/util/dllexport.h @@ -0,0 +1,84 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006,2007 crypton + * + * 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 DLLEXPORT_H +#define DLLEXPORT_H + +#include + +/** + * @file dllexport.h + * + * Header that export symbols for creating a .dll under Windows. + * Example: + *
    + * #ifdef MY_DLL
    + * 	#ifdef BUILDING_DLL
    + * 		#define API DLLEXPORT
    + * 	#else
    + * 		#define API DLLIMPORT
    + * 	#endif
    + * #else
    + * 	#define API
    + * #endif
    + *
    + * class API MyClass
    + * API int publicFunction()
    + * class EXCEPTIONAPI(API) PublicThrowableClass
    + * class DLLLOCAL MyClass
    + * 
    + * + * You should define DLL if you want to use the library as a shared one + * + when you build the library you should define BUILDING_DLL + * GCC > v4.0 support library visibility attributes. + * + * @see http://gcc.gnu.org/wiki/Visibility + * + */ +//Shared library support +#ifdef OS_WIN32 + #define DLLIMPORT __declspec(dllimport) + #define DLLEXPORT __declspec(dllexport) + #define DLLLOCAL + #define DLLPUBLIC +#else + #define DLLIMPORT + #ifdef CC_GCC4 + #define DLLEXPORT __attribute__ ((visibility("default"))) + #define DLLLOCAL __attribute__ ((visibility("hidden"))) + #define DLLPUBLIC __attribute__ ((visibility("default"))) + #else + #define DLLEXPORT + #define DLLLOCAL + #define DLLPUBLIC + #endif +#endif + +//Throwable classes must always be visible on GCC in all binaries +#ifdef OS_WIN32 + #define EXCEPTIONAPI(api) api +#elif defined(GCC_HASCLASSVISIBILITY) + #define EXCEPTIONAPI(api) DLLEXPORT +#else + #define EXCEPTIONAPI(api) +#endif + +#endif //DLLEXPORT_H diff --git a/retroshare-gui/src/util/global.h b/retroshare-gui/src/util/global.h new file mode 100644 index 000000000..8ff3671df --- /dev/null +++ b/retroshare-gui/src/util/global.h @@ -0,0 +1,152 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006,2007 crypton + * + * 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 RSGLOBAL_H +#define RSGLOBAL_H + +/** + * OS and compilers detection via defines (preprocessor). + * + * Most of this defines are from Qt (Trolltech). + * In each category (OS_ and CC_) one define exludes the others. + * Warning: if you want to add a define to this file, the order is very important. + * + * Operating systems: + * - OS_WINDOWS + * - OS_WIN32 + * - OS_WIN64 + * - OS_WINCE_POCKETPC (Windows CE for PocketPC) + * - OS_WINCE_SMARTPHONE (Windows CE for smartphone) + * - OS_POSIX + * - OS_MACOSX + * - OS_LINUX + * - OS_HURD + * - OS_BSD + * - OS_FREEBSD + * - OS_NETBSD + * - OS_OPENBSD + * + * Compilers: + * - CC_MSVC (Microsoft Visual C++) + * - CC_MSVC6 (Visual C++ 6) + * - CC_MSVC7 (Visual C++ .NET) + * - CC_MSVC71 (Visual C++ 2003) + * - CC_MSVC8 (Visual C++ 2005) + * - CC_WINCE (Microsoft Visual C++ Embedded for Windows CE) + * - CC_WINCE1 (Windows CE 1.x) + * - CC_WINCE2 (Windows CE 2.x) + * - CC_WINCE3 (Windows CE 3.x) + * - CC_WINCE4 (Windows CE 4.x) + * - CC_WINCE5 (Windows CE 5.x) + * - CC_GCC + * - CC_MINGW (Native GCC under Windows) + * - CC_GCC3 (GNU GCC 3.x) + * - CC_GCC4 (GNU GCC 4.x) + * - CC_INTEL (Intel C++) + * - CC_BORLAND (Borland C++) + * + * @file global.h + * @see qglobal.h from Qt4 + * + */ + +//OS +#if defined(__APPLE__) && (defined(__GNUC__) || defined(__xlC__) || defined(__xlc__)) + #define OS_MACOSX +#elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__) + #define OS_WIN32 +#elif defined(WIN64) || defined(_WIN64) || defined(__WIN64__) + #define OS_WIN64 +#elif defined(__linux__) || defined(__linux) + #define OS_LINUX +#elif defined(__FreeBSD__) || defined(__DragonFly__) + #define OS_FREEBSD +#elif defined(__NetBSD__) + #define OS_NETBSD +#elif defined(__OpenBSD__) + #define OS_OPENBSD +#elif defined(__GNU_HURD__) + #define OS_HURD +#elif defined(WIN32_PLATFORM_PSPC) + #define OS_WINCE_POCKETPC +#elif defined(WIN32_PLATFORM_WFSP) + #define OS_WINCE_SMARTPHONE +#else + #error This OS has not been tested +#endif + +#if defined(OS_WIN32) || defined(OS_WIN64) || defined(OS_WINCE_POCKETPC) || defined(OS_WINCE_SMARTPHONE) + #define OS_WINDOWS +#endif + +#if defined(OS_FREEBSD) || defined(OS_NETBSD) || defined(OS_OPENBSD) + #define OS_BSD +#endif + +#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_HURD) || defined(OS_BSD) + #define OS_POSIX +#endif + + +//Compilers +#if defined(__INTEL_COMPILER) + #define CC_INTEL +#elif defined(_MSC_VER) + #define CC_MSVC + #if _MSC_VER <= 1200 + #define CC_MSVC6 + #elif _MSC_VER <= 1300 + #define CC_MSVC7 + #elif _MSC_VER <= 1310 + #define CC_MSVC71 + #elif _MSC_VER <= 1400 + #define CC_MSVC8 + #endif +#elif defined(_WIN32_WCE) + #define CC_WINCE + #if _WIN32_WCE <= 101 + #define CC_WINCE1 + #elif _WIN32_WCE <= 211 + #define CC_WINCE2 + #elif _WIN32_WCE <= 300 + #define CC_WINCE3 + #elif _WIN32_WCE <= 400 + #define CC_WINCE4 + #elif _WIN32_WCE <= 500 + #define CC_WINCE5 + #endif +#elif defined(__GNUC__) + #define CC_GCC + #if __GNUC__ == 3 + #define CC_GCC3 + #elif _MSC_VER == 4 + #define CC_GCC4 + #endif + #if defined(__MINGW32__) + #define CC_MINGW + #endif +#elif defined(__BORLANDC__) || defined(__TURBOC__) + #define CC_BORLAND +#else + #error This compiler has not been tested +#endif + +#endif //OWGLOBAL_H diff --git a/retroshare-gui/src/util/process.cpp b/retroshare-gui/src/util/process.cpp new file mode 100644 index 000000000..b35d1ea1e --- /dev/null +++ b/retroshare-gui/src/util/process.cpp @@ -0,0 +1,123 @@ +/**************************************************************** + * RShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 +#include +#include + +#include "string.h" +#include "process.h" + + +/** Returns the PID of the current process. */ +qint64 +get_pid() +{ +#if defined(Q_OS_WIN) + return (qint64)GetCurrentProcessId(); +#else + return (qint64)getpid(); +#endif +} + +/** Returns true if a process with the given PID is running. */ +bool +is_process_running(qint64 pid) +{ +#if defined(Q_OS_WIN) + BOOL rc; + DWORD exitCode; + + /* Try to open the process to see if it exists */ + HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, (DWORD)pid); + if (hProcess == NULL) { + return false; + } + + /* It exists, so see if it's still active or if it terminated already */ + rc = GetExitCodeProcess(hProcess, &exitCode); + CloseHandle(hProcess); + if (!rc) { + /* Error. Assume it doesn't exist (is this a bad assumption?) */ + return false; + } + /* If GetExitCodeProcess() returns a non-zero value, and the process is + * still running, exitCode should equal STILL_ACTIVE. Otherwise, this means + * the process has terminated. */ + return (exitCode == STILL_ACTIVE); +#else + /* Send the "null" signal to check if a process exists */ + if (kill((pid_t)pid, 0) < 0) { + return (errno != ESRCH); + } + return true; +#endif +} + +/** Writes the given file to disk containing the current process's PID. */ +bool +write_pidfile(QString pidFileName, QString *errmsg) +{ + /* Make sure the directory exists */ + QDir pidFileDir = QFileInfo(pidFileName).absoluteDir(); + if (!pidFileDir.exists()) { + pidFileDir.mkpath(QDir::convertSeparators(pidFileDir.absolutePath())); + } + + /* Try to open (and create if it doesn't exist) the pidfile */ + QFile pidfile(pidFileName); + if (!pidfile.open(QIODevice::WriteOnly | QIODevice::Text)) { + return err(errmsg, pidfile.errorString()); + } + + /* Write our current PID to it */ + QTextStream pidstream(&pidfile); + pidstream << get_pid(); + return true; +} + +/** Reads the given pidfile and returns the value contained in it. If the file + * does not exist 0 is returned. Returns -1 if an error occurs. */ +qint64 +read_pidfile(QString pidFileName, QString *errmsg) +{ + qint64 pid; + + /* Open the pidfile, if it exists */ + QFile pidfile(pidFileName); + if (!pidfile.exists()) { + return 0; + } + if (!pidfile.open(QIODevice::ReadOnly | QIODevice::Text)) { + if (errmsg) { + *errmsg = pidfile.errorString(); + } + return -1; + } + + /* Read the PID in from the file */ + QTextStream pidstream(&pidfile); + pidstream >> pid; + return pid; +} + diff --git a/retroshare-gui/src/util/process.h b/retroshare-gui/src/util/process.h new file mode 100644 index 000000000..dce832be6 --- /dev/null +++ b/retroshare-gui/src/util/process.h @@ -0,0 +1,53 @@ +/**************************************************************** + * RShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 _PROCESS_H +#define _PROCESS_H + +#include + +#if defined(Q_OS_WIN) +#define WIN32_LEAN_AND_MEAN +#include +#else +#include +#include +#include +#include +#endif + + +/** Returns the PID of the current process. */ +qint64 get_pid(); + +/** Returns true if a process with the given PID is running. */ +bool is_process_running(qint64 pid); + +/** Writes the given file to disk containing the current process's PID. */ +bool write_pidfile(QString pidfile, QString *errmsg = 0); + +/** Reads the giiven pidfile and returns the value in it. If the file does not + * exist, -1 is returned. */ +qint64 read_pidfile(QString pidfile, QString *errmsg = 0); + +#endif + diff --git a/retroshare-gui/src/util/registry.cpp b/retroshare-gui/src/util/registry.cpp new file mode 100644 index 000000000..4139bb29d --- /dev/null +++ b/retroshare-gui/src/util/registry.cpp @@ -0,0 +1,110 @@ +/**************************************************************** + * RShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 "registry.h" + +/** Returns the value in keyName at keyLocation. + * Returns an empty QString if the keyName doesn't exist */ +QString +registry_get_key_value(QString keyLocation, QString keyName) +{ +#if 0 + HKEY key; + char data[255] = {0}; + DWORD size = sizeof(data); + + /* Open the key for reading (opens new key if it doesn't exist) */ + if (RegOpenKeyExA(HKEY_CURRENT_USER, + qPrintable(keyLocation), + 0L, KEY_READ, &key) == ERROR_SUCCESS) { + + /* Key exists, so read the value into data */ + RegQueryValueExA(key, qPrintable(keyName), + NULL, NULL, (LPBYTE)data, &size); + } + + /* Close anything that was opened */ + RegCloseKey(key); + + return QString(data); +#endif + return keyName; + +} + +/** Creates and/or sets the key to the specified value */ +void +registry_set_key_value(QString keyLocation, QString keyName, QString keyValue) +{ + +#if 0 + HKEY key; + + /* Open the key for writing (opens new key if it doesn't exist */ + if (RegOpenKeyExA(HKEY_CURRENT_USER, + qPrintable(keyLocation), + 0, KEY_WRITE, &key) != ERROR_SUCCESS) { + + /* Key didn't exist, so write the newly opened key */ + RegCreateKeyExA(HKEY_CURRENT_USER, + qPrintable(keyLocation), + 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, + &key, NULL); + } + + /* Save the value in the key */ + RegSetValueExA(key, qPrintable(keyName), 0, REG_SZ, + (BYTE *)qPrintable(keyValue), + (DWORD)keyValue.length() + 1); // include null terminator + + /* Close the key */ + RegCloseKey(key); +#endif + +} + +/** Removes the key from the registry if it exists */ +void +registry_remove_key(QString keyLocation, QString keyName) +{ + +#if 0 + + HKEY key; + + /* Open the key for writing (opens new key if it doesn't exist */ + if (RegOpenKeyExA(HKEY_CURRENT_USER, + qPrintable(keyLocation), + 0, KEY_SET_VALUE, &key) == ERROR_SUCCESS) { + + /* Key exists so delete it */ + RegDeleteValueA(key, qPrintable(keyName)); + } + + /* Close anything that was opened */ + RegCloseKey(key); + +#endif + +} + diff --git a/retroshare-gui/src/util/registry.h b/retroshare-gui/src/util/registry.h new file mode 100644 index 000000000..08b3ef00a --- /dev/null +++ b/retroshare-gui/src/util/registry.h @@ -0,0 +1,46 @@ +/**************************************************************** + * Vidalia is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 _REGISTRY_H +#define _REGISTRY_H + +#include + +#define WIN32_LEAN_AND_MEAN + +#if 0 +#include "windows.h" +#endif + + +/** Returns value of keyName or empty QString if keyName doesn't exist */ +QString registry_get_key_value(QString keyLocation, QString keyName); + +/** Creates and/or sets the key to the specified value */ +void registry_set_key_value(QString keyLocation, QString keyName, QString keyValue); + +/** Removes the key from the registry if it exists */ +void registry_remove_key(QString keyLocation, QString keyName); + +#endif + diff --git a/retroshare-gui/src/util/rsqtutildll.h b/retroshare-gui/src/util/rsqtutildll.h new file mode 100644 index 000000000..80410d3c7 --- /dev/null +++ b/retroshare-gui/src/util/rsqtutildll.h @@ -0,0 +1,37 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 RSQTUTILDLL_H +#define RSQTUTILDLL_H + +#include + +#ifdef RSQTUTIL_DLL + #ifdef BUILD_RSQTUTIL_DLL + #define RSQTUTIL_API DLLEXPORT + #else + #define RSQTUTIL_API DLLIMPORT + #endif +#else + #define RSQTUTIL_API +#endif + +#endif //RSQTUTILDLL_H diff --git a/retroshare-gui/src/util/rsutildll.h b/retroshare-gui/src/util/rsutildll.h new file mode 100644 index 000000000..39b4703aa --- /dev/null +++ b/retroshare-gui/src/util/rsutildll.h @@ -0,0 +1,37 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006,2007 crypton + * + * 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 RSUTILDLL_H +#define RSUTILDLL_H + +#include + +#ifdef RSUTIL_DLL + #ifdef BUILD_RSUTIL_DLL + #define RSUTIL_API DLLEXPORT + #else + #define RSUTIL_API DLLIMPORT + #endif +#else + #define RSUTIL_API +#endif + +#endif //RSUTILDLL_H diff --git a/retroshare-gui/src/util/rsversion.cpp b/retroshare-gui/src/util/rsversion.cpp new file mode 100644 index 000000000..c93a04eca --- /dev/null +++ b/retroshare-gui/src/util/rsversion.cpp @@ -0,0 +1,38 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006,2007 crypton + * + * 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 "rsversion.h" + +//#define USE_SVN_VERSIONS 1 + +#define VERSION "0.3.52a" + +#if USE_SVN_VERSIONS +#include "svn_revision.h" +#endif + +QString retroshareVersion() { +#if USE_SVN_VERSIONS + return QString(QString(VERSION) + "+" + QString(SVN_REVISION)); +#else + return QString(VERSION); +#endif +} diff --git a/retroshare-gui/src/util/rsversion.h b/retroshare-gui/src/util/rsversion.h new file mode 100644 index 000000000..995459c4b --- /dev/null +++ b/retroshare-gui/src/util/rsversion.h @@ -0,0 +1,30 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2006,2007 crypton + * + * 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 _RSVERSION_H_ +#define _RSVERSION_H_ + +#include + +QString retroshareVersion(); + +#endif + diff --git a/retroshare-gui/src/util/string.cpp b/retroshare-gui/src/util/string.cpp new file mode 100644 index 000000000..0d7458ba3 --- /dev/null +++ b/retroshare-gui/src/util/string.cpp @@ -0,0 +1,65 @@ +/**************************************************************** + * Vidalia is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 "string.h" + + +/** Create a QStringList from the array of C-style strings. */ +QStringList +char_array_to_stringlist(char **arr, int len) +{ + QStringList list; + for (int i = 0; i < len; i++) { + list << QString(arr[i]); + } + return list; +} + +/** Conditionally assigns errmsg to str if str is not null and returns false. + * This is a seemingly pointless function, but it saves some messiness in + * methods whose QString *errmsg parameter is optional. */ +bool +err(QString *str, QString errmsg) +{ + if (str) { + *str = errmsg; + } + return false; +} + +/** Ensures all characters in str are in validChars. If a character appears + * in str but not in validChars, it will be removed and the resulting + * string returned. */ +QString +ensure_valid_chars(QString str, QString validChars) +{ + QString out = str; + for (int i = 0; i < str.length(); i++) { + QChar c = str.at(i); + if (validChars.indexOf(c) < 0) { + out.remove(c); + } + } + return out; +} + diff --git a/retroshare-gui/src/util/string.h b/retroshare-gui/src/util/string.h new file mode 100644 index 000000000..82ce0cb39 --- /dev/null +++ b/retroshare-gui/src/util/string.h @@ -0,0 +1,42 @@ +/**************************************************************** + * Vidalia is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 __STRING_H +#define __STRING_H + +#include + +/** Creates a QStringList from the array of C strings. */ +QStringList char_array_to_stringlist(char **arr, int len); + +/** Ensures all characters in str are in validChars. If a character appears + * in str but not in validChars, it will be removed and the resulting + * string returned. */ +QString ensure_valid_chars(QString str, QString validChars); + +/** Conditionally assigns errmsg to string if str is not null and returns + * false. */ +bool err(QString *str, QString errmsg); + +#endif + diff --git a/retroshare-gui/src/util/win32.cpp b/retroshare-gui/src/util/win32.cpp new file mode 100644 index 000000000..b1bc6b48b --- /dev/null +++ b/retroshare-gui/src/util/win32.cpp @@ -0,0 +1,82 @@ +/**************************************************************** + * RShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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. + ****************************************************************/ + +#if 0 +#include +#include +#endif + +#include +#include "win32.h" + + +/** Finds the location of the "special" Windows folder using the given CSIDL + * value. If the folder cannot be found, the given default path is used. */ +QString +win32_get_folder_location(int folder, QString defaultPath) +{ +#if 0 + TCHAR path[MAX_PATH+1]; + LPITEMIDLIST idl; + IMalloc *m; + HRESULT result; + + /* Find the location of %PROGRAMFILES% */ + if (SUCCEEDED(SHGetSpecialFolderLocation(NULL, folder, &idl))) { + /* Get the path from the IDL */ + result = SHGetPathFromIDList(idl, path); + SHGetMalloc(&m); + if (m) { + m->Release(); + } + if (SUCCEEDED(result)) { + QT_WA(return QString::fromUtf16((const ushort *)path);, + return QString::fromLocal8Bit((char *)path);) + } + } +#endif + + return defaultPath; +} + +/** Gets the location of the user's %PROGRAMFILES% folder. */ +QString +win32_program_files_folder() +{ + return win32_get_folder_location( +#if 0 + CSIDL_PROGRAM_FILES, QDir::rootPath() + "\\Program Files"); +#endif + 0, QDir::rootPath() + "\\Program Files"); +} + +/** Gets the location of the user's %APPDATA% folder. */ +QString +win32_app_data_folder() +{ + return win32_get_folder_location( +#if 0 + CSIDL_APPDATA, QDir::homePath() + "\\Application Data"); +#endif + 0, QDir::homePath() + "\\Application Data"); + +} + diff --git a/retroshare-gui/src/util/win32.h b/retroshare-gui/src/util/win32.h new file mode 100644 index 000000000..4abbfa1a5 --- /dev/null +++ b/retroshare-gui/src/util/win32.h @@ -0,0 +1,35 @@ +/**************************************************************** + * RShare is distributed under the following license: + * + * Copyright (C) 2006, crypton + * + * 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 _WIN32_H +#define _WIN32_H + +#include + +/** Retrieves the location of the user's %PROGRAMFILES% folder. */ +QString win32_program_files_folder(); + +/** Retrieves the location of the user's %APPDATA% folder. */ +QString win32_app_data_folder(); + +#endif +